Tuesday, March 1, 2022

SegmentFault 最新的文章

SegmentFault 最新的文章


来自开源世界的超级码丽,中国开源码力榜权威发布!

Posted: 01 Mar 2022 12:20 AM PST

2022 年 1 月 13 日,SegmentFault 思否联合长期耕耘与推广开源文化的开源社共同推出了《2021 中国开源先锋 33 人》榜单,一众开源先锋上榜,一时间引发了行业的广泛关注与讨论。他们当中有贡献代码的开发者、开源项目发起者、开源布道师、开源治理专家、关注开源的投资人、开源社区经理等等,他们推动着开源生态的繁荣与发展。

"开源"是 2021 中国技术发展的年度热词,越来越多人关注开源、贡献开源。然而,谈到中国的开源盛况,却有人提出了不同的观点 ——

  • 开源布道师李建盛老师(适兕)曾在一次专访中表示 "真实的开源世界依旧冷清",鼓励大家"要到开源真正发生的地方里去。"
  • 我们也收到了不少社区开发者的反馈 —— 热闹的背后,究竟有多少来自中国的开发者在贡献代码?如何能帮助在开源社区中贡献代码的开发者们也被更多人认识?

在和一众开源老友的讨论后,SegmentFault 思否计划联合开源社、腾源会、X-Lab 实验室发起一个全新的、专属于开源开发者的榜单 —— 中国开源码力榜,通过 GitHub 开发者协作影响力进行排名、评选。

来自 X-Lab 的 OpenDigger 团队对 GitHub 开放的归档日志进行分析,筛选出了 2021 全年 GitHub 协作影响力排名前 10,000 的账号,并号召了社区中数十位开发者及十余家合作社区,通过开放式协作共同核实标注信息、排除机器人账号,第一阶段甄选出了 99 位中国开发者。

码不停蹄,赢!

这些来自中国的"开源码丽"值得被更多人认识

开源开发者GitHub ID主要贡献项目
Zhenglai Zhang@zhenglaizhangAzure/azure-rest-api-specs
openapi-env-test/azure-rest-api-specs
zhenglaizhang/github-scala
Yang Luo https://github.com/hsluoyzcasdoor/casdoor
casbin/casbin
casbin/casnode
题叶https://github.com/jiyinyiyonghttps://github.com/calcit-lan... https://github.com/calcit-lan... https://github.com/Respo/resp...
Felix Yanhttps://github.com/felixonmarshttps://github.com/darkreader... https://github.com/felixonmar... https://github.com/felixonmar...
Pahud Hsiehhttps://github.com/pahudhttps://github.com/aws-sample... https://github.com/pahud/eks-... https://github.com/pahud/cdk-...
Huan (李卓桓)https://github.com/huanhttps://github.com/wechaty/we... https://github.com/wechaty/we... https://github.com/wechaty/pu...
Chun-Sheng, Lihttps://github.com/peter279khttps://github.com/peter279k/... https://github.com/Ayesh/Inst... https://github.com/antidot-fr...
JounQinhttps://github.com/JounQinhttps://github.com/alauda/ala... https://github.com/mdx-js/esl... https://github.com/Definitely...
Rickhttps://github.com/LinuxSuRenhttps://github.com/kubesphere... https://github.com/kubesphere... https://github.com/linuxsuren...
xrkffgghttps://github.com/xrkffgghttps://github.com/ant-design... https://github.com/umijs/dumi https://github.com/actions-co...
陈帅https://github.com/chenshuai2144https://github.com/ant-design... https://github.com/ant-design... https://github.com/ant-design...
Alex Lihttps://github.com/AlexV525https://github.com/cfug/flutt... https://github.com/cfug/dart.cn https://github.com/fluttercan...
Gooolerhttps://github.com/Gooolerhttps://github.com/coil-kt/coil https://github.com/square/okhttp https://github.com/zhaobozhen...
沈唁https://github.com/sy-recordshttps://github.com/hyperf/hyperf https://github.com/swoole/swo... https://github.com/php/doc-zh
吴晟 Wu Shenghttps://github.com/wu-shenghttps://github.com/apache/sky... https://github.com/apache/sky... https://github.com/apache/sky...
ishinehttps://github.com/ishinehttps://github.com/ishine/kal... https://github.com/ishine/kaldi https://github.com/ishine/Ten...
Tzu-ping Chunghttps://github.com/uranusjrhttps://github.com/apache/air... https://github.com/pypa/pip https://github.com/pypa/pipx
afc163https://github.com/afc163https://github.com/ant-design... https://github.com/react-comp... https://github.com/antvis/gat...
Man, Jianting (Meco)https://github.com/mysterywolfhttps://github.com/RT-Thread/... https://github.com/RT-Thread/... https://github.com/mysterywol...
罗泽轩https://github.com/spacewanderhttps://github.com/apache/apisix https://github.com/api7/apisi... https://github.com/apache/api...
Jinzhe Zenghttps://github.com/njzjzhttps://github.com/deepmodeli... https://github.com/deepmodeli... https://github.com/deepmodeli...
Alex Chihttps://github.com/skyzhhttps://github.com/sjtug/mirr... https://github.com/tikv/tikv https://github.com/sjtug/mirr...
Johnny Chenhttps://github.com/johnnychen94https://github.com/JuliaImage... https://github.com/JuliaImage... https://github.com/JuliaArray...
neverlandhttps://github.com/chenjiahanhttps://github.com/youzan/vant https://github.com/youzan/van... https://github.com/youzan/van...
lin onetwohttps://github.com/linonetwohttps://github.com/tiddly-git... https://github.com/Kenan2000/... https://github.com/Jermolene/...
Tianling Shenhttps://github.com/1715173329https://github.com/openwrt/pa... https://github.com/fw876/hell... https://github.com/immortalwr...
messensehttps://github.com/messensehttps://github.com/PyO3/maturin https://github.com/PyO3/pyo3 https://github.com/PyO3/setup...
kezhenxu94https://github.com/kezhenxu94https://github.com/apache/sky... https://github.com/apache/dol... https://github.com/apache/sky...
Andy Zhanghttps://github.com/andyzhangxhttps://github.com/kubernetes... https://github.com/kubernetes... https://github.com/kubernetes...
tisonhttps://github.com/tisonkunhttps://github.com/pingcap/tidb https://github.com/pingcap/ti... https://github.com/engula/engula
Jiashuo Lihttps://github.com/jiaslihttps://github.com/Azure/azur... https://github.com/MicrosoftD... https://github.com/Azure/azur...
hustcchttps://github.com/hustcchttps://github.com/antvis/G2 https://github.com/antvis/G2Plot https://github.com/antvis/scale
gaokaihttps://github.com/mostcoolhttps://github.com/mostcool/S... https://github.com/mostcool/s... https://github.com/mostcool/m...
一丝https://github.com/yisiblhttps://github.com/thx/iconfo... https://github.com/googlefont... https://github.com/yisibl/res...
rukihttps://github.com/waruqihttps://github.com/xmake-io/x... https://github.com/xmake-io/x... https://github.com/msys2/MING...
Dongdong Tianhttps://github.com/seismanhttps://github.com/GenericMap... https://github.com/seismo-lea... https://github.com/gmt-china/...
惜别https://github.com/SekiBetuhttps://github.com/lovezzzxxx... https://github.com/521xueweih... https://github.com/XTLS/Xray-...
fisker Cheunghttps://github.com/fiskerhttps://github.com/prettier/p... https://github.com/sindresorh... https://github.com/fisker/pre...
云游君https://github.com/YunYouJunhttps://github.com/element-pl... https://github.com/YunYouJun/... https://github.com/YunYouJun/...
haizhilinhttps://github.com/haizhilin2013https://github.com/haizlin/fe... https://github.com/haizhilin2... https://github.com/jbaysoluti...
李铭昕https://github.com/limingxinleohttps://github.com/hyperf/hyperf https://github.com/hyperf/hyp... https://github.com/jcchavezs/...
工业废水https://github.com/hi-rustinhttps://github.com/pingcap/ti... https://github.com/ti-communi... https://github.com/ti-communi...
yihonghttps://github.com/yihong0618https://github.com/yihong0618... https://github.com/yihong0618... https://github.com/yihong0618...
Kenshin Wanghttps://github.com/Kenshinhttps://github.com/Kenshin/si... https://github.com/Kenshin/si... https://github.com/raycast/ex...
卡色https://github.com/cipchkhttps://github.com/ng-alain/d... https://github.com/ng-alain/n... https://github.com/NG-ZORRO/n...
visikyhttps://github.com/visikyhttps://github.com/antvis/G2Plot https://github.com/antvis/G2 https://github.com/antvis/GUI
Hulihttps://github.com/aszx87410https://github.com/aszx87410/... https://github.com/aszx87410/... https://github.com/Lidemy/err...
yi_Xuhttps://github.com/yi-Xu-0100https://github.com/Fndroid/cl... https://github.com/vivaxy/vsc... https://github.com/Yikun/hub-...
Shixiang Wang (王诗翔)https://github.com/ShixiangWanghttps://github.com/ShixiangWa... https://github.com/openbiox/U... https://github.com/ShixiangWa...
Yi Shenhttps://github.com/pissanghttps://github.com/apache/ech... https://github.com/ecomfe/zre... https://github.com/ecomfe/ech...
Johnny Wanghttps://github.com/xiaocanghttps://github.com/openresty/... https://github.com/openresty/... https://github.com/openresty/...
littletomatodonkeyhttps://github.com/littletoma...https://github.com/PaddlePadd... https://github.com/PaddlePadd... https://github.com/PaddlePadd...
琚致远https://github.com/juzhiyuanhttps://github.com/apache/api... https://github.com/apache/api... https://github.com/apache/apisix
赵延https://github.com/horizonzyhttps://github.com/apache/dubbo https://github.com/alibaba/nacos https://github.com/sofastack/...
utzcozhttps://github.com/utzcozhttps://github.com/robolectri... https://github.com/farmerbb/T... https://github.com/robolectri...
Vincehttps://github.com/vinceliuicehttps://github.com/vinceliuic... https://github.com/vinceliuic... https://github.com/vinceliuic...
John Nianghttps://github.com/JohnNianghttps://github.com/kubesphere... https://github.com/halo-dev/halo https://github.com/kubesphere...
Lei Chenhttps://github.com/iChenLeihttps://github.com/mobxjs/zh.... https://github.com/mobxjs/mobx https://github.com/wx-minapp/...
geffzhanghttps://github.com/geffzhanghttps://github.com/geffzhang/abp https://github.com/NanoFabric... https://github.com/geffzhang/...
石头https://github.com/tingyanshenhttps://github.com/deepinthin... https://github.com/deepinthin... https://github.com/deepinthin...
Dhttps://github.com/88250https://github.com/siyuan-not... https://github.com/Vanessa219... https://github.com/88250/lute
Android轮子哥https://github.com/getActivityhttps://github.com/getActivit... https://github.com/getActivit... https://github.com/getActivit...
Zhongxiang Wanghttps://github.com/plainhearthttps://github.com/apache/ech... https://github.com/ecomfe/zre... https://github.com/plainheart...
Dadiorchenhttps://github.com/dadiorchenhttps://github.com/Greenstand... https://github.com/Greenstand... https://github.com/Greenstand...
Jintao Zhanghttps://github.com/tao1234566...https://github.com/apache/api... https://github.com/kubernetes... https://github.com/apache/api...
骑马小猫https://github.com/wj-Mcathttps://github.com/wechaty/py... https://github.com/wechaty/py... https://github.com/wechaty/we...
居戎氏https://github.com/lotemhttps://github.com/rime/squirrel https://github.com/rime/home https://github.com/rime/librime
Yurunhttps://github.com/Yurunsofthttps://github.com/imiphp/imi https://github.com/swoole/swo... https://github.com/swoole/php...
Dahan Gonghttps://github.com/gdh1995https://github.com/gdh1995/vi... https://github.com/philc/vimium https://github.com/gdh1995/vi...
rxliulihttps://github.com/rxliulihttps://github.com/rxliuli/jo... https://github.com/rxliuli/us... https://github.com/rxliuli/jo...
Freeman(Yue) Fanghttps://github.com/ffanghttps://github.com/apache/cam... https://github.com/jboss-fuse... https://github.com/apache/cxf
CuiLianghttps://github.com/cuilianghttps://github.com/cuiliang/Q... https://github.com/HandyOrg/H... https://github.com/cuiliang/C...
Daniel Poveyhttps://github.com/danpoveyhttps://github.com/k2-fsa/k2 https://github.com/k2-fsa/sno... https://github.com/kaldi-asr/...
Winlinhttps://github.com/winlinviphttps://github.com/ossrs/srs https://github.com/ossrs/stat... https://github.com/pion/trans...
Jinguo Liuhttps://github.com/GiggleLiuhttps://github.com/under-Pete... https://github.com/GiggleLiu/... https://github.com/jieli-matr...
Ryan Wanghttps://github.com/ruibabyhttps://github.com/halo-dev/halo https://github.com/halo-dev/h... https://github.com/halo-dev/docs
肖恒https://github.com/xiaoheng1https://github.com/apache/dubbo https://github.com/alibaba/nacos https://github.com/sofastack/...
Zeyu Chenhttps://github.com/ZeyuChenhttps://github.com/PaddlePadd... https://github.com/PaddlePadd... https://github.com/PaddlePadd...
Neohttps://github.com/CMingTsenghttps://github.com/JetBrains/... https://github.com/joreilly/P... https://github.com/Kr328/Clas...
Wang Hanhttps://github.com/aviraxphttps://github.com/LSPosed/LS... https://github.com/topjohnwu/... https://github.com/nining377/...
Shiwen Chenghttps://github.com/chengshiwenhttps://github.com/apache/dol... https://github.com/apache/dol... https://github.com/chengshiwe...
张逸帆https://github.com/Sciroccogtihttps://github.com/luzy99/SEU... https://github.com/Sciroccogti/LDPC-with-SIMD https://github.com/Sciroccogt...
clayGaohttps://github.com/ClayGaohttps://github.com/Lidemy/men... https://github.com/Lidemy/men... https://github.com/Lidemy/men...
Wenkai Yin(尹文开)https://github.com/ywk253100https://github.com/goharbor/h... https://github.com/goharbor/h... https://github.com/vmware-tan...
luhc228https://github.com/luhc228https://github.com/alibaba/ice https://github.com/apptools-l... https://github.com/apptools-l...
快乐的老鼠宝宝https://github.com/LaoshuBabyhttps://github.com/osmlab/nam... https://github.com/Uni-Gal/Un... https://github.com/Things-Bef...
Jasonhttps://github.com/jiangjiajunhttps://github.com/PaddlePadd... https://github.com/PaddlePadd... https://github.com/PaddlePadd...
Embbnux Jihttps://github.com/embbnuxhttps://github.com/ringcentra... https://github.com/ringcentra... https://github.com/ringcentra...
vectorhttps://github.com/NewByVectorhttps://github.com/antvis/X6 https://github.com/antvis/layout https://github.com/antvis/gat...
Evenhttps://github.com/CaptainEvenhttps://github.com/chxy95/HDR... https://github.com/nianticlab... https://github.com/LongguangW...
QiuJiangkunhttps://github.com/qiujiangkunhttps://github.com/intellij-r... https://github.com/smoltcp-rs... https://github.com/najamelan/...
Sunny Luohttps://github.com/sunnylqmhttps://github.com/reactnativ... https://github.com/reactnativ... https://github.com/facebook/r...
Shuyu Guohttps://github.com/CarGuohttps://github.com/CarGuo/GSY... https://github.com/CarGuo/gsy... https://github.com/flutter/fl...
Xuehai Panhttps://github.com/XuehaiPanhttps://github.com/Homebrew/brew https://github.com/Homebrew/i... https://github.com/Homebrew/h...
QiChang Lihttps://github.com/QC-Lhttps://github.com/reactjs/zh... https://github.com/docschina/... https://github.com/windicss/d...
shichangkuohttps://github.com/ShiChangkuohttps://github.com/huaweiclou... https://github.com/FlexibleEn... https://github.com/huaweiclou...
Francisco Lopeshttps://github.com/oblitumhttps://github.com/neoclide/c... https://github.com/oblitum/In... https://github.com/folke/zen-...
Binary Wanghttps://github.com/binarywanghttps://github.com/Wechat-Gro... https://github.com/binarywang... https://github.com/binarywang...
菜唧唧https://github.com/buuinghttps://github.com/buuing/luc... https://github.com/buuing/lee... https://github.com/LuckDraw/m...
Wenjun Ruanhttps://github.com/ruanwenjunhttps://github.com/apache/dol... https://github.com/apache/inc... https://github.com/apache/iotdb

他们在为这些项目贡献(排名不分先后)

Azure, KubeSphere, Ant Design, Flutter, Hyperf, Swoole, Apache SkyWalking, Apache Airflow, RT-Thread,Apache APISIX, DeepModeling, vant, PyO3, DolphinScheduer, Kubernetes, TiDB, TiKV, Engula, Apache Echarts, OpenResty, PaddlePaddle, Apache Dubbo, MobX, Deepin, Wechaty, TDengine, Apache Camel, ice, AntVis, Apache IoTDB, Aapche EventMesh (Incubating), ClickHouse, Apache InLong (Incubating)

访问项目官网了解上榜开发者项目贡献详情


关于中国开源码力榜

中国开源码力榜是由 SegmentFault 思否、开源社、腾源会、X-lab 实验室共同发起的中国开源开发者榜单。

来自 X-lab 的 OpenDigger 团队对 GitHub 开放的归档日志进行分析,筛选出了 2021 全年 GitHub 协作影响力排名前 10,000 的账号,并号召了社区中数十位开发者及十余家合作社区,通过开放式协作共同核实标注信息、排除机器人账号,第一阶段选出了 99 位中国开发者。

榜单发布后,我们收到社区反馈,新增了一位符合标准的来自中国的"开源码丽"Huan (李卓桓),也请开源世界的每一位开发者通过 Github 项目地址能积极的向我们反馈,我们会不间断的进行更新。

通过中国开源码力榜,我们希望开源世界的超级码丽、开源项目背后的开发者们可以被更多人知道、认识和 respect。让更多人关注开源、关注开源开发者成长。

项目地址:

https://github.com/OpenSourceWin

项目官网:

http://opensource.win/

评选标准

  1. 开发者影响力基于 GitHub 全域开发者活跃数据计算得到。
  2. 影响力计算使用了开发者与项目之间的活动关联与图算法计算获得。
  3. 计算影响力的基本主张为:更有影响力的开发者在 GitHub 上更加活跃、更有影响力的开发者更倾向于参与到更有影响力的项目中、更有影响力的项目会吸引到更多更有影响力的开发者参与。
  4. 第一阶段开源码力榜收录来自中国的协作影响力排名 Top 99 位的开发者,开发者归属地主要依据其 GitHub 上公开的地理位置信息及志愿者手工标注辨别,如有错漏欢迎来 GitHub 向我们反馈。

    项目地址:

    https://github.com/OpenSourceWin


合作伙伴

保险柜钥匙插门上,大学生单枪匹马盗取淘宝11亿用户手机号

Posted: 01 Mar 2022 12:19 AM PST

Hello,大家好,我是民间发明家,覃健祥。我申请了20多项发明专利,听到这个数字,有的朋友觉得好厉害但又不明白这些发明和我们的日常生活有什么关系,有的甚至问我是不是为了资助奖励申请了一堆凑数的专利。其实,我的大脑里有100个创新点可以申请专利,只是申请专利的时间和金钱成本都太高了,我只能优先申请一些商业价值大的创新程度高的。

为了消除大家对专利的神秘感,我打算写篇文章科普一下。恰好,就在2月23日,我有件名为《基于HMAC算法的密钥保护方法、装置、设备和存储介质》的专利获得了国家专利局的受理通知书,这件专利和淘宝11亿客户手机号被盗的惊天大案有关。我在专利中提出的漏洞普遍存在于各行各业,很多受害者正在被攻击而不自知,而我提出的防护方案具有非常好的通用性。

在此也请各位读者朋友多多转发,好让业界早日受益,若专利成功取得授权,我将授权国防/政务/科研/教育等公共行业免费使用,对本文传播有贡献的读者朋友也可申请免费授权(可用于商业目的)。

月黑风高夜,昏暗的房间里,弥漫着羊肉汤的膻味,一个大学生模样的年轻人端坐电脑前,几亿个手机号离奇出现在沾满指纹的电脑屏幕上。在上千公里之外的不夜城,一个个淘宝网购用户相继收到陌生的微信好友申请,继而被拉进一个微信群领优惠券购物,群主的广告账户余额飞速跳动,一个完美的获取用户隐私变现的闭环形成了。

是什么神秘的力量让中国两大互联网巨头的用户产生了神奇的交集?手机号怎样完成了这不可思议的时空之旅?天之骄子为何铤而走险?敬请收看本期《走近科学》,啊不对不对,手抖打错了,敬请收看本期《了不起的小发明》,哈哈

1. 圈门锁失守,猛虎啖羊羔

说到获取几亿个手机号,人们最容易想到的手段之一就是爬虫抓取。在人们的常识中,爬虫属于百度谷歌才有的高科技工具。诚然,百度谷歌要收录全网上百亿的网页,还要保证一定的实时性,技术难度确实非常大,研发费用都是以亿为单位的。

但是,抓取淘宝用户手机号的爬虫却不需要那么高的技术含量,因为淘宝有官方手机客户端,淘宝为自己的手机客户端提供了接口(即API),API有两大优点,使得抓取难度远远小于网页:

一是简洁性。网页不止包含了数据信息,还包含了排版信息,要把数据从网页上提取出来,需要一些复杂的规则和算法。

二是稳定性,网页可能每个月都在改版,改版了,原来提取数据的规则和算法就要重写。而API非常稳定,通常一次定义好了之后几年都不变。

于是,通过API抓取淘宝用户手机号,不需要写复杂的规则就能直接拿到手机号,爬虫开发一次可以用很久。

淘宝的十几亿用户在黑客眼里就是羊圈里成千上万只肥羊,接下来就是想办法突破羊圈的门了。高价值的用户信息必然有着极高的安全等级,淘宝采用了国际上主流的HMAC技术,鉴定调用接口的是官方的客户端,还是未授权的第三方爬虫。HMAC技术的H代表hash,中文翻译是哈希,是全世界银行业金融业广泛采用的基石技术,当下最火的区块链也是靠哈希来保证数据的可信性。

听起来淘宝的用户库是不是跟谍战大片里的银行金库的保险柜一样安全了?遗憾的是,淘宝将HMAC算法用到的密钥,明文放在了HTTP COOKIE里(后面会讲技术细节),这就好比保险柜钥匙插在了门上。圈门大开,虎入羊群,一个大学本科文化水平的人,就这样单枪匹马从淘宝官方的接口中盗取了11.8亿用户的手机号用户名等隐私。

这正是:

蓬门今始为君开,
花径不曾缘客扫。
数只皂雕追紫燕,
一群猛虎啖羊羔。

2.天网疏不漏,伸手必被捉

2021年6月,中国裁判文书网公布了一份判决文书,名为《逯某、黎某侵犯公民个人信息一审刑事判决书》,编号为(2021)豫1403刑初78号,这个惊天大案的真相浮出水面。详情可见腾讯的这篇报道:超11亿条!你的淘宝信息可能被泄露了

根据这份判决书,我们简单回顾一下要点:

时间线

  • 案犯2019年9月开始作案
  • 淘宝网风控人员在2020年7月发现,8月报案,同月,嫌疑人被抓获
  • 2021年6月一审判决。

损失

  • 案犯损失自由,淘宝损失商誉。
  • 两名案犯分别被判处3年多有期徒刑,违法所得予以追缴,另处罚款数十万。

被盗用户规模

  • 淘宝报案称有3500万(只是2020年7月6日至7月13日之间被风控人员监测到的数据)
  • 司法机关查获认定为11.8亿,淘宝经抽样核实,认可这11.8亿数据的真实性
  • 嫌疑人辩称只抓了几千万,剩下的11亿是别的地方下载的,法院未予采纳。

作案技术手段

  • 通过手机淘宝的官方接口接口抓取,判决书中所称mtop,即mobile taobao open platform,手机淘宝专用的接口平台
  • 不同于淘宝开放平台(TOP),手机淘宝的接口平台是淘宝私有的,只有兄弟公司和极少数合作伙伴能申请到访问权限。淘宝报案称嫌疑人非法绕过风控机制,证明他们没有合法申请的访问权限,推测是通过淘宝"插在门上的钥匙"伪装成淘宝官方客户端抓取数据的

开发爬虫的法律风险

在我们互联网行业有几句玩笑话:爬虫玩得好,牢饭吃到饱;《Python爬虫:从入门到入狱》。

我科普的目的是提高大家的安全意识和法律意识,分享安全防护技术的同时也做点普法工作。

爬虫违法的高风险区有这些:

  1. 抓取大量个人隐私贩卖牟利。罪名是侵犯公民个人信息,属于刑事犯罪。非法获取/出售50条个人隐私即可判刑,本案中,涉案公民信息条数超标10倍以上,触发情节特别严重的法条,所以刑期也达到了3年以上
  2. 爬虫访问过于频繁造成对方服务器崩溃。罪名是破坏计算机信息系统,属于刑事犯罪,造成为1万人服务的系统停机一小时即为情节严重。比如这个CTO和程序员双双被判刑的案子
    :某公司抓取市居住证系统致服务器崩溃,多个政务系统中断服务,CTO和程序员分别被判3年和1年刑。
  3. 抓取同行的数据用作商业目的。构成不正当竞争,属于民事侵权。比如中国法院网报道过的这个案子:大众点评诉百度案一审宣判 百度赔偿323万

拥有编程手艺的朋友们,一定要多了解法律常识,保持技术造福社会的初心,不要迷信"避风港原则",莫伸手,伸手必被捉。

3. 蚁穴何足道,千里之堤溃

早在2015年,我就通过乌云漏洞平台向淘宝报告了HMAC密钥明文放在cookie中的安全漏洞,但淘宝认为那个不是密钥,危害等级低。我认为这个是app secret,淘宝认为这只是一个token,这只是文字表述的差异,就算你把它命名为noise,也不改变它在程序中100%承担着HMAC算法secret角色的事实。

乌云漏洞报告截图
2015年淘宝在cookie中放明文密钥的截图

这种将明文密钥放在通信报文中的做法,相当于给了攻击者一个永久有效的访问权限,导致接口被攻击者用来抓数据,淘宝的技术团队认为本质上跟淘宝去抓别人的数据没有区别。详细对话过程参见我2015年9月29日发的这条微博

当时这事在阿里内网也引起过关注,但不知道为什么,淘宝一直坚持使用这个显然不安全不专业的方案,即使11亿消费者的隐私被盗,也没能引起淘宝的重视。直到今天(2022年3月1日),淘宝还在用6年前就被我找出过安全漏洞的方案。证据如下:

2022年3月1日淘宝在cookie中放明文密钥的截图

Dear Officer, the lift is running with huge safety risk.
No, there is no lift, this is only elevator.

讳疾忌医,终致溃堤,扼腕叹息。

4. 亡羊可补牢,为时犹未晚

提供互联网服务的朋友们,一定要定期认真审视自己的安全体系,安全防护方案多多益善,不是说买了一套防火墙就万事大吉了。淘宝这个级别的公司尚且遭遇这么大的安全事故,正说明安全绝不是轻轻松松就能做好的。

希望阿里的朋友们,能帮我把这篇文章转发给阿里相关技术团队,尽早把这扇敞开了7年的大门关上。亡羊补牢,为时未晚。

当然了,11亿消费者手机号这么容易被盗,错误不止是明文密钥这一个,API网关缺少优秀的限流限频和隐私过滤功能也是重要原因。这个做起来也颇有难度,我这几年投资做了一个API安全网关,服务过央企,也服务过小创业公司,遇到很多技术挑战,也申请了不少专利,遍尝个中酸甜苦辣。

懂技术的读者朋友可能会觉得,把密钥隐藏在js代码里,反复编码加密几次,再混淆一下代码,不就安全了吗?其实不是的,由于浏览器运行环境和JavaScript语法的特殊性,网页端的JavaScript是解释执行的,可被重写覆盖的,JavaScript藏不住真正的秘密。我只用了一行代码,几秒钟就找出淘宝的密钥了,有了密钥,我才发现居然就明文放在cookie里。上面的两张截图可以看到,我把密钥打印在控制台或者警告了。

用kotlin开发的Android客户端可能也有类似的风险,我还没测试过,预计比网页端破解难度大一些。

基于md5或者sha系列哈希函数的签名验证机制,在互联网使用得非常广泛,这从各大开放平台的签名算法文档就可以看出来。绝大多数的网页版,都能用一行代码几秒钟破解出密钥,无论你把密钥藏得多深。

有鉴于此,我在2015年发明了一种可以真正防止网页端HMAC密钥被盗的方法,并成功运用在我公司的所有产品上。直到2022年,发现业界仍然没有类似的技术,才申请了专利。这个专利的核心是保护密钥安全,秘密在于以下几点:

权利要求1:使用衰减后的密钥

哈希算法都是摘要算法,从输入到输出存在信息衰减,无法逆推。平常大家下载一个几百兆的软件,用于验证下载文件完整性的hash(也叫check sum)只有16~32字节,足见衰减系数有多大。

我们可以将明文的密钥预先执行一部分衰减运算,再将衰减后的密钥放在网页端JavaScript代码中,在网页端JavaScript代码中实现一个变种的hash函数,使其利用衰减后的密钥计算出与标准hash函数兼容的结果。这样,攻击者就不能从网页端偷到真正的明文密钥了,因为,你没法偷走一个不存在的东西。

攻击者拿到衰减后的密钥,用标准的hash函数必然算不出正确的签名,便无法破解HMAC安全机制。

这就是本专利的权利要求1(专利法规定,权利要求1是基石,权利要求2,3,4都是基于权利要求1的)。

这是篇科普文,我尽量讲得通俗易懂些,详细的技术细节不展开讲,我在专利技术交底书里写了证明过程,大家有兴趣看得话,评论里告诉我,我后面贴上来。

权利要求2:保护变种hash函数

通过代码混淆,使混淆后的代码可读性大大降低,大大提高攻击者人肉阅读变种hash函数源码的时间成本。

实际上,即使不混淆,写得极其优雅的md5, sha256函数源代码也非常复杂,我感觉因爬虫被判刑的技术员,读得懂md5源代码的屈指可数。

此外,还可以将混淆后的hash函数代码编译成web assembly二进制产物,攻击者只能反编译再阅读,难度又提升了一个数量级。

权利要求3:定期自动更换

写一个自动化程序,定期执行,更换密钥,以及变种hash函数的算法,更换的时间间隔远远小于攻击者破解的时间,就算他们破解出来也没用了。

5. 摆下迷魂阵,请君入瓮来

在能检测到爬虫行为或者攻击行为的前提下,第一时间用攻防技术硬扛不一定是最佳选择。兵者,诡道也,业内还有这么一些请君入瓮的方法:

蜜罐

检测到攻击行为后,并不提示错误码和警告消息,而是故意卖给破绽,用一些假的商业价值不大的数据喂养攻击者,令其乐不思蜀,不再精进技术去攻击真正敏感的地方。

毒丸

若是公开的接口被抓取,为保证正常用户服务不受影响,识别出非法爬虫后,在数据里埋设毒丸:给爬虫返回真假参半的数据,令其被领导或者黑产买家责难数据质量差,生意难以为继。

养猪

若对方变现模式是非法外挂,刚检测出来时,可不打草惊蛇,待对方小有所成发展了一定数量收费客户后,一举封杀,退款纠纷将仅使其焦头烂额。

钓鱼

若对方变现模式是售卖抓取的数据,第一时间不封禁其抓取通道,而是收集证据,够刑事立案标准再诉诸法律。


如果大家喜欢这篇文章,除了转发之外,还可以扫描下方二维码关注我们的微信公众号:代码狗说代码

我的同事会在那里和我一起写文章,都是信息安全/软件技术/智能硬件领域的一些科普,通俗易懂,也有技术含量,欢迎大家来交流。

代码狗微信公众号

Jenkins+Docker+Gitee+SpringBoot自动化部署

Posted: 28 Feb 2022 03:47 AM PST

当我们使用传统的开发方式开发后台系统时,每写完一个功能点就需要重新运行一下项目,然后进行测试,如果是项目比较小还可以,但是如果项目比较大的话,由于涉及的人员比较多,这种开发方式就比较麻烦。基于此,我们就需要使用Jenkins配合Gitee搭建一个自动化部署平台,并将代码托管到服务器上,这样减轻了本地的电脑压力,也解放了部署的流程。

1, 搭建Jenkins平台

首先,我们需要搭建一下Jenkins自动化构建平台。首先,我们需要安装Docker,然后在Docker中安装Jenkins,安装的命令如下:

# 安装yum-utils工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 配置阿里云的Docker Yum源 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装Docker sudo yum install docker-ce docker-ce-cli containerd.io # 启动Docker sudo systemctl start docker # 配置开机自启动 sudo systemctl enable docker

通过以上指令即可成功安装Docker并启动,接下来我们通过Docker运行Jenkins。

docker run \   -d \   --rm \   -u root \   -p 8080:8080 \   -v /home/jenkins-data:/var/jenkins_home \   -v /var/run/docker.sock:/var/run/docker.sock \   -v /opt/develop_resource/apache-maven-3.6.3:/usr/local/maven \   -v "$HOME":/home \   jenkinsci/blueocean

执行上述指令Docker会自动拉取Jenkins的镜像并启动,因为我们要部署的是SpringBoot,所以需要准备JDK和Maven环境,不过该Jenkins镜像自带了JDK环境,只需准备一下Maven即可,首先,下载Maven压缩包,命令如下:

wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

然后,使用命令解压文件。

tar -zxvf apache-maven-3.6.3-bin.tar.gz

解压之后千万要注意Maven所在的目录,比如:

/opt/develop_resource/apache-maven-3.6.3

将它挂载到容器的目录里,-v /opt/develop_resource/apache-maven-3.6.3:/usr/local/maven这一条指令中的Maven目录千万记得换成自己的。现在,我们可以运行刚才的指令启动Jenkins了,通过docker ps指令可以查看容器是否启动。

[root@10 /]# docker ps CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS         PORTS                                                  NAMES dfa1b8b2c7a3   jenkinsci/blueocean   "/sbin/tini -- /usr/…"   15 seconds ago   Up 9 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 50000/tcp   condescending_meitner

接下来,我们使用服务器的ip加端口8080的方式访问Jenkins。
在这里插入图片描述
管理员密码可以在Jenkins的启动日志中查看,使用docker logs dfa1b8b2c7a3查看日志:
在这里插入图片描述
密码就是红框中的字符串,注意红框下的一段提示:

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

意思是你可以在/var/jenkins_home/secrets/initialAdminPassword这个文件中查看到管理员密码,不过这是Jenkins容器内的目录,我们在启动Jenkins的就挂载了Jenkins的关键目录/var/jenkins_home,宿主机目录为/home/jenkins-data,所以可以使用如下指令查看管理员密码。

cat /home/jenkins-data/secrets/initialAdminPassword

得到密码后输入到Jenkins页面解锁Jenkins,然后点击安装推荐的插件。
在这里插入图片描述
在这里插入图片描述
接下来,直接点击【下一步】。
在这里插入图片描述
在这里插入图片描述
到这一步,Jenkins平台就可以正式使用了。

2, Jenkins平台配置

接下来,就是对Jenkins平台的配置,首先配置Maven。
在这里插入图片描述
按步骤点击,即可进入系统配置。首先,在全局属性中进行配置。
在这里插入图片描述
在这里插入图片描述
还记得我们在运行Jenkins容器时挂载的Maven目录吗?挂载到Jenkins容器中的目录就是/usr/local/maven,如果实在搞不懂的你就保持和我的配置一样即可。

以同样的方式,再新增一个配置:
在这里插入图片描述
PATH+EXTRA的作用是让原来PATH变量中的环境不丢失,最后点击保存。Maven配置完成后,需要配置Gitee。
在这里插入图片描述
在这里插入图片描述
点击可选插件,选中Gitee,然后点击Install without restart进行安装,等待安装完成即可,Gitee的相关配置我们放到后面讲。

3,创建SpringBoot应用

首先,我们创建一个简单的SpringBoot应用进行测试,控制器代码如下。

@RestController public class HelloController {      @GetMapping("/hello")     public String hello(){         return "Hello World!";     } }

然后在配置文件application.yml中添加:

server:   port: 8000

并在main下新建docker文件夹,在docker文件夹下新建Dockefile文件,内容如下。

# 指定是基于哪个基础镜像 FROM java:8  # 作者信息 MAINTAINER wwj  # 挂载点声明 VOLUME /tmp  # 将本地的一个文件或目录,拷贝到容器的文件或目录里 ADD /target/demo-0.0.1-SNAPSHOT.jar springboot.jar  #shell脚本 RUN bash -c 'touch /springboot.jar'  # 将容器的8000端口暴露,给外部访问。 EXPOSE 8000  # 当容器运行起来时执行使用运行jar的指令 ENTRYPOINT ["java", "-jar", "springboot.jar"]

需要注意的是ADD指令的编写,当SpringBoot应用打包完成后,其jar包会被放在target目录下。
在这里插入图片描述
所以需要指定该文件的位置,使用ADD指令将其放入待构建的容器中,接着在Gitee中新建一个仓库,并将代码推送到仓库中。
在这里插入图片描述
仓库名随便你叫什么,然后将刚才的应用推送上去即可。
在这里插入图片描述

4,Gitee配置

推送完成后,回到Jenkins管理界面,我们来完成Gitee的配置,打开系统配置。
在这里插入图片描述
找到Gitee配置,填入对应的信息:
在这里插入图片描述
点击添加按钮添加一个Jenkins凭证。
在这里插入图片描述
选择Gitee API 令牌:
在这里插入图片描述
私人令牌的获取地址为:https://gitee.com/profile/personal_access_tokens

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5, 新建自动化部署任务

配置完成,接下来新建一个任务,点击新建Item。
在这里插入图片描述
随便输入一个任务名称,并选择【Freestyle project】。
在这里插入图片描述
在源码管理处勾选Git,并填入项目地址,然后在构建触发器位置勾选触发打包的时机。
在这里插入图片描述
在构建触发器最底部位置点击生成Gitee WebHook密码。
在这里插入图片描述

然后打开Gitee项目中的WebHooks,添加webHook。
在这里插入图片描述
在这里插入图片描述

此处的URL需要填入一个公网IP,所以如果你是用的虚拟机,就需要用内网穿透工具映射一下。

在这里插入图片描述
在这里插入图片描述
至于URL应该填什么,我们需要修改一下。
在这里插入图片描述
填写完成后点击添加,Gitee便会发送一个Post请求到Jenkins,如果请求结果如下所示,则配置成功了。
在这里插入图片描述
重新回到Jenkins管理界面,继续勾选构建触发器下的轮询SCM,输入轮询频率。
在这里插入图片描述
最后在构建位置下增加构建步骤,选择执行shell。
在这里插入图片描述
shell脚本代码如下。

#!/bin/bash -il docker rm -f app_docker sleep 1 docker rmi -f app_docker:1.0 sleep 1 mvn clean install -Dmaven.test.skip=true sleep 1 docker build -t app_docker:1.0 -f ./src/main/docker/Dockerfile . sleep 1 docker run -d -p 8000:8000 --name app_docker app_docker:1.0

该脚本表示删除正在运行的app_docker容器,并删除app_docker:1.0镜像,然后使用mvn命令打包从Gitee拉取来的项目代码,接着使用项目中的Dockerfile文件构建出一个镜像,名称为app_docker:1.0,最后运行该镜像。

6,打包测试

最后点击保存,部署任务就创建完成了,我们来测试一下有没有问题。
在这里插入图片描述
点击立即构建,Jenkins会立马进行一次构建,查看控制台输出。
在这里插入图片描述
最后,我们打开默认的地址即可。

走进开源项目 - urlcat

Posted: 28 Feb 2022 07:23 AM PST

大部分人都有个参与开源项目的梦,可项目在前却不知如何下手?今日有幸遇到了可以下手的库 — urlcat

Untitled.png

urlcat 只有 267 行代码的开源项目,却收获了 1.4 k 的 star,周下载量 1 w 以上,这是我目前遇到过源码最少的开源项目,下面就来一探究竟,看看每个文件在项目中的作用。

Untitled 1.png

.github

image.png

从命名上看是 issue 和 pr 模板,这三个模板可以有效降低作者与使用者的沟通成本,高效解决问题,其中:

bug_report.md 描述:

  1. 什么问题
  2. 如何复现该问题
  3. 预期的行为效果是什么
  4. 截图
  5. 桌面环境:什么系统、什么浏览器、什么版本
  6. 手机环境:什么设备、什么系统、什么浏览器、什么版本
  7. 问题上下文:作用在于说明该问题是否与其他问题有关联

fature_request.md 描述:

  1. 你需要的功能是否与某个问题有关
  2. 描述下你想要的方案
  3. 描述你可能考虑过的代替方案
  4. 描述预制相关的功能 issue

pull_request_template.md 描述:

  1. PR 的功能概括
  2. PR 的详情描述

docs

image.png

用 What、Why、How 精准阐述了项目的存在的意义。

  • What:是什么?
  • Why:为什么要做?
  • How:怎么用

除此之外,还提供了详细的 api 说明,以及告诉大家如何参与该项目,贡献自己的代码。

src

存放源码的文件夹,之后会单独写一篇关于该源码的文章。

test

都说单元测试很重要,可都觉得写单元测试费时费力,即便是区区几百行代码,该作者依旧写了如此详细的单元测试,这是一种态度。

Untitled 4.png

.all-contributorsrc

一个项目能够保持活力,持续不断的发展,需要众人的力量。

.editorconfig

有助于在不同的编辑器和 IDE 中保持一致的编码样式。

# 是否是顶级配置文件,设置为 true 的时候才会停止搜索.editorconfig 文件 root = true  [*] # 换行符类型 end_of_line = lf # 是否让文件以空行结束 insert_final_newline = true # 缩进方式 indent_style = space # 缩进大小 indent_size = 2 # 编码格式 charset = utf-8

.eslintignore

告诉 eslint 忽略特定文件和目录,不要对其进行检测。

node_modules dist coverage

.eslintrc.js

eslint 配置文件

module.exports = {   env: {     'node': true   },   root: true,   parser: '@typescript-eslint/parser',   plugins: [     '@typescript-eslint',   ],   extends: [     'eslint:recommended',     'plugin:@typescript-eslint/recommended',   ],   rules: {     'object-curly-spacing': ['error', 'always'],     'array-bracket-spacing': ['error', 'never'],     'quotes': ['error', 'single'],     'no-console': ['error'],   } };

关于 eslint 的配置已经有不少好文,感兴趣的可以看看这篇文章。

相关文章:

.gitignore

提交代码时,需要忽略一些文件时,该配置就很有用了

/node_modules /dist /dist-test /.nyc_output /coverage .vscode

.npmignore

当需要发布 npm 包时,可以忽略一些不需要发布到 npm 的文件。

/node_modules /dist-test /src /docs /test /.travis.yml /tsconfig.json /tsconfig-test.json /.nyc_output /coverage

.travis.yml

一个持续集成服务的配置文件

language: node_js node_js:   - lts/*   - 14   - 13   - 12   - 11   - 10 script:   - npm run lint   - npm test   - npm run coverage

关于持续集成服务,看看阮一峰老师的这篇文章就够了。

相关文章:

CODE_OF_CONDUCT.md

第一次注意到这个文件,搜了相关资料,原来是行为准则。看了篇博文也了解其作用。行为准则对开源社区的健康、可持续发展有着至关重要的影响。

相关文章:

CONTRIBUTING.md

贡献指南,前面已提过。

LICENSE

开源许可证,授权他人与特定权利来使用的产品。防止那些拿来主义。怎么选择开源许可证,在这里借用下阮一峰老师的一张图。

Untitled 5.png

相关文章:

README.md

该作者的一份 README.md 基本涵盖了之前提到的 docs 的所有内容,很简洁,跟代码一样简洁😄😄

jest.config.js

单元测试配置文件,这也是我所欠缺的,之后会详细学习一下。

module.exports = {   preset: 'ts-jest',   testEnvironment: 'node',   coverageDirectory: 'coverage',   collectCoverage: true,   testMatch: [     '**/test/**/*.ts'   ],   verbose: true,   collectCoverageFrom: [     '**/src/**/*.ts'   ],   testPathIgnorePatterns: [     'dist.*\\.ts$'   ] }

相关文章:

package-lock.json

简单理解,为了锁定第三方包的版本号, 由于项目会依赖大量第三方包,第三方包也会依赖其他第三方包,当包更新了不兼容的 api 时,在执行 npm install 之后,项目运行时,可能会发生意想不到的情况。

相关文章:

package.json

作为前端人,都再熟悉不过,分享几个不常见,但很关键的配置:

指定 node 版本号:

{   "engines": {     "node": ">=8 <14"   } }

指定 npm 版本:

{   "engines": {     "npm": "~1.0.20"   } }

如果你打算发布一个 npm 包,files字段可能会有用,指定发布到 npm 中的文件

钩子,npm 脚本有 prepost 两种钩子。其作用执行某些特殊命令是触发自动化脚本,例如:

  • build 之前删除 dist
  • publish 之前跑单元测试并打包项目
"scripts": {     "clean": "shx rm -rf dist",     "prebuild": "npm run clean",     "build": "tsc -p .",     "test": "jest",     "lint": "eslint . --ext .js,.jsx,.ts,.tsx",     "coverage": "cat ./coverage/lcov.info | coveralls",     "prepublish": "npm test && npm run build",     "docs": "docsify serve docs --open"   },

相关文章:

renovate.json

一种似曾相识的感觉,是它,就是它。

Untitled 6.png

Untitled 7.png

Renovate 是一个开源工具,用于自动化:

  • 检测存储库中的依赖项(开源和私有/闭源)
  • 检查是否有依赖更新
  • 创建提交和合并/拉取请求以更新依赖项
  • ……

tsconfig.json

当使用 typescript 开发项目时就会用到该配置文件。

相关文章:

总结

除源码和单元测试之外,对其他文件的用途都做了说明,做开源不易,当我们信手拈来之时,这些开源项目作者付出了太多。一群来自世界各地的人,共同完成一件事,除了专业技能之外,看到更多的是一种态度。

参考文章:

IDEA 中如何完成 Git 版本回退?

Posted: 28 Feb 2022 06:07 PM PST

@[toc]
上周的文章发了后,有小伙伴问如何在 IDEA 中进行 Git 的版本回退?

其实这个松哥之前写过文章,但是时间久远了,所以今天再和小伙伴们重新捋一捋这个话题,顺便也来聊聊如何在 IDEA 中进行 Git 的版本回退。

Git 中的撤销操作,我们可以归纳为四类:

  1. 工作区的代码想撤销
  2. add到暂存区的代码想撤销
  3. 提交到本地仓库的代码想撤销
  4. 远程仓库的代码想要撤销

1. 基于命令行

1.1 工作区的代码想撤销

可能有一天我正在写代码,写了很久发现写错了,想恢复到一开始的状态,一个笨办法就是把刚刚写的代码一行一行的删除,不过这种方式成本太高,我们可以通过git checkout -- <file> 命令来撤销工作区的代码修改。如下图:

p182

首先我们执行了 git status 命令,发现工作区是干净的,然后执行了 cat 命令,发现文件只有两行内容,然后通过 vi 编辑器向文件中添加一行,保存并退出,退出来之后又执行了 git status 命令,此时工作区的状态已经发生变化,然后我们执行了 git checkout -- git01.txt 命令,表示撤销之前的操作,让 git01.txt 恢复到之前的状态,该命令执行成功之后,我们再执行 cat 命令发现文件内容已经恢复了,此时再执行 git status,状态也恢复了。

1.2 add 到暂存区的代码想撤销

如果想要撤销,但是代码已经提交到暂存区了,不用担心,也能撤销,分两个步骤:

  1. 将暂存区的代码撤销到工作区
  2. 将工作区的代码撤销(具体操作和 1.1 小节一致)

将暂存区的代码撤销,我们可以使用 git reset HEAD 命令来实现。如下图:

p183

这里的代码都比较简单,核心的过程就是先执行 git reset HEAD 命令,从暂存区撤销,剩下的操作参考 1.1 小节。

1.3 提交到本地仓库的代码想撤销

同样的,提交到本地仓库的代码一样也可以撤销,我们可以利用 git reset --hard <版本号> 命令来实现版本回退,该命令中的版本号有几种不同的写法:

  1. 可以使用 HEAD^ 来描述版本,一个 ^ 表示前一个版本,两个 ^^ 表示前两个版本,以此类推。
  2. 也可以使用数字来代替 ^,比如说前 100 个版本可以写作 HEAD~100
  3. 也可以直接写版本号,表示跳转到某一个版本处。我们每次提交成功后,都会生成一个哈希码作为版本号,所以这里我们也可以直接填版本号,哈希码很长,但是我们不用全部输入,只需要输入前面几个字符即可,就能识别出来。

看下面一系列的操作:

  1. 通过 git log 查看当前提交日志:

p184

  1. 通过 git reset HEAD^^ 向前回退两个版本:

p185

  1. 查看日志,发现最后一次提交的版本号是 695ce1fe,利用 git reset --hard 695ce1fe 命令回到回退之前的状态:

p186

  1. 通过 git reset --hard HEAD~1 回到上一个版本:

p187

当然以上操作都是基于命令行的,如果你命令行操作比较熟练的话,其实命令行操作比 IDEA 上点点点要快很多。

1.4 远程仓库撤销

如果代码提交到远程仓库了,想要撤销,那就如 1.3 小节所讲,先在本地仓库撤销,然后 push 到远程仓库即可。

2. 基于 IDEA

看懂了命令行操作,再看基于 IDEA 的操作就容易多了。

2.1 未提交就撤销

对于第一小节的前两种撤销操作,即修改的文件还没 commit,此时想要撤销,方式很简单,点击 IDEA 右上角的撤销按钮:

如果你修改了文件,无论有没有执行 git add 命令,只要没有 commit,都可以通过这个按钮撤销修改,点击该按钮,弹出如下提示框:

这里会列出来所有修改但是没有 commit 的文件,想要撤销哪个文件的修改,就勾选该文件,然后点击 Rollback 按钮就完成了撤销操作。

2.2 commit 了想撤销

如果已经 commit 了,那么就需要先打开提交日志,点击如下按钮打开:

也可以直接点击 IDEA 右上角的时钟图标,快速打开提交日志:

提交日志类似下面这样:

此时的回退就分情况了。

首先这个撤销操作分两种:

  • Revert Commit
  • Undo Commit

我们分别来看。

2.2.1 Undo Commit

Undo Commit 这个操作只能在最近一次提交上使用,不能在其他提交上使用,最近一次 commit 上,右键单击,如下图:

其他的 commit 上右键单击:

既然如此,我们就来看看最近的一次 commit 如何 Undo Commit。

在最近一次 commit 日志上右键单击后选择 Undo Commit,如下图:

选中后,直接点击 OK,撤销最近一次的 commit。

这就是撤销最近一次 commit,撤销之后,本地的修改相当于变成了已 add 但是未 commit 的状态,此时我们可以继续开发新代码,然后再 commit,再 push;或者也可以像 2.1 小节介绍的那样,继续撤销操作。

我电脑上的 IDEA 在这块操作中有个偶发性问题,就是撤销掉 commit 之后,IDEA 检测不到文件处于未提交状态,需要我把 IDEA 关掉重新打开,IDEA 就能发现文件处于未提交状态了,此时就可以按照 2.1 小节的步骤继续回退了,这块小伙伴们在试验的时候可以留意下。

2.2.2 Revert Commit

Revert Commit 这个操作到处都能用,不同于 Undo Commit,Revert Commit 之后,会产生一条提交记录。相当于 Revert Commit 其实也是提交,只不过提交的内容刚好相反,刚好刷掉已有内容。

Revert Commit 操作可以用在所有的日志上,而不仅仅是刚刚提交的 commit。

操作方式如下:

找到需要回滚的地方,右键单击,选择 Revert Commit:

此时会弹出来一个提交的对话框,就是一个普普通通的 commit 对话框,如下:

commit 之后,可以看到内容已经撤销了,提交日志中也多了一条记录,如下图:

2.3 push 了想撤销

如果已经 push 到远程仓库了,怎么撤销?

其实跟 2.2 小节一样,先在本地仓库撤销,撤销完成后,重新修改代码,最后再 force push 就行了,不过 force push 的时候,注意别把同事的代码给覆盖了。

3. 小结

好啦,今天和小伙伴们分享了 Git 中的几个撤销问题,有问题的小伙伴欢迎留言讨论呀~

音视频开发者的福音,快速集成AI配音能力

Posted: 28 Feb 2022 12:20 AM PST

音视频内容创作者对剪辑应用中的AI配音需求与日俱增。它的优点很多,不光可以解决雇佣人力配音的成本以及创作者本身的口音、语言等限制,还可以大幅提升生产效率。比如,短视频的播放时间短的几十秒,长的vlog类型视频有4-5分钟,使用AI配音功能可以在短时间内实现多个剪辑需求。

HMS Core音频编辑服务(Audio Editor Kit)提供AI配音服务,帮助开发者在应用中轻松构建语音合成功能,一键输出文字即可转换语音。它支持乖萌童声,亲切女声,阳光男声,英文男声、女声等多种风格音色,还可以定制自己想要的音色。音色自然流畅,情感丰富,满足有声阅读、音频内容制作、剪辑等多种开发者关注的热门场景。

开发实战

1.开发准备

详细准备步骤可参考华为开发者联盟官网:

https://developer.huawei.com/...

2.编辑工程集成

2.1设置应用的鉴权信息

开发者需要通过api_key或者Access Token来设置应用鉴权信息。

  • (推荐)通过setAccessToken方法设置Access Token,在应用启动时初始化设置
HAEApplication.getInstance().setAccessToken("your access token");
  • 通过setApiKey方法设置api_key,在应用启动时初始化设置一次即可,无需多次设置。

    HAEApplication.getInstance().setApiKey("your ApiKey");

2.2初始化环境

初始化音频编辑管理类、创建时间线以及需要的泳道。

// 创建音频编辑管理类 HuaweiAudioEditor mEditor = HuaweiAudioEditor.create(mContext); // 初始化Editor的运行环境 mEditor.initEnvironment(); // 创建时间线 HAETimeLine mTimeLine = mEditor.getTimeLine(); // 创建泳道 HAEAudioLane audioLane = mTimeLine.appendAudioLane();

导入音乐。

// 泳道末尾添加音频资源 HAEAudioAsset audioAsset = audioLane.appendAudioAsset("/sdcard/download/test.mp3", mTimeLine.getCurrentTime());

3. AI配音功能集成

调用HAEAiDubbingEngine实现AI配音功能。

// 通过此配置类来对AI配音引擎进行配置 HAEAiDubbingConfig haeAiDubbingConfig = new HAEAiDubbingConfig() // 设置音量 .setVolume(volumeVal) // 设置音速 .setSpeed(speedVal) // 设置发音人 .setType(defaultSpeakerType); // 单个AI配音任务回调 HAEAiDubbingCallback callback = new HAEAiDubbingCallback() {     @Override     public void onError(String taskId, HAEAiDubbingError err) {         // error处理     }     @Override     public void onWarn(String taskId, HAEAiDubbingWarn warn) {}     @Override     public void onRangeStart(String taskId, int start, int end) {}     @Override     public void onAudioAvailable(String taskId, HAEAiDubbingAudioInfo haeAiDubbingAudioFragment, int i, Pair<Integer, Integer> pair, Bundle bundle) {         // 开始接收文件,保存成文件     }     @Override     public void onEvent(String taskId, int eventID, Bundle bundle) {         // The synthesis is complete.         if (eventID == HAEAiDubbingConstants.EVENT_SYNTHESIS_COMPLETE) {             // AI配音任务处理结束,即合成的音频数据全部处理完毕         }     }     @Override     public void onSpeakerUpdate(List<HAEAiDubbingSpeaker> speakerList, List<String> lanList,          List<String> lanDescList) { } }; // AI配音引擎 HAEAiDubbingEngine mHAEAiDubbingEngine = new HAEAiDubbingEngine(haeAiDubbingConfig); // 设置AI配音任务播放过程侦听 mHAEAiDubbingEngine.setAiDubbingCallback(callback); // 实时AI配音并播放API,text传入待转语音的文本,modeAI配音任务播放模式 String taskId = mHAEAiDubbingEngine.speak(text, mode); // 暂停播放 mHAEAiDubbingEngine.pause(); // 恢复播放 mHAEAiDubbingEngine.resume(); // 关闭合成 mHAEAiDubbingEngine.stop();

Demo演示

<很高兴见到你>

更多华为音频编辑服务详情,请参考:
服务官网:https://developer.huawei.com/...
获取指导文档:https://developer.huawei.com/...

了解更多详情>>

访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHubGitee

关注我们,第一时间了解 HMS Core 最新技术资讯~

No comments:

Post a Comment