工具

工具

采用 #

趋向 #

本地(app) -> 线上(browser)

工具 #

资讯
    课:腾讯视频
    搜索: DEVONagent, WolframAlpha
    渠道: pages, 知网, 博客, 知乎, 慕课, 网易公开课, 微信/qq, outlook
    发散查找: 百度指数, DEVONSphere
存储
    文件管理: DEVONthink, SiteSucker, FEFileExplorer, Documents
    网盘: icloud, oneDrive x 2, 坚果云, 百度网盘, 阿里网盘
效率
    浏览器: SwitchyOmega, tampermonkey, downthemall, fireshot, pushBullet, firefoxFocus, Alook
    设备同步: synergy, pushbullet, sharemouse
    人机: alfred, divvy, unclutter, workspaces, yoink, xscope, hazeOver, microSnitch
    监视: istatistica, wifiExplorer
    图: Flameshot
    短链: shortMenu
    远程:OpenVPN, Shadowrocket, TeamViewer, 向日葵, ToDesk, AnyDesk, Google远程桌面, Termius, 腾讯会议,钉钉
    语言:欧路词典
制品
    架构图: Visio, WPS, Office, OmniGraffle, PlantUML, Graphviz, VisualParadigm 
    甘特图: OmniPlan, GanttProject, MicrosoftProject
    表: Excel, Xmind, MindNode, Ithoughts, Scapple
    大纲: Drafts, Workflowy, 幕布
    字: LaTeX, iAWriter
    数学: MathStudio, PocketCAS,
    画: Procreator, Realistic, MentalCanvas, ExplainEverything
    代码: Jetbrains, VIM, Spacemacs, VsCode, Code[iPad], WorkingCopy[iPad]
    表达式: Expressions 
    图片: touchRetouch, auroraHDR, lensFlare, reflectStudio, superDenoising, Logoist, polarrPhoto, priimeStyles, tonality, QRFactory, Faceu, 美图秀秀
    音频: permute3
    视频: quickTime, gifox, gif brewery, gif maker, Hype3
    3d: RealityComposer, Aurora3DMaker, 3dScanner, JigSpace, MagicPlan
笔记
    信息: Notion, hugobook, Goodnotes, Notability, Prodrafts, OneNote[oneDrive]
    双链: LogSeq, Obsidian, Roam
    图: MarginNote, LiquidText, ThinkSpace
    GTD:Fantastical2, Trello, MicrosoftToDo, Things3
    记账: DayOne, 支付宝, MoneyPro, FamilyTree
    代码: Snipaste, Cacher[github], lepton[github], dash, snippetsLap, textastic
休闲: 
    iPad: Chameleon, Frax, CoStudy
    Mac: noizio, relaxMelodiesSeasions, earth3D
政务财务
    APP: 个人所得税, 微店, 贝壳, 住这儿, 热力集团, 网上国网

依赖 #

系统: 
    文件: tree, unrar, unzip, 7z, diff, du
    系统: ntfs-3g, os-prober, network-manager, wireless-tools, systemctl, service
    包: yaourt, yay, pkgfile, snap
        wps-office, ttf-wps-fonts
    界面: awesome, i3-wm, arandr, xscreensaver, tmux, synergy, ibus, synaptics, pepper-flash, virtualbox
    网络: chromium, firefox, thunderbird
ops:
    shell: ^z, bg, fg, jobs, nohup, expect, 
    系统: sysdig, sysstat包(sar, sadf, mpstat, iostat, pidstat), ifconfig, top, htop, ps, df
    网络: wireshark, netstat, ss, ping, telnet, iptables, wget, git, openssh, nc, nmap, nslookup
    vpn: openvpn, shadowsocks, polipo, v2ray
    vm: docker, docker-compose
        db: mysql, mariadb, postgresql, redis, mongodb, cassandra, neo4j
            elasticsearch, elasticsearch-head, elasticsearch-analysis-hanlp, elasticsearch-ik, elasticsearch-pinyin
        mq: nsq, rabbitmq,  kafka,
        容器: nginx, nginx-php
        监控: zipkin, 
        应用: dokuwiki, tiddlywiki, wordpress, 
    服务: vsftpd, filezilla
    分布式: ansible
程序:
    基本: make, cmake, g++, gcc, lua, ruby,
    java: openjdk8, jdk8, jdk12, maven, tomcat
    go: go1.9.3, go1.12.6, go1.13.5, probobuf, protoc
    python: python2.7, python3.8, pip2, pip3
    php: php-cgi, php-fpm
    js: node, mvn, babel-cli
    分析: flame-graph
媒体: dia, convert, import, alsamixer, mplayer
ide: vscode, sublime, emacs, vim 
    jetbrains: webstorm, goland, intellijIdea, phpstorm, pycharm, mps, android studio
    eclipse: eclipse-inst, eclipse-birt, eclipse-jee-neon
数据库: datagrip, neoclipse, robo3t, studio-3t
测试: postman
工作: snapcast, mosquitto, sox, snapcastrd, websockify

系统 #

windows #

# 方案
    附件 -> 系统工具 -> 字符映射表 -> 新宋体 中查看汉字的unicode编码

    远程协助
            端口:3389
        1.系统属性 远程
        2.附件:远程连接
                # xp:单用户,远程操作时原用户无法操作

    chm 不显示内容
            右键 -> 常规 -> 解锁

# 命令
    route print
    route delete
    route add 0.0.0.0 mask 0.0.0.0 10.0.2.2
    nstsc   # 运程桌面
# cmd
    CMD 属性
            cmd /c dir 是执行完dir命令后关闭命令窗口。
            cmd /k dir 是执行完dir命令后不关闭命令窗口。
            cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。
            cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭。

    语法命令
            | findstr asdf                        # 相当于grep

    CMD命令
            1. gpedit.msc-----组策略
            2. sndrec32-------录音机
            3. Nslookup-------IP地址侦测器
            4. explorer-------打开资源管理器
            5. logoff---------注销命令
            6. tsshutdn-------60秒倒计时关机命令
            7. lusrmgr.msc----本机用户和组
            8. services.msc---本地服务设置
            9. oobe/msoobe /a----检查XP是否激活
            10. notepad--------打开记事本
            11. cleanmgr-------垃圾整理
            12. net start messenger----开始信使服务(或其它服务)
            13. compmgmt.msc---计算机管理
            14. net stop messenger-----停止信使服务(或其它服务)
            15. conf-----------启动netmeeting
            16. dvdplay--------DVD播放器
            17. charmap--------启动字符映射表
            18. diskmgmt.msc---磁盘管理实用程序
            19. calc-----------启动计算器
            20. dfrg.msc-------磁盘碎片整理程序
            21. chkdsk.exe-----Chkdsk磁盘检查
            22. devmgmt.msc--- 设备管理器
            23. regsvr32 /u *.dll----停止dll文件运行
            24. drwtsn32------ 系统医生
            25. rononce -p ----15秒关机
            26. dxdiag---------检查DirectX信息
            27. regedt32-------注册表编辑器
            28. Msconfig.exe---系统配置实用程序
            29. rsop.msc-------组策略结果集
            30. mem.exe--------显示内存使用情况
            31. regedit.exe----注册表
            32. winchat--------XP自带局域网聊天
            33. progman--------程序管理器
            34. winmsd---------系统信息
            35. perfmon.msc----计算机性能监测程序
            36. winver---------检查Windows版本
            37. sfc /scannow-----扫描错误并复原
            38. taskmgr-----任务管理器(2000/xp/2003
            39. winver---------检查Windows版本
            40. wmimgmt.msc----打开windows管理体系结构(WMI)
            41. wupdmgr--------windows更新程序
            42. wscript--------windows脚本宿主设置
            43. write----------写字板
            44. winmsd---------系统信息
            45. wiaacmgr-------扫描仪和照相机向导
            46. winchat--------XP自带局域网聊天
            47. mem.exe--------显示内存使用情况
            48. Msconfig.exe---系统配置实用程序
            49. mplayer2-------简易widnows media player
            50. mspaint--------画图板
            51. mstsc----------远程桌面连接
            52. mplayer2-------媒体播放机
            53. magnify--------放大镜实用程序
            54. mmc------------打开控制台
            55. mobsync--------同步命令
            56. dxdiag---------检查DirectX信息
            57. drwtsn32------ 系统医生
            58. devmgmt.msc--- 设备管理器
            59. dfrg.msc-------磁盘碎片整理程序
            60. diskmgmt.msc---磁盘管理实用程序
            61. dcomcnfg-------打开系统组件服务
            62. ddeshare-------打开DDE共享设置
            63. dvdplay--------DVD播放器
            64. net stop messenger-----停止信使服务
            65. net start messenger----开始信使服务
            66. notepad--------打开记事本
            67. nslookup-------网络管理的工具向导
            68. ntbackup-------系统备份和还原
            69. narrator-------屏幕“讲述人”
            70. ntmsmgr.msc----移动存储管理器
            71. ntmsoprq.msc---移动存储管理员操作请求
            72. netstat -an----(TC)命令检查接口
            73. syncapp--------创建一个公文包
            74. sysedit--------系统配置编辑器
            75. sigverif-------文件签名验证程序
            76. sndrec32-------录音机
            77. shrpubw--------创建共享文件夹
            78. secpol.msc-----本地安全策略
            79. syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
            80. services.msc---本地服务设置
            81. Sndvol32-------音量控制程序
            82. sfc.exe--------系统文件检查器
            83. sfc /scannow---windows文件保护
            84. tsshutdn-------60秒倒计时关机命令
            84. tsshutdn-------60秒倒计时关机命令
            85. tourstart------xp简介(安装完成后出现的漫游xp程序)
            86. taskmgr--------任务管理器
            87. eventvwr-------事件查看器
            88. eudcedit-------造字程序
            89. explorer-------打开资源管理器
            90. packager-------对象包装程序
            91. perfmon.msc----计算机性能监测程序
            92. progman--------程序管理器
            93. regedit.exe----注册表
            94. rsop.msc-------组策略结果集
            95. regedt32-------注册表编辑器
            96. rononce -p ----15秒关机
            97. regsvr32 /u *.dll----停止dll文件运行
            98. regsvr32 /u zipfldr.dll------取消ZIP支持
            99. cmd.exe--------CMD命令提示符
            100. chkdsk.exe-----Chkdsk磁盘检查
            101. certmgr.msc----证书管理实用程序
            102. calc-----------启动计算器
            103. charmap--------启动字符映射表
            104. cliconfg-------SQL SERVER 客户端网络实用程序
            105. Clipbrd--------剪贴板查看器
            106. conf-----------启动netmeeting
            107. compmgmt.msc---计算机管理
            108. cleanmgr-------垃圾整理
            109. ciadv.msc------索引服务程序
            110. osk------------打开屏幕键盘
            111. odbcad32-------ODBC数据源管理器
            112. oobe/msoobe /a----检查XP是否激活
            113. lusrmgr.msc----本机用户和组
            114. logoff---------注销命令
            115. iexpress-------木马捆绑工具,系统自带
            116. Nslookup-------IP地址侦测器
            117. fsmgmt.msc-----共享文件夹管理器
            118. utilman--------辅助工具管理器
            119. gpedit.msc-----组策略
            120. explorer-------打开资源管理器
            其它
                    arp -a                # 显示当前局域网ip与物理地址
                    net view        # 显示局域网用户
                    nbtstat                # 详细局域网用户
                    sfc /scannow                # windows 文件检查器(修复系统)
                    shutdonw                        # 关机等一系列指令
# 注册表
    使用UTC时间(兼容linux)
            cmd> Reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1
# 工具
    端口映射器
            远程vpn代理到ssh
    everything
            文件快速搜索工具
            远程访问电脑文件的服务器
    花生壳
            动态域名软件,已申请域名,ip经常变换时使用
    xmanager
            ssh工具
    端口映射
            portmap
    xshell
    secureCRT
    Xmanager                # 可运行图形界面如vnc
    teamViewer                # 可图形界面
    cmder          # windows命令行工具

网络 #

teamviewer #

# 远程桌面

wireshark #

# 抓包

charlet #

# 抓包

mitmproxy #

# 抓包
命令
    mitmdump
    mitmproxy
    mitmweb

Burp Suite #

# 抓包

fiddler #

# 抓包

whistle #

# 抓包

tcpdump #

# 抓包

anyproxy #

# 代理http/https

proxychains #

# 代理

chrome #

介绍
    webkit: chrome firefox safari的内核,来源于kde的khtml与kjs
快捷键
    ctrl + f5 无缓存刷新
    f12 调试模式
调试模式
    js调试
        sources-> js文件打断点调试
                # “{}”按钮是格式化代码,右边按钮单步调试,依次为执行, 跳过进入方法,进入方法,跳出方法,开启/停止调试,暂停
        //# sourceURL=base.js
    console
        可以查看js常量,如THREE.VERSION
设置页
    about:about                                 # 进入查看所有设置页
    chrome:extensions
    chrome:flags                                # 可以开启硬件加速解码
集成抓包工具
    chrome://net-internals/#events
    chrome://net-export 导出文件,netlog-viewer.appspot.com分析
插件
    ARC Welder  # android模拟器

firefox #

代理设置
    “编辑”→“首选项”→“高级”→“网络”→“设置”→“手动配置代理”
mozvr
    介绍
        mozilla vr 虚拟现实
        购买Oculus Rift头盔来看它的网页

数据分析 #

paraview #

# 数据可视化

finreport #

# 数据可视化

设计 #

sketch #

# mac下轻量ui设计工具

rose #

    # ibm uml工具

开发 #

vim #

sublime #

功能
    显示风格好
    缩略图
    热加载(不改变原文件)
    插件
    多文件夹查找
    多视窗
    命令模糊搜索下拉菜单
    柜形选择
    V8插件,js运行控制台
    js校验
    vi 操作设置
    修改配色方案
快捷键
    批量修改

idle #

# python tkinter开发的python ide

lighttable #

# clojure

hbuilder #

    # h5

komodo edit #

# 免费跨平台,多pl

vscode #

source insight #

gerrit #

    # 查看代码

keil #

# 嵌入式

客户端 #

datastudio #

    # ibm数据库连接工具

plsql #

oracle sql developer #

    # ios的数据库操作gui

robo3t #

# 原robomongo, 免费

studio3t #

# mongodb, 收费

字体 #

中文等宽
    Sarasa Mono SC
        https://github.com/be5invis/Sarasa-Gothic

Eclipse

方案 #

user library发布
        项目右键 -> properties -> Deployment Assembly -> add -> javaBuild Path Entries中选择发布包
tomcat设置发布到外部
        new server -> 直接finish
        右键server -> open        
                修改server location -> use Tomcat installation
                修改server location -> deploy path为webapps
                修改TimeOuts ->所有时间为1200
java版本
        window -> preferences -> java -> compiler
        window -> preferences -> java -> installed JREs
编码
        general -> workspace
                Text file encoding
        general -> content types
                Text -> java source file 
                        defalt encoding输入UTF-8并点击update
快捷键
        general -> editors -> keys
                content assist                # 代码提示
                word comletion                # 代码补全

插件 #

market place
        http://www.eclipse.org/mpc/
        在线网页
                http://www.eclipse.org/mpc/archive.php
        在线安装(luna)
                http://download.eclipse.org/mpc/releases/1.3.0/
        yum
                eclipse-mpc
subclipse
        yum
                eclipse-subclipse
jdt java8 support
        help -> market place -> find: java 8
                java 8 support for eclipse 
        在线安装(kepler)
                http://download.eclipse.org/eclipse/updates/4.3-P-builds/
                网站
                        http://wiki.eclipse.org/JDT/Eclipse_Java_8_Support_For_Kepler
m2e
        在线
                http://download.eclipse.org/technology/m2e/releases 

mvn项目 #

创建web 项目
        maven project 
                catalog: internal
                filter:webapp
                        org.apache.maven.archetypes
        项目右键 - new -> source folder
                src/main/java
                src/main/resources
                src/test/java
                src/test/resources
                        # 可以在navigator中创建, 再:
                        ## 项目右键 -> buildpath -> configure... -> source -> add folder添加以上4个source folder
        修改 configure build path -> source 中2个source folder中的output folder
                src/main/java                target/classes
                src/main/resources        target/classes
                src/test/java                target/test-classes
                src/test/resources        target/test-classes
        修改 configure build path -> libraries -> jre system library -> edit
        右键 -> properties ->java compiler -> 1.8
        

        项目右键 -> run as -> maven install                #下载依赖包
        右键 -> properties -> project facets -> convert to faceted from
                选中 dynamic web module
                选中 java
                右边选择runtime
                下面further configuration available
                        content directory: src/main/webapp
                        勾选generate web.xml
        右键 -> properties -> deployment assembly中配置文件发布路径
                去掉test的目录
                添加发布包maven dependencies
方案
    修改项目名
            o-> 修改project名
            o-> 修改包名与test包名
            o-> 修改配置文件, 类中的常量, (workspace配置文件[maven项目没有这些文件])                # ctrl + h 全局搜索(替换)
            o-> mvn clean
            o-> mvn install
            o-> preferences -> web project settings -> context root中修改项目名称
    集成spring
        pom.xml中添加spring依赖

myEclipse #

假错误(problem view中删掉)

目录结构
        /Common/中存储的是jar包与配置
                plugins/存放插件
                features/存放外观
        /MyEclipse 10/中
                dropins/配置自定义插件

调整format一行最大字符数        Java — Code Style — Formatter — Active profile — Edit — Line Wrapping — Maximum line width
修改,自定义alt + / 模板        包括@anthor 等等        Java — Editor — Templates
修改编码:window --> General --> Workspace
                Myeclipse --> files and editors
忽略校验:右键 --> myeclipse --> exclude from validation
package Explor 中可以go into  和 up 缩小和扩大显示范围

鼠标右键 -->Run As --> Run Configuration --> Arguments --> Program Arguments 设置运行传入的参数 

new 中可以生成测试文件

window --> preferences --> MyEclipse --> validation --> disableAll 取消验证

Package Explorer中什么也不显示(进入了已经关闭的包时) --> navigator --> open project
                                                                                        或者{workspaces}\.metadata\.plugins\org.eclipse.ui.workbench\workbench.xml文件中
                                                                                        搜索<input factoryID="org.eclipse.ui.internal.model.ResourceFactory",把path的值改为"/"
        其它原因:window --> reset perspective
                        Package Explorer 上的倒三角中:deselect working set
struts2配置myeclipse编写xml文件时的提示
        ## 约束文件的相对路径:struts-2.3.15.1\src\core\src\main\resources\struts2.0.dtd
        ## xml文件中声明的url:http://struts.apache.org/dtds/struts-2.0.dtd
        ## myeclipse中:window        --> Preferences --> MyEclipse --> XML --> XML Catalog --> XML Catalog Entries 选中User Specified Entries --> 点击add
        ## Location中关联源码路径,Key Type 选择 URI,Key中写xml文件中声明的url 
改变Package Explorer Vier中包的为分层显示方式:
        Package Explorer 视窗中 --> 点击倒三角 --> Package Presentation --> hierarchical :
        
导入war文件:
        新建webPorject --> File===》import==》General中选择Archive File --> Form archive file中选择要导入的项目.war -> 导入

ctrl + shift + t 关联源码快捷键
                                                
设置字体:eclipse preference-->Colors and Fonts-->basic-->Text Font-->edit

导入dtd/xsd约束文件:window -> preferences -> XmlCatalog -> add
        dtd直接导入文件就可以了,xsd要在添加时key的选项中补上文件名
        
自定义jar包library目录
        项目 右键:building path -> addLiber->user liber配置userLibery右键:building path -> addLiber->user liber配置userLibery
                只是作了外部的引用,workspace中没有包,但是别人导入时会搜索同名的userLibery自动进行配置
改javaee版本    
        1.修改项目中的javaee包
        2.项目工程目录/settings/org.eclipse.wst.common.project.facet.core.xml/中修改javaee版本

在线安装svn
        Help -> install from site(Myeclipse2013) -> add -> url=http://subclipse.tigris.org/update_1.6.x
        不选择 Subclipse -> Subclipse Integration for Mylyn 3.x , 其它全选

在线安装mylyn
        同上,url(Myeclipse2013):http://download.eclipse.org/mylyn/snapshots/weekly

插件 #

myeclipse 2013 安装svn
        help -> Install from Site ->add
                name : Svn
                Location : http://subclipse.tigris.org/update_1.6.x
                        或
                        http://subclipse.tigris.org/update
        下一步
                不要选择Subclipse选项下的Subclipse Integration for Mylyn 3.x(Optional)
        一直下一步

本地安装svn插件

快捷键 #

alt /
ctrl shift f
    # 代码格式化
alt enter
    # 补全提示
f3
    # 跳转到声明
f2 显示类或方法的全限定名
ctrl + h 多文件搜索        
alt shift s
alt shift z :surround with 
ctrl /
ctrl shift /
F5 F6 F7
ctrl alt 上下
alt 上下
alt shift x j :运行
ctrl 1 显示错误红线的处理方法
ctrl t 显示继承关系
ctrl 左右 跳过单词
ctrl 上下滚屏
ctrl l 定位
输入时直接点分号就可以跳到最后
ctrl alt / 写过内容补全
字符串最后敲回车可以自动加入 + '\n' ""
ctrl shift T  openType 查找类关系
ctrl shift R  查找资源文件
alt shift A 矩形操作
alt 左右 返回代码上一层,进入代码下一层
ctrl o 获得outline
// TODO 标签
alt + shift + R 重构中的重命名
ctrl + shift + o 全局导包
ctrl + shift + m 局部导包
ctrl + shift + X  改为大写
ctrl + shift + g  查看方法被谁调用
ctrl + shift + h  输入类名,查看类继承关系
命令补全:syso main        alt + /
代码抽取:        alt + shift + M
代码自动生成get set                alt + shift +s
代码自动生成 — 重写equals hashCode  alt + shift + s
    

Ctrl+1 快速修复(最经典的快捷键,就不用多说了)
Ctrl+D: 删除当前行 
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交互位置(同上)
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)
Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性
Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)
Shift+Ctrl+Enter 在当前行插入空行(原理同上条)
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)
Ctrl+/ 注释当前行,再按则取消注释
Ctrl+O 快速显示 OutLine
Ctrl+T 快速显示当前类的继承结构
Ctrl+W 关闭当前Editer
Ctrl+K 参照选中的Word快速定位到下一个
Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)
Ctrl+/(小键盘) 折叠当前类中的所有代码
Ctrl+×(小键盘) 展开当前类中的所有代码
Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用

Alt+/来代替)
Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)
Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没

有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)
Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)
Ctrl+Shift+F4 关闭所有打开的Editer
Ctrl+Shift+X 把当前选中的文本全部变味小写
Ctrl+Shift+Y 把当前选中的文本全部变为小写
Ctrl+Shift+F 格式化当前代码
Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反

之)
下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift

开头的了)
Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力

)
Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)
Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)
Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)
Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能)
Alt+Shift+I 合并变量(可能这样说有点不妥Inline)
Alt+Shift+V 移动函数和变量(不怎么常用)
Alt+Shift+Z 重构的后悔药(Undo)
编辑
作用域 功能 快捷键 
全局 查找并替换 Ctrl+F 
文本编辑器 查找上一个 Ctrl+Shift+K 
文本编辑器 查找下一个 Ctrl+K 
全局 撤销 Ctrl+Z 
全局 复制 Ctrl+C 
全局 恢复上一个选择 Alt+Shift+↓ 
全局 剪切 Ctrl+X 
全局 快速修正 Ctrl1+1 
全局 内容辅助 Alt+/ 
全局 全部选中 Ctrl+A 
全局 删除 Delete 
全局 上下文信息 Alt+?
Alt+Shift+?
Ctrl+Shift+Space 
java编辑器 显示工具提示描述 F2
java编辑器 选择封装元素 Alt+Shift+↑
java编辑器 选择上一个元素 Alt+Shift+←
java编辑器 选择下一个元素 Alt+Shift+→
文本编辑器 增量查找 Ctrl+J 
文本编辑器 增量逆向查找 Ctrl+Shift+J 
全局 粘贴 Ctrl+V 
全局 重做 Ctrl+Y 

查看
作用域 功能 快捷键 
全局 放大 Ctrl+= 
全局 缩小 Ctrl+- 

窗口
作用域 功能 快捷键 
全局 激活编辑器 F12 
全局 切换编辑器 Ctrl+Shift+W 
全局 上一个编辑器 Ctrl+Shift+F6 
全局 上一个视图 Ctrl+Shift+F7 
全局 上一个透视图 Ctrl+Shift+F8 
全局 下一个编辑器 Ctrl+F6 
全局 下一个视图 Ctrl+F7 
全局 下一个透视图 Ctrl+F8 
文本编辑器 显示标尺上下文菜单 Ctrl+W 
全局 显示视图菜单 Ctrl+F10 
全局 显示系统菜单 Alt+- 

导航
作用域 功能 快捷键 
java编辑器 打开结构 Ctrl+F3 
全局 打开类型 Ctrl+Shift+T 
全局 打开类型层次结构 F4 
全局 打开外部javadoc Shift+F2
全局 打开资源 Ctrl+Shift+R 
全局 后退历史记录 Alt+← 
全局 前进历史记录 Alt+→ 
全局 上一个 Ctrl+, 
全局 下一个 Ctrl+. 
java编辑器 显示大纲 Ctrl+O 
全局 在层次结构中打开类型 Ctrl+Shift+H 
全局 转至匹配的括号 Ctrl+Shift+P 
全局 转至上一个编辑位置 Ctrl+Q 
java编辑器 转至上一个成员 Ctrl+Shift+↑ 
java编辑器 转至下一个成员 Ctrl+Shift+↓ 
文本编辑器 转至行 Ctrl+L 

搜索
作用域 功能 快捷键 
全局 出现在文件中 Ctrl+Shift+U 
全局 打开搜索对话框 Ctrl+H 
全局 工作区中的声明 Ctrl+G 
全局 工作区中的引用 Ctrl+Shift+G 

文本编辑
作用域 功能 快捷键 
文本编辑器 改写切换 Insert 
文本编辑器 上滚行 Ctrl+↑ 
文本编辑器 下滚行 Ctrl+↓ 

文件
作用域 功能 快捷键 
全局 保存 Ctrl+X 
Ctrl+S 
全局 打印 Ctrl+P 
全局 关闭 Ctrl+F4 
全局 全部保存 Ctrl+Shift+S 
全局 全部关闭 Ctrl+Shift+F4 
全局 属性 Alt+Enter 
全局 新建 Ctrl+N 

项目
作用域 功能 快捷键 
全局 全部构建 Ctrl+B 

源代码
作用域 功能 快捷键 
java编辑器 格式化 Ctrl+Shift+F
java编辑器 取消注释 Ctrl+\
java编辑器 注释 Ctrl+/
java编辑器 添加导入 Ctrl+Shift+M
java编辑器 组织导入 Ctrl+Shift+O
java编辑器 使用try/catch块来包围 未设置,太常用了,所以在这里列出,建议自己设置。
也可以使用Ctrl+1自动修正。 

运行
作用域 功能 快捷键 
全局 单步返回 F7 
全局 单步跳过 F6 
全局 单步跳入 F5 
全局 单步跳入选择 Ctrl+F5 
全局 调试上次启动 F11 
全局 继续 F8 
全局 使用过滤器单步执行 Shift+F5 
全局 添加/去除断点 Ctrl+Shift+B 
全局 显示 Ctrl+D 
全局 运行上次启动 Ctrl+F11 
全局 运行至行 Ctrl+R 
全局 执行 Ctrl+U 

重构
作用域 功能 快捷键 
全局 撤销重构 Alt+Shift+Z 
全局 抽取方法 Alt+Shift+M 
全局 抽取局部变量 Alt+Shift+L 
全局 内联 Alt+Shift+I 
全局 移动 Alt+Shift+V 
全局 重命名 Alt+Shift+R 
全局 重做 Alt+Shift+Y 

jrebel #

介绍
        热加载
使用:
        myeclipse根目录下配置自定义 插件
        window -> preferences -> JRebel中关联jar包,设定自动部署时间
    window -> preferences -> services -> tomcat -> tomcat6(可以配置是否启用jrebel和打印jrebel的日志)->jdk 加上资源分配参数与tomcat要加载的jar包:
                        -noverify -javaagent:D:\(修改为自己的目录)\jrebel.jar -Xmx512M -Xms512M -XX:MaxPermSize=1024m
        项目右键jrebel生成reble.xml,其中配置rebel要管理的项目在tomcat中的路径

运维

持续集成(CI/CD) #

# Continuous Integration(持续集成), Continuous Delivery(持续部署)
Jenkins

容器 #

docker
containerd

虚拟化 #

vagrant
    # 自动化虚拟机配置
parallels desktop
    # 苹果
xen
gnome boxes
hyper-v
    # 微软

KVM #

介绍
    kernel-based virtual machine, 使用linux自身的调度器进行管理,所以代码较少
        # 又叫qemu-system或qemu-kvm
    虚拟化需要硬件支持(如 intel VT技术或AMD V技术),是基于硬件的完全虚拟化
原理
    包含一个可加载的内核模块kvm.ko, 由于集成在linux内核中,比其他虚拟机软件高效
使用
    检查系统是否支持硬件虚拟化
        egrep '(vmx|svm)' --color=always /proc/cpuinfo

VMware #

安装
    安装后会创建两个虚拟网卡
设置
    edit -> preferences -> Hot Keys 设置退出快捷键
网络连接方式
    1.vm9自带的virtual network editor中选择桥接到有线网卡
    2.vm -> setting -> network adapter选项设置
        bridged(桥接):与主机平等,可以设置为同一个网段相互访问
        nat:通过虚拟网卡连接主机,共享网络
        host-only:单机模式

VirtualBox #

网络连接
NAT Bridged Adapter Internal Host-only Adapter
虚拟机->主机 × 默认不能,需设置
主机->虚拟机 × × 默认不能,需设置
虚拟机->其他主机 × 默认不能,需设置
其他主机->虚拟机 × × 默认不能,需设置
虚拟机间 × 同网络可以
方案
linux安装增强iso
iso位置
/usr/share/virtualbox
编译环境
kernel-devel
gcc
    共享剪切板与拖拽文件
        虚拟机启动后devices下设置
    共享文件夹
        linux下挂载
            mount -t vboxsf 共享名 /mnt/share
        windows下挂载
            我的电脑 右键 映射网络驱动器
    clone
        clone 时选择更新mac,并在虚拟机中网络连接设置中重写mac与ip
        配置主机间ssh免登录,远程ssh与所有主机免登录

PaaS #

OpenStack

DevOps #

自动化运维 #

tty.js
    # 浏览器运行命令
jenkins
    # java实现的持续集成工具
saltstack
    # 部署, 自动化运维
puppet
    # 自动化运维
selenium
    # 自动化运维
chef

Ansible #

# python实现的自动化部署工具
模式
    ad-hoc              # 批量命令
    playbook            # 任务编排,执行yml文件
安装
    pip install ansible
配置
    优先级
        export ANSIBLE_CONFIG=/etc/ansible.cfg
        ~/.ansible.cfg
        /etc/ansible.cfg
    ansible.cfg
        inventory = /etc/ansible/hosts
        library = /usr/share/ansible
        forks = 5
        sudo_user = root
        remote_port = 22
        host_key_checking = False
        timeout = 60
        log_path = /var/log/ansible.log
    hosts
        [mysql_test]
        192.168.0.1
        192.168.0.2
命令
    ansible
        通配符
            10.1.1.113
            '*'
            all
        -m
            command                     # 执行命令
                -a 'uptime'
            file                        # 操作文件
                -a "dest=/tmp/t.sh mode=755 owner=root group=root"                  # 改属性
                -a "src=/etc/resolv.conf dest=/tmp/resolv.conf state=link"          # 软链接
                -a "path=/tmp/resolv.conf state=absent"                             # 删除软连接
            copy
                -a "src=/a.cfg dest=/tmp/a.cfg owner=root group=root mode=0644"
            cron                        # 定时任务
                -a 'name="custom job" minute=*/3 hour=* day=* month=* weekday=* job="/usr/sbin/ntpdate 172.16.254.139"'
            group                       # 操作组
                -a 'gid=2017 name=a'    # 创建组
            user                        # 操作用户
                -a 'name=aaa groups=aaa state=present'          # 创建用户
                -a 'name=aaa groups=aaa remove=yes'             # 删除用户
            yum
                -a "state=present name=httpd"
            service
                -a 'name=httpd state=started enabled=yes'       # 开机启动
            ping
            script
                -a '/root/test.sh'
            shell
                -a 'ps aux|grep zabbix'
            raw                         # 同shell
            get_url
                -a 'url=http://10.1.1.116/a.ico dest=/tmp'      # 下载
            synchronize
                -a 'src=/root/a dest=/tmp/ compress=yes'        # 推送

        o-> 例子
        ansible '*' -m command -a 'uptime'
    ansible-doc         # 文档
    ansible-galaxy      # 上传/下载模块
    ansible-playbook    # 任务编排
    ansible-pull        # 拉配置
    ansible-vault       # 文件加密
    ansible-console     # REPL

资源管理 #

文档管理 #

Confluence
Git Wiki

版本 #

mercurial
    # 简称hg,分布式版本控制系统,比git好
clearQuest
    # IBM Rational提供的缺陷及变更管理工具。它对软件缺陷或功能特性等任务记录提供跟踪管理。提供了查询定制和多种图表报表。
clearcase
    # 配置管理的工具,只是SCM管理工具其中的一种。是RATIONAL公司开发的配置管理工具
spm
    # 构建sea.js项目
bower
    # 构建前端
redmine

Gradle #

介绍
    基于dsl(Groovy)声明项目自动化构建
环境
命令
    gradle
        -q                                      # --quiet, 只显示error
        init
            --type pom                          # 转换maven项目
        wrapper                                 # 生成可独立运行的打包脚本gradlew和gradlew.bat
配置
    build.gradle
        task hello {
            doLast {
                println 'Hello world!'
            }
        }
        task hello << {
            println 'Hello world!'
        }

        buildscript{}
        allprojects{}
        subprojects{}


    settings.gradle
        rootProject.name = 'choice-scm'
        include 'choice-scm-dao'


    gradle.properties
        org.gradle.parallel=true                # 开启并行编译
        org.gradle.daemon=true                  # 守护线程,在第一次编译时开线程并保持
        org.gradle.configureondemand=true       # 用新的孵化模式,加快编译
        org.gradle.caching=true                 # 启用缓存
        org.gradle.warning.mode=none            # 屏蔽warning
        org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=1g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

Git #

目录结构
    .git
        branches
        config  # 存放版本库git地址
规定
    HEAD
        # HEAD的版本号, HEAD^^ 表示HEAD之前两个的版本, HEAD~n 表示之前n个版本
    buffered stage branch head
        # buffered表示当前修改所在的版本,stage是buffered中文件add之后到的版本,branch是stage commit后到的分支(版本),head是远程仓库的最新版本
工作流程
    fork + pull / merge request 更新代码
    commit message, pr messsage 提交说明
        pr是功能展示,前面加"WIP:"
    user.name, user.email用公司的
    pr必需有人review, assign到人, 推动review
    pr不要大
命令
    git [command] --help
    git help submodule
    设置
        config
            --global http.proxy 'http://127.0.0.1:8123'
    仓库
        clone
        checkout                    # 切换到分支。检出原有文件替换
            -b                      # 创建并切换到分支
        branch                      # 创建并切换到分支
            -r                      # 指定操作远程分支
                -r origin/dev
            -a                      # 本地远程所有分支
            dev ef71                # 从ef71创建分支dev
            dev
            -d dev                  # 删除
            -D dev                  # 强制删除
        remote
            remove origin
            show                    # 显示仓库
            prune origin            # 删除远程没有而本地缓存的远程分支
            add origin git@bitbucket.org:outrun/www2.git
                    # 设置仓库
            set-url origin git@github.com:outrun/jeky
                    # 设置仓库url
        fetch                       # pull加merge
        pull origin master
            --allow-unrelated-histories
                # 本地有已存文件时,强行pull并检查冲突
        merge dev                   # 合并dev到当前分支
            --squash dev-bak        # dev-bak改动写到stash
        push origin master
            -u origin master        # 设定git push 默认参数
            origin :dev
                # origin +dev:dev
                # 强制替换掉原来版本
        commit                      # stage 提交到branch
            -a                      # 提交删改,忽略增加
            -m                      # 注释
            --amend                 # 合并到上次commit
        revert
            git commit -am 'revert'
            git revert revertid1 取消上次revert
                # ideaIDE操作 - local history - revert
            示例
                revert  -m 1 ea1    # 舍弃最近一次commit
        rebase master               # 相当于当前改动代码之前merge master
        reset
            --hard ea1              # 回退
        stash                       # 暂存buffered
            list                    # 显示stash
            drop                    # 删除暂存
            pop                     # 恢复并删除暂存
            apply stash@{0}         # 恢复暂存
        tag
            -a tag1                 # 添加tag1
            -m 'a'                  # 注释
            -d tag1                 # 删除tag1
            示例
                git tag -a v1.0.1  -m 'a' e67
        show tag1                   # 查看tag1的信息
    文件
        add
            -A                      # 递归
        mv a b                      # 重命名
        rm                          # buffered和stage中都删除
            --cached                # 只删除git stage中文件, 不实际删 
        log                         # HEAD到指定版本号之前的log
            --oneline               # 每个记录显示一行
            --stat                  # 文件名差异
            -p                      # 细节差异
            -2                      # 文件最近2次差异
        reflog                      # 包括reset前的版本号
        diff master dev             # 对比分支差异,可指定到文件。默认对比buffered和stage的差异
            --cached                # 对比stage和branch的差异
        ls-files
            -u                      # 显示冲突文件
            -s                      # 显示标记为冲突已解决的文件
            --stage                 # stage中的文件
        submodule
            init                    # 初始化本地配置文件
            update
                --init --recursive  # 同步项目中的submodule
设置
    .gitignore

    .git/config

    ~/.gitconfig
        [commit]
        template=/t.txt
            # 每次commit会打开模板
    代理
        git config --global https.proxy http://127.0.0.1:1080
        git config --global https.proxy https://127.0.0.1:1080
        git config --global http.proxy 'socks5://127.0.0.1:1080' 
        git config --global https.proxy 'socks5://127.0.0.1:1080'

        git config --global --unset http.proxy
        git config --global --unset https.proxy
子模块
    .gitmodules
        [submodule "a"]
            path = a
            url = ssh://a.git
    git submodule update --init --recursive  
方案
    回退commit
        git reset --hard ea1
            # 进行回退
        git push -f
            # 强制提交
        git clean -xdf
            # 一般配合git reset使用, 清除已有的改动
    补充commit
        git commit --amend
        git push origin +a:a
    合并commit
        git rebase -i cf7e875   # 合并Head到cf7e875 commit
        修改rebase记录
            pick xxxx
            s yyyy
            s zzzz
        git status              # 查看冲突
        git add .               # 解决冲突提交
        git rebase --continue
        修改commit记录
    远程回退
        git revert id
    忽略文件
        git add 逆操作
            git rm --cached a
        远程保留,忽略本地
            git update-index --assume-unchanged a
            恢复 git update-index --no-assume-unchanged a
        远程删除,忽略本地
            git rm --cached a
            恢复 git add -A a
        远程不论,忽略本地
            .gitignore
    删本地分支
        git branch -D test
    删除远程分支
        git push origin --delete test
        或
            git branch -r -d origin/test
            git push origin :test
    恢复历史版本文件
        git reset ba5798aff7778c95252b9e01e924dddb5811bcd7 courseModel.js
        git checkout -- courseModel.js
        git push origin +master:master                # 提交回退版本到远程
    查看修改的内容
        git show
            # 与上个commit 比较
        git whatchanged
        git log --stat --date=relative
    删除历史
        git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch .idea' --prune-empty --tag-name-filter cat -- --all
        git push origin main --force
        rm -rf .git/refs/original/
        git reflog expire --expire=now --all
        git gc --prune=now
        git gc --aggressive --prune=now
    合并commit历史
        git branch test-bak
        git reset --hard ea1
        git merge --squash test-bak
        git push origin test -f
        git branch -D test-bak
    打tag
        git tag                     # git tag -l 'v1.*' 通配查找
        git tag -a v1.0 -m "a"      # git tag -a v1.0 ba1 给commit打标签
        git tag -a v1.0 -m "a" ea1  # 指定commit
        git show v1.0
        git checkout v1.0
        git push origin v1.0        # git push origin -tags 将本地所有标签提交
        git tag -d v1.0
        git push origin --delete tag v1.0 
            # git push origin :refs/tags/v1.0c
    查tag的commit
        git show 1.4.1
        git log --pretty=oneline 1.4.0 1.4.1
    fork跨网站git
        git remote add upstream git@github.com:xuyuadmin/xxljob.git
        git fetch upstream
        git merge upstream/master --allow-unrelated-histories
    文件损坏错误error object file is empty
        find .git/objects/ -type f -empty | xargs rm
        git fetch -p
        git fsck --full
    统计某人代码
        git log --author="$(git config --get user.name)" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }' -
    统计所有人代码
        git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
    共添加或修改行数
        git log --stat|perl -ne 'END { print $c } $c += $1 if /(\d+) insertions/'
    pr
        介绍
            fork与pull request

        fork后本地
            git clone git@github.com:chenduo/auth.git
            git remote add upstream git@github.com:Meiqia/auth.git
            git merge upstream/main 
            git push origin main
        本地合并更新
            git checkout master
            git fetch upstream
                # fetch远程仓库
            git rebase upstream/master
                # 合并远程master
            git push
            git checkout branch1
            git rebase master
        pr追加
            git commit --amend
                # 更新本地的本次commit,不产生新的commit
            git push origin +branch1:branch1
                # 使用本地的commit覆盖远程分支的有问题的commit
        处理pr
            git fetch origin
            git checkout -b pr1 origin/pr1
            git checkout master
            git merge --no-ff pr1
            git reset --hard
            git revert -m 1 ea1
                # 舍弃pr
            git commit -am 'revert'
            git revert revertid1 取消上次revert
                # intellji - local history - revert
            git push origin master
    开发
        提交
            git pull eoecn dev
                # 等于git fetch加git merge
            git diff
                # buffer与HEAD的差异(不包括新建文件)
            git add -A .
                # 添加到stage
            git status
                # stage与HEAD的差异
            git diff --cached/--stage
                # stage与HEAD的详细差异
            git diff HEAD
                # buffer, stage与HEAD的详细差异
            git commit -am 'a'
            git push origin dev
            网站上点pull request
    代码审查
        git blame -L 60,60 [filename]
        git blame -L 60,60 --reverse 5534e1b4b..HEAD [filename]      
            # 版本范围内某行代码提交记录
        git show [commit id]

github
    ssh -T git@github.com
        # 检查github ssh是否设置成功
插件
    octotree    # 树形显示

SVN #

linux下移植的版本控制器
默认端口: 3690
## 目录结构
    conf:配置文件
    db:数据库
    hooks:勾子(自定义功能)
    locks:文件锁
## 命令
### 服务器
    svn --version
    svnadmin create c:\svn        # 创建仓库
                                        ## hooks勾子 locks锁 conf db
    svnserve -h
    svnserve -d -r c:\svn      # 启动服务(-d是后台运行,windows不支持,需要创建服务)
                                            ## --listen-port 3691 指定监听端口
    windows 下注册服务
                    sc create 服务名 binPath= "d:/suversion/bin/svnserve --service -r c:\svn" displayName= "显示名"
                        # 注意双引号前面要有空格
                    sc delete 服务名

    使用多个仓库
            svnadmin create d:\svn2 创建仓库以后
            svnserve -d -r d:\svn2 --listen-port 3691        配置用另一个服务端口启动该仓库        # svn默认启动端口是3690
            svn://192.168.10.3:3691        来访问该仓库
#### 客户端
    添加项目
            svn add test/
            svn ci -m "first"                # svn commit -m "fisrt"
                                            ## ci是checkin
    检出
            svn checkout svn://192.168.0.2/framework
    显示所有分支(目录)
            svn ls svn://192.168.0.2/fr --verbose
    创建分支
            svn copy svn://192.168.0.2/repo/trunk/ svn://192.168.0.2/repo/branches/try-sth -m 'make branch try-sth'
                    # 注意trunk后面要有/
    更换本地分支
            svn switch svn://192.168.0.2/repo/branches/try-sth
## 配置
    conf/svnserve.conf
            anon-access = read                # 匿名用户权限
            auth-access = write                # 登录用户权限
                                    # write权限包括read权限
                                    # none没有验证无权限(匿名权限)
            password-db = passwd        # 加载conf/passwd文件(中的用户帐户)
            authz-db = authz                        #开启权限控制
                    同目录authz文件中配置权限
                    [/]                               # 对根目录设置权限
                    * = r                            # 所有人都可读
                    outrun = rw                # 配置所有版本库只读,outrun可读可写
                    @admin = rw                # @组名    对组进行引用
            realm = aa
                                    # 认证域名称, 本svn路径为 svn://192.168.0.2/aa
    conf/authz

    conf/passwd
            [groups]
                    admin = outrun
    例子
        authz
                [groups]
                admin = a1, a2
                [/]
                @admin = rw
                a3 = rw
                * = r
        passwd
                [users]
                a1 = 123
                a2 = 123
                a3 = 123
        svnserve.conf
                [general]
                anon-access = none
                auth-access = write
                password-db = passwd
                authz-db = authz
                realm = trunk
                force-username-case = none
## 工具
    tortoiseSVN
        下载
                    右键 svn checkout 选择版本 下载 (show log 查看日志)

            上传
                    第一次提交 右键 tor.../import
                    svn://192.168.10.188     # 输入用户名、密码登录
                    第二次提交 右键 commit
            还原
                    右键 tor.../Revert 还原其中的文件
            多人
                    右键 svn update ,更新另一个人提交的文件内容
            新建文件的提交
                    tor../add 或 commit的时候选择该文件
                    tor./Repo-browser,浏览仓库
            加锁文件    # 只有自己在不提交更改的前提下才可以解锁
            tor../get lock      # 不会改变版本
                    tor../release lock  # 解锁,但是新下载的工程不可以再解锁,如果删除原工程则无法解锁
            冲突
                    当前版本已经有人修改后commit的话提示版本已经过时
                    update:下载所有版本,右键 tor../edit conflicts -> mark as resolved确定解决
                    # 避免冲突:减少公共修改时间,重写前更新
            使用经验
                    TortoiseSVN -> Setting -> Saved Data 可以清空自动登录

    svn的myeclipse插件:
                    # eclipse6中不能用,eclipse7每次报错,能用,eclipse8报错一次,能用 eclipse10不报错
            1.复制插件文件夹features与plugins到/myeclipse 10/dropins/文件夹中
            2.创建目录/myeclipse 10/my_plugin/svn/
                            复制插件文件夹features与plugins到/myeclipse 10/my_plugin/svn/文件夹中
                            /myeclipse 10/dropins/添加svn.link文件 ,内容为:path=my_plugin\\svn                # 这里写相对路径
            3.使用:重启myeclipse,弹出确认窗口(也可以从window -> show view中找到svn的视图)
                    项目:右键->share project 上传项目到svn(bug 第一次只上传空文件夹,再右键Team/提交 时上传项目文件)
                            再右键就可以对该项目进行一系列的操作了
                    导入项目:file -> import -> svn

    rapidsvn

Ant #

功能
    js压缩
    自动发布
build.xml
    示例
    <?xml version="1.0" encoding="UTF-8"?>
    <project default="execute">
            <target name="compile">
                    <javac destdir="." srcdir="."/>
            </target>

            <target name="execute" depends="compile">
                    <java classpath="." classname="HelloWorld"/>
            </target>
    </project>

Maven #

仓库
    mvnrepository.com
依赖范围
    compile     # 默认,对编译、测试、运行有效
    test        # 对测试有效
    runtime     # 对测试和运行有效
    provided    # 编译和测试有效
    system      # 本地仓库
    import
源
    阿里云maven: https://maven.aliyun.com/mvn/view
mvn                                         # 相当于mvn compile
    全局
        -version                            # 版本
        -e                                  # 错误详情
        help:describe                       # help插件的describe
            -Dplugin=help                   # 显示help插件的详情
            -Dfull                          # 显示完整参数
        help:effective-pom                  # 显示默认设置
    生成
        archetype:create                    # 创建java项目
            -DgroupId=com.outrun
            -DartifactId=erp
            -Dversion=0.0.1-SNAPSHOT
            -DarchetypeArtifactId=maven-archetype-webapp                            # 指定模板为webapp
        archetype:generate                  # 向导创建项目
        site                                # 产生html文档
        source:jar                          # 源码打包
        generate-sources                    # 生成源码, 如xdoclet
        eclipse:eclipse                     # 生成或转化成eclipse工程
        eclipse:clean                       # 清除eclipse设置
        idea:idea                           # 生成idea项目
        install                             # compile, package后, 保存到本地仓库
            -X                              # 显示依赖
            -Dmaven.test.skip=true          # 跳过测试
            -rf 模块名                       # 从指定模块从新开始
    执行
        validate                            # 项目验证
        verify                              # 验证包
        compile                             # 编译
            exec:java                       # 编译完成后,执行java main方法
        test-compile                        # 编译测试代码
        test                                # 运行测试
            -skipping                       # 跳过
                compile                     # 不编译
                test-compile                # 不编译测试
        integration-test                    # 集成测试
        package                             # 打包
            -Dmaven.test.skip=true          # 跳过单元测试,不编译
            -DskipTests                     # 跳过单元测试,编译
        clean                               # 清除编译
            install-U                       # 强制更新
            package                         # 编译成jar包
        deploy                              # install后, 上传
        jar:jar                             # 打jar包
    插件
        jetty:run                           # 引入jetty-plugin后, 运行jetty
        tomcat:run
    分析
        dependency:list                     # 列出依赖
        dependency:tree                     # 列出依赖树
        dependency:analyze                  # 依赖分析, 未使用的做标记
        dependency:resolve                  # 列出已解决的依赖
        dependency:sources                  # 下载源码
        dependency:copy-dependencies        # 得到jar包
常用
    分析包依赖
        mvn dependency:tree -Dverbose -Dincludes=org.apache.commons:commons-lang3
    清理打包文件
        mvn clean package -DskipTests
    idea工具
        打包了带main方法的jar不能引用
        在父项目运行mvn package, model中运行会找不到其它model
        model运行前先mvn package
    手动添加依赖
        mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc7 -Dversion=12.1.0.2 -Dpackaging=jar -Dfile=ojdbc7.jar
配置
    <groupId>                               # 包名
    <artifactId>                            # 项目名
    <version>
    <packaging>                             # 打包方式, war, jar

    <parent>                                # 父模块

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Dalston.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>                              # 子模块继承
        <dependency>
            <groupId>
            <artifactId>
            <version>
                LATEST
                ${spring-cloud.version}         #引用properties中定义的变量
            <scope>                             # 何时使用
                compile
                provided                        # 类似compile
                runtime
                test
                system
        </dependency>
    </dependencies>

    <dependenciesManager>                       # 子模块不继承, 继承时需要声明
        <dependencies>
    </dependenciesManager>

    <build>
        <plugins>
            <plugin>
                <groupId>
                <artifactId>
            </plugin>
        </plugins>
    </build>
插件
    介绍
        按顺序执行,完成maven生命周期
        无配置时调默认插件
    生命周期(lifecycle)顺序
        clean                                   # 清除target目录
        resources                               # 复制resources下文件到target/classes
        complie                                 # 包含resources, 编译java下文件到target/classes
        testResources                           # 复制test/resources下文件到target/test-classes
        testCompile                             # 包含testResources, 编译test/java下文件到target/test-classes
        test                                    # 包含resources, compile, testResources, testCompile, test
        package
        jar                                     # 打包class文件, 配置文件, 不打包lib
        install
    
    maven-clean-plugin
    maven-resources-plugin
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-resources-plugin</artifactId>  
            <version>2.6</version>  
            <executions>  
                <execution>  
                    <id>copy-resources</id>  
                    <phase>validate</phase>
                    <goals>  
                        <goal>copy-resources</goal>  
                    </goals>  
                    <configuration>  
                        <outputDirectory>${project.build.outputDirectory}</outputDirectory>  
                        <resources>  
                            <resource>  
                                <directory>src/main/${deploy.env}/applicationContext.xml</directory>  
                                <excludes>
                                    <exclude>WEB-INF/*.*</exclude>
                                </excludes>
                                <filtering>false</filtering>  
                            </resource>  
                        </resources>  
                    </configuration>  
                    <inherited></inherited>  
                </execution>  
            </executions>  
        </plugin>  
    maven-compiler-plugin
    maven-surefire-plugin                       # 对应test, 单元测试
    maven-dependency-plugin                     # 打包lib
    maven-jar-plugin
        <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-jar-plugin</artifactId>
             <version>2.6</version>
             <configuration>
                <archive>
                     <manifest>
                         <addClasspath>true</addClasspath>
                         <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>com.xxx.xxxService</mainClass>
                   </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>                                # 单独打包lib
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.10</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    maven-assembly-plugin                       # 打包lib, 有bug缺失spring xds文件, 同级jar会冲突
        <plugin>
             <artifactId>maven-assembly-plugin</artifactId>
             <configuration>
                 <descriptorRefs>
                     <descriptorRef>jar-with-dependencies</descriptorRef>
                 </descriptorRefs>
                 <archive>
                     <manifest>
                         <mainClass>com.xxx.xxxService</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    maven-shade-plugin                          # 打包lib, 同级jar会冲突, 提示SF,DSA,RSA冲突,排除META-INF相关文件
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <filters>
                            <filter>
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>
                        <transformers>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.handlers</resource>
                            </transformer>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.schemas</resource>
                            </transformer>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.tooling</resource>
                            </transformer>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.xxx.xxxInvoke</mainClass>
                            </transformer>
                        </transformers>
                        <minimizeJar>true</minimizeJar>
                        <shadedArtifactAttached>true</shadedArtifactAttached>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    maven-install-plugin
    spring-boot-maven-plugin
    gradle-maven-plugin
    protobuf-maven-plugin
    build-helper-maven-plugin                   # 用于指定自定义目录
    dockerfile-maven-plugin                     # root用户直接打包到docker images
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>dockerfile-maven-plugin</artifactId>
            <version>1.4.10</version>
            <configuration>
                <repository>${project.artifactId}</repository>
                <contextDirectory>./</contextDirectory>
                <tag>${project.version}</tag>
                <buildArgs>
                    <JAR_FILE>mqtt/target/*.jar</JAR_FILE>
                </buildArgs>
            </configuration>
        </plugin>
        ./Dockerfile
            FROM primetoninc/jdk:1.8

            #ADD mqtt/target/*.jar app.jar
            ARG JAR_FILE

            COPY ${JAR_FILE} /opt/app.jar

            ENTRYPOINT ["java", "-jar", "/app.jar"]
        mvn package dockerfile:build
方案
    新项目安装
        mvn clean install -DskipTests
        mvn install -rf :模块名 -DskipTests     # 指定模块开始
    ojdbc14本地加载
        # oracle是收费的,所以不能直接下载到驱动
        o-> mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.4.0 -Dpackaging=jar -Dfile=ojdbc14-10.2.0.4.0.jar
        o-> 把ojdbc14-10.2.0.4.0.jar复制到目录下: /home/outrun/.m2/repository/com/oracle/ojdbc14/10.2.0.4.0/
        o-> /home/outrun/.m2/repository/com/oracle/ojdbc14/下会产生maven-metadata-local.xml文件存放maven引入依赖
        o-> 项目中引入本地依赖
            <dependency>
                <groupId>com.oracle</groupId>
                <artifactId>ojdbc14</artifactId>
                <version>10.2.0.4.0</version>
                </dependency>
    代理
        复制$M2_HOME/conf/settings.xml到.m2/
        settings.xml
            <proxies>
                <proxy>
                  <id>my-proxy</id>
                  <active>true</active>
                  <protocol>http</protocol>
                  <host>localhost</host>
                  <port>8123</port>
                  <!--
                  <username>admin</username>
                  <password>admin</password>
                  <nonProxyHosts>repository.mycom.com|*.google.com</nonProxyHosts>
                  -->
                </proxy>
            </proxies>

代码 #

github
bitBucket
gitee.com
    # 码云
sentry
    # 产品error tracing
gerrit
    # code review 工具
coverallx
    # github上项目的coverage测试覆盖率条目由它提供服务
circleCI
    # github代码测试
travis-ci
    # 利用github hook测试
fitness
    # 自动单元测试
coverity
    # 代码静态检查
www.webpagetest.org
    # 测试网站性能

GitLab #

仓库 #

Nexus #

# maven, npm, go, docker, yum等

JFrog #

# 全语言二进制仓库

CMDB #

# configuration management database

Bt-Panel #

# 宝塔面板,服务器运维面板

JumpServer #

# 跳板机

功能 #

认证 #

SSH(Secure Shell) #

特点
    1.加密和压缩:http与ftp都是明文传输
    2.ssh有很多子协议,实现不同功能:如sftp,scp
    3.端口:22
配置
    修改ip地址:
        有虚拟机时:先设置虚拟机的连接方式是桥接
        图形界面直接修改(或重启到root用户的图形界面修改)
        命令修改
            /etc/network/interfaces
                auto eth0
                iface eth0 inet static
                address ip地址
                netmask  子网掩码
                gateway  网关
                broadcast 广播地址
                dns-nameservers DNS
            重启网络服务:/etc/init.d/networking restart,
    /etc/ssh/sshd_config
        PasswordAuthentication no
            # 关闭密码登录
        PermitRootLogin no
            # 关闭root登录
命令
    ssh outrun@10.1.1.1
        # -p 22 端口
        # PubkeyAuthentication=no 不公钥登录
免登录
        ssh-keygen -t rsa
            # 一直回车,生成~/.ssh/id_rsa 与 id_rsa.pub两个文件
        ssh-copy-id -i 192.168.56.11
            # 这样就可以免登录访问192.168.56.11了
            ## ssh-copy-id -i localhost 免登录自己

        或
        把A机下的1中生成的id_rsa.pub的内容复制到B机下,在B机的.ssh/authorized_keys文件里,这样可以多个主机对B机进行免登录
sshpass
    介绍
        命令行密码登录
    命令
        sshpass  -p zlycare@123 ssh zlycare@10.162.201.58

OpenVPN #

安装
    yum install openvpn easy-rsa lzo lzo-devel openssl openssl-devel -y
    或编译安装openvpn
        mkdir –p /usr/local/openvpn && cd /usr/local/openvpn/
        ./configure --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib
        make
        make install

生成证书
    目标
        服务器: ca.crt、server.key、server.crt、dh.pem
        客户端: ca.crt、client.key、client.crt
    查找模板
        find / -name "vars.example" -type f                         # vars文件
        find / -name "server.conf" -type f                          # server.conf文件
    进入目录easy-rsa
        cd /usr/local/openvpn/openvpn-2.0.9/easy-rsa/2.0/
        cd /usr/share/easy-rsa/3.0.3/
    设置vars
        cp vars.example vars
        vars文件
            set_var KEY_COUNTRY="CN"
            set_var KEY_PROVINCE="BJ"
            set_var KEY_CITY="Beijing"
            set_var KEY_ORG="linux"
            set_var KEY_EMAIL="test@example.net"
            # set_var EASYRSA_NS_SUPPORT "yes"                      # 客户端配置ns-cert-type server时配置
    生成server文件
        # 配置文件在/etc/easy-rsa或 .../openvpn/easy-rsa
        rm -rf pki
        ./easyrsa init-pki                                          # pki目录
        ./easyrsa build-ca  nopass                                  # 回车过, 生成ca.crt
        ./easyrsa gen-req vpnserver nopass                          # 回车过, 生成vpnserver.key, vpnserver.req(密钥对、证书请求文件)
        ./easyrsa sign server vpnserver                             # 生成vpnserver.crt(ca.crt与vpnserver.req签名)
        ./easyrsa gen-dh                                            # 生成dh.pem(diffie hellman)
        cp -r ../3.0.3/ ~
    生成client文件
        rm -rf pki
        ./easyrsa init-pki
        ./easyrsa gen-req client nopass                             # 回车过, 生成client.key, client.req
        cp pki/reqs/client.req ~/3.0.3/pki/reqs/
        cp pki/private/client.key ~/3.0.3/pki/private/
        cd ~/3.0.3
        ./easyrsa sign client client                                # 生成client.crt(ca.crt与client.req签名)
    移动server文件到openvpn配置目录
        cp pki/{ca.crt,dh.pem} /etc/openvpn/server/
        cp pki/private/vpnserver.key /etc/openvpn/server/
        cp pki/issued/vpnserver.crt /etc/openvpn/server/
        cp server.conf /etc/openvpn/server
    下载client文件
        pki/ca.crt
        pki/private/client.key
        pki/issued/client.crt
server.conf
    cp -p ../../sample-config-files/server.conf /etc/openvpn
    o-> server.conf
        ;local 172.21.223.196
        port 1194
        proto udp
        dev tun

        ca /etc/openvpn/ca.crt
        cert /etc/openvpn/server.crt
        key /etc/openvpn/server.key
        dh /etc/openvpn/dh1024.pem

        server 192.168.200.0 255.255.255.0
        ifconfig-pool-persist ipp.txt
        ;client-config-dir "C:\\Program Files\\OpenVPN\\ccd"        # 支持TLS client
        push "route 0.0.0.0 0.0.0.0"
        keepalive 10 120

        cipher AES-256-CBC
        comp-lzo                                                    # 减少带宽
        persist-key
        persist-tun

        status openvpn-status.log
        log /var/log/openvpn.log

        verb 3
        explicit-exit-notify 1                                      # 只能udp协议使用
    sudo openvpn --config /etc/openvpn/server.conf --daemon
    netstat -anulp | grep 1194
linux配置
    iptables
        vim /etc/sysctl.conf
            net.ipv4.ip_forward = 1     # 开启路由转发
        sysctl -p
        iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -j SNAT --to-source 45.55.56.16
    firewall
        firewall-cmd  --add-service=openvpn --zone=public --permanent
        firewall-cmd --reload
client配置
    o-> client.ovpn
        client
        dev tun
        proto udp
        remote 45.55.56.16 1194
        resolv-retry infinite
        nobind
        ca ca.crt
        cert client.crt
        key client.key
        ;ns-cert-type server
        cipher AES-256-CBC
        comp-lzo
        persist-key
        persist-tun
        verb 3
        mute 20
    sudo openvpn --config client.ovpn
        # --user outrun
        # --auth-nocache
        # askpass pass.txt 放密码到文件
    o-> 免密码连接
        #!/usr/bin/expect -f
        spawn sudo openvpn --config /home/outrun/.openvpn/meiqia-vpn-ldap.ovpn
        # match_max 100000
        expect "*?assword*:*"
        send -- "1234\n"
        expect "*Username:*"
        send -- "outrun\n"
        expect "*Password:*"
        expect "#"
案例
    代理http上网                                                     # tcp连接国内服务器会被reset
        server.conf
            dev tap
            proto tcp

            push "redirect-gateway def1 bypass-dhcp"
            push "dhcp-option DNS 114.114.114.114"
            push "dhcp-option DNS 8.8.8.8"

            client-to-client
            ;explicit-exit-notify 1
        client.ovpn
            dev tap
            proto tcp
    改成用户名密码认证
        服务器
            server.conf
                auth-user-pass-verify /etc/openvpn/server/checkpsw.sh via-env
                verify-client-cert none
                username-as-common-name
                tls-auth /etc/openvpn/server/ta.key 0
                script-security 3
            checkpsw.sh
                #!/bin/sh
                PASSFILE="/etc/openvpn/server/user/psw-file"
                LOG_FILE="/etc/openvpn/server/log/openvpn-password.log"
                TIME_STAMP=`date "+%Y-%m-%d %T"`

                if [ ! -r "${PASSFILE}" ]; then
                  echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
                  exit 1
                fi

                CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`

                if [ "${CORRECT_PASSWORD}" = "" ]; then
                  echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
                  exit 1
                fi

                if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
                  echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
                  exit 0
                fi

                echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
                exit 1
            chmod 645 checkpsw.sh
            mkdir user
            mkdir log
            user/psw-file
                outrun asdfasdf
            openvpn --genkey --secret ta.key
        客户端
            下载ta.key
            client.ovpn
                ;cert client.crt
                ;key client.key
                auth-user-pass
                tls-auth ta.key 1

Shadowsocks #

安装
    sudo yum -y install epel-release
    sudo yum -y install python-pip
    sudo pip install --upgrade pip
    sudo pip install shadowsocks
服务器
    server.json
        {
            "server":"0.0.0.0",
            "server_port":443,
            "local_address":"127.0.0.1",
            "local_port":1080,
            "password":"asdfasdf",
            "timeout":300,
            "method":"aes-256-cfb",
            "fast_open":false,
            "workers":5
        }
    ssserver -c server.json -d start
中继代理
    client.json
        {
            "server":"47.74.230.238",
            "server_port":443,
            "local_address": "127.0.0.1",
            "local_port":1080,
            "password":"asdfasdf",
            "timeout":300,
            "method":"aes-256-cfb"
        }
    sslocal -c client.json
协议转换
    安装polipo
    /etc/polipo/config
        logSyslog = false
        logFile = "/var/log/polipo/polipo.log"
        socksParentProxy = "127.0.0.1:1080"
        socksProxyType = socks5
        chunkHighMark = 50331648
        objectHighMark = 16384
        serverMaxSlots = 64
        serverSlots = 16
        serverSlots1 = 32
        proxyAddress = "0.0.0.0"
        proxyPort = 8123
    polipo -c /etc/polipo/config
客户端
    switchOmega
        SOCKS5 127.0.0.1 1080
        http 127.0.0.1 8123
    环境变量
        export http_proxy=http://127.0.0.1:8123
        export https_proxy=http://127.0.0.1:8123

OpenDJ #

介绍
    open source directory services for the java platform
    LDAPv3的认证系统

OpenSSL #

使用
    openssl genrsa -out server.key 1024
        # 生成私钥
    openssl rsa -in server.key -pubout -out server.pem
        # 生成公钥
    openssl req -new -key ca.key -out ca.csr
        # 通过私钥生成csr(certificate signing request, 证书签名请求)文件
    openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
        # 通过csr生成自签名ca证书,用来颁发证书
    openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
        # 向自己的ca机构申请签名,需要ca.crt, ca.key, server.csr, 得到带有CA签名证书。用来给客户端验证公钥属于该域名
        # 客户端发起安全连接前会获取服务器端的证书, 并通过ca证书验证服务器端证书的真伪,并对服务器名称, IP地址等进行验证
    openssl s_client -connect 127.0.0.1:8000
        # 测试证书是否正常

应用控制 #

Forever #

openvpn --config openvpn.conf
        # 连接
        ## --user outrun
        ## --auth-nocache
        # askpass pass.txt 放密码到文件

Supervisor #

介绍
    监视重启
命令
    supervisord
        # 启动后台服务
    supervisorctl
        status          # 查看所有
        update          # 重载配置
        reload          # 

        start
        stop
        restart
        start all
        stop all
        restart all

配置
    /etc/supervisor/supervisord.conf
        [include]
        files = /etc/supervisor/conf.d/*.conf
    /etc/supervisor/conf.d/app.conf
        [program:tri]
        command=/data/apps/tri/bin/tri --config /data/apps/tri/conf/config.tri.toml
        directory=/data/apps/tri
        autostart=true
        autorestart=true
        startsecs=10
        startretries=3
        stdout_logfile=/data/logs/supervisor/tri/access.log
        stdout_logfile_maxbytes=100MB
        stdout_logfile_backups=20
        stderr_logfile=/data/logs/supervisor/tri/stderr.log
        stderr_logfile_maxbytes=100MB
        stderr_logfile_backups=2
        environment=ASPNETCORE_ENVIRONMENT=Production       # 环境变量
        user=root                                           # 执行的用户

PM2 #

介绍
    带有负载均衡功能的node应用进程管理器
    内建负载均衡(使用node cluster模块)
    后台运行
    热重载
    停止不稳定进程,如无限循环
安装
    npm install -g pm2
命令
    pm2 start app.js
    pm2 stop
    pm2 restart
    pm2 status
    pm2 info 1
    pm2 logs 1

个人操作 #

Ngrok #

# 内网穿透

VSFTP #

介绍
    默认端口21
用户
    匿名用户
        默认为ftp或anonymous
        目录在/var/ftp
        只能下载不能上传
    本地用户
        用户名和密码与本地用户相同
        目录为该用户的登录目录
    虚拟用户
        文件配置名字和密码
        要生成认证文件
文件
    /usr/sbin/vsftpd                    # 主程序
    /etc
        /rc.d/init.d/vsftpd             # initd启动脚本
        /vsftpd.conf                    # 主配置
        /vsftpd.ftpusers                # 用户黑名单, 一行一名字
        /vsftpd.user_list               # 用户黑/白名单, 一行一名字
        /pam.d/vsftpd                   # pam认证文件
    /var
        /ftp                            # 匿名用户主目录
        /ftp/pub                        # 匿名用户的下载目录
默认用户与组
    用户
        adduser -d /var/ftp -g ftp -s /sbin/nologin ftp
    组
        ftp
命令
    systemctl start vsftpd
最小可用配置
    /etc/vsftpd.conf
        listen=YES
        local_enable=YES
        xferlog_enable=YES
        connect_from_port_20=YES
        pam_service_name=vsftpd
        seccomp_sandbox=NO

        # Enable upload by local user.
        write_enable=YES

        # Enable read by anonymous user (without username and password).
        secure_chroot_dir=/var/empty
        anonymous_enable=YES
        anon_root=/srv/ftp
        no_anon_password=YES
使用
    /etc/vsftpd.conf
        anonymous_enable=YES            # 允许匿名用户
        local_enable=YES                # linux用户可登录, 虚拟用户可登录
        write_enable=YES                # 可写
        local_umask=022                 # user文件权限, 默认077
        dirmessage_enable=YES           # 显示目录信息
        xferlog_enable=NO               # 记录上传/下载日志
        connect_from_port_20=YES        # 确保用20端口传输
        ls_recurse_enable=NO            # 允许ls -R
        allow_writeable_chroot=NO
        listen=NO
        listen_ipv6=YES                 # 包含ipv4,和listen只能有一个YES

        pam_service_name=vsftpd
        local_root=/home/outrun/Downloads                       # linux用户默认目录。会先登录到用户目录,再切换到这里
        ftp_username=ftp                # 匿名用户名,默认ftp
        tcp_wrappers=NO                 # 结合tcp_wrapper限制ip登录
            /etc
                /hosts.allow            # 允许地址
                /hosts.deny             # 拒绝地址
    useradd -d /home/ftp ftp
    mkdir /home/ftp && chown ftp /home/ftp && chgrp ftp /home/ftp
    systemctl restart vsftpd
    打开tcp, udp端口21, 20
用户
    匿名登录
        /etc/vsftpd/vsftpd.conf
            anonymous_enable=YES
            anon_root=/home/outrun/Downloads                    # 匿名用户默认目录
            anon_upload_enable=YES      # 匿名可写,要求write_enable=YES
            anon_mkdir_write_enable=YES # 匿名创建文件夹
            anon_other_write_enable=YES # 匿名可删除、重命名
            anon_umask=000              # 如创建077文件,anon_umask=022时,则为055 
        chmod 777 dir1

    本地用户登录
        /etc/vsftpd/vsftpd.conf
            anonymous_enable=NO
            userlist_enable=YES
            userlist_deny=YES           # YES时user_list为黑名单
            userlist_file=/etc/vsftpd/user_list

            chroot_local_user=YES       # 默认可以chroot到用户home。YES时, chroot_list_file指定黑名单
            chroot_list_enable=YES
            chroot_list_file=/etc/vsftpd/chroot_file            # 名单用户只能访问自己home
            allow_writeable_chroot=YES  # 不限制chroot目录可写
        /etc/vsftpd/ftpusers
        /etc/vsftpd/user_list
            注释root
    虚拟用户

SimpleHTTPServer #

pythom -m SimpleHTTPServer 8080

Pyshark #

介绍
    包嗅探

项目用工具 #

知识库 #

confluence
    # 收费
NextCloud
    # 私有网盘
tiddlyWiki
    # 可在线定义目录树
github
    # 用wiki页面
gitbook
mediaWiki
    # 维基百科样式,只有单页目录树
dokuWiki
    # 只有网站地图
xwiki
    # 目录树, acl
语雀
hdwiki
    # 百科, 已停更
notion
    # 任务管理
minidoc
    # 原smartWiki(php), 改成golang开发的minidoc
有道云笔记
幕布
石墨
etherpad.org
    # 在线协作无缝编辑
dropbox
    # 文档协作
坚果云
    # 文档协作

网盘 #

google drive
百度云

沟通 #

Mattermost
    # 开源
team
    # 微软, 聊天
slack
    # 聊天
hipChat
    # Atlassian, 聊天
企业微信
钉钉
倍洽
飞书
瀑布IM

邮件 #

gmail
阿里云邮箱
腾讯企业邮
zoho
网易企业邮

原型 #

zeplin
    # 设计和前端协同工具
蓝湖
    # 免费

团队协作 #

jira
    # 进度管理跟踪, 敏捷开发
microsoft Project
    # 瀑布式开发
rational
    # IBM, 进度管理
teambition
    # 进度管理
basecamp
    # 进度管理
testlink
    # 测试收集, 进度管理
redmine
    # 开源, ror开发, 项目管理, 把成员、任务、文档、讨论等资源整合在一起。支持git, svn, cvs等
youtrack
    # jetbrains, 项目管理
禅道
    # 项目管理, 开源
trac
    # wiki, issue
tapd
    # 腾讯项目管理
    优势
        打通企业微信
    功能
worktile
    # microsoft项目管理
notion
明道云
云之家
eteams
今目标
tower
masterlab
    # 开源
openProject
    # 开源
peerProject
    # 开源

trello
    # 进度管理

代码管理 #

github
gitee
coding
bitbucket
gitea
    # 开源
gitlab
gogs
    # 开源

测试 #

semaphore
codeClimate

文档 #

swagger

镜像 #

harbor
nexus

部署 #

drone
Travis-CI
CircleCI
GitLab-CI

集群 #

kuboard
prometheus
grafana
zabbix

日志 #

ElasticStack

Linux

基础 #

历史
    40年代:汇编语言
    60年代:汇编语言unux
    70年代初:c语言、c语言unux、unux开源(美国反垄断法制裁AT&T)
    70年代末:AT&T分裂,unix闭源
    80年代:minix
    90年代:linux  # 80、90年代之间:gun计划
文件权限
    drwxr-xr-x  # d代表目录
    lrwxrwxrwx  # l代表软连接
    drwxrwxrwt  # 末尾的t代表粘滞位(sticky bit),用户只能删除自己建东西
                ## chmod 1777来设置
扩展名
    .bin
        # 二进制可执行文件,加上执行权限./执行即可
    .tar.gz
        # gzip压缩,tar打包的文件
    .tar.tgz
        # 同gzip
    .tar.bz2
    .tar.xz
环境变量
    http_proxy=http://1.1.1.1:8082         # http代理
    https_proxy=http://1.1.1.1:8082        # https代理
    no_proxy='m.test.com,127.0.0.1'         # 代理白名单

    PATH                                    # 命名查找路径
    SHELL                                   # shell命令位置
    PWD                                     # 当前用户目录
    HOME                                    # 同上
    LOGNAME                                 # 用户名
    USER                                    # 同上
    LANG                                    # 语言环境
    _                                       # 查看环境变量的命令

文件位置 #

/var
    /log
        /boot.log                           # 启动日志
/proc
    /[pid]
        /status                             # 任务虚拟地址空间的大小 VmSize, 应用程序正在使用的物理内存的大小 VmRSS
    /loadavg                                # 1分钟、5分钟、15分钟平均负载。运行队列进程数/进程总数。最后一个进程id
/etc
    /etc/fstab
        /dev/nvme0n1p5 /home ext4 defaults 0 2
        /dev/nvme0n1p3 /home/outrun/nvme0n1p3 ntfs-3g defaults 0 0

        # /dev/nvme0n1p6
        UUID=b00fac49-46d7-43ef-aea7-256d82b862b2	/         	ext4      	rw,relatime,data=ordered	0 1

        # /dev/nvme0n1p1 LABEL=ESP
        UUID=FE8F-730F      	/boot/EFI 	vfat      	rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro	0 2
    /sudoers
        outrun ALL=(ALL) NOPASSWD:ALL
    /passwd
    /group
    /resolv.conf                            # dns
        nameserver 223.5.5.5
        nameserver 223.6.6.6                # alidns
        nameserver 114.114.114.114
    /sysconfig
        /network-scripts/ifcfg-eth0         # 永久修改网卡
            DEVICE=eth0                     # 设备别名
            BOOTPROTO=static                # 网卡获得ip地址的方式,默认dhcp
            HWADDR=00:00:00:00:00:00        # mac
            IPADDR=192.168.0.100            # ip
            NETMASK=255.255.255.0           # netmask
            ONBOOT=yes                      # 系统启动时是否激活此设备
        /network                            # 修改网关
            NETWORKING=yes                  # 系统是否使用网络
            HOSTNAME=abc                    # 设置本机主机名, 要与/etc/hosts中设置的主机名相同
            GATEWAY=192.168.0.1             # 网关ip
        /selinux                            # 软连接到../selinux/config
            SELINUX=disabled                # 关闭selinux
    /selinux/config                         # selinux
        SELINUX=enforcing                   # disabled 为关闭
    /systemd
        /logind.conf                        # 电源管理配置
            HandleLidSwitch=ignore          # 关闭盖子不执行操
        /system                             # units位置
            /default.target                 # 启动级别
            /docker.service.d/http-proxy.conf                           # docker代理
                Environment="HTTP_PROXY=http://127.0.0.1:8123"
                    "HTTPS_PROXY=http://127.0.0.1:8123"
                    "NO_PROXY=192.168.1.1,localhost"
    /security
        /limits.conf                        # 设置系统限制,如文件句柄数
    /X11
        /xorg.conf.d/70-synaptics.conf      # 触摸板设置
            Section "InputClass"
                Identifier "touchpad"
                Driver "synaptics"
                MatchIsTouchpad "on"
                        Option "TapButton1" "1"
                        Option "TapButton2" "3"
                        Option "TapButton3" "2"
                        Option "VertEdgeScroll" "on"
                        Option "VertTwoFingerScroll" "on"
                        Option "HorizEdgeScroll" "on"
                        Option "HorizTwoFingerScroll" "on"
                        Option "CircularScrolling" "on"
                        Option "CircScrollTrigger" "2"
                        Option "EmulateTwoFingerMinZ" "40"
                        Option "EmulateTwoFingerMinW" "8"
                        Option "FingerLow" "30"
                        Option "FingerHigh" "50"
                        Option "MaxTapTime" "125"
                    Option "VertScrollDelta" "-50"
                    Option "HorizScrollDelta" "-50"
            EndSection
    /issue                                  # 发行版信息
    /hosts                                  # 修改localhost
    /ld.so.conf                             # lib设置,加入so文件的配置路径如:/usr/local/lib
        执行/sbin/ldconfig -v 更新
    /profile                                # 用户登录时加载的环境变量
    /inittab                                # 设置启动级别
        id:3:initdefault:
/usr
    /lib
        /systemd
            /system                         # units位置
    /share
        /applications                        # desktop文件
/run
    /systemd
        /system                             # units位置
/sys
    /class
        /backlight
            /acpi_video0                    # ati显卡是acpi_video0, intel显卡是intel_backlight
                /brightness                 # 修改亮度
~
    /.bash_profile
    /.bash_login
    /.profile                               # 在登录时执行一次, 先.bash_profile, 再bash_login, 再.profile
    /.bashrc
    /.bash_logout
    /.local
        /share
            /applications                   # desktop文件


initd
    /etc/rc.d/init.d/rc.local
        chmod +x rc.local
        ln -sf ../init.d/rc.local rc0.d/S999rc.local
        ln -sf ../init.d/rc.local rc1.d/S999rc.local
        ln -sf ../init.d/rc.local rc2.d/S999rc.local
        ln -sf ../init.d/rc.local rc3.d/S999rc.local
        ln -sf ../init.d/rc.local rc4.d/S999rc.local
        ln -sf ../init.d/rc.local rc5.d/S999rc.local
        ln -sf ../init.d/rc.local rc6.d/S999rc.local
            # 文件名中S表示传递start参数(K表示stop), 999为启动级别



fstab
    /dev/sda1 /home/outrun/sda1 ntfs-3g defaults 0 0


日志
    access-log      # http传输
    acct和pacct     # 用户命令
    aculog          # modem活动
    btmp            # 失败记录
    lastlog         # 最近成功登录、最后一次不成功登录
    syslog          # 系统日志
    messages        # syslog
    sudolog         # sudo记录
    sulog           # su记录
    utmp            # 当前登录用户
    wtmp            # 用户登录登出记录
    xferlog         # ftp会话

设置 #

lib设置
    /etc/ld.so.conf加入so文件的配置路径如:/usr/local/lib
    执行/sbin/ldconfig -v 更新

发行版 #

lfs
coreos
debian
gentoo
opensuse
mint

centos #

包
    dnf install @development-tools
    yum install epel-release
安装VBoxAdditions
    yum update kernel
    yum install kernel-headers kernel-devel gcc
    # 可能要加软连接 /usr/src/kernels/
    mount /dev/cdrom /mnt
    /mnt/VBoxLinuxAdditions.run
gcc升级
    yum -y install centos-release-scl
    yum -y install devtoolset-6-gcc devtoolset-6-gcc-c++ devtoolset-6-binutils
    scl enable devtoolset-6 bash
    echo "source /opt/rh/devtoolset-6/enable" >>/etc/profile

ubuntu #

包
    apt-cache madison xxx       # 查看仓库中所有版本
    apt-cache search xxx
    apt-get -f -y --assume-yes install
    aptitude
        search
        show
        install
        remove 
        purge                   # 删除包及配置
        clean                   # 删除下载的包文件
        autoclean               # 仅删除过期

fedora #

升级
    fedup --network 21
    或
    fedora-upgrade
升级21
    rpm --import https://fedoraproject.org/static/95A43F54.txt
    yum update yum
    yum clean all
    yum --releasever=21 distro-sync --nogpgcheck
group
    yum grouplist
    yum groupinstall "X Window System"
    yum groupinstall "GNOME Desktop Environment"
    yum groupinstall "KDE"

gnome的快捷方式存放地址
安装unity  
    cd /etc/yum.repos.d/
    wget http://download.opensuse.org/repositories/GNOME:/Ayatana/Fedora_17/GNOME:Ayatana.repo
    yum install unity

arch #

设置
    ahci, secure boot, post behavious thorough
源
    vim /etc/pacman.d/mirrorlist
    pacman -Syy
依赖
    base-devel
分区
    # mount -t efivarfs efivarfs /sys/firmware/efi/efivars
            # 判断efi
    cfdisk
    mkfs.vfat -F32 /dev/nvme0n1p1
            # 或直接使用windows的uefi分区
    mkfs.ext4 /dev/nvme0n1p2
    mkswap /dev/nvme0n1p3
    swapon /dev/nvme0n1p3
    mount /dev/nvme0n1p2 /mnt
    mkdir -p /mnt/boot/EFI
    mount /dev/nvme0n1p1 /mnt/boot/EFI
配置
    pacstrap -i /mnt base
    genfstab -U -p /mnt >> /mnt/etc/fstab
    arch-chroot /mnt /bin/bash
    pacman -S dialog wpa_supplicant vim 
    vim /etc/locale.gen
    locale-gen
    echo LANG=en_US.UTF-8 > /etc/locale.conf
    ls -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    hwclock --systohc --utc
    echo outrun > /etc/hostname
grub
    pacman -S dosfstools grub os-prober efibootmgr
            # bios下 grub os-prober 
    grub-install --target=x86_64-efi --efi-directory=/boot/EFI --bootloader-id=grub
    grub-mkconfig -o /boot/grub/grub.cfg
用户
    passwd
    groupadd outrun
    useradd -m -g users -G outrun -s /usr/bin/bash outrun
    passwd outrun
    vim /etc/sudoers
退出
    exit
    umount -R /mnt
    reboot
桌面
    pacman -S xorg-server xorg-apps xorg xorg-xinit
    pacman -S xf86-video-intel mesa xf86-input-synaptics
    pacman -S gnome
    echo exec gnome-session > .xinitrc
    # systemctl enable gdm
    /etc/modprobe.d/blacklist_nouveau.conf中写blacklist nouveau
    /etc/modprobe.d/modprobe.conf中写blacklist nouveau
    pacman -S ttf-dejavu wqy-microhei
network
    pacman -S networkmanager-openvpn
    systemctl enable NetworkManager
yaourt
    vim /etc/pacman.conf
        [archlinuxfr]
            SigLevel = Never
            Server = http://repo.archlinux.fr/$arch
    pacman -Sy base-devel yaourt
字体
    wiki上找font configuration
AUR
    git clone https://aur.archlinux.org/snapd.git
    cd snapd
    makepkg -si
    sudo systemctl enable --now snapd.socket

测试

基础 #

方法
    TDD                     # Test-Driven Development
阶段
    单元测试阶段
        单元测试
    集成测试阶段            # 出厂测试
        冒烟测试            # 测主流程
        功能测试
            黑盒
            灰盒            # 集成测试阶段,黑盒但关注程序内部
            白盒
        回归测试
    系统测试阶段            # 第三方测试
    验收测试阶段
    性能测试                # PTS(Performance Testing Service)
        压力测试            # 系统失效的负载点
            常规模式        # 稳定并发
            梯度模式        # 并发梯度递增
            目标模式        # 并发梯度递增,达到预设指标(CPU、用户数、TPS、RT等)
        负载测试            # 满足性能指标情况下,最大负载
        疲劳强度测试        # 长时间执行最大工作量,保证持续业务量指标
        基准测试            # 统计多少时间内执行了多少次某个方法
        大数据量测试
            独立测试        # 针对存储、传输、统计、查询测试
            综合测试        # 大数据量下压测,负载,疲劳结合
        全链路压测
灰度发布                    # 金丝雀发布
    A/B测试
    蓝绿测试    
前端测试
    structure/behavior(数据结构/行为)问题
        # 判断是否有此耦合,用一个测试验证: 是否为应用逻辑编写一个单元测试而不需要dom结构存在
        ## angular中没有这种问题,因为所有定位元素和处理事件的工作都是在angular内部完成的
        ## 在测试时创建dom,就增加了测试的复杂性。而且页面变化时有更多维护要做。访问dom的操作很慢,测试反馈时间长

数据库 #

sysbench
    # mysql 压测
    --db-driver=mysql --mysql-host=visitor-bench.ctysoosgzk4k.rds.cn-north-1.amazonaws.com.cn --mysql-user=root --mysql-password=12345678 --threads=512 --events=1000000 --time=0 --report-interval=15 ./bench_visit_page_insert.lua run

接口 #

jmeter #

压测场景
    HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"
    jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]

loadrunner #

    脚本参数
        get
            web_url("login",
                "URL=http://192.168.0.14:9081/ryx-login/sso/login",
                "Resource=0",
                "RecContentType=text/html",
                "Referer=",
                "Snapshot=t1.inf",
                "Mode=HTML",
                EXTRARES,
                "Url=../ycls/img/banner1.jpg", ENDITEM,
                "Url=../ycls/img/banner2.jpg", ENDITEM,
                "Url=../ycls/img/banner3.jpg", ENDITEM,
                "Url=../ycls/img/userinput.png", ENDITEM,
                "Url=../ycls/img/sawtooth.png", ENDITEM,
                "Url=../ycls/img/tip2.png", ENDITEM,
                "Url=../ycls/img/pwdinput.png", ENDITEM,
                "Url=../ycls/img/login_back.png", ENDITEM,
                "Url=../ycls/img/tip1.png", ENDITEM,
                "Url=../ycls/img/codeinput.png", ENDITEM,
                "Url=../ycls/img/loading-small2.gif", ENDITEM,
                "Url=/favicon.ico", "Referer=", ENDITEM,
                LAST);

        post参数
            web_submit_data("getActivityParameter",
                "Action=http://192.168.0.14:9081/tobacco/retail/lottery/getActivityParameter?jsonp=jQuery19109862107675272699_1401335732777",
                "Method=POST",
                "RecContentType=text/html",
                "Referer=http://192.168.0.14:9081/tobacco/retail/index;jsessionid=7BBAFC6DE481FBCB1CB88D738BD7EE71",
                "Snapshot=t6.inf",
                "Mode=HTML",
                ITEMDATA,
                "Name=requestType", "Value=ajax", ENDITEM,
                LAST);

        post直接传数据
            web_custom_request("dataservice",
                "URL=http://202.110.222.207:7080/rtserver/rest/resource/tobacco/dataservice",
                "Method=POST",
                "Resource=0",
                "RecContentType=text/plain",
                "Referer=",
                "Snapshot=t1.inf",
                "Mode=HTML",
                "Body= {\"trans_code\":\"1006\",\"end_date\":\"20140701\",\"source\":\"appkey\",\"data\":\"eyJiZWdpbl9kYXRlIjoiMjAxNDA2MDEiLCJlbmRfZGF0ZSI6IjIwMTQwNzAxIiwicG9zX2lkIjoiODg1MDAzMTAiLCJzb3VyY2UiOiJhcHBrZXkiLCJjdXN0b21lcl9pZCI6IjM3MDExMjEwNzQ2NyIsImFjY2Vzc190b2tlbiI6IiJ9\",\"begin_date\":\"20140601\",\"mac\":\"123\",\"pos_id\":\"88500310\",\"customer_id\":\"370112107467\",\"access_token\":\"\"}",
                LAST);

phoenix #

    介绍
            web自动化测试工具
    特点
            分布式执行
            无脚本模式执行
            无人值守模式执行
            自定模式执行
    模块
            数据维护模块
    部署模式
            server-client
                    仅windows下可用
                    socket通信
            web部署
                    server与client放到tomcat或webLogic下部署
                    http通信
                    web页面控制与监控client端执行

wireshark
siege
        siege -c 200 -r 100 http://www.google.com
                # 200并发,发送100次请求
tcpcopy
        # 基于tcp packets的请求复制工具, 在线流量导入到测试系统中
ab
        内网测试, apache自带的压力测试工具, 安装apache后在bin目录中找到
        ab -n1000 -c100 http://www.google.com/a.html
                # 100并发, 发送1000次请求
locust
        # 外网性能测试 
http_load
        # 压测
        http_load -rate 5 -seconds 10 http://www.baidu.com
                # -p 并发
                # -f 总计访问数
                # -r 每秒访问频率
                # -s 总计访问时间
yslow
        # firefox插件,网页性能测试工具
gatling
        # dsl脚本, 生成报表
wrk
        # 压测
        wrk -R5000 -d10s "http://internal-rope-api-1875734411.cn-north-1.elb.amazonaws.com.cn/online_agents/1"
swagger
        # 文档与测试用例
fortio
        # istio压测工具
hey
        # http压测

js #

heapdump
        # 堆内存快照
jslint
supertest
        # 测http接口
sinon.js
        # 非运行测试,延时测试等
vows
        # asynchronous BDD(behaviour drven development) for Node
chai
        # js断言
mock.js
        # 模拟生成接口假数据

benchmark #

介绍
        测试代码执行性能
使用
        var Benchmark = require('benchmark');
        var suite = new Benchmark.Suite;

        var int1 = function(str){
                return +str;
        };
        var int2 = function(str){
                return parseInt(str, 10);
        };
        var int3 = function(str){
                return Number(str);
        };
        // 开始测试
        var number = '100';
        suite
        .add('+', function(){
                int1(number);
        });
        .add('parseInt', function(){
                int2(number);
        });
        .add('Number', function(){
                int3(number);
        });
        .on('cycle', function(event){        // 每个测试跑完后输出信息
                console.log(String(event.target));
        })
        .on('complete', function(){
                console.log('Fastest is' + this.filter('fastest').pluck('name'));
        })
        .run({'async': true});                    // 这里async与时间计算有关,默认为true

travis #

介绍
    项目node版本测试,在基本依赖下跑
使用
    在travis上授权仓库,每当push代码到github, 会自动跑测试
    配置根目录下的.travis.yml文件来配置测试内容,如
        language: node_js
        node_js:
        -'0.8'
        -'0.10'
        -'0.11'
        script: make test
        services:
            mongodb
            # 一个使用了mongodb的nodejs应用,用0.8、0.10、0.11三个版本来跑,跑测试的命令是make test
    travis测试的项目,可以得到一个图片地址,显示项目当前的测试通过状态,把这个图片添加到项目的README中

jasmine #

介绍
    编写单元测试
使用
    describe("A suite", function(){
        var foo;
        beforeEach(function(){
                foo = 0;
                foo += 1;
        });
        afterEach(function(){
                foo = 0;
        });
        it("contains spec with an expectation", function(){
                expect(true).toBe(true);
        });
    });

should #

介绍
    兼容性测试
安装
    npm install should --save-dev
使用
var should = require('should');

user.should.have.property('name', 'jack')
    # should(user).have.property('name','jack');
user.should.have.property('pets').with.lengthOf(4);
    # 判断数组
should.not.exist(err);
should.exist(result);
result.bar.should.equal(foo);
(5).should.be.exactly(5).and.be.a.Number();
user.should.be.an.instanceOf(Object).and.have.property('name', 'jack');
this.obj.should.have.property('id').which.is.a.Number();

memwatch #

介绍
    监控内存leak, stats,leak在连续5次垃圾回收后内存没释放时触发, stats事件在垃圾回收时触发

o-> 堆内存比较
var memwatch = require('memwatch')
var leakArray = []
var leak = function () {
    leakArray.push('leak' + Math.random())
}
var hd = new memwatch.HeapDiff()
for (var i = 0; i < 10000; i++) {
    leak()
}

var diff = hd.end()
console.log(JSON.stringify(diff, null, 2))

muk #

var muk = require('muk')
before(function () {
    muk(fs, 'readFileSync', function (path, encoding) {
        throw new Error('mock readFileSync error')
    })
    muk(fs, 'readFile', function (path, encoding, callback) {
        process.nextTick(function () {
            # 模拟异步
            callback(new Error('mock readFile error'))
        })
    })
})

after(function () {
    muk.restore()
})

rewire #

介绍
    测试私有方法

o->
it('limit should return success', function () {
    var lib = rewire('../lib/index.js')
    var litmit = lib.__get__('limit')
    litmit(10).should.be.equal(10)
})

mocha #

介绍
    单元测试框架
命令
    mocha
        # --reporters 查看所有报告样式, 默认dot, 常用spec, json, html-cov
        # -R <reporter>采用某报告样式
        # -t <ms>设置超时时间
使用
    npm install -g mocha
    // package.json
    {
        "scripts": {
            "test": "mocha test"
            "blanket": {
                "pattern": "//^((?!(node_modules|test)).)*$/",
                "data-cover-flags": {
                    "debug": false
                }
            }
        }
    }
    mocha test

o-> bdd风格
describe('Array', function() {
    before(function() {})
        # 钩子函数还有after, beforeEach, afterEach
    it('should return -1 when not present', function (done) {
        [1,2,3].indexOf(4).should.equal(-1)
        this.timeout(500)
            # 500ms后超时
        done()
            # 用done来测试异步
    })
})

o-> bdd风格
suite('Array', function() {
    setup(function () {})
        # 钩子函数还有teardown
    suite('$indexOf()', function () {
        test('should return -1 when not present', function() {
            assert.equal(-1, [1,2,3].indexOf(4))
        })
    })
})

istanbul #

介绍
    名字是依斯坦布尔,用来白盒覆盖用例测试
    支持的use cases有unit tests, browser tests, server side code embedding
使用
    instanbul cover test.js

phantomjs #

介绍
    前端测试工具
    webkit js测试工具,支持多web标准, dom, css, json, canvas和svg
o-> 使用1
    npm install mocha-phantomjs
    mocha-phantomjs index.html

o-> 使用2
    phantomjs hello.js

    // hello.js
    console.log('Hello, world');
    phantom.exit();

browserstack #

介绍
    前端测试工具
    内建webdriver的api
使用
    npm install browserstack-runner --save-dev
    ./node_modules/.bin/browserstack-runner init
    // browserstack.json
        "test_framework": "mocha",
        "timeout": 60,
        "test_path": "public/index.html"
    https://www.browserstack.com/accounts/automate
        得到username 和 access key
        复制到browserstack.json中的username和key
    browserstack-runner
    https://www.browserstack.com/automate 查看结果

karma #

介绍
    是google Testacular的新名字,自动化完成单元测试
使用
    npm install -g karma
    karma start
    karma init
        # 初始化karma配置文件
    npm install karma-jasmine

jscover #

介绍
    覆盖率测试
使用
    npm install jscover -g
    jscover lib lib-cov
        # 把lib下的源码编译到lib-cov下,新代码在每一行加上了执行次数统计
    index.js中
        module.exports = process.env.LIB_COV ? require('./lib-cov/index') : require('./lib/index')
    export LIB_COV=1
    mocha -R html-cov > coverage.html
        # 生成结果

blanket #

介绍
    比jscover更好的测试工具
使用
    package.json中
        "scripts": {
            "blanket": {
                "pattern": "eventproxy/lib"
                    # 要测试的源码目录
            }
        }
    mocha --require blanket -R html-cov > coverage.html

python #

nose
    # 注解测试
selenium
    # 自动化测试

go #

gomock
    # 官方mock库, 对接口mock

monkey #

介绍
    对函数mock
Patch()
Unpatch()
PatchInstanceMethod()
UnpatchInstanceMethod()

问题
    内联函数不能mock
        测试时禁止内联, go test -gcflags=all="-N -l"

java #

hamcrest #

# 自然语法

mockito #

页面 #

jsperf
    # js性能分析
jasmine
    # js单元测试

移动 #

robotium
    # android自动化测试