├── checklist ├── README.md ├── list │ ├── out.md │ ├── reward.md │ ├── work │ │ ├── after-work.md │ │ ├── before-work.md │ │ ├── pc-hardware.md │ │ ├── task.md │ │ ├── code-review.md │ │ ├── know-company.md │ │ └── pc-software.md │ ├── piece-time.md │ └── personal-image.md └── product.md ├── tools ├── my-tools │ ├── jianshu │ │ ├── frontend │ │ │ └── index.html │ │ ├── test.png │ │ ├── artcile-backup │ │ │ ├── show │ │ │ │ ├── demo.jpeg │ │ │ │ └── fold.png │ │ │ ├── package.json │ │ │ ├── config.js │ │ │ ├── .gitignore │ │ │ ├── index_template.html │ │ │ ├── README.md │ │ │ ├── index.js │ │ │ └── yarn.lock │ │ ├── server │ │ │ ├── router.js │ │ │ ├── package.json │ │ │ ├── index.js │ │ │ └── service.js │ │ ├── login │ │ │ ├── package.json │ │ │ ├── index.js │ │ │ └── yarn.lock │ │ ├── README.md │ │ ├── .gitignore │ │ ├── LICENSE │ │ └── bin │ │ │ └── submit-article.js │ ├── wechat-assistant │ │ ├── v2 │ │ │ ├── index.js │ │ │ ├── README.md │ │ │ ├── package.json │ │ │ ├── .gitignore │ │ │ └── yarn.lock │ │ └── v1 │ │ │ ├── requirements.txt │ │ │ ├── send-to-multi-person.py │ │ │ ├── README.md │ │ │ ├── LICENSE │ │ │ ├── .gitignore │ │ │ └── bot.py │ └── README.md ├── third-tools │ ├── tts │ │ ├── kdxf │ │ │ ├── index.js │ │ │ ├── package.json │ │ │ └── yarn.lock │ │ ├── sayjs │ │ │ ├── package.json │ │ │ ├── simple.js │ │ │ └── yarn.lock │ │ ├── google-tts │ │ │ ├── package.json │ │ │ ├── simple.js │ │ │ └── yarn.lock │ │ └── baidu │ │ │ └── demo.sh │ ├── README.md │ ├── 室内定位技术.md │ └── wordpress │ │ ├── README.md │ │ ├── resource.md │ │ └── install.md └── README.md ├── it-service-doc ├── key.md ├── accept-project-rule.md ├── customer │ └── wechat │ │ └── 微信公众号迁移.png ├── template │ ├── 产品需求说明书模板_v1.2.docx │ └── doc-nav.md ├── project-manage │ ├── spend-template.xlsx │ ├── smart.md │ └── project-responsibility-plan.md ├── need │ ├── key-list.md │ └── admin-design.md ├── develop │ └── common │ │ └── how-to-create-qa-problem.md ├── target.md ├── financial │ └── README.md ├── communicate-first-time │ └── README.md ├── LICENSE └── README.md ├── README.md ├── LICENSE └── .gitignore /checklist/README.md: -------------------------------------------------------------------------------- 1 | # 检查列表 -------------------------------------------------------------------------------- /tools/my-tools/jianshu/frontend/index.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tools/my-tools/wechat-assistant/v2/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /checklist/list/out.md: -------------------------------------------------------------------------------- 1 | # 出门检查列表 2 | * 手机 3 | * 家钥匙 4 | * 钱包 5 | -------------------------------------------------------------------------------- /tools/my-tools/wechat-assistant/v1/requirements.txt: -------------------------------------------------------------------------------- 1 | wxpy >= 0.3.9.5 -------------------------------------------------------------------------------- /checklist/list/reward.md: -------------------------------------------------------------------------------- 1 | # 奖励 2 | * 看小说 3 | * 看电影 4 | * 买些新鲜好玩的 5 | * 旅行 -------------------------------------------------------------------------------- /checklist/list/work/after-work.md: -------------------------------------------------------------------------------- 1 | # 下班前 2 | * 回忆下,今天的任务是否已完成。 3 | * 还没完成的东西的记录。 -------------------------------------------------------------------------------- /checklist/list/work/before-work.md: -------------------------------------------------------------------------------- 1 | # 开始工作前 2 | * 今天的工作任务。 3 | * 需要其他人协调的,先列好,安排。 -------------------------------------------------------------------------------- /tools/third-tools/tts/kdxf/index.js: -------------------------------------------------------------------------------- 1 | var axios = require('axios') 2 | 3 | axios.post() -------------------------------------------------------------------------------- /tools/my-tools/README.md: -------------------------------------------------------------------------------- 1 | # 我开发或集成过的工具 2 | * [简书相关工具](jianshu) 3 | * [微信机器人](wechat) 被微信封的比较厉害,所以用不了。 -------------------------------------------------------------------------------- /tools/third-tools/README.md: -------------------------------------------------------------------------------- 1 | # 第三方工具 2 | * [tts](tts) 文字转语音。 3 | * [室内定位技术](室内定位技术.md) 4 | * [wordpress](wordpress) -------------------------------------------------------------------------------- /it-service-doc/key.md: -------------------------------------------------------------------------------- 1 | # 关键点 2 | 设立几个重要的要关注的点。我们的是: 销售额 和 回款。 3 | 4 | 每个月要设立目标,目标要于关注点有关系。 比如 每个月的销售额最少是5万,回款时间与预期项目,不能超过2周。 -------------------------------------------------------------------------------- /tools/my-tools/jianshu/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamjoel/tools-and-material/HEAD/tools/my-tools/jianshu/test.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 工具和素材 2 | * [工具](tools),[我开发或集成过的工具](tools/my-tools) 3 | * [清单](checklist) 4 | * [软件服务(外包)公司文档](it-service-doc) 5 | * 模板 TODO -------------------------------------------------------------------------------- /it-service-doc/accept-project-rule.md: -------------------------------------------------------------------------------- 1 | # 接项目的原则 2 | 接项目的目标是利润最大化。 3 | 4 | * 优先接技术熟悉,业务熟悉的项目。 5 | * 优先接中等规模(开发1~3个月)的项目。尽量不接小项目(1万一下的)。 6 | -------------------------------------------------------------------------------- /checklist/list/piece-time.md: -------------------------------------------------------------------------------- 1 | # 碎片时间做的事 2 | * 小于5分钟 3 | * 眺望远方 4 | * 做运动 HIIT 5 | * 小于30分钟 6 | * 散步 7 | * 阅读 8 | * 微信读书 9 | * 读公众号 -------------------------------------------------------------------------------- /it-service-doc/customer/wechat/微信公众号迁移.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamjoel/tools-and-material/HEAD/it-service-doc/customer/wechat/微信公众号迁移.png -------------------------------------------------------------------------------- /it-service-doc/template/产品需求说明书模板_v1.2.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamjoel/tools-and-material/HEAD/it-service-doc/template/产品需求说明书模板_v1.2.docx -------------------------------------------------------------------------------- /it-service-doc/project-manage/spend-template.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamjoel/tools-and-material/HEAD/it-service-doc/project-manage/spend-template.xlsx -------------------------------------------------------------------------------- /tools/my-tools/jianshu/artcile-backup/show/demo.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamjoel/tools-and-material/HEAD/tools/my-tools/jianshu/artcile-backup/show/demo.jpeg -------------------------------------------------------------------------------- /tools/my-tools/jianshu/artcile-backup/show/fold.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamjoel/tools-and-material/HEAD/tools/my-tools/jianshu/artcile-backup/show/fold.png -------------------------------------------------------------------------------- /checklist/list/work/pc-hardware.md: -------------------------------------------------------------------------------- 1 | # 电脑配置 2 | * Intel i5-3470 @3.2GHz 3.6GHz 3 | * 内存 8GB 4 | * 显卡 NVIDIA GeForce 720 5 | * 显示器: 双显。 1块 2k(2560*1440)屏。 6 | * 256G 机械硬盘。 7 | * 青轴机械键盘。 -------------------------------------------------------------------------------- /checklist/list/work/task.md: -------------------------------------------------------------------------------- 1 | # 做任务的 Checklist 2 | * 兼容性 3 | * 兼容哪些设备 4 | * 兼容哪些浏览器 5 | * 分辨率要求 6 | * 技术方面 7 | * 代码风格。 8 | * 技术选型。是否有要求要用什么技术。 9 | * 性能要求。 10 | * 测试,覆盖率。 -------------------------------------------------------------------------------- /checklist/list/work/code-review.md: -------------------------------------------------------------------------------- 1 | # 代码审核 2 | * 代码风格(这块尽可能用工具去做,如 ESLint,CSSLint 之类的) 3 | * 命名 4 | * 不合适的缩写 5 | * 不必要的上下文 6 | * 实现算法 7 | * 能满足需求,是否有bug 8 | * 是否有安全性问题 9 | * 是否有更好的实现方式 10 | 11 | 更多可参考 12 | * 代码简洁之道 -------------------------------------------------------------------------------- /tools/my-tools/wechat-assistant/v2/README.md: -------------------------------------------------------------------------------- 1 | # 微信小助手 2 | > 从2017年6月下旬开始,使用基于web版微信接入方案存在大概率的被限制登陆的可能性。 主要表现为:无法登陆Web 微信,但不影响手机等其他平台。 验证是否被限制登陆: https://wx.qq.com 上扫码查看是否能登陆。 3 | 4 | 可以用 ipad 的方式登入,但需要 `token`: `200 元/微信/月`。。。 5 | 6 | -------------------------------------------------------------------------------- /checklist/list/personal-image.md: -------------------------------------------------------------------------------- 1 | # 个人品牌 2 | * 外观 3 | * 穿着是否得体(待加强) 4 | * 饰品:如手表 5 | * 发型,胡子,指甲等 6 | * 博客 7 | * 文章内容 8 | * 文章分类 9 | * Github 10 | * 代码质量 11 | * 手机 12 | * 桌面 13 | * App 的选择 14 | * 通讯录 15 | 16 | 17 | -------------------------------------------------------------------------------- /it-service-doc/need/key-list.md: -------------------------------------------------------------------------------- 1 | # 验收清单 2 | ## 商品 3 | ### 商品录入流程 4 | 1. 店员在管理后台录入商品,提交审核。等待店长审核。 5 | 1. 店长审核通过。 6 | 1. 用户在商品列表页看到该商品。 7 | 8 | ### 预订流程 9 | 1. 用户在商品需求页,点击立即购买。 10 | 1. 选择商品规格。 11 | 1. 选择收货地址。 12 | 1. 支付。 13 | 1. 在未发货的订单中看到该订单。 14 | -------------------------------------------------------------------------------- /tools/my-tools/jianshu/server/router.js: -------------------------------------------------------------------------------- 1 | var router = require('express').Router() 2 | var services = require('./service') 3 | 4 | router.get('/notify', (req, res)=> { 5 | services.fetchNotifications().then(data =>{ 6 | res.json(data) 7 | }) 8 | }) 9 | 10 | module.exports = router -------------------------------------------------------------------------------- /it-service-doc/template/doc-nav.md: -------------------------------------------------------------------------------- 1 | # 文档导航 2 | ## 需求 3 | * 需求文档 4 | * 流程图 5 | * 报表字段 6 | * 管理后台页面 7 | * 手机原型图 8 | 9 | ## 开发 10 | * 服务器信息 11 | * 公众号 12 | * 代码库地址 13 | * 测试地址 14 | * 管理后台 15 | * 手机端 16 | * 微信公众号 17 | 18 | ## 测试 19 | * 测试帐号 20 | 21 | ## 上线 22 | * 服务器信息 23 | * 公众号 24 | * 正式地址 25 | * 测试帐号 26 | -------------------------------------------------------------------------------- /checklist/list/work/know-company.md: -------------------------------------------------------------------------------- 1 | # 了解公司 2 | * 主要产品 3 | * 营收情况 4 | * 公司价值观。 5 | * 如何看待加班? 6 | * 弹性工作制? 7 | * 关于员工提升,会做些什么? 8 | * 技术方面 9 | * 技术团队人数,前端人数 10 | * 工作流程。 11 | * 代码版本控制。 怎样的分支策略? 12 | * 工作流管理软件。 任务安排,用看板系统如 Trello,bug 用 Jira,Teamibition,钉钉之类。需求文档之类的呢? 13 | * 是否要写日报? 14 | * 公司福利(旅游,体检,其他?) 15 | -------------------------------------------------------------------------------- /tools/my-tools/jianshu/login/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "login", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index" 8 | }, 9 | "author": "Joel", 10 | "license": "MIT", 11 | "dependencies": { 12 | "puppeteer": "^1.15.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /tools/third-tools/tts/kdxf/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kdxf", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^0.18.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /checklist/product.md: -------------------------------------------------------------------------------- 1 | # 产品 2 | 原文:https://ruanyf.github.io/survivor/startup/product.html 3 | 4 | ## 开发产品时的问题 5 | 1. 它有用吗?(Is it useful?) 6 | 2. 它易用吗?(Is it easy to use?) 7 | 3. 它用起来令人愉悦吗?(Is it delightful to use?) 8 | 9 | 创业家孙陶然也说过类似的话。他说开发一个产品的时候,应该问自己五个问题。 10 | 11 | 1. 给谁用? 12 | 2. 他们用这个产品来解决什么问题? 13 | 3. 这个问题对他们而言有多重要? 14 | 4. 我们的方法是否足够简单方便? 15 | -------------------------------------------------------------------------------- /tools/third-tools/tts/sayjs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test-sayjs", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Joel", 10 | "license": "MIT", 11 | "dependencies": { 12 | "say": "^0.15.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /tools/third-tools/tts/google-tts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "google-tts", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "google-tts-api": "^0.0.3" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /tools/my-tools/jianshu/artcile-backup/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "article-to-pdf", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index" 8 | }, 9 | "author": "Joel", 10 | "license": "MIT", 11 | "dependencies": { 12 | "fs-extra": "^8.0.1", 13 | "puppeteer": "^1.15.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /tools/my-tools/wechat-assistant/v2/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wechat-assistant", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Joel", 10 | "license": "MIT", 11 | "dependencies": { 12 | "wechaty": "^0.26.1" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /tools/my-tools/jianshu/server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jianshu-tools", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Joel", 10 | "license": "MIT", 11 | "dependencies": { 12 | "express": "^4.15.2", 13 | "request": "^2.81.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /it-service-doc/project-manage/smart.md: -------------------------------------------------------------------------------- 1 | # 敏捷开发 2 | 将开发总周期分割成若个小的周期(sprint,冲刺),比如 2 周,先做核心的,再做非核心的。每个周期完成一些的功能点(用户故事)的版本。这个版本是可使用的、完整的、可交付的。每个周期的最后一天用来回顾这个周期有什么问题,在下个周期中优化。每天了解进度。基于 用户故事 来驱动开发和测试。 3 | 4 | 和采用传统瀑布流模型开发的好处: 5 | 对客户来说: 6 | 7 | 1. 客户可以定期了解软件的进度。 8 | 1. 客户在使用软件的过程中,发现问题或分歧,早发现。越早发现问题,修改的成本越低。 9 | 10 | 对开发来说: 11 | 12 | 1. 开发进度更可控。传统瀑布流:用甘特图那管理大项目,延期很正常。 13 | 1. 回顾的过程,帮我们不断优化流程。等项目结束后再回顾,很多东西都忘了。 14 | -------------------------------------------------------------------------------- /tools/third-tools/tts/google-tts/simple.js: -------------------------------------------------------------------------------- 1 | var googleTTS = require('google-tts-api'); 2 | 3 | // 不翻墙会报错 4 | // FetchError: network timeout at: https://translate.google.com 5 | googleTTS('Hello World', 'en', 1) // speed normal = 1 (default), slow = 0.24 6 | .then(function (url) { 7 | console.log(url); // https://translate.google.com/translate_tts?... 8 | }) 9 | .catch(function (err) { 10 | console.error(err.stack); 11 | }); -------------------------------------------------------------------------------- /tools/third-tools/tts/sayjs/simple.js: -------------------------------------------------------------------------------- 1 | const say = require('say') 2 | 3 | say.speak('Oh My God! 你在干什么') 4 | 5 | // Stop the text currently being spoken 6 | // say.stop() 7 | 8 | // 导出文件 9 | // say.export("这是我老家,就是土很多,从洛阳开过来,车变那么脏。一刮风觉得满脸都是土。衣服刚穿上就觉得很脏", undefined, 0.75, 'hal.wav', (err) => { 10 | // if (err) { 11 | // return console.error(err) 12 | // } 13 | 14 | // console.log('Text has been saved to hal.wav.') 15 | // }) -------------------------------------------------------------------------------- /tools/my-tools/jianshu/README.md: -------------------------------------------------------------------------------- 1 | # 简书工具 2 | 简书是一个很好的写作的平台。但有些功能并不是很好用。于是有了做个让自己用的很爽工具的念头。 3 | 4 | 先用 Postman 测试了下,在带上登录后的 cookie 和设置合适的请求头后,就可以拿登录者相关数据了。如下图 5 | 6 | ![](test.png) 7 | 8 | ## 功能 9 | ### 文章备份 10 | [实现](artcile-backup)。 用 Puppteer 来做的。 11 | 12 | ### 登录 13 | 输入登录后的 cookie 。实现登录。 或者用 Puppteer。 14 | 15 | ### 给专题投稿的功能 16 | 列出用户的文章。和按照类型分类的专题。选文章,来投稿。 [实现](bin/submit-article.js) 17 | 18 | ### 统计类功能 19 | * 粉丝每天新增的图。 20 | * 列出所有的粉丝。带一些筛选条件。 21 | -------------------------------------------------------------------------------- /tools/my-tools/wechat-assistant/v1/send-to-multi-person.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding:UTF-8 -*- 3 | 4 | from wxpy import * 5 | 6 | # 初始化机器人,扫码登陆 7 | bot = Bot() 8 | 9 | friends = bot.friends() 10 | # freinds = bot.friends().search(city="苏州",sex=MALE) 11 | 12 | for friend in friends: 13 | if 'Joel' in friend.nick_name: 14 | # friend.send((friend.nick_name + ':xxx 节日快乐').encode('utf-8')) 15 | friend.send(friend.nick_name + ':xxx Day happy') 16 | 17 | embed() -------------------------------------------------------------------------------- /tools/third-tools/tts/sayjs/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | one-time@0.0.4: 6 | version "0.0.4" 7 | resolved "https://registry.yarnpkg.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e" 8 | 9 | say@^0.15.0: 10 | version "0.15.0" 11 | resolved "https://registry.yarnpkg.com/say/-/say-0.15.0.tgz#ca0d7b88a06cfc485aaa82287b263c31a0d33e75" 12 | dependencies: 13 | one-time "0.0.4" 14 | -------------------------------------------------------------------------------- /it-service-doc/develop/common/how-to-create-qa-problem.md: -------------------------------------------------------------------------------- 1 | # 如何描述测试时发现的问题? 2 | 问题包括 标题,类型,详细描述 和 优先级。 3 | 4 | ## 标题 5 | 标题的通用格式 `[设备端 模块] 概要描述`, 例如 6 | * [手机端 个人中心] 上传个人头像失败。 7 | * [管理后台 商品] 管理员角色不能对商品进行下架操作。 8 | 9 | ## 类型 10 | 类型分为: Bug(功能缺陷),改进项 和 未实现的需求。 11 | 12 | ## 详细描述 13 | 对不同的类型,详细描述的内容会有区别: 14 | * Bug 类型: 描述 Bug 复现的步骤。 15 | * 改进项 类型: 描述 要怎么改,为什么需要做该改进。 16 | * 未实现的需求: 指向 需求文档 的章节。 17 | 18 | 在必要的情况下,配图说明。 19 | 20 | ## 优先级 21 | 分为 高,中,低。 具体来说: 22 | * 优先级高: 要当天改完。 23 | * 优先级中: 要在一周内改完。 24 | * 优先级低: 上线前改完即可。 -------------------------------------------------------------------------------- /tools/my-tools/jianshu/server/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express') 2 | 3 | var app = express() 4 | 5 | app.use(require('./router')) 6 | 7 | app.use(function (req, res, next) { 8 | res.type('application/json') 9 | res.header('Access-Control-Allow-Origin', 'example.com') 10 | res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE') 11 | res.header('Access-Control-Allow-Headers', 'Content-Type') 12 | next() 13 | }) 14 | 15 | app.listen(3000, function () { 16 | console.info('listen 3000') 17 | }); -------------------------------------------------------------------------------- /it-service-doc/target.md: -------------------------------------------------------------------------------- 1 | # 愿景 2 | 高效的开发客户的期望的稳定的产品。 3 | 4 | ## 高效 5 | * 重复工作用工具做。 6 | * 使用高效的工具。 7 | * 不重复造轮子。好好利用轮子。 8 | 9 | ## 期望的产品 10 | * 需求的充分沟通。 11 | * 定期与客户沟通,共同打造产品。 12 | * 详细的流程图。 13 | * 内部团队的充分沟通。 14 | 15 | ## 稳定 16 | * 环境的稳定性。 17 | * 稳定的操作系统。 CentOS。 18 | * 服务器性能监控。 19 | * 稳定的数据库版本。 20 | * 开发流程的规范化。 21 | * 代码的健壮性。 22 | * 稳定第三方代码库。 23 | * 核心功能 24 | * 测试用例。 25 | * 人肉 Review。 26 | * 日志。 前端日志。后端日志。通过日志, 27 | * 能复现问题,找到出错原因。 28 | * 行为记录。 29 | * 有风险代码的规避。用 ESLint 来验证。 30 | * 强类型语言的约束。 TypeScript。 31 | * 核心功能的人肉测试。 32 | -------------------------------------------------------------------------------- /tools/my-tools/jianshu/artcile-backup/config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | jianshu: { 3 | userPrefix: 'https://www.jianshu.com/u', 4 | articlePrefix: 'https://www.jianshu.com/p' 5 | }, 6 | output: { 7 | path: 'output/', 8 | // 生成pdf时的页边距 9 | margin: { 10 | top: '20px', 11 | right: '10px', 12 | bottom: '20px', 13 | left: '10px', 14 | }, 15 | displayHeaderFooter: false, 16 | format: 'A4', 17 | }, 18 | userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' 19 | } -------------------------------------------------------------------------------- /checklist/list/work/pc-software.md: -------------------------------------------------------------------------------- 1 | # 电脑软件 2 | 1. 配置VPN 3 | 1. Chrome 4 | 1. 登录 5 | 1. 同步相关浏览器插件 6 | 1. 输入法:鼠须管 7 | 1. 印象笔记 8 | 1. IDE: Sublime 及相关插件。 9 | 1. Node.js 及一些全局的包(anywhere)。 10 | 1. Wechat,QQ 11 | 1. 福星PDF Reader(可选,也可以用 Chrome来打开) 12 | 1. 有道词典 13 | 1. PhotoShop CC,Pick Picker 14 | 1. Windows 15 | 1. GitHub for Windows 16 | 1. Fiddler 17 | 1. XShell,XFtp 18 | 1. Mac 19 | 1. Homebrew 20 | 21 | Windows 的开机启动 start.bat 22 | ``` 23 | start note(印象笔记) 24 | start ch(Chrome) 25 | start sublime 26 | start gs 27 | start gs 28 | start gs 29 | start mail 30 | start dd(钉钉) 31 | ``` 32 | 33 | 34 | -------------------------------------------------------------------------------- /it-service-doc/need/admin-design.md: -------------------------------------------------------------------------------- 1 | # 管理后台详细设计 2 | ## 所有菜单 3 | * 商品 4 | * 商品 5 | * 商品分类 6 | * 订单 7 | * 订单 8 | * 退款 9 | * 营销 10 | * 广告 11 | * 会员 12 | * 积分规则 13 | ... 14 | 15 | ## 角色 16 | 店员,店长,长运营 17 | 18 | ## 店员 菜单 19 | * 商品 20 | * 商品 21 | * 商品分类 22 | 23 | ## 店长 菜单 24 | * 商品 25 | * 商品 26 | * 商品分类 27 | * 订单 28 | * 订单 29 | * 退款 30 | 31 | ## 运营 菜单 32 | * 营销 33 | * 广告 34 | * 会员 35 | * 积分规则 36 | 37 | ## 页面 38 | ### 商品列表页 39 | 搜索条件: 名称 40 | 41 | 字段: 名称,标题,分类,价格,Sku,图文... 42 | 43 | 操作: 新增(店员,店长),上下架(店长) 44 | 45 | ## 商品编辑页 46 | 字段:名称(必填),分类(必填,远程下拉,来自商品分类),是否热门(必填,布尔值),价格(必填,数字)... 47 | 48 | 操作: 保存,保存为草稿,审核(店员) 49 | 50 | 51 | -------------------------------------------------------------------------------- /it-service-doc/financial/README.md: -------------------------------------------------------------------------------- 1 | # 公司财务 2 | 3 | ## 税务 4 | ### 税的分类 5 | 税分三大类: 流转税,所得税 和其他。 6 | 7 | 流转税:有了收入,无论赚不赚钱都要交的税。 如增值税。 8 | 所得税:赚了钱,才要交的税。 如企业所得税,个人所得税。 9 | 其他:上面两大税种之外的税。如 印花税,房产税等。 10 | 11 | 例子: 公司A 是小规模纳税人,从客户处收到 103 万,则先交 3万多一点 的流转税(小规模纳税人,增值税率是 3%)。如果成本是 60万,则利润为 40万,那 需要先交企业所得税 10万(企业所得税的税率是 25%),剩下 30万。如要股东要分红,则要交个人所得税 6万(个人所得税的税率是 20%)。剩下的 24万 才是股东到手的钱。 12 | 13 | ### 增值税 14 | 小规模纳税人和一般规模纳税人的算法不同。 15 | 16 | 小规模纳税人采用“简易计税方法”:不含税销售额 * 3%。注意:一般纳税人销售发生特定的货物、应税劳务、应税行为,也可以选择适用简易计税方法计税。 17 | 18 | 一般规模纳税人采用“一般计税方法”: (当期销售税额 - 当期进项税额) * 17%。 其实对应不同的产品,有四种税率: 17%、11%、6%、零税率。 19 | 20 | 详细介绍:[增值税(二)税率征收率及计税方法](https://zhuanlan.zhihu.com/p/33797614)。 21 | 22 | ## 资源 23 | * 创业财税口袋书 - 孟峰 -------------------------------------------------------------------------------- /tools/third-tools/室内定位技术.md: -------------------------------------------------------------------------------- 1 | # 室内定位技术 2 | 摘自 https://www.fengmap.com/product-location.html 3 | 4 | ## WiFi室内定位 5 | WiFi室内定位精度为5-10米左右,可以借助场所内的WiFi热点信号进行定位,硬件成本较低。 6 | 7 | ## iBeacon室内定位 8 | iBeacon室内定位精度为3-5米左右,需要在室内部署低功耗蓝牙设备或蓝牙基站,设备体积小、距离短、功耗低,容易部署,硬件成本中等。 9 | 10 | ## LiFi室内定位 11 | LiFi可见光室内定位精度为0.5-1米左右,误差10cm以内,定位精准,无需维护,安全保密性高,但光源遮挡时无法定位,需要在室内安装支持LiFi定位的LED光源或对现有光源进行改造。 12 | 13 | ## 地磁室内定位 14 | 地磁室内定位精度为1-3米左右,不依赖硬件设备,需要投入人力进行实地环境地磁信号采集,定位精度与现场环境有关联,当定位场所环境变化后需要进行重新采集。 15 | 16 | ## UWB室内定位 17 | UWB超宽带室内定位精度为0.1-0.5米左右,定位精度较高,需要在现场布设专业UWB基站并配合终端设备进行定位,通常为手环、磁卡等便携设备,成本较高。 18 | 19 | ## RFID定位 20 | 射频识别(RFID)室内定位技术作用距离很近,但它可以在几毫秒内得到厘米级定位精度的信息,并且RFID标识的体积比较小,造价比较低。但其不具有通信能力,抗干扰能力较差。RFID定位通常可以解决室内场所关键位置精准定位的需求 21 | 22 | -------------------------------------------------------------------------------- /tools/my-tools/wechat-assistant/v1/README.md: -------------------------------------------------------------------------------- 1 | # 微信小助手 2 | 借助[wxpy](https://github.com/youfou/wxpy)来实现些自己的功能。 3 | 4 | ## 启动 5 | 1. 下载本项目源码 `git clone https://github.com/iamjoel/wechat-assistant` 6 | 1. 安装 python3 7 | 1. 安装依赖 `pip install -r requirements.txt` 8 | 1. 去[图灵机器人官网](http://www.tuling123.com/)申请 api key,替换代码中[这里的值](https://github.com/iamjoel/wechat-assistant/blob/master/bot.py#L9)。 9 | 1. `python3 bot.py` 10 | 11 | ## 退出 12 | quit() 13 | 14 | ## 支持功能 15 | 1. 加好友后,发送自我介绍,并进行聊天(需要设置机器人微信帐号加好友的策略为,需要验证加好友。当然,无论他的验证信息是什么,都会被同意的)。 16 | 1. 加好友或在群里 @他,来进行聊天(用的图灵123)。 17 | 1. 发送关键字,发送群邀请。 18 | 19 | ## 参考 20 | * [官方的代码片段](https://gist.github.com/youfou) 21 | * [LCBot](https://github.com/LCTT/LCBot) 22 | * [如何让机器人持续在线?](https://github.com/LCTT/LCBot/wiki/Daemon) -------------------------------------------------------------------------------- /it-service-doc/communicate-first-time/README.md: -------------------------------------------------------------------------------- 1 | # 与客户的第一次见面沟通 2 | * 了解客户的基本情况。 3 | * 和客户介绍我们。 4 | * 了解需求。 5 | * 了解预算和开发周期。 6 | * 风险点。 7 | * 分析,得出结论。 8 | 9 | ## 客户的基本情况 10 | * 公司人数规模。去天眼查,企查查看公司的基本信息。 11 | * 公司做的产品。销量如何。 12 | 13 | 事先调查。 14 | 15 | ## 和客户介绍我们 16 | * 做过的产品。优先介绍与客户相关行业的项目,然后介绍下高大上的项目。 17 | * 我们的工作流程。 18 | 19 | ## 了解需求 20 | * 有哪些功能。 21 | * 为什么需要 开发这个软件。 22 | * 有哪些角色(工种),各角色会做哪些工作。 => 来考察客户的对自己工作流程的了解程度。 23 | * 要做哪些端,为什么要做这些端。 管理后台,安卓,IOS,微信公众号,小程序。 如果要做 app。 和客户沟通,有没有调研过app的获客成本有多少? 24 | * 了解客户的顾虑。 25 | 26 | 27 | 28 | ## 了解预算和开发周期 29 | 给一个大概值。什么时候需要做完。 30 | 31 | ## 风险点 32 | * 客户是否有稳定的时间来沟通需求。是否会有个专门的人来沟通需求。 33 | * 需求是否会经常变。 34 | * 是否能顺畅的沟通。特别是,如果远程开发的情况。 35 | 36 | ## 分析,得出结论 37 | 分析的点 38 | * 客户靠不靠谱。 不靠谱的客户基本上不会有靠谱的产品。这块还需要细化成。 39 | * 产品靠不靠谱。 40 | 41 | 结论: 接 或 不接。 42 | -------------------------------------------------------------------------------- /tools/my-tools/jianshu/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directories 30 | node_modules 31 | jspm_packages 32 | 33 | # Optional npm cache directory 34 | .npm 35 | 36 | # Optional REPL history 37 | .node_repl_history 38 | 39 | .DS_Store -------------------------------------------------------------------------------- /tools/my-tools/jianshu/artcile-backup/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directories 30 | node_modules 31 | jspm_packages 32 | 33 | # Optional npm cache directory 34 | .npm 35 | 36 | # Optional REPL history 37 | .node_repl_history 38 | 39 | .DS_Store 40 | output/* 41 | *.pdf 42 | -------------------------------------------------------------------------------- /it-service-doc/project-manage/project-responsibility-plan.md: -------------------------------------------------------------------------------- 1 | # 项目责任制 2 | > 项目以项目经理主导。项目经理对项目负责。项目经理可以根据需求选择内部或外部团队。 3 | 4 | ## 项目金额的分配 5 | 项目开发金额:需要开票的情况,项目合同金额 = 项目合同金额 / 1.06(6%的增值税),非开票情况,项目合同金额 = 项目合同金额。下面出现的百分数都是占项目开发金额的百分数。 6 | 7 | * 公司: 40%。具体: 8 | * 项目介绍费: 10%。 9 | * 其他税: 2%。 10 | * 其他: 22%。 11 | * 基础成本。包括: 办公室租金,会计,员工福利等。 12 | * 风险成本。包括: 人员闲置,收不到钱等。 13 | * 差旅费。 14 | * 公司利润。 15 | * 开发支出 60%。 16 | * 人员工资支出: 50%。 17 | * 团队激励: 最高 5%。 18 | * 项目经理的激励: 最高 5%。 19 | 20 | 说明: 21 | * 团队激励这部分,如果是吃饭之类能开票的,需要开公司抬头。建议项目开始,结束时各吃一次饭,项目中时不时发红包。 22 | * 项目经理的激励的上限是 5%。如果人员工资支出超出预估的,从项目经理的激励中扣,扣完为止。 23 | * 项目开发完的结余归公司所有。 24 | 25 | ### 计算示例 26 | * 项目开发金额:200000/1.06 = 188679.25 27 | * 公司: 188679.25 * 0.4 = 75471.7 28 | * 开发支出 : 188679.25 * 0.6 = 113207.55 29 | 30 | 31 | ## 项目经理的职责 32 | * 项目估计,估价。 估**人员工资支出**这部分即可。 33 | * 制定开发计划,在项目规定时间内交付。 34 | * 记录人员的实际时间。 35 | 36 | ## 项目经理的权利 37 | * 选择外包团队。 38 | * 团队激励的分配。 -------------------------------------------------------------------------------- /tools/third-tools/wordpress/README.md: -------------------------------------------------------------------------------- 1 | # Wordpress 2 | 用 [Wordpress](https://cn.wordpress.org/) 可以做到不编码做 CMS(内容管理系统) 类的网站。Wordpress 比较适合做博客,公司或个人官网之类的。也有主题将 Wordpress 改成商城的~ 3 | 4 | 相比我调研过的其他CMS, Wordpress 是对非程序员最友好的。如果没有太多的个性化要求,只要选个合适的主题,改改内容,一个网站就做好了。 5 | 6 | ## 环境 7 | 搭建 Wordpress 需要的环境(PHP,MySQL,Apache httpd 或 Nginx)有点麻烦。安装 Wordpress 本身比较容易。 8 | 9 | 安装好 Wordpress 后,坑不多。主要对一些文件设置读写的权限,来允许上传图片,更改主题之类的。 10 | 11 | ## 主题 12 | 搭建好 Wordpress 后,网站就做好了。当然,网站的外观是默认主题的,内容也是默认内容。 13 | 14 | 不同主题支持不同的外观修改。修改一般包括:改些文字内容,修改图片,增加菜单,改改元素的位置之类的。如果改网站的结构,比如,加个完全自定制的页面,而且页面会用到发布的文章,要么换一个支持的主题,要么自己编码。 15 | 16 | 在不想自己编码的情况下,做不同类似的网站,就要选不同的主题。不同的主题决定了网站的结构:包括 17 | * 首页是怎样的;首页的哪些内容可以改。 18 | * 新增的页面,可以选择怎样的模板。 19 | * 其他页面。 20 | 21 | ## 插件 22 | 通过安装插件,可以增强 wordpress 的能力。 23 | 24 | ## 其他功能 25 | Wordpress 主要有如下的通用的功能: 26 | * 页面的增删改查 27 | 。 28 | * 文章的增删改查。 29 | * 分类的增删改查。 30 | * 标签的增删改查。 31 | * 用户的增删改查。用户有5种角色。 32 | * 评论的增删改查。 33 | * 资源的增删改查。资源包括图片,视频,音频等。 34 | * 导出和备份内容。 35 | 36 | -------------------------------------------------------------------------------- /tools/my-tools/jianshu/login/index.js: -------------------------------------------------------------------------------- 1 | var puppeteer = require('puppeteer') 2 | 3 | index() 4 | 5 | async function index() { 6 | const browser = await puppeteer.launch({ 7 | headless: false, 8 | // devtools: true, 9 | }); 10 | let page = await browser.newPage(); 11 | await page.goto(`https://www.jianshu.com/sign_in`, { 12 | waitUntil: 'networkidle0' 13 | }) 14 | 15 | // 输入帐号密码,点登录 16 | // session_email_or_mobile_number 17 | // session_password 18 | // await page.type('#session_email_or_mobile_number', 'tel') 19 | // await page.type('#session_password', 'pass') 20 | 21 | page.click('#sign-in-form-submit-btn') 22 | 23 | // 等待登录成功 24 | await page.waitForNavigation({ 25 | timeout: 0 26 | }) 27 | 28 | // 分析粉丝 29 | await page.goto(`https://www.jianshu.com/notifications#/follows`) 30 | console.log('登录成功') 31 | 32 | var fanNames = Array.from(page.$$('.follow-list .info .user')) 33 | // 34 | fanNames.forEach(fanEl => { 35 | console.log(fanEl.textContent) 36 | }) 37 | 38 | } -------------------------------------------------------------------------------- /tools/third-tools/tts/kdxf/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | axios@^0.18.0: 6 | version "0.18.0" 7 | resolved "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" 8 | dependencies: 9 | follow-redirects "^1.3.0" 10 | is-buffer "^1.1.5" 11 | 12 | debug@=3.1.0: 13 | version "3.1.0" 14 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 15 | dependencies: 16 | ms "2.0.0" 17 | 18 | follow-redirects@^1.3.0: 19 | version "1.5.8" 20 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.8.tgz#1dbfe13e45ad969f813e86c00e5296f525c885a1" 21 | dependencies: 22 | debug "=3.1.0" 23 | 24 | is-buffer@^1.1.5: 25 | version "1.1.6" 26 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 27 | 28 | ms@2.0.0: 29 | version "2.0.0" 30 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 九彩拼盘 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /it-service-doc/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 九彩拼盘 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /tools/my-tools/jianshu/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 九彩拼盘 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | .DS_Store 61 | -------------------------------------------------------------------------------- /tools/my-tools/wechat-assistant/v1/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 九彩拼盘 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /tools/my-tools/wechat-assistant/v2/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | .DS_Store 61 | 62 | server/data/TM_JH.json 63 | 64 | -------------------------------------------------------------------------------- /tools/third-tools/wordpress/resource.md: -------------------------------------------------------------------------------- 1 | # 资源 2 | ## 推荐主题 3 | * [WooCommerce](https://woocommerce.com/) 世界上使用量最大的独立电商平台([来源](https://trends.builtwith.com/shop))。 4 | 5 | ## 主题网站 6 | * [官方主题](https://wordpress.org/themes/) 7 | * [ThemeForest](https://themeforest.net/) 很多主题。基本上都是付费的。 8 | * [elegantthemes](https://www.elegantthemes.com) 9 | * [主题猫](http://ztmao.com/) 10 | * [主题之家](http://www.zhutihome.com/) 11 | 12 | ## 推荐插件 13 | * [Remove Google Fonts References](https://wordpress.org/plugins/remove-google-fonts-references/) 去除Google 的字体(国内被墙了),可以加速。 14 | * Wechat Social Login 。微信登录。 15 | 16 | ## 插件 17 | * [有哪些实用的WordPress 插件值得推荐?](https://www.zhihu.com/question/22864602) 18 | * [25+ 必备WordPress插件列表](http://webres.wang/25-must-have-wordpress-plugins/) 19 | 20 | ## 工具 21 | * [WhatRuns](http://chromecj.com/web-development/2017-10/832.html) 可以查看用当前网页用的 Wordpress 的主题和插件。 22 | 23 | ## 开发资源 24 | * [Themosis](https://framework.themosis.com/) A WordPress framework 25 | * [如何合并两个WordPress主题?](https://www.zhihu.com/question/20576104) 26 | 27 | ## 其他 28 | * [用 WordPress 和主题模板做网站](https://mp.weixin.qq.com/s/8Ansqf8Q1ibdfHKX7ddSzA) 内容包括:WordPress 做企业站要花多少钱?要做多久?怎么挑主机?怎么挑以及买主题?主题升级等等内容。 29 | * [WordPress建站主机推荐](https://www.hostmama.cc/wordpress%E5%BB%BA%E7%AB%99%E4%B8%BB%E6%9C%BA%E6%8E%A8%E8%8D%90/) -------------------------------------------------------------------------------- /tools/my-tools/wechat-assistant/v1/.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *,cover 46 | .hypothesis/ 47 | 48 | # Translations 49 | *.mo 50 | *.pot 51 | 52 | # Django stuff: 53 | *.log 54 | local_settings.py 55 | 56 | # Flask stuff: 57 | instance/ 58 | .webassets-cache 59 | 60 | # Scrapy stuff: 61 | .scrapy 62 | 63 | # Sphinx documentation 64 | docs/_build/ 65 | 66 | # PyBuilder 67 | target/ 68 | 69 | # IPython Notebook 70 | .ipynb_checkpoints 71 | 72 | # pyenv 73 | .python-version 74 | 75 | # celery beat schedule file 76 | celerybeat-schedule 77 | 78 | # dotenv 79 | .env 80 | 81 | # virtualenv 82 | venv/ 83 | ENV/ 84 | 85 | # Spyder project settings 86 | .spyderproject 87 | 88 | # Rope project settings 89 | .ropeproject 90 | 91 | .pkl 92 | -------------------------------------------------------------------------------- /tools/third-tools/wordpress/install.md: -------------------------------------------------------------------------------- 1 | # 安装 2 | [文档](https://codex.wordpress.org/zh-cn:Main_Page) 3 | 4 | 在 Mac 上。 wordpress 需要的环境:MySql,PHP和 apache 可以用[XAMPP](https://www.apachefriends.org/index.html)(Apache + MariaDB + PHP + Perl) 来弄(自己一个个配置很痛苦。。。)。 5 | 6 | 在 Coding 上安装很简单。只要开启动态服务服务,改改 wp-config.php 中关于数据库的配置文件即可。数据库的信息,coding 会生成一个。 见[这里](https://coding.net/help/doc/pages/dpages.html) 7 | 8 | ## XAMPP 是一些设置 9 | ### 让本机能访问 phpMyAdmin 的做法 10 | 点XAMPP 的 volumn 下的explore 。编辑 `/opt/lampp/etc/extra/httpd-xampp.conf` 。将 11 | ``` 12 | 13 | AllowOverride AuthConfig 14 | Require local 15 | ``` 16 | 17 | 改成 18 | 19 | ``` 20 | 21 | AllowOverride AuthConfig 22 | Require all granted 23 | ``` 24 | 25 | ## 安装 wordpress 26 | 0 创建数据库 wordpress 27 | 28 | 1 将 wordpress 下的 wp-config-sample.php 重命名为wp-config.php 。修改里面的 DB_NAME 等一系列数据库配置。 29 | 30 | 2 将 wordprss 移动到 (点XAMPP 的 volumn 下的explore) htdocs 下。 31 | 32 | 3 访问 `http://192.168.64.2/wordpress/wp-admin/install.php` 33 | 34 | 4 输入网站的一些信息,就安装完成拉~ 35 | 36 | ## 权限设置 37 | 上传图片之类,需要设置权限 38 | ``` 39 | cd xxx/htdocs/wordpress/ 40 | cd wp-content 41 | chmod 777 . 42 | chmod 777 ./plugins 43 | chmod 777 ./themes 44 | chmod 777 ./uploads 45 | ``` 46 | 47 | ## 安装主题会要输入ftp 帐号密码的解决方案 48 | 在 wp-config.php 文件中添加下面的代码: 49 | ``` 50 | define('FS_METHOD', 'direct'); 51 | define('FS_CHMOD_DIR', 0777); 52 | define('FS_CHMOD_FILE', 0777); 53 | ``` 54 | 55 | ## 页面模板 56 | 有些主题会有页面模板供选择。 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /tools/my-tools/jianshu/bin/submit-article.js: -------------------------------------------------------------------------------- 1 | sumbitToFrontend() // 向前端类专栏投稿 2 | function sumbitToFrontend() { 3 | submitArticle(3) // 程序员 4 | submitArticle(65506) // Web前端之路 5 | submitArticle(52276) // Web 前端开发 6 | submitArticle(204109) // 技术文 7 | } 8 | /* 9 | * 给专栏投稿 10 | * @params collectionId: 专题id 11 | * @params articleIndex: 投稿文章序号文章。可选 12 | */ 13 | function submitArticle(collectionId, articleIndex = 0) { 14 | var collection 15 | var article 16 | 17 | fetchCollectionInfo(collectionId).done(data => { 18 | collection = data 19 | fetchArticleList(collection.id).done(articles => { 20 | article = articles[articleIndex] 21 | $.ajax({ 22 | url: `http://www.jianshu.com/notes/${article.id}/submit`, 23 | type: 'post', 24 | data: JSON.stringify({ 25 | collection_id: collection.id 26 | }), 27 | contentType: 'application/json' 28 | }).done(data => { 29 | alert(`${article.title} 投稿 ${collection.title} 成功!`) 30 | }).fail(data => { 31 | alert(`${article.title} 投稿 ${collection.title} 失败:${data.responseJSON.error}`) 32 | }) 33 | }).fail(data => { 34 | dfd.resolve(data) 35 | }) 36 | }) 37 | } 38 | 39 | // 获取我的文章列表 40 | function fetchArticleList(collectionId) { 41 | return $.ajax({ 42 | url: `http://www.jianshu.com/collections/${collectionId}/contribute_notes?page=1`, 43 | }) 44 | } 45 | 46 | // 获取专栏信息 47 | function fetchCollectionInfo(id) { 48 | var dfd = $.Deferred() 49 | $.ajax({ 50 | url: `http://www.jianshu.com/subscriptions/${id}`, 51 | }).done(data => { 52 | dfd.resolve(data.source) 53 | }).fail(data => { 54 | dfd.resolve(data) 55 | }) 56 | return dfd.promise() 57 | } 58 | -------------------------------------------------------------------------------- /it-service-doc/README.md: -------------------------------------------------------------------------------- 1 | # 软件服务(外包)公司文档 2 | > 如果没有产品,只做定制化开发的外包公司,很难平衡开发质量和利润,因为可复用的东西不多。有产品,可以针对的去找客户,代码质量可以不断打磨,成本也会越来越低。 3 | > 业务成熟的公司,做定制化的需求一点。初创公司用现成的业务软件磨合业务。 4 | 5 | ## 目录 6 | * [愿景](target.md) 7 | * [关键点](key.md) 8 | * [接项目的原则](accept-project-rule.md) 9 | * 客户帮助文档 10 | * 部署相关 11 | * 如何购买服务器? 阿里云。 七牛云。 12 | * 如何购买域名? 13 | * 域名如何备案? 14 | * HTTS 15 | * HTTPS 介绍。 是什么,为什么要用,什么场景一定要用 16 | * 如何购买 SSL 证书。 17 | * 微信相关 18 | * 订阅号和服务号的区别 19 | * 如何申请微信公众号 20 | * 小程序能做什么,不能做什么 21 | * 如何开通微信小程序 22 | * [商家开通支付功能的设置](https://jingyan.baidu.com/article/b907e627d6e2d646e7891cca.html) 23 | * [微信公众号迁移](customer/wechat/微信公众号迁移.png) 24 | * 解决公众号问题的客服。通过小程序: 腾讯客服,支持提交问题和在线咨询。不支持人工在线咨询。 25 | * 服务 26 | * 短信服务的购买流程。 27 | * 地图服务的使用。 腾讯地图。 百度地图。 28 | * 第三方客服的使用。 29 | * 第三方数据统计工具的使用。 30 | * 模板 31 | * [文档导航](template/doc-nav.md) 32 | * 项目模板 33 | * 需求文档 34 | * 产品需求说明书模板:[说明](https://www.jianshu.com/p/925c512949bb), [模板文件](template/产品需求说明书模板_v1.2.docx) 35 | * [管理后台详细设计](need/admin-design.md) 36 | * 手机原型图 37 | * [验收清单](need/key-list.md) 38 | * 用户使用手册 39 | * 软件系统维护手册。包括对硬件,软件的要求,如何部署,启动,停止。 40 | * 报价。 普通报价。 时间合同报价。 41 | * [公司财务](financial) 42 | * 售前 43 | * [与客户的第一次见面沟通](communicate-first-time) 44 | * 项目管理 45 | * [敏捷开发](project-manage/smart.md) 46 | * [项目责任制](project-manage/project-responsibility-plan.md) 47 | * [项目费用模板](project-manage/spend-template.xlsx) 48 | * 开发 49 | * 开发流程。 50 | * 部署流程。 51 | * 测试,交付流程。 52 | * 研发 53 | * 通用 54 | * [如何描述测试时发现的问题?](develop/common/how-to-create-qa-problem.md) 55 | * 技能 56 | * 前端技术栈 57 | * 后端技术栈 58 | * Android 技术栈 59 | * IOS 技术栈 60 | * UI 技术栈 61 | * QA 技术栈 62 | * 项目经理 技术栈 63 | * 资源 64 | * 优质第三方服务&工具 65 | * 优质开源项目 66 | -------------------------------------------------------------------------------- /tools/third-tools/tts/google-tts/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | encoding@^0.1.11: 6 | version "0.1.12" 7 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 8 | dependencies: 9 | iconv-lite "~0.4.13" 10 | 11 | google-tts-api@^0.0.3: 12 | version "0.0.3" 13 | resolved "https://registry.yarnpkg.com/google-tts-api/-/google-tts-api-0.0.3.tgz#2fbc4db33fd58f2acbd6af1443026e15922dcca5" 14 | dependencies: 15 | isomorphic-fetch "^2.2.1" 16 | 17 | iconv-lite@~0.4.13: 18 | version "0.4.24" 19 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 20 | dependencies: 21 | safer-buffer ">= 2.1.2 < 3" 22 | 23 | is-stream@^1.0.1: 24 | version "1.1.0" 25 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 26 | 27 | isomorphic-fetch@^2.2.1: 28 | version "2.2.1" 29 | resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" 30 | dependencies: 31 | node-fetch "^1.0.1" 32 | whatwg-fetch ">=0.10.0" 33 | 34 | node-fetch@^1.0.1: 35 | version "1.7.3" 36 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" 37 | dependencies: 38 | encoding "^0.1.11" 39 | is-stream "^1.0.1" 40 | 41 | "safer-buffer@>= 2.1.2 < 3": 42 | version "2.1.2" 43 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 44 | 45 | whatwg-fetch@>=0.10.0: 46 | version "3.0.0" 47 | resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" 48 | -------------------------------------------------------------------------------- /tools/my-tools/jianshu/artcile-backup/index_template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {author}的文章 6 | 30 | 31 | 32 |
33 | 53 | 54 |
55 | 56 |
57 |
58 | 59 | 85 | 86 | -------------------------------------------------------------------------------- /tools/my-tools/wechat-assistant/v1/bot.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding:UTF-8 -*- 3 | 4 | from wxpy import * 5 | import re 6 | 7 | # 初始化机器人,扫码登陆 8 | bot = Bot() 9 | apiKey = '去 http://www.tuling123.com/ 上去申请' 10 | 11 | bot.enable_puid('wxpy_puid.pkl') # 不加参数,puid 会变。。。 12 | 13 | # 新人入群的欢迎语 14 | welcome_text = '''🎉 欢迎 @{} 的加入! 15 | 来做个简单的自我介绍吧~ 16 | ''' 17 | 18 | # 需管理的微信群 19 | 20 | intro = ''' 21 | 我是九彩拼盘大人的前端小助手~ 22 | 发送: 23 | 入门:进入前端入门群交流 24 | 进阶:进入前端中级群交流 25 | 关键字:获得前端文章相关的关键字 26 | 博客:获得九彩拼盘的博客地址 27 | ''' 28 | 29 | # 将群加入通讯录。否则有的群拿不到 30 | allGroups = bot.groups() 31 | groupText = allGroups.search('调戏机器人')[0] 32 | groupJunior = allGroups.search('🐋 入门')[0] 33 | groupSenior = allGroups.search('🐋 中级')[0] 34 | 35 | 36 | groups = [groupJunior, groupSenior, groupText] 37 | 38 | # ---------------- 配置结束 ---------------- 39 | 40 | 41 | tuling = Tuling(api_key=apiKey) 42 | 43 | # 新人入群通知的匹配正则 44 | rp_new_member_name = ( 45 | re.compile(r'^"(.+)"通过'), 46 | re.compile(r'邀请"(.+)"加入'), 47 | ) 48 | 49 | ''' 50 | 加好友请求 51 | ''' 52 | @bot.register(msg_types=FRIENDS) 53 | def new_friends(msg): 54 | user = msg.card.accept() 55 | return intro 56 | 57 | ''' 58 | 好友的自动回复 59 | ''' 60 | @bot.register(Friend, msg_types=TEXT) 61 | def reply_my_friend(msg): 62 | return reply_it(msg) 63 | 64 | ''' 65 | 入群的新人欢迎消息 66 | ''' 67 | @bot.register(groups, NOTE) 68 | def welcome(msg): 69 | name = get_new_member_name(msg) 70 | if name: 71 | return welcome_text.format(name) 72 | 73 | def get_new_member_name(msg): 74 | # itchat 1.2.32 版本未格式化群中的 Note 消息 75 | from itchat.utils import msg_formatter 76 | msg_formatter(msg.raw, 'Text') 77 | print(msg.text) 78 | for rp in rp_new_member_name: 79 | match = rp.search(msg.text) 80 | if match: 81 | return match.group(1) 82 | 83 | ''' 84 | 回复被 @ 的消息 85 | ''' 86 | @bot.register(groups, TEXT) 87 | def reply_group_msg(msg): 88 | if msg.is_at: 89 | return reply_it(msg) 90 | 91 | ''' 92 | 回复信息 93 | ''' 94 | def reply_it(msg): 95 | sender = msg.member or msg.sender # 群聊中,会单独回复。 96 | if '入门' in msg.text: 97 | groupJunior.add_members(sender, use_invitation=True) 98 | elif '进阶' in msg.text: 99 | groupSenior.add_members(sender, use_invitation=True) 100 | else: 101 | tuling.do_reply(msg) 102 | 103 | # 在 nohup(后台挂起)时执行下面的命令会报错,要用 bot.join() 104 | embed() 105 | # bot.join() 106 | 107 | -------------------------------------------------------------------------------- /tools/third-tools/tts/baidu/demo.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 该脚本用于测试百度语音合成接口,详细参数说明和使用方法请参考官方文档:http://ai.baidu.com/docs#/TTS-API/top 3 | # This is the demo script for Baidu Speech TTS, please refer http://ai.baidu.com/docs#/TTS-API/top for detailed document 4 | 5 | 6 | # 该KEY仅仅做测试用,正式使用请在 ai.baidu.com 控制台申请个人APP 7 | # THIS KEY IS FOR TEST ONLY 8 | APPKEY="rKCHBLmYiFPuCQTS0HttLbUD" 9 | APPSECRET="037dc446820ec143d1628c20146b9d34" 10 | 11 | # 需要合成的文本 12 | # Text to synthesis 13 | # 百度AI更懂你 URLENCODE 编码 urlencode result = %e7%99%be%e5%ba%a6AI%e6%9b%b4%e6%87%82%e4%bd%a0 14 | # 注意实际使用需要2次urlencode以保障如“+”等特殊字符合成正确。 请测试 “1+1=2” 15 | TEXT="%E8%BF%99%E6%98%AF%E6%88%91%E8%80%81%E5%AE%B6%EF%BC%8C%E5%B0%B1%E6%98%AF%E5%9C%9F%E5%BE%88%E5%A4%9A%EF%BC%8C%E4%BB%8E%E6%B4%9B%E9%98%B3%E5%BC%80%E8%BF%87%E6%9D%A5%EF%BC%8C%E8%BD%A6%E5%8F%98%E9%82%A3%E4%B9%88%E8%84%8F%E3%80%82%E4%B8%80%E5%88%AE%E9%A3%8E%E8%A7%89%E5%BE%97%E6%BB%A1%E8%84%B8%E9%83%BD%E6%98%AF%E5%9C%9F%E3%80%82%E8%A1%A3%E6%9C%8D%E5%88%9A%E7%A9%BF%E4%B8%8A%E5%B0%B1%E8%A7%89%E5%BE%97%E5%BE%88%E8%84%8F" 16 | # or use English words 17 | # TEXT=hello 18 | 19 | # 发音人选择, 0为普通女声,1为普通男生,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女声 20 | # Speaker, 1: female, 2: male, 3: male-2, 4: child; 21 | SPEAKER=0 22 | # Speed, 0 ~ 15; 语速,取值0-9,默认为5中语速 23 | SPEED=5 24 | # Pitch, 0 ~ 15; 音调,取值0-9,默认为5中语调 25 | PITCH=5 26 | # Volume, 0 ~ 9; 音量,取值0-9,默认为5中音量 27 | VOLUME=5 28 | 29 | # Aue,下载音频的格式 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wav 30 | AUE=3 31 | 32 | FORMAT_LIST=([3]='mp3' [4]='pcm' [5]='pcm' [6]='wav') 33 | FORMAT=${FORMAT_LIST[$AUE]} 34 | 35 | ## step 1: Fetch token 36 | token_url="https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=$APPKEY&client_secret=$APPSECRET" 37 | echo "Request token $token_url" 38 | 39 | token_resp=$(curl -s "$token_url") 40 | echo "Response: $token_resp" 41 | # token=$(echo "${token_resp}" | grep -oP '"access_token"\s*:\s*"\K.+?(?=")') # this works for Linux with GUN grep 42 | # MacOS grep not support Perl(-P) syntax, so we use perl instead ;) 43 | token=$(echo "${token_resp}" | perl -nle 'print $& if m{"access_token"\s*:\s*"\K.+?(?=")}' ) 44 | echo "Got token: $token" 45 | echo 46 | 47 | ## step 2: TTS 48 | tts_url="http://tsn.baidu.com/text2audio?lan=zh&ctp=1&cuid=123456&tok=$token&per=$SPEAKER&spd=$SPEED&pit=$PITCH&vol=$VOLUME&tex=$TEXT" 49 | echo "Request TTS: $tts_url" 50 | curl -v -o result.$FORMAT "$tts_url" 51 | 52 | echo "Audio file saved as result.$FORMAT" 53 | # 以下以mp3文件为示例 54 | # Content-Type: audio/mp3 表示正确 可以播放result.mp3 55 | # Content-Type: application/json 表示错误 result.mp3改名为result.txt打开 56 | # Content-Type: application/json means that error occurs, please rename result.mp3 as result.txt 57 | echo "Done" -------------------------------------------------------------------------------- /tools/my-tools/jianshu/artcile-backup/README.md: -------------------------------------------------------------------------------- 1 | # 用 Puppeteer 实现简书文章备份 2 | 读了篇文章 [《前端使用 puppeteer 爬虫生成《React.js 小书》PDF并合并》](https://segmentfault.com/a/1190000016198363)。参照这个思路,可以用 [Puppeteer](https://github.com/GoogleChrome/puppeteer) 备份简书的文章。 3 | 4 | 呈现效果: 5 | ![](show/demo.jpeg) 6 | 7 | 点击左侧的链接,可以看到每篇文章。每篇文章都存了一张截图,如下图所示: 8 | 9 | ![](show/dict.png) 10 | 11 | ## 实现思路 12 | 1. 进入个人首页,抓取该用户所有的文章。 13 | 2. 对每篇文章截图。 14 | 3. 生成一个导航页面。该页面上的链接,可以看到每篇文章截图。 15 | 16 | ## 主要的实现代码 17 | 抓取该用户所有的文章。需要程序将页面滚动到底部,去拿所有文章。代码如下: 18 | ``` 19 | let articles = await page.evaluate(async () => { 20 | // 将页面滚动到最底部 21 | await new Promise((resolve, reject) => { 22 | let totalHeight = 0 23 | let distance = 200 24 | let timer = setInterval(() => { 25 | let scrollHeight = document.body.scrollHeight 26 | window.scrollBy(0, distance) 27 | totalHeight += distance 28 | if(totalHeight >= scrollHeight){ 29 | clearInterval(timer) 30 | resolve() 31 | } 32 | }, 100) 33 | }) 34 | // 抓取所有文章 35 | var res = Array.from(document.querySelectorAll('.note-list a.title')) 36 | .map(link => { 37 | return { 38 | id: link.getAttribute('href').split('/').slice(-1), 39 | title: link.textContent 40 | } 41 | 42 | }) 43 | return res 44 | }) 45 | ``` 46 | 47 | 对每篇文章截屏。 48 | ``` 49 | for(var i = 0; i < articles.length; i++) { 50 | await download(browser, articles[i].id) 51 | } 52 | ``` 53 | 54 | 加载文章中的图片,生成一个导航页面。该页面上的链接到每篇文章截图。 55 | ``` 56 | const imgs = Array.from(document.querySelectorAll('.show-content img')) 57 | await Promise.all(imgs.filter(img => !img.complete).map(img => { 58 | return new Promise((resolve, reject) => { 59 | img.addEventListener('load', resolve); 60 | img.addEventListener('error', resolve); // 也算成功吧 61 | }); 62 | })) 63 | ``` 64 | 65 | 下载某篇文章。 66 | ``` 67 | await page.screenshot({ 68 | fullPage: true, 69 | path: resolve(outputConfig.path, `${pageInfo.title}.png`) 70 | }) 71 | ``` 72 | 73 | ## 遇到的坑 74 | ### 图片懒加载 75 | 文章的图片是懒加载,因此直接截图,在页面不可见部分的图片会截不全。 76 | 77 | 解决方案: 78 | 程序将页面往下每过一段时间往下滚,滚动到不能滚动为止。 79 | 80 | ### pfd 里插图片的问题 81 | 开始是想做一篇文章生成一个PDF,然后把所有的PDF再拼成一个PDF的。 但发现PDF插入图片,如果图片处于跨页位置或图片高度超过一页PDF的高度时,会自动裁切。效果不好,就放弃PDF了。 82 | 83 | 解决方案: 84 | 用图片来做截屏。 85 | 86 | ### page.evaluate 不支持调用外部函数 87 | 解决方案: 88 | 用 `page.evaluateHandle` 添加方法。如果只是加外部的 `consle.log` 可以用 89 | ``` 90 | page.on('console', msg => console.log(msg.text())) 91 | ``` 92 | 93 | ### 反爬虫 94 | 短时间内频繁访问简书的文章,会触发简书反爬虫机制,导致返回的页面超时。 95 | 96 | 解决方案: 97 | 如果页面访问超时,歇一段时间,多试几次。 98 | 99 | ``` 100 | try { 101 | await page.goto(url) 102 | } catch(e) { 103 | // 请求超时,重试3次。 为了反爬虫。 104 | await retry(3, async () => { 105 | await page.goto(url) 106 | }) 107 | } 108 | 109 | async function retry(times, fn) { 110 | if(times > 0) { 111 | await timeout(1000) // 歇1秒再试 112 | try { 113 | await fn() 114 | } catch(e) { 115 | await retry(times--, fn) 116 | } 117 | } 118 | } 119 | ``` 120 | 121 | -------------------------------------------------------------------------------- /tools/my-tools/jianshu/server/service.js: -------------------------------------------------------------------------------- 1 | var request = require('request') 2 | 3 | const JIANSHU_SERVER = 'http://www.jianshu.com' 4 | // loggeredCoodie 的值是简书登录后,页面输入 document.cookie 的值。 5 | // _session_id 是 http only 的。。。 6 | const loggeredCoodie = `xxx` 7 | // 获取消息通知 8 | var fetchNotifications = (loginedCookieValue) => { 9 | // return new Promise((resolve,reject)=> { 10 | var url = `${JIANSHU_SERVER}/notifications?type=follows&page=1` 11 | var j = generatorLoginCookieJar(loginedCookieValue, url) 12 | request({ 13 | url: url, 14 | jar: j, 15 | headers: { 16 | 'Accept': 'application/json' 17 | } 18 | }, function (error, response, body) { 19 | console.log(body) 20 | // resolve(body) 21 | }) 22 | // }) 23 | } 24 | // http://www.jianshu.com/u/EhUmA3?order_by=shared_at&_pjax=%23list-container 25 | 26 | // 获取文章列表 TODO 有没有接口 获得用户id EhUmA3 27 | var fetchArticles = (loginedCookieValue) => { 28 | var url = `${JIANSHU_SERVER}/u/EhUmA3?order_by=shared_at` 29 | var j = generatorLoginCookieJar(loginedCookieValue, url) 30 | request({ 31 | url: url, 32 | jar: j, 33 | headers: { 34 | 'Accept': 'application/json' 35 | } 36 | }, function (error, response, body) { 37 | var neededInfo = ['id', 'title', 'shared_at'] 38 | var note = JSON.parse(body).notes.map(article => { 39 | var res = {} 40 | neededInfo.forEach(key => { 41 | res[key] = article[key] 42 | }) 43 | return res 44 | }) 45 | console.log(note) 46 | }) 47 | } 48 | 49 | // 获取专题 50 | var fetchCollections = (loginedCookieValue, q) => { 51 | var url = `${JIANSHU_SERVER}/search/do?q=${encodeURIComponent(q)}&type=collection&page=1&order_by=top` 52 | var j = generatorLoginCookieJar(loginedCookieValue, url) 53 | request({ 54 | url: url, 55 | jar: j, 56 | headers: { 57 | 'Accept': 'application/json' 58 | } 59 | }, function (error, response, body) { 60 | var neededInfo = ['id', 'title', 'public_notes_count','likes_count'] 61 | var collection = JSON.parse(body).entries.map(article => { 62 | var res = {} 63 | neededInfo.forEach(key => { 64 | res[key] = article[key] 65 | }) 66 | return res 67 | }) 68 | console.log(collection) 69 | }) 70 | } 71 | 72 | // 投稿 73 | var submitArticle = (loginedCookieValue, articleId, collectionId) => { 74 | var url = `${JIANSHU_SERVER}/notes/${articleId}/submit` 75 | var j = generatorLoginCookieJar(loginedCookieValue, url) 76 | request({ 77 | url: url, 78 | jar: j, 79 | method: 'POST', 80 | json: true, 81 | body: { 82 | collection_id: collectionId 83 | }, 84 | headers: { 85 | 'Accept': 'application/json' 86 | } 87 | }, function (error, response, body) { 88 | console.log(body) 89 | }) 90 | } 91 | 92 | function generatorLoginCookieJar(loginedCookieValue, url) { 93 | var j = request.jar(); 94 | loginedCookieValue.split(';').forEach(item => { 95 | // console.log(item) 96 | var cookie = request.cookie(item.trim()) 97 | j.setCookie(cookie, url) 98 | }) 99 | // console.log(j) 100 | return j 101 | } 102 | 103 | fetchNotifications(loggeredCoodie) 104 | // fetchArticles(loggeredCoodie) 105 | // fetchCollections(loggeredCoodie, '前端') 106 | // submitArticle(loggeredCoodie, 11819604, 937) 107 | 108 | /* 109 | 专栏 id 1084 Web 前端之路 110 | 文章 11819604 vue-router2 写法示例 111 | */ 112 | 113 | module.exports = { 114 | fetchNotifications: ()=> { 115 | return fetchNotifications(loggeredCoodie) 116 | } 117 | } -------------------------------------------------------------------------------- /tools/my-tools/jianshu/artcile-backup/index.js: -------------------------------------------------------------------------------- 1 | var config = require('./config') 2 | var puppeteer = require('puppeteer') 3 | var fs = require('fs') 4 | var fsExtra = require('fs-extra') 5 | var path = require('path') 6 | 7 | const isDebug = true 8 | const SPLIT = '@@@@@@@@@@@' 9 | index() 10 | 11 | 12 | async function index() { 13 | const browser = await puppeteer.launch({ 14 | headless: !isDebug, 15 | // devtools: true, 16 | }); 17 | 18 | try { 19 | // await getAllArticle(browser, 'EhUmA3') // 很多文章 20 | // await getAllArticle(browser, 'a5301268013b') // 有不少文章。star 21 | // await getAllArticle(browser, 'b41122e8d776') // 只有一页文章 22 | // await getAllArticle(browser, '65df078621c0') // 有少量一些文章 23 | await getAllArticle(browser, '82a143ac3f03') 24 | } catch(e) { 25 | console.log(e) 26 | } 27 | 28 | console.log('恭喜,所有文章下载完成!') 29 | 30 | browser.close() 31 | } 32 | 33 | async function getAllArticle(browser, userId) { 34 | let page = await browser.newPage(); 35 | await page.goto(`${config.jianshu.userPrefix}/${userId}`) 36 | let user = await page.evaluate(async () => { 37 | // 将页面滚动到最底部 38 | await new Promise((resolve, reject) => { 39 | let totalHeight = 0 40 | let distance = 100 41 | let timer = setInterval(() => { 42 | let scrollHeight = document.body.scrollHeight 43 | window.scrollBy(0, distance) 44 | totalHeight += distance 45 | if(totalHeight >= scrollHeight){ 46 | clearInterval(timer) 47 | resolve() 48 | } 49 | }, 100) 50 | }) 51 | var articles = Array.from(document.querySelectorAll('.note-list a.title')) 52 | .map(link => { 53 | return { 54 | id: link.getAttribute('href').split('/').slice(-1), 55 | title: link.textContent 56 | } 57 | 58 | }) 59 | return { 60 | articles, 61 | info: {name: document.querySelector('.name').textContent} 62 | } 63 | 64 | }) 65 | var {articles, info} = user 66 | console.log(`${info.name}总共有${articles.length}篇文章`) 67 | 68 | const outputFoldPath = resolve(`${config.output.path}/${info.name}_${userId}`); 69 | fsExtra.ensureDir(`${outputFoldPath}/article`) 70 | 71 | var nav = [] 72 | var navObj = {} 73 | for(var i = 0; i < articles.length; i++) { 74 | // TODO 发现文章下载过,不做重复下载 75 | let articleInfo = await download(browser, articles[i].id, outputFoldPath) 76 | let [categoryName, title, articleId] = articleInfo.split(SPLIT) 77 | if(!navObj[categoryName]) { 78 | navObj[categoryName] = [] 79 | } 80 | navObj[categoryName].push({id: articleId, title: title}) 81 | } 82 | nav = Object.keys(navObj).map(categoryName => { 83 | return { 84 | categoryName, 85 | articleList: navObj[categoryName] 86 | } 87 | }) 88 | 89 | var htmlTemplate = fs.readFileSync(resolve('index_template.html'), 'UTF-8') 90 | 91 | htmlTemplate = htmlTemplate 92 | .replace('{author}', info.name) 93 | .replace('{data}', JSON.stringify(nav, null, '\t')) 94 | fsExtra.outputFileSync(`${outputFoldPath}/index.html`, htmlTemplate) 95 | } 96 | 97 | async function download(browser, articleId, outputFoldPath) { 98 | let page = await browser.newPage(); 99 | var url = `${config.jianshu.articlePrefix}/${articleId}` 100 | page.setUserAgent(config.userAgent) 101 | try { 102 | await page.goto(url) 103 | } catch(e) { 104 | // 请求超时,重试3次。 为了反爬虫。 105 | await retry(3, async () => { 106 | await page.goto(url) 107 | }) 108 | } 109 | 110 | // 页面上下文中加 log 111 | page.on('console', msg => console.log(msg.text())) 112 | 113 | let pageInfo = await page.evaluate(async () => { 114 | const title = document.querySelector('.title').textContent 115 | const categoryName = document.querySelector('.notebook span').textContent 116 | console.log(`开始下载: ${title}`) 117 | 118 | var style = document.createElement('style') 119 | style.innerHTML = ` 120 | html body {padding-top: 40px!important;} 121 | .note {padding-top:0 !important;} 122 | .post {padding-top:0 !important;} 123 | .title{margin-top: 0 !important;margin-bottom: 20px !important;}` 124 | document.body.appendChild(style) 125 | // 将页面滚动到最底部 126 | await new Promise((resolve, reject) => { 127 | let totalHeight = 0 128 | let distance = 100 129 | let timer = setInterval(() => { 130 | let scrollHeight = document.body.scrollHeight 131 | window.scrollBy(0, distance) 132 | totalHeight += distance 133 | if(totalHeight >= scrollHeight){ 134 | clearInterval(timer) 135 | resolve() 136 | } 137 | }, 100) 138 | }) 139 | 140 | // 删除页面上干扰的内容 141 | removeDOM('.navbar-fixed-top') 142 | removeDOM('.author') 143 | removeDOM('#free-reward-panel') 144 | removeDOM('.show-foot') 145 | removeDOM('.follow-detail') 146 | removeDOM('.meta-bottom') 147 | removeDOM('#comment-list') 148 | removeDOM('.note-bottom') 149 | removeDOM('#fixed-ad-container') 150 | removeDOM('.side-tool') 151 | removeDOM('#web-note-ad-1') 152 | 153 | // 加载图片 154 | try { 155 | const imgs = Array.from(document.querySelectorAll('.show-content img')) 156 | 157 | await Promise.all(imgs.filter(img => !img.complete).map(img => { 158 | return new Promise((resolve, reject) => { 159 | img.addEventListener('load', resolve); 160 | img.addEventListener('error', resolve); // 也算成功吧 161 | }); 162 | })) 163 | 164 | } catch(e) { 165 | const div = document.createElement('div'); 166 | div.innerHTML = e 167 | document.body.appendChild(div) 168 | } 169 | 170 | function removeDOM(selector) { 171 | if(document.querySelector(selector)) { 172 | document.querySelector(selector).remove() 173 | } else { 174 | console.log(`未找到元素: ${selector}`) 175 | } 176 | } 177 | 178 | 179 | return { 180 | wh: { 181 | width: 680, // 620 是主题内容的宽度 182 | height: document.body.clientHeight, 183 | }, 184 | title, 185 | categoryName 186 | } 187 | }); 188 | 189 | await page.setViewport(pageInfo.wh); 190 | 191 | var outputConfig = config.output 192 | 193 | var downloadPath = `${outputFoldPath}/article/${pageInfo.title.replace(/\//g, '_')}.png` 194 | await page.screenshot({ 195 | fullPage: true, 196 | path: downloadPath 197 | }) 198 | console.log(`下载完成: ${pageInfo.title}。`) 199 | await page.close() 200 | return `${pageInfo.categoryName}${SPLIT}${pageInfo.title}${SPLIT}${articleId}` 201 | } 202 | 203 | async function retry(times, fn) { 204 | if(times > 0) { 205 | await timeout(1000) // 歇1秒再试 206 | try { 207 | console.log(`倒数第${times}次重试!`) 208 | await fn() 209 | } catch(e) { 210 | await retry(times--, fn) 211 | } 212 | } else { 213 | console.log('重试失败!') 214 | } 215 | } 216 | 217 | function resolve(dir, dir2 = ''){ 218 | return path.posix.join(__dirname, './', dir, dir2); 219 | } 220 | 221 | function timeout(delay) { 222 | return new Promise((resolve, reject) => { 223 | setTimeout(() => { 224 | try { 225 | resolve(1) 226 | } catch (e) { 227 | reject(0) 228 | } 229 | }, delay) 230 | }) 231 | } 232 | 233 | 234 | -------------------------------------------------------------------------------- /tools/my-tools/jianshu/login/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | agent-base@^4.1.0: 6 | version "4.2.1" 7 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" 8 | dependencies: 9 | es6-promisify "^5.0.0" 10 | 11 | async-limiter@~1.0.0: 12 | version "1.0.0" 13 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" 14 | 15 | balanced-match@^1.0.0: 16 | version "1.0.0" 17 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 18 | 19 | brace-expansion@^1.1.7: 20 | version "1.1.11" 21 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 22 | dependencies: 23 | balanced-match "^1.0.0" 24 | concat-map "0.0.1" 25 | 26 | buffer-from@^1.0.0: 27 | version "1.1.1" 28 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 29 | 30 | concat-map@0.0.1: 31 | version "0.0.1" 32 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 33 | 34 | concat-stream@1.6.2: 35 | version "1.6.2" 36 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 37 | dependencies: 38 | buffer-from "^1.0.0" 39 | inherits "^2.0.3" 40 | readable-stream "^2.2.2" 41 | typedarray "^0.0.6" 42 | 43 | core-util-is@~1.0.0: 44 | version "1.0.2" 45 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 46 | 47 | debug@2.6.9: 48 | version "2.6.9" 49 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 50 | dependencies: 51 | ms "2.0.0" 52 | 53 | debug@^3.1.0: 54 | version "3.2.6" 55 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 56 | dependencies: 57 | ms "^2.1.1" 58 | 59 | debug@^4.1.0: 60 | version "4.1.1" 61 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 62 | dependencies: 63 | ms "^2.1.1" 64 | 65 | es6-promise@^4.0.3: 66 | version "4.2.6" 67 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" 68 | 69 | es6-promisify@^5.0.0: 70 | version "5.0.0" 71 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 72 | dependencies: 73 | es6-promise "^4.0.3" 74 | 75 | extract-zip@^1.6.6: 76 | version "1.6.7" 77 | resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" 78 | dependencies: 79 | concat-stream "1.6.2" 80 | debug "2.6.9" 81 | mkdirp "0.5.1" 82 | yauzl "2.4.1" 83 | 84 | fd-slicer@~1.0.1: 85 | version "1.0.1" 86 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" 87 | dependencies: 88 | pend "~1.2.0" 89 | 90 | fs.realpath@^1.0.0: 91 | version "1.0.0" 92 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 93 | 94 | glob@^7.1.3: 95 | version "7.1.4" 96 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 97 | dependencies: 98 | fs.realpath "^1.0.0" 99 | inflight "^1.0.4" 100 | inherits "2" 101 | minimatch "^3.0.4" 102 | once "^1.3.0" 103 | path-is-absolute "^1.0.0" 104 | 105 | https-proxy-agent@^2.2.1: 106 | version "2.2.1" 107 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" 108 | dependencies: 109 | agent-base "^4.1.0" 110 | debug "^3.1.0" 111 | 112 | inflight@^1.0.4: 113 | version "1.0.6" 114 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 115 | dependencies: 116 | once "^1.3.0" 117 | wrappy "1" 118 | 119 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 120 | version "2.0.3" 121 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 122 | 123 | isarray@~1.0.0: 124 | version "1.0.0" 125 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 126 | 127 | mime@^2.0.3: 128 | version "2.4.3" 129 | resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.3.tgz#229687331e86f68924e6cb59e1cdd937f18275fe" 130 | 131 | minimatch@^3.0.4: 132 | version "3.0.4" 133 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 134 | dependencies: 135 | brace-expansion "^1.1.7" 136 | 137 | minimist@0.0.8: 138 | version "0.0.8" 139 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 140 | 141 | mkdirp@0.5.1: 142 | version "0.5.1" 143 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 144 | dependencies: 145 | minimist "0.0.8" 146 | 147 | ms@2.0.0: 148 | version "2.0.0" 149 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 150 | 151 | ms@^2.1.1: 152 | version "2.1.1" 153 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 154 | 155 | once@^1.3.0: 156 | version "1.4.0" 157 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 158 | dependencies: 159 | wrappy "1" 160 | 161 | path-is-absolute@^1.0.0: 162 | version "1.0.1" 163 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 164 | 165 | pend@~1.2.0: 166 | version "1.2.0" 167 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 168 | 169 | process-nextick-args@~2.0.0: 170 | version "2.0.0" 171 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 172 | 173 | progress@^2.0.1: 174 | version "2.0.3" 175 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 176 | 177 | proxy-from-env@^1.0.0: 178 | version "1.0.0" 179 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" 180 | 181 | puppeteer@^1.15.0: 182 | version "1.16.0" 183 | resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.16.0.tgz#4b763d9ff4e69a4bb7a031c3393534214d54f27e" 184 | dependencies: 185 | debug "^4.1.0" 186 | extract-zip "^1.6.6" 187 | https-proxy-agent "^2.2.1" 188 | mime "^2.0.3" 189 | progress "^2.0.1" 190 | proxy-from-env "^1.0.0" 191 | rimraf "^2.6.1" 192 | ws "^6.1.0" 193 | 194 | readable-stream@^2.2.2: 195 | version "2.3.6" 196 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 197 | dependencies: 198 | core-util-is "~1.0.0" 199 | inherits "~2.0.3" 200 | isarray "~1.0.0" 201 | process-nextick-args "~2.0.0" 202 | safe-buffer "~5.1.1" 203 | string_decoder "~1.1.1" 204 | util-deprecate "~1.0.1" 205 | 206 | rimraf@^2.6.1: 207 | version "2.6.3" 208 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 209 | dependencies: 210 | glob "^7.1.3" 211 | 212 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 213 | version "5.1.2" 214 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 215 | 216 | string_decoder@~1.1.1: 217 | version "1.1.1" 218 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 219 | dependencies: 220 | safe-buffer "~5.1.0" 221 | 222 | typedarray@^0.0.6: 223 | version "0.0.6" 224 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 225 | 226 | util-deprecate@~1.0.1: 227 | version "1.0.2" 228 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 229 | 230 | wrappy@1: 231 | version "1.0.2" 232 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 233 | 234 | ws@^6.1.0: 235 | version "6.2.1" 236 | resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" 237 | dependencies: 238 | async-limiter "~1.0.0" 239 | 240 | yauzl@2.4.1: 241 | version "2.4.1" 242 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" 243 | dependencies: 244 | fd-slicer "~1.0.1" 245 | -------------------------------------------------------------------------------- /tools/my-tools/jianshu/artcile-backup/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | agent-base@^4.1.0: 6 | version "4.2.1" 7 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" 8 | dependencies: 9 | es6-promisify "^5.0.0" 10 | 11 | async-limiter@~1.0.0: 12 | version "1.0.0" 13 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" 14 | 15 | balanced-match@^1.0.0: 16 | version "1.0.0" 17 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 18 | 19 | brace-expansion@^1.1.7: 20 | version "1.1.11" 21 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 22 | dependencies: 23 | balanced-match "^1.0.0" 24 | concat-map "0.0.1" 25 | 26 | buffer-from@^1.0.0: 27 | version "1.1.1" 28 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 29 | 30 | concat-map@0.0.1: 31 | version "0.0.1" 32 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 33 | 34 | concat-stream@1.6.2: 35 | version "1.6.2" 36 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 37 | dependencies: 38 | buffer-from "^1.0.0" 39 | inherits "^2.0.3" 40 | readable-stream "^2.2.2" 41 | typedarray "^0.0.6" 42 | 43 | core-util-is@~1.0.0: 44 | version "1.0.2" 45 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 46 | 47 | debug@2.6.9: 48 | version "2.6.9" 49 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 50 | dependencies: 51 | ms "2.0.0" 52 | 53 | debug@^3.1.0: 54 | version "3.2.6" 55 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 56 | dependencies: 57 | ms "^2.1.1" 58 | 59 | debug@^4.1.0: 60 | version "4.1.1" 61 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 62 | dependencies: 63 | ms "^2.1.1" 64 | 65 | es6-promise@^4.0.3: 66 | version "4.2.6" 67 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" 68 | 69 | es6-promisify@^5.0.0: 70 | version "5.0.0" 71 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 72 | dependencies: 73 | es6-promise "^4.0.3" 74 | 75 | extract-zip@^1.6.6: 76 | version "1.6.7" 77 | resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" 78 | dependencies: 79 | concat-stream "1.6.2" 80 | debug "2.6.9" 81 | mkdirp "0.5.1" 82 | yauzl "2.4.1" 83 | 84 | fd-slicer@~1.0.1: 85 | version "1.0.1" 86 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" 87 | dependencies: 88 | pend "~1.2.0" 89 | 90 | fs-extra@^8.0.1: 91 | version "8.0.1" 92 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.0.1.tgz#90294081f978b1f182f347a440a209154344285b" 93 | dependencies: 94 | graceful-fs "^4.1.2" 95 | jsonfile "^4.0.0" 96 | universalify "^0.1.0" 97 | 98 | fs.realpath@^1.0.0: 99 | version "1.0.0" 100 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 101 | 102 | glob@^7.1.3: 103 | version "7.1.4" 104 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 105 | dependencies: 106 | fs.realpath "^1.0.0" 107 | inflight "^1.0.4" 108 | inherits "2" 109 | minimatch "^3.0.4" 110 | once "^1.3.0" 111 | path-is-absolute "^1.0.0" 112 | 113 | graceful-fs@^4.1.2, graceful-fs@^4.1.6: 114 | version "4.1.15" 115 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 116 | 117 | https-proxy-agent@^2.2.1: 118 | version "2.2.1" 119 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" 120 | dependencies: 121 | agent-base "^4.1.0" 122 | debug "^3.1.0" 123 | 124 | inflight@^1.0.4: 125 | version "1.0.6" 126 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 127 | dependencies: 128 | once "^1.3.0" 129 | wrappy "1" 130 | 131 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 132 | version "2.0.3" 133 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 134 | 135 | isarray@~1.0.0: 136 | version "1.0.0" 137 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 138 | 139 | jsonfile@^4.0.0: 140 | version "4.0.0" 141 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 142 | optionalDependencies: 143 | graceful-fs "^4.1.6" 144 | 145 | mime@^2.0.3: 146 | version "2.4.2" 147 | resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.2.tgz#ce5229a5e99ffc313abac806b482c10e7ba6ac78" 148 | 149 | minimatch@^3.0.4: 150 | version "3.0.4" 151 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 152 | dependencies: 153 | brace-expansion "^1.1.7" 154 | 155 | minimist@0.0.8: 156 | version "0.0.8" 157 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 158 | 159 | mkdirp@0.5.1: 160 | version "0.5.1" 161 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 162 | dependencies: 163 | minimist "0.0.8" 164 | 165 | ms@2.0.0: 166 | version "2.0.0" 167 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 168 | 169 | ms@^2.1.1: 170 | version "2.1.1" 171 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 172 | 173 | once@^1.3.0: 174 | version "1.4.0" 175 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 176 | dependencies: 177 | wrappy "1" 178 | 179 | path-is-absolute@^1.0.0: 180 | version "1.0.1" 181 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 182 | 183 | pend@~1.2.0: 184 | version "1.2.0" 185 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 186 | 187 | process-nextick-args@~2.0.0: 188 | version "2.0.0" 189 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 190 | 191 | progress@^2.0.1: 192 | version "2.0.3" 193 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 194 | 195 | proxy-from-env@^1.0.0: 196 | version "1.0.0" 197 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" 198 | 199 | puppeteer@^1.15.0: 200 | version "1.15.0" 201 | resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.15.0.tgz#1680fac13e51f609143149a5b7fa99eec392b34f" 202 | dependencies: 203 | debug "^4.1.0" 204 | extract-zip "^1.6.6" 205 | https-proxy-agent "^2.2.1" 206 | mime "^2.0.3" 207 | progress "^2.0.1" 208 | proxy-from-env "^1.0.0" 209 | rimraf "^2.6.1" 210 | ws "^6.1.0" 211 | 212 | readable-stream@^2.2.2: 213 | version "2.3.6" 214 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 215 | dependencies: 216 | core-util-is "~1.0.0" 217 | inherits "~2.0.3" 218 | isarray "~1.0.0" 219 | process-nextick-args "~2.0.0" 220 | safe-buffer "~5.1.1" 221 | string_decoder "~1.1.1" 222 | util-deprecate "~1.0.1" 223 | 224 | rimraf@^2.6.1: 225 | version "2.6.3" 226 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 227 | dependencies: 228 | glob "^7.1.3" 229 | 230 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 231 | version "5.1.2" 232 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 233 | 234 | string_decoder@~1.1.1: 235 | version "1.1.1" 236 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 237 | dependencies: 238 | safe-buffer "~5.1.0" 239 | 240 | typedarray@^0.0.6: 241 | version "0.0.6" 242 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 243 | 244 | universalify@^0.1.0: 245 | version "0.1.2" 246 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 247 | 248 | util-deprecate@~1.0.1: 249 | version "1.0.2" 250 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 251 | 252 | wrappy@1: 253 | version "1.0.2" 254 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 255 | 256 | ws@^6.1.0: 257 | version "6.2.1" 258 | resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" 259 | dependencies: 260 | async-limiter "~1.0.0" 261 | 262 | yauzl@2.4.1: 263 | version "2.4.1" 264 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" 265 | dependencies: 266 | fd-slicer "~1.0.1" 267 | -------------------------------------------------------------------------------- /tools/README.md: -------------------------------------------------------------------------------- 1 | # 工具 2 | ## 低代码工具 3 | * [ivx](https://www.ivx.cn/index) “0代码”语言 4 | * [牛刀](http://www.newdao.net/) 5 | * [API Cloud](https://www.apicloud.com/) 的低代码开发平台 6 | * [搭搭云](http://test.dadayun.net/index) 7 | * [氚云](https://h3yun.com/index.php?g=Chuanyun&m=Index&a=index) 8 | * [宜搭](https://www.aliyun.com/product/yida) 9 | * [云表](https://www.iyunbiao.com/) 10 | * [mendix](https://www.mendix.com/) 11 | * [outsystems](https://www.outsystems.com/) 12 | 13 | ## CMS 14 | * [WordPress](https://wordpress.org/) PHP。 做博客,官网,电商等等。 [我的整理](wordpress) 15 | * [Drupal](https://github.com/drupal/drupal) PHP。 16 | * [Strapi](https://strapi.io/) Node.js 无头CMS(只维护数据,提供数据操作的 API 接口 和权限)。代码生成工具很强大。 17 | * [ghost](https://ghost.org/) Node.js 收费。 18 | * [Keystonejs](http://keystonejs.com) Node.js。需要写页面。 19 | * [Apostrophe](apostrophecms) Node.js 需要写页面。比较漂亮。 20 | * [tamiat CMS](https://github.com/tamiat/tamiat/) 基于 Vue和 Firebase。无后端。 21 | 22 | 推荐文章: 23 | * [What is the best Node.js CMS? Why?](https://www.quora.com/What-is-the-best-Node-js-CMS-Why) 24 | * [Exploring Different CMS Solutions Built on Node.js](https://www.sitepoint.com/exploring-different-cms-solutions-built-on-node-js/) 25 | 26 | ## CRM 27 | * [分享销客](https://www.fxiaoke.com/) 28 | * [销售易](http://www.xiaoshouyi.com/) 29 | * [Microsoft Dynamics](https://dynamics.microsoft.com/zh-cn/dynamics-crm/) 微软出品。 30 | * [odoo](https://www.odoo.com/) All-in-one management software. 31 | Beautiful. Easy-to-use. 32 | * [Zoho CRM](https://www.zoho.com.cn/) 33 | * [悟空CRM](http://www.5kcrm.com/index.php) 会有开源版本。 [云平台](http://www.72crm.com/) 34 | * 教育 35 | * [校管家](https://www.xiaogj.com/index.html) 36 | 37 | ## 论坛系统 38 | * [Discuz](http://www.discuz.net/forum.php) PHP。 39 | * [NodeBB](https://github.com/NodeBB/NodeBB) Node.js。 40 | * [Nodeclub](https://github.com/cnodejs/nodeclub/) Nodeclub 是使用 Node.js 和 MongoDB 开发的社区系统。 [CNode](https://cnodejs.org/) 开发的和使用着。 41 | 42 | ## 商城系统 43 | * [Drupal Commerce](https://drupalcommerce.org/) 基于Drupal的电商解决方案.功能强大.免费+开源. 44 | * [mall](https://github.com/macrozheng/mall) 国人开源的。5k+ Star。 45 | * [Shopify](https://www.shopify.com/) 收费。上手快,无需技术背景。 46 | * [Shop++](http://www.shopplusplus.co.uk/) Java。 47 | * [更多](http://dig.tools/kj/) 下的独立网站类目。 48 | * 平台 49 | * [有赞云](https://www.youzanyun.com/) 功能很全。可以添加拓展点,在标准的流程里,插入定制的流程。可以给商家做一些服务工具。支持 Node.js 的 SDK。有赞也有很赞的开源 前端框架 框架。 50 | * [微店开发平台](https://web.open.weidian.com/index?spider_token=d8e8) 微信开店。 [开放平台](https://web.open.weidian.com/index)。可以试试做个导购平台~ 51 | * 亚马逊无货源ERP 52 | * [易境ERP](http://yijingerp.com/) 53 | 自动化一键采集淘宝、京东、天猫、Ebay、速卖通、1688货源、兰亭、新蛋等平台商品,自动化采集,生成亚马逊所需要的格式转换,商品信息修改只需要在系统内完成修改,自动化同步货源商品。所有商品信息,后台内编辑修改导出,销售货物,订单信息后台一目了然,下单自动同步物流信息,随时查看物流动态后台简单操作,无需自己发货,直接购买商品,发货交给我们处理,无需自己手动处理发货问题,省时省力。 54 | * XShop 基于Java,朋友公司做的一套商城。 55 | * 快递单电子面单打印 56 | * [快递鸟](http://www.kdniao.com/) 接入了主流的物流公司。不用去对接一家家的打印公司了。 57 | 58 | ## 财务系统 59 | * [GnuCash](https://gnucash.org/) 开源的。[GitHub](https://github.com/Gnucash/gnucash) 60 | * 金蝶 61 | * 用友 62 | 63 | ## 固定资产管理软件 64 | * [易盘点](https://www.epandian.cn/) 65 | 66 | ## 数据爬取 67 | * 软件 68 | * [火车头](http://www.locoy.com/) 69 | * 八爪鱼 70 | * [集搜客(GooSeeker)](http://www.gooseeker.com/index.html) 71 | * [神箭手云采集](http://www.shenjianshou.cn/) 采集平台。支持代码来写爬取逻辑。 72 | * 框架 73 | * [Scrapy](https://github.com/scrapy/scrapy) Python。 74 | * 其他 75 | * [如何入门 Python 爬虫?](https://www.zhihu.com/question/20899988) 76 | * [gooseeker,火车头,八爪鱼三者各有什么优劣?](https://www.zhihu.com/question/36978537) 77 | 78 | ## DMP 79 | > Data management Platform 数据管理平台。基于用户画像的精准投放广告。基于数据的营销。 80 | 81 | * [TalkingData DMP](https://www.talkingdata.com/dmp.jsp) 82 | * [AdMaster](http://admaster.com.cn/) 83 | * [秒针](http://www.miaozhen.com/index.php/Index.html) 84 | * [晶赞天机(zampdmp)](http://zamplus.com/product.html) 85 | 86 | ## 电商数据分析 87 | * [阿明工具](http://zhishuchacha.com/) 88 | 89 | ## No Backend 90 | * [Firebase](https://firebase.google.com/) 支持数据存储(Database),文件存储,用户分析等功能。Google 出的。在国内被墙了。 91 | * [野狗](https://docs.wilddog.com/sync/Web/index.html) 实时通信引擎用法和功能和 Firebase 的数据存储相似。 92 | * [Leancloud](https://leancloud.cn/) 包括云存储、数据分析、用户关系、消息推送、即时通信等现代应用基础模块,满足移动开发所有需求。 93 | 94 | ## 数据接口 95 | * [聚合数据](https://www.juhe.cn/service) 96 | 97 | ## 验证码识别 98 | * [Tesseract](https://github.com/tesseract-ocr/tesseract) 99 | 100 | 101 | 102 | ## 打印 103 | * [易联云](https://www.yilianyun.net/) 带打印机。 104 | 105 | ## 分词 106 | * [NodeJieba](https://github.com/yanyiwu/nodejieba) NodeJieba是"结巴"中文分词的 Node.js 版本实现 107 | 108 | ## 语音合成(TTS: text to speech) 109 | * [Baidu TTS](https://github.com/Baidu-AIP/speech-demo/tree/master/rest-api-tts/bash_shell) 110 | * [科大讯飞](https://doc.xfyun.cn/rest_api/%E8%AF%AD%E9%9F%B3%E5%90%88%E6%88%90.html) 111 | * [say.js](https://github.com/Marak/say.js) [demo](tts/sayjs) 用的是 Mac 自带的语音 Node.js。 112 | 113 | ## 数据挖掘和数据分析工具 114 | * [Scikit-Learn](http://sklearn.apachecn.org/) 简单高效的数据挖掘和数据分析工具。开源。 115 | * [BDP 个人版](https://me.bdp.cn/home.html) 数据分析神奇。 116 | 117 | ## 云标签生成工具 118 | * https://worditout.com/word-cloud/create 119 | 120 | ## 发现需求 121 | * 关键字联想/挖掘工具 122 | * [百度关键字挖掘](http://s.tool.chinaz.com/baidu/words.aspx) 123 | * [百度下拉词(联想词)批量查询系统(电脑端)](http://www.zhujicp.com/tools/baiduxiala/web/) 124 | * [手机百度下拉词批量查询系统(移动端)](http://www.zhujicp.com/tools/baiduxiala/wap/) 125 | 126 | * 通过指数来知道一个大势。 127 | 128 | ## 竞品分析 129 | * [SimilarWeb](https://www.similarweb.com/) 查看网站的排名,流量来源统计,网站的跳出率,搜索关键字,竞品等。有 Chrome 插件。 130 | * [爱站](http://www.aizhan.com/) 网站排名,域名查询,关键字优化,关键字挖掘等等。 131 | * [chinaZ 站长工具](http://s.tool.chinaz.com/same) 类似爱站。 132 | * [5188](http://www.5118.com/) 轻松掌控网站运营所需的关键数据。 133 | * [Wappalyzer](https://wappalyzer.com/) 查看网站用什么技术做的(如 WordPress(CMS框架),jQuery(前端框架),IIS(服务器操作系统))。有 Chrome 插件。 134 | 135 | ## 产品 136 | * [人人都是产品经理](http://www.woshipm.com/category/pmd) 这里有很多产品设计的内容,支持搜索。 137 | 138 | ## 指数 139 | * [大数据导航](http://hao.199it.com/) 140 | * [阿里指数](https://index.1688.com/) 最权威专业的行业价格、供应、采购趋势分析 141 | * [百度指数](http://index.baidu.com/) 142 | * 友盟指数(查询机型硬件和软件操作系统)(http://umindex.com) 143 | * 淘宝指数(http://shu.taobao.com/) 144 | * 微指数(微博指数http://data.weibo.com/index) 145 | * 新媒体排行(http://www.newrank.cn/)新榜的微信公众号的数据是 146 | * 新媒体指数(http://www.gsdata.cn/) 147 | 148 | ## 了解企业 149 | * [国家企业信用信息公示系统](http://www.gsxt.gov.cn/index.html) 150 | * [天眼查](https://www.tianyancha.com/) 151 | * [企查查](http://www.qichacha.com/) 152 | * [看准网](http://www.kanzhun.com/) 153 | 154 | ## 了解人 155 | * 性格测试 156 | * [MBTI职业性格测试](http://www.welefen.com/lab/mbti/) 157 | * [DISC个性测验](https://wiki.mbalib.com/wiki/DISC%E4%B8%AA%E6%80%A7%E6%B5%8B%E9%AA%8C) 158 | * [PDP动物性格测试](http://types.yuzeli.com/survey/pdp30) 老虎,孔雀,考拉,猫头鹰,变色龙。 159 | * [FPA乐嘉性格色彩测试](http://types.yuzeli.com/survey/fpa30) 160 | 161 | ## 自媒体 162 | * 头条号 163 | * [企鹅号](https://om.qq.com/userAuth/index) 内容会出现在腾讯的相关产品。 164 | * [大鱼号](https://mp.dayu.com/) 165 | 大鱼号是阿里文娱体系为内容创作者提供的统一账号。 UC 做的。 166 | * [一点号](http://www.yidianzixun.com/) 167 | * 百家号 168 | * 搜狐公众平台 169 | * 知乎专栏 170 | * 简书 171 | * 网易号 172 | * [微博自媒体](http://me.weibo.com/) 173 | * 更多见 [大鱼搜](http://meiti.wiki/) 北邮做的。 174 | 175 | ## 品牌设计/策略/管理 176 | * [奥美](http://www.ogilvy.com.cn/) 177 | * [英诺](http://www.innoab.com/) 张家港的一家公司。 178 | 179 | ## ppt 180 | * [优品PPT 模板网站](http://www.ypppt.com/) 181 | 182 | ## 公司工作流工具 183 | * 文档 184 | * 印象笔记 185 | * [石墨文档](https://shimo.im/) 186 | * [腾讯文档](https://docs.qq.com/desktop) 方便在微信中协同。 187 | * [Notion](https://www.notion.so/) 将笔记、知识库和任务管理无缝整合的协作平台。很好的编辑,所见即所得。UI 漂亮。 188 | * 知识库 189 | * [Confluence](https://www.atlassian.com/software/confluence) 190 | * 思维导图 191 | * [百度脑图](http://naotu.baidu.com/) 192 | * 协作&任务管理 193 | * [Trello](https://trello.com/) 看板类型的。 194 | * [Slack](https://yedian.slack.com/) 195 | * [Teambition](https://www.teambition.com/) 196 | * Jira 197 | * 禅道 198 | * Redmine 199 | * 在线会议 200 | * [JITSI](https://meet.jit.si/) 免费的。支持共享桌面。 201 | * [Zoom](http://zoom.cn/product/) 在线会议。成熟的产品。比较贵。 202 | * 原型图 203 | * [墨刀](https://modao.cc/) 204 | * 设计图 205 | * [imgCook(图像大厨)](https://imgcook.taobao.org/) 阿里出品。根据设计稿生成代码。代码形式支持 小程序、React、H5、Weex Rax。 206 | * [蓝湖](https://lanhuapp.com/) 方便标注,切图,关联页面之间的关系。支持上传 PS 和 Sketch的素材。 207 | * [Figma](https://www.figma.com/) 基于浏览器的 UI 设计工具。用法和 Sketch 很像,支持版本管理,方便协同。 208 | * 代码版本管理 209 | * [Coding.net](https://coding.net) 210 | * 代码质量和安全 211 | * [SonarQube](https://www.sonarqube.org/) 字节跳动有部门用。 212 | * 数据库 213 | * [SQLEditor](https://xclient.info/s/sqleditor.html) 支持 Mac的数据库模型建模工具。很好用,唯一的缺点是,不支持表的模板(PDMan) 中没有。 214 | * [PDMan](https://gitee.com/robergroup/pdman) 是一款开源免费的数据库模型建模工具,支持Windows,Mac,Linux等操作系统,是PowerDesigner之外,更好的免费的替代方案。 215 | * [Yearning](https://github.com/cookieY/Yearning) Mysql web端sql审核平台 216 | * 部署 217 | * SSH&FTP 218 | * [FinalShell](http://www.hostbuf.com/) 支持 Mac, Windows。 219 | * [Xshell](https://www.netsarang.com/products/xsh_overview.html) 只支持 Windows。 220 | * 数据库 221 | * [Navicat](https://navicat.com.cn/) 表结构的对比和同步。 222 | * 图片 223 | * [Monosnap](https://monosnap.com/) 截图和标注。 224 | * 视频 225 | * [Apowersoft在线录屏](https://www.apowersoft.cn/free-online-screen-recorder) 226 | * 其他 227 | * [腾讯柠檬清理](https://mac.gj.qq.com/) 释放 Mac 磁盘空间。 228 | * [SwitchHosts](https://github.com/oldj/SwitchHosts/blob/master/README_cn.md) 快速切换 hosts 工具。 229 | 230 | ## 持续集成 CI 231 | * [Jenkins](https://jenkins.io/zh/) 232 | * [drone](https://drone.io/) 233 | * [Circle CI](https://circleci.com/) 234 | * [Travis CI](https://travis-ci.org/) 235 | 236 | ## 企业第三方服务 237 | * [企服服](https://www.qifufu.com/) 企查查旗下。服务包括 工商注册,财务记账,商标知识产权,人事社保,法律服务等。 238 | 239 | ## 代码市场 240 | * [开源中国-开源软件](https://www.oschina.net/project) 241 | * [码云-开源项目](https://gitee.com/explore) OS China。 242 | * 小程序 243 | * [小程序窝](http://www.xcxwo.com/cate/component) 244 | * 代码交易平台 245 | 246 | ## 设计&素材 247 | * 设计网站 248 | * [UI](https://www.ui.cn/) 249 | * [UI Collect](http://collectui.com/) 对不同类型的页面分门别类。 250 | * 模板网站 251 | * [妹子UI 模板中心](http://tpl.amazeui.org/) 252 | * [模板之家](http://www.cssmoban.com/) 253 | * 图片 254 | * [Unsplash](https://unsplash.com/) 可免费使用的高质量照片网站 255 | * [Foodies Feed](https://foodiesfeed.com/crunchy-sunny-side-eggs-bacon/) 以「食物」为主题的免费摄影照片图库 256 | * [Cool Backgrounds](https://coolbackgrounds.io/) 生成很酷的背景图。 257 | * [picjumbo](https://picjumbo.com/) 258 | * [streetwill](http://streetwill.co/) 259 | * [gratisography](http://www.gratisography.com/) 260 | * [Subtle Patterns](http://subtlepatterns.com/) 带纹理的背景图片 261 | * [VEER](https://www.veer.com/) 一家免版税、国际化的图片提供商 262 | * [昵图网](http://www.nipic.com/) 一个图片分享交流平台,网站以摄影、设计、多媒体数字视觉文件为主要内容,以“共享创造价值”为理念,以“尊重原创”为准则。 263 | * 图标 264 | * [阿里巴巴矢量图标库](http://www.iconfont.cn/) 265 | * 网站 ICON 266 | * [findIcons](http://findicons.com/ ) icon搜索引擎 267 | * [在线icon制作](http://www.xiconeditor.com/) 268 | * [favicon](http://www.favicon.cc/) 做网站icon 269 | * 字体 270 | * [有字库](www.youziku.com) 中文web字库 271 | * [字体(视巨网)](http://www.ssjee.com) 272 | * 配色 273 | * [Coolors](https://coolors.co/) 选择一种颜色,自动配色。支持提取图片上的颜色。 274 | * [BrandColors](https://brandcolors.net/) 总结各个企业在用的配色 275 | * [Flat UI Color Picker](http://www.flatuicolorpicker.com/) Flat Design必不可少,颜色自动分类 276 | * 公众号排版 277 | * [mdnice](https://mdnice.com/) md 转化成 可贴到 微信公众号,知乎和掘金的内容。内置多个主题。还支持自定义CSS。 278 | * 图片制作工具 279 | * [创客贴](https://www.chuangkit.com/) 极简的平面设计工具。支持Banner、公众号首图、海报、简历、传单、折页、易拉宝等60多个场景,上万个模板。 280 | * [Fotor懒设计](https://www.fotor.com.cn/) 281 | * 素材 282 | * [觅元素](http://www.51yuansu.com/) 283 | 284 | ## 前端相关 285 | * HTTP 286 | * [Eolinker](https://www.eolinker.com/) Web版。加强版 Postman。支持导入 postman 等多种接口文件。 287 | * [Postman](https://www.getpostman.com/) 开发调试 API 用。 288 | * [Fiddler](https://www.telerik.com/fiddler) 修改线上 Bug。用 Auto Response 来用本地文件替换线上文件。 289 | * Mock 服务 290 | * [Easy Mock](https://github.com/easy-mock/easy-mock) Easy Mock 是一个可视化,并且能快速生成模拟数据的持久化服务。生成随机模拟数据,内置了 Mock.js。依赖 Mongo。支持 [Swagger](https://swagger.io/)。 291 | * [YApi](https://github.com/YMFE/yapi) 可视化接口管理平台。支持Mock数据,接口直接调用,自动化测试。支持私有部署。 292 | * [RAP2](https://github.com/thx/rap2-delos) 类似 YApi。 阿里妈妈出品。 293 | * [Swagger](https://swagger.io/) 294 | * [API blueprint](https://apiblueprint.org/) 295 | * [JSONPlaceholder](https://jsonplaceholder.typicode.com/) 固定的几个资源 GET,POST,DELETE,PUT。 296 | * [JSON Server](https://github.com/typicode/json-server) 用 JSON 文件做为数据源。 可以试试线上的服务[My JSON Server](https://my-json-server.typicode.com/)。 297 | * 占位 298 | * [placeholder](https://placeholder.com/) 占位图。 299 | * [adorable](http://avatars.adorable.io) 头像占位。 300 | * 前端插件 301 | * [我整理的前端插件](https://github.com/iamjoel/front-end-plugins) 302 | * [Chrome 拓展非翻 墙地址](https://chrome-extension-downloader.com/) 303 | 304 | ## APP 305 | * 内测/APP 发布 306 | * [蒲公英](https://www.pgyer.com/) 307 | * [fir.im](https://fir.im/) 308 | * 信息推送 309 | * [U-Push](https://www.umeng.com/push) 友盟的信息推送。 310 | * [极光推送](https://www.jiguang.cn/push) 311 | * 即时通讯 312 | * [环信](http://www.easemob.com/) 即时通讯云,客服云,音频云。。。 313 | * 异常上报,奔溃日志 314 | * [Bugly](https://bugly.qq.com/v2/) 腾讯出品。 315 | * 云真机租用 316 | * [百度MTC](http://mtc.baidu.com/tinypace/mobileCloudy/) 大概 1元/分钟(19年5月份)。 317 | 318 | ## DevOps 319 | * [Ledge](https://devops.phodal.com/design) phodal 在的 ThoughtWorks 搞的。 320 | 321 | ## 第三方服务 322 | * 支付 323 | * [Ping++](https://www.pingxx.com/products) 方便接入支付。 324 | * 空中分账 325 | * 聊天 326 | * [美洽](https://meiqia.com/) 第三方客服聊天工具。 327 | * [百度商桥](https://qiao.baidu.com/) 多渠道咨询、智能客服接待、实时访客监控、全链条数据分析 328 | 329 | ## 微信公众号编辑器 330 | * [秀米](https://xiumi.us/#/) 富文本。 331 | * [公众号 Phodal 专用编辑器](http://md.phodal.com/) Markdown。 332 | * [135编辑器](https://www.135editor.com/) 333 | 334 | ## 兼职&发布项目 335 | * [实现网](https://shixian.com/) 336 | * [一早一晚](http://yizaoyiwan.com/) 远程工作。 337 | * [程序员客栈](https://www.proginn.com/) 338 | * [缘创派](http://www.ycpai.com/) 项目合作。 339 | 340 | ## 日常 341 | * [habitica](https://habitica.com/) 用游戏化的方式,来形成好习惯和做任务管理的。带奖励机制。 342 | * [芝麻二维码收款](https://www.hotapp.cn/shouqian) 合并支付宝和微信的码。原理就是生成一个第三方的地址,当码被扫时,会调用第三方地址,并加些参数。通过参数来判断是被支付宝还是微信扫了。 343 | * POS机/套现 344 | * 拉卡拉 345 | * 盒子支付 346 | * [全历史](https://www.allhistory.com/) 查历史资料,超级方便。 347 | * [个人所得税工具](https://www.gerensuodeshui.cn/) 348 | 349 | ## 其他 350 | * [经纬度查询工具](http://www.gpsspg.com/maps.htm) 351 | * [Ten Minutes Mail](http://xzymoe.edu.pl/) 10分钟邮箱。 记得要激活才能用。 352 | * [句子迷](https://www.juzimi.com/) 美句佳句。 353 | * [xClient](http://xclient.info) 软件破解。 354 | * [carbon](https://carbon.now.sh/) 代码分享工具。可将代码生成图片。 355 | * [Screenity: Chrome 录屏神器](https://mp.weixin.qq.com/s/P1mo38aCVDzte298APUpWg) 356 | -------------------------------------------------------------------------------- /tools/my-tools/wechat-assistant/v2/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/normalize-package-data@^2.4.0": 6 | version "2.4.0" 7 | resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" 8 | 9 | ansi-escapes@^1.1.0: 10 | version "1.4.0" 11 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 12 | 13 | ansi-regex@^2.0.0: 14 | version "2.1.1" 15 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 16 | 17 | ansi-regex@^3.0.0: 18 | version "3.0.0" 19 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 20 | 21 | ansi-styles@^2.2.1: 22 | version "2.2.1" 23 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 24 | 25 | async-limiter@~1.0.0: 26 | version "1.0.0" 27 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" 28 | 29 | async@^1.5.2: 30 | version "1.5.2" 31 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 32 | 33 | aws-sdk@^2.286.2: 34 | version "2.478.0" 35 | resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.478.0.tgz#dff901553c5d0ba5824e1e10e2494f96f26a0001" 36 | dependencies: 37 | buffer "4.9.1" 38 | events "1.1.1" 39 | ieee754 "1.1.8" 40 | jmespath "0.15.0" 41 | querystring "0.2.0" 42 | sax "1.2.1" 43 | url "0.10.3" 44 | uuid "3.3.2" 45 | xml2js "0.4.19" 46 | 47 | babel-polyfill@6.23.0: 48 | version "6.23.0" 49 | resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" 50 | dependencies: 51 | babel-runtime "^6.22.0" 52 | core-js "^2.4.0" 53 | regenerator-runtime "^0.10.0" 54 | 55 | babel-runtime@^6.22.0: 56 | version "6.26.0" 57 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" 58 | dependencies: 59 | core-js "^2.4.0" 60 | regenerator-runtime "^0.11.0" 61 | 62 | base64-js@^1.0.2: 63 | version "1.3.0" 64 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" 65 | 66 | bluebird@^3.4.1: 67 | version "3.5.5" 68 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" 69 | 70 | brolog@^1.2.6, brolog@^1.3.3, brolog@^1.6.2, brolog@^1.6.5, brolog@^1.8.1: 71 | version "1.8.3" 72 | resolved "https://registry.yarnpkg.com/brolog/-/brolog-1.8.3.tgz#8123420b46912333ed4dc3d25fe98af30f5b0fad" 73 | 74 | buffer@4.9.1: 75 | version "4.9.1" 76 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" 77 | dependencies: 78 | base64-js "^1.0.2" 79 | ieee754 "^1.1.4" 80 | isarray "^1.0.0" 81 | 82 | callsites@^3.0.0: 83 | version "3.1.0" 84 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 85 | 86 | chalk@1.1.3, chalk@^1.0.0: 87 | version "1.1.3" 88 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 89 | dependencies: 90 | ansi-styles "^2.2.1" 91 | escape-string-regexp "^1.0.2" 92 | has-ansi "^2.0.0" 93 | strip-ansi "^3.0.0" 94 | supports-color "^2.0.0" 95 | 96 | chardet@^0.4.0: 97 | version "0.4.2" 98 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" 99 | 100 | charenc@~0.0.1: 101 | version "0.0.2" 102 | resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" 103 | 104 | cli-cursor@^2.1.0: 105 | version "2.1.0" 106 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 107 | dependencies: 108 | restore-cursor "^2.0.0" 109 | 110 | cli-width@^2.0.0: 111 | version "2.2.0" 112 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 113 | 114 | clone-class@^0.6.11, clone-class@^0.6.19: 115 | version "0.6.20" 116 | resolved "https://registry.yarnpkg.com/clone-class/-/clone-class-0.6.20.tgz#b199a51f1e7466d3f544fe1de74b6b8d97ca007e" 117 | 118 | cookie@0.3.1: 119 | version "0.3.1" 120 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 121 | 122 | core-js@^2.4.0: 123 | version "2.6.9" 124 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" 125 | 126 | crypt@~0.0.1: 127 | version "0.0.2" 128 | resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" 129 | 130 | cuid@^2.1.1: 131 | version "2.1.6" 132 | resolved "https://registry.yarnpkg.com/cuid/-/cuid-2.1.6.tgz#dc3a20b5a7497d36d32c0bf8a2997524c9c796c4" 133 | 134 | debug@^2.2.0: 135 | version "2.6.9" 136 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 137 | dependencies: 138 | ms "2.0.0" 139 | 140 | encoding@^0.1.11: 141 | version "0.1.12" 142 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 143 | dependencies: 144 | iconv-lite "~0.4.13" 145 | 146 | err-code@^1.0.0: 147 | version "1.1.2" 148 | resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" 149 | 150 | error-ex@^1.3.1: 151 | version "1.3.2" 152 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 153 | dependencies: 154 | is-arrayish "^0.2.1" 155 | 156 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 157 | version "1.0.5" 158 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 159 | 160 | events@1.1.1: 161 | version "1.1.1" 162 | resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" 163 | 164 | external-editor@^2.0.1: 165 | version "2.2.0" 166 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" 167 | dependencies: 168 | chardet "^0.4.0" 169 | iconv-lite "^0.4.17" 170 | tmp "^0.0.33" 171 | 172 | figures@^2.0.0: 173 | version "2.0.0" 174 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 175 | dependencies: 176 | escape-string-regexp "^1.0.5" 177 | 178 | file-box@^0.8.23: 179 | version "0.8.27" 180 | resolved "https://registry.yarnpkg.com/file-box/-/file-box-0.8.27.tgz#f209ed07709819a1cccde2c7c7e7391bce117a14" 181 | dependencies: 182 | mime "^2.3.1" 183 | 184 | find-up@^3.0.0: 185 | version "3.0.0" 186 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 187 | dependencies: 188 | locate-path "^3.0.0" 189 | 190 | find-up@^4.0.0: 191 | version "4.1.0" 192 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 193 | dependencies: 194 | locate-path "^5.0.0" 195 | path-exists "^4.0.0" 196 | 197 | has-ansi@^2.0.0: 198 | version "2.0.0" 199 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 200 | dependencies: 201 | ansi-regex "^2.0.0" 202 | 203 | hosted-git-info@^2.1.4: 204 | version "2.7.1" 205 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" 206 | 207 | hot-import@^0.2.1: 208 | version "0.2.9" 209 | resolved "https://registry.yarnpkg.com/hot-import/-/hot-import-0.2.9.tgz#8aa9c98e5a74c00d0a8f603f46ef8bf7e28a9a3b" 210 | dependencies: 211 | brolog "^1.2.6" 212 | callsites "^3.0.0" 213 | read-pkg-up "^6.0.0" 214 | 215 | iconv-lite@^0.4.17, iconv-lite@~0.4.13: 216 | version "0.4.24" 217 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 218 | dependencies: 219 | safer-buffer ">= 2.1.2 < 3" 220 | 221 | ieee754@1.1.8, ieee754@^1.1.4: 222 | version "1.1.8" 223 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" 224 | 225 | inquirer@3.0.6: 226 | version "3.0.6" 227 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" 228 | dependencies: 229 | ansi-escapes "^1.1.0" 230 | chalk "^1.0.0" 231 | cli-cursor "^2.1.0" 232 | cli-width "^2.0.0" 233 | external-editor "^2.0.1" 234 | figures "^2.0.0" 235 | lodash "^4.3.0" 236 | mute-stream "0.0.7" 237 | run-async "^2.2.0" 238 | rx "^4.1.0" 239 | string-width "^2.0.0" 240 | strip-ansi "^3.0.0" 241 | through "^2.3.6" 242 | 243 | is-arrayish@^0.2.1: 244 | version "0.2.1" 245 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 246 | 247 | is-buffer@~1.1.1: 248 | version "1.1.6" 249 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 250 | 251 | is-fullwidth-code-point@^2.0.0: 252 | version "2.0.0" 253 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 254 | 255 | is-promise@^2.1.0: 256 | version "2.1.0" 257 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 258 | 259 | is-stream@^1.0.1: 260 | version "1.1.0" 261 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 262 | 263 | isarray@^1.0.0: 264 | version "1.0.0" 265 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 266 | 267 | jmespath@0.15.0: 268 | version "0.15.0" 269 | resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" 270 | 271 | json-parse-better-errors@^1.0.1: 272 | version "1.0.2" 273 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 274 | 275 | locate-path@^3.0.0: 276 | version "3.0.0" 277 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 278 | dependencies: 279 | p-locate "^3.0.0" 280 | path-exists "^3.0.0" 281 | 282 | locate-path@^5.0.0: 283 | version "5.0.0" 284 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 285 | dependencies: 286 | p-locate "^4.1.0" 287 | 288 | lodash@^4.3.0: 289 | version "4.17.11" 290 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 291 | 292 | md5@^2.2.1: 293 | version "2.2.1" 294 | resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" 295 | dependencies: 296 | charenc "~0.0.1" 297 | crypt "~0.0.1" 298 | is-buffer "~1.1.1" 299 | 300 | memory-card@^0.6.9: 301 | version "0.6.13" 302 | resolved "https://registry.yarnpkg.com/memory-card/-/memory-card-0.6.13.tgz#1736980021ffbfc4596ae048be60d27c7405ed36" 303 | dependencies: 304 | aws-sdk "^2.286.2" 305 | brolog "^1.6.2" 306 | 307 | mime@^2.3.1: 308 | version "2.4.4" 309 | resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" 310 | 311 | mimic-fn@^1.0.0: 312 | version "1.2.0" 313 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 314 | 315 | minimist@0.0.8: 316 | version "0.0.8" 317 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 318 | 319 | minimist@1.2.0: 320 | version "1.2.0" 321 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 322 | 323 | mkdirp@0.5.x: 324 | version "0.5.1" 325 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 326 | dependencies: 327 | minimist "0.0.8" 328 | 329 | ms@2.0.0: 330 | version "2.0.0" 331 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 332 | 333 | mute-stream@0.0.7: 334 | version "0.0.7" 335 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 336 | 337 | node-fetch@1.6.3: 338 | version "1.6.3" 339 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" 340 | dependencies: 341 | encoding "^0.1.11" 342 | is-stream "^1.0.1" 343 | 344 | nop@^1.0.0: 345 | version "1.0.0" 346 | resolved "https://registry.yarnpkg.com/nop/-/nop-1.0.0.tgz#cb46cf7e01574aa6390858149f66897afe53c9ca" 347 | 348 | normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: 349 | version "2.5.0" 350 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 351 | dependencies: 352 | hosted-git-info "^2.1.4" 353 | resolve "^1.10.0" 354 | semver "2 || 3 || 4 || 5" 355 | validate-npm-package-license "^3.0.1" 356 | 357 | npm-programmatic@0.0.12: 358 | version "0.0.12" 359 | resolved "https://registry.yarnpkg.com/npm-programmatic/-/npm-programmatic-0.0.12.tgz#566ba2452c886c7fd3a41586bd559cdc872fa77e" 360 | dependencies: 361 | bluebird "^3.4.1" 362 | 363 | object-assign@^4.0.1: 364 | version "4.1.1" 365 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 366 | 367 | onetime@^2.0.0: 368 | version "2.0.1" 369 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 370 | dependencies: 371 | mimic-fn "^1.0.0" 372 | 373 | opencollective-postinstall@^2.0.2: 374 | version "2.0.2" 375 | resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" 376 | 377 | opencollective@^1.0.3: 378 | version "1.0.3" 379 | resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1" 380 | dependencies: 381 | babel-polyfill "6.23.0" 382 | chalk "1.1.3" 383 | inquirer "3.0.6" 384 | minimist "1.2.0" 385 | node-fetch "1.6.3" 386 | opn "4.0.2" 387 | 388 | opn@4.0.2: 389 | version "4.0.2" 390 | resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" 391 | dependencies: 392 | object-assign "^4.0.1" 393 | pinkie-promise "^2.0.0" 394 | 395 | os-tmpdir@~1.0.2: 396 | version "1.0.2" 397 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 398 | 399 | p-limit@^2.0.0, p-limit@^2.2.0: 400 | version "2.2.0" 401 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" 402 | dependencies: 403 | p-try "^2.0.0" 404 | 405 | p-locate@^3.0.0: 406 | version "3.0.0" 407 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 408 | dependencies: 409 | p-limit "^2.0.0" 410 | 411 | p-locate@^4.1.0: 412 | version "4.1.0" 413 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 414 | dependencies: 415 | p-limit "^2.2.0" 416 | 417 | p-try@^2.0.0: 418 | version "2.2.0" 419 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 420 | 421 | parse-json@^4.0.0: 422 | version "4.0.0" 423 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" 424 | dependencies: 425 | error-ex "^1.3.1" 426 | json-parse-better-errors "^1.0.1" 427 | 428 | path-exists@^3.0.0: 429 | version "3.0.0" 430 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 431 | 432 | path-exists@^4.0.0: 433 | version "4.0.0" 434 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 435 | 436 | path-parse@^1.0.6: 437 | version "1.0.6" 438 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 439 | 440 | pinkie-promise@^2.0.0: 441 | version "2.0.1" 442 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 443 | dependencies: 444 | pinkie "^2.0.0" 445 | 446 | pinkie@^2.0.0: 447 | version "2.0.4" 448 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 449 | 450 | pkg-dir@^4.0.0: 451 | version "4.2.0" 452 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 453 | dependencies: 454 | find-up "^4.0.0" 455 | 456 | portfinder@^1.0.17: 457 | version "1.0.20" 458 | resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" 459 | dependencies: 460 | async "^1.5.2" 461 | debug "^2.2.0" 462 | mkdirp "0.5.x" 463 | 464 | promise-retry@^1.1.1: 465 | version "1.1.1" 466 | resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" 467 | dependencies: 468 | err-code "^1.0.0" 469 | retry "^0.10.0" 470 | 471 | punycode@1.3.2: 472 | version "1.3.2" 473 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 474 | 475 | qr-image@^3.2.0: 476 | version "3.2.0" 477 | resolved "https://registry.yarnpkg.com/qr-image/-/qr-image-3.2.0.tgz#9fa8295beae50c4a149cf9f909a1db464a8672e8" 478 | 479 | querystring@0.2.0: 480 | version "0.2.0" 481 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 482 | 483 | quick-lru@^3.0.0: 484 | version "3.0.0" 485 | resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-3.0.0.tgz#2f96145481567e5bc442c6c4a66e86158405c696" 486 | 487 | raven@^2.6.2: 488 | version "2.6.4" 489 | resolved "https://registry.yarnpkg.com/raven/-/raven-2.6.4.tgz#458d4a380c8fbb59e0150c655625aaf60c167ea3" 490 | dependencies: 491 | cookie "0.3.1" 492 | md5 "^2.2.1" 493 | stack-trace "0.0.10" 494 | timed-out "4.0.1" 495 | uuid "3.3.2" 496 | 497 | read-pkg-up@^5.0.0: 498 | version "5.0.0" 499 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-5.0.0.tgz#b6a6741cb144ed3610554f40162aa07a6db621b8" 500 | dependencies: 501 | find-up "^3.0.0" 502 | read-pkg "^5.0.0" 503 | 504 | read-pkg-up@^6.0.0: 505 | version "6.0.0" 506 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-6.0.0.tgz#da75ce72762f2fa1f20c5a40d4dd80c77db969e3" 507 | dependencies: 508 | find-up "^4.0.0" 509 | read-pkg "^5.1.1" 510 | type-fest "^0.5.0" 511 | 512 | read-pkg@^5.0.0, read-pkg@^5.1.1: 513 | version "5.1.1" 514 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.1.1.tgz#5cf234dde7a405c90c88a519ab73c467e9cb83f5" 515 | dependencies: 516 | "@types/normalize-package-data" "^2.4.0" 517 | normalize-package-data "^2.5.0" 518 | parse-json "^4.0.0" 519 | type-fest "^0.4.1" 520 | 521 | regenerator-runtime@^0.10.0: 522 | version "0.10.5" 523 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" 524 | 525 | regenerator-runtime@^0.11.0: 526 | version "0.11.1" 527 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" 528 | 529 | resolve@^1.10.0: 530 | version "1.11.1" 531 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" 532 | dependencies: 533 | path-parse "^1.0.6" 534 | 535 | restore-cursor@^2.0.0: 536 | version "2.0.0" 537 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 538 | dependencies: 539 | onetime "^2.0.0" 540 | signal-exit "^3.0.2" 541 | 542 | retry@^0.10.0: 543 | version "0.10.1" 544 | resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" 545 | 546 | run-async@^2.2.0: 547 | version "2.3.0" 548 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 549 | dependencies: 550 | is-promise "^2.1.0" 551 | 552 | rx-queue@^0.8.1: 553 | version "0.8.2" 554 | resolved "https://registry.yarnpkg.com/rx-queue/-/rx-queue-0.8.2.tgz#263af850297c9e28964725eb863e8cd45ba47058" 555 | 556 | rx@^4.1.0: 557 | version "4.1.0" 558 | resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" 559 | 560 | rxjs@^6.2.1: 561 | version "6.5.2" 562 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" 563 | dependencies: 564 | tslib "^1.9.0" 565 | 566 | "safer-buffer@>= 2.1.2 < 3": 567 | version "2.1.2" 568 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 569 | 570 | sax@1.2.1, sax@>=0.6.0: 571 | version "1.2.1" 572 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" 573 | 574 | "semver@2 || 3 || 4 || 5": 575 | version "5.7.0" 576 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" 577 | 578 | semver@^6.0.0: 579 | version "6.1.1" 580 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" 581 | 582 | signal-exit@^3.0.2: 583 | version "3.0.2" 584 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 585 | 586 | spdx-correct@^3.0.0: 587 | version "3.1.0" 588 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" 589 | dependencies: 590 | spdx-expression-parse "^3.0.0" 591 | spdx-license-ids "^3.0.0" 592 | 593 | spdx-exceptions@^2.1.0: 594 | version "2.2.0" 595 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" 596 | 597 | spdx-expression-parse@^3.0.0: 598 | version "3.0.0" 599 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 600 | dependencies: 601 | spdx-exceptions "^2.1.0" 602 | spdx-license-ids "^3.0.0" 603 | 604 | spdx-license-ids@^3.0.0: 605 | version "3.0.4" 606 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" 607 | 608 | stack-trace@0.0.10: 609 | version "0.0.10" 610 | resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" 611 | 612 | state-switch@^0.6.2: 613 | version "0.6.12" 614 | resolved "https://registry.yarnpkg.com/state-switch/-/state-switch-0.6.12.tgz#bb94f39a88c246c6a705559c3ae240fc4c0b872f" 615 | dependencies: 616 | nop "^1.0.0" 617 | 618 | string-width@^2.0.0: 619 | version "2.1.1" 620 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 621 | dependencies: 622 | is-fullwidth-code-point "^2.0.0" 623 | strip-ansi "^4.0.0" 624 | 625 | strip-ansi@^3.0.0: 626 | version "3.0.1" 627 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 628 | dependencies: 629 | ansi-regex "^2.0.0" 630 | 631 | strip-ansi@^4.0.0: 632 | version "4.0.0" 633 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 634 | dependencies: 635 | ansi-regex "^3.0.0" 636 | 637 | supports-color@^2.0.0: 638 | version "2.0.0" 639 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 640 | 641 | through@^2.3.6: 642 | version "2.3.8" 643 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 644 | 645 | timed-out@4.0.1: 646 | version "4.0.1" 647 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" 648 | 649 | tmp@^0.0.33: 650 | version "0.0.33" 651 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 652 | dependencies: 653 | os-tmpdir "~1.0.2" 654 | 655 | tslib@^1.9.0: 656 | version "1.10.0" 657 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" 658 | 659 | type-fest@^0.4.1: 660 | version "0.4.1" 661 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" 662 | 663 | type-fest@^0.5.0: 664 | version "0.5.2" 665 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" 666 | 667 | url@0.10.3: 668 | version "0.10.3" 669 | resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" 670 | dependencies: 671 | punycode "1.3.2" 672 | querystring "0.2.0" 673 | 674 | uuid@3.3.2: 675 | version "3.3.2" 676 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 677 | 678 | validate-npm-package-license@^3.0.1: 679 | version "3.0.4" 680 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 681 | dependencies: 682 | spdx-correct "^3.0.0" 683 | spdx-expression-parse "^3.0.0" 684 | 685 | watchdog@^0.8.1, watchdog@^0.8.12: 686 | version "0.8.17" 687 | resolved "https://registry.yarnpkg.com/watchdog/-/watchdog-0.8.17.tgz#515596a0d413b8a2a2a3ebcfeb142a0dda28b438" 688 | dependencies: 689 | brolog "^1.3.3" 690 | 691 | wechaty-puppet@^0.15.1: 692 | version "0.15.18" 693 | resolved "https://registry.yarnpkg.com/wechaty-puppet/-/wechaty-puppet-0.15.18.tgz#ec763d63ee7148bb5f692de48bcaed0844394a2b" 694 | dependencies: 695 | brolog "^1.6.5" 696 | clone-class "^0.6.19" 697 | hot-import "^0.2.1" 698 | normalize-package-data "^2.4.0" 699 | quick-lru "^3.0.0" 700 | read-pkg-up "^5.0.0" 701 | rx-queue "^0.8.1" 702 | rxjs "^6.2.1" 703 | semver "^6.0.0" 704 | state-switch "^0.6.2" 705 | watchdog "^0.8.12" 706 | 707 | wechaty@^0.26.1: 708 | version "0.26.1" 709 | resolved "https://registry.yarnpkg.com/wechaty/-/wechaty-0.26.1.tgz#0aeabebecc7a149924e98fdc311c6e3dc3f8dfbe" 710 | dependencies: 711 | brolog "^1.8.1" 712 | clone-class "^0.6.11" 713 | cuid "^2.1.1" 714 | file-box "^0.8.23" 715 | hot-import "^0.2.1" 716 | memory-card "^0.6.9" 717 | npm-programmatic "0.0.12" 718 | opencollective "^1.0.3" 719 | opencollective-postinstall "^2.0.2" 720 | pkg-dir "^4.0.0" 721 | portfinder "^1.0.17" 722 | promise-retry "^1.1.1" 723 | qr-image "^3.2.0" 724 | raven "^2.6.2" 725 | read-pkg-up "^5.0.0" 726 | state-switch "^0.6.2" 727 | watchdog "^0.8.1" 728 | wechaty-puppet "^0.15.1" 729 | ws "^6.0.0" 730 | 731 | ws@^6.0.0: 732 | version "6.2.1" 733 | resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" 734 | dependencies: 735 | async-limiter "~1.0.0" 736 | 737 | xml2js@0.4.19: 738 | version "0.4.19" 739 | resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" 740 | dependencies: 741 | sax ">=0.6.0" 742 | xmlbuilder "~9.0.1" 743 | 744 | xmlbuilder@~9.0.1: 745 | version "9.0.7" 746 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" 747 | --------------------------------------------------------------------------------