diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..c9ec4d4 --- /dev/null +++ b/404.html @@ -0,0 +1,28 @@ + + + + + + 404 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + +

404 Page Not Found

+ + + + \ No newline at end of file diff --git a/about.html b/about.html new file mode 100644 index 0000000..cfc00ae --- /dev/null +++ b/about.html @@ -0,0 +1,32 @@ + + + + + + 关于我们 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +

关于我们

关于我们

这是一个半官方的、由社区成员自发维护的、用来记录飞桨开源社区故事的博客。

  • 如果你对分享 故事、技术、段子...内容创作 感兴趣,可提 issue 联系 @sunzhongkai588

    欢迎大家创作投稿。投稿方式:在 blog 代码仓库里提交 Pull Request 即可,Pull Request 会自动触发 CI,CI 通过并且被 approve 后,你的文章就会被自动发布到这里 📄

  • 如果你对优化 前端、后端、前后一锅端...网站建设 感兴趣,可提 issue 联系 @SigureMo

    同时也感谢 001 @SigureMo 帮忙搭建了这个博客 🌹

博客总览

置顶博客🔝 【飞桨开源社区成为国内 Top,我们做对了什么?】


一、特色栏目: 开源江湖闲聊录📚

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


二、日常社区活动剪影 🎬


三、开源活动进展 📄


写在最后

笔者很喜欢一句话: The world is a stage, life is a performance. 每个社区故事都是一场表演,我们每个人都是舞台上的演员。而建立博客的初衷,就是为了记录这些精彩绝伦的演出,让台下的观众能够为我们鼓掌喝彩,鼓舞更多的人来参与其中。

希望我们的博客能够带给大家更多惊喜,谢谢大家~

+ + + + \ No newline at end of file diff --git a/assets/3-3-individual-contributors.GmPWOkG8.jpg b/assets/3-3-individual-contributors.GmPWOkG8.jpg new file mode 100644 index 0000000..bf138f4 Binary files /dev/null and b/assets/3-3-individual-contributors.GmPWOkG8.jpg differ diff --git a/assets/4-1-projects.oGNxzZ7-.jpg b/assets/4-1-projects.oGNxzZ7-.jpg new file mode 100644 index 0000000..4143cf8 Binary files /dev/null and b/assets/4-1-projects.oGNxzZ7-.jpg differ diff --git a/assets/5-1-honours.ySk-nSpf.jpg b/assets/5-1-honours.ySk-nSpf.jpg new file mode 100644 index 0000000..d23dd67 Binary files /dev/null and b/assets/5-1-honours.ySk-nSpf.jpg differ diff --git a/assets/6-1-issues.Wy-UHNLr.jpg b/assets/6-1-issues.Wy-UHNLr.jpg new file mode 100644 index 0000000..0abc8f3 Binary files /dev/null and b/assets/6-1-issues.Wy-UHNLr.jpg differ diff --git a/assets/6-2-nianhouzaishuo.KmYlS5E8.jpg b/assets/6-2-nianhouzaishuo.KmYlS5E8.jpg new file mode 100644 index 0000000..da51d80 Binary files /dev/null and b/assets/6-2-nianhouzaishuo.KmYlS5E8.jpg differ diff --git a/assets/6-3-pullrequests.FKAJXid_.jpg b/assets/6-3-pullrequests.FKAJXid_.jpg new file mode 100644 index 0000000..cad9da7 Binary files /dev/null and b/assets/6-3-pullrequests.FKAJXid_.jpg differ diff --git a/assets/7-1-xdoctest-project.KKsNIISm.jpg b/assets/7-1-xdoctest-project.KKsNIISm.jpg new file mode 100644 index 0000000..aaa5994 Binary files /dev/null and b/assets/7-1-xdoctest-project.KKsNIISm.jpg differ diff --git a/assets/7-2-paddlepaddle-hackathon.qGrD_HXl.jpg b/assets/7-2-paddlepaddle-hackathon.qGrD_HXl.jpg new file mode 100644 index 0000000..4282e0a Binary files /dev/null and b/assets/7-2-paddlepaddle-hackathon.qGrD_HXl.jpg differ diff --git a/assets/9-1-funny-memes.pvEq2GpS.jpg b/assets/9-1-funny-memes.pvEq2GpS.jpg new file mode 100644 index 0000000..6772589 Binary files /dev/null and b/assets/9-1-funny-memes.pvEq2GpS.jpg differ diff --git a/assets/about.md.h4__TlQ2.js b/assets/about.md.h4__TlQ2.js new file mode 100644 index 0000000..26f10e5 --- /dev/null +++ b/assets/about.md.h4__TlQ2.js @@ -0,0 +1 @@ +import{_ as a}from"./chunks/first-post.B_qpWiqd.js";import{_ as e,o as t,c as o,a as r}from"./chunks/framework.-K2UgQQN.js";const _=JSON.parse('{"title":"关于我们","description":"","frontmatter":{"layout":"about","title":"关于我们"},"headers":[],"relativePath":"about.md","filePath":"about.md"}'),l={name:"about.md"},s=r('

关于我们

这是一个半官方的、由社区成员自发维护的、用来记录飞桨开源社区故事的博客。

博客总览

置顶博客🔝 【飞桨开源社区成为国内 Top,我们做对了什么?】


一、特色栏目: 开源江湖闲聊录📚

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


二、日常社区活动剪影 🎬


三、开源活动进展 📄


写在最后

笔者很喜欢一句话: The world is a stage, life is a performance. 每个社区故事都是一场表演,我们每个人都是舞台上的演员。而建立博客的初衷,就是为了记录这些精彩绝伦的演出,让台下的观众能够为我们鼓掌喝彩,鼓舞更多的人来参与其中。

希望我们的博客能够带给大家更多惊喜,谢谢大家~

',20),i=[s];function h(n,u,p,c,d,f){return t(),o("div",null,i)}const m=e(l,[["render",h]]);export{_ as __pageData,m as default}; diff --git a/assets/about.md.h4__TlQ2.lean.js b/assets/about.md.h4__TlQ2.lean.js new file mode 100644 index 0000000..44e7476 --- /dev/null +++ b/assets/about.md.h4__TlQ2.lean.js @@ -0,0 +1 @@ +import{_ as a}from"./chunks/first-post.B_qpWiqd.js";import{_ as e,o as t,c as o,a as r}from"./chunks/framework.-K2UgQQN.js";const _=JSON.parse('{"title":"关于我们","description":"","frontmatter":{"layout":"about","title":"关于我们"},"headers":[],"relativePath":"about.md","filePath":"about.md"}'),l={name:"about.md"},s=r("",20),i=[s];function h(n,u,p,c,d,f){return t(),o("div",null,i)}const m=e(l,[["render",h]]);export{_ as __pageData,m as default}; diff --git a/assets/apollo-park-all.eayktu2y.jpg b/assets/apollo-park-all.eayktu2y.jpg new file mode 100644 index 0000000..ecb5f49 Binary files /dev/null and b/assets/apollo-park-all.eayktu2y.jpg differ diff --git a/assets/apollo-park-meng-present.vP2EfT4Y.jpg b/assets/apollo-park-meng-present.vP2EfT4Y.jpg new file mode 100644 index 0000000..480b528 Binary files /dev/null and b/assets/apollo-park-meng-present.vP2EfT4Y.jpg differ diff --git a/assets/app.cemPYfGD.js b/assets/app.cemPYfGD.js new file mode 100644 index 0000000..e78433a --- /dev/null +++ b/assets/app.cemPYfGD.js @@ -0,0 +1,7 @@ +import{f as p,o,c as r,d as t,t as c,F as P,i as A,n as T,u as d,j as B,k as E,l as f,g as h,m as g,h as _,b as v,p as L,_ as O,q as j,a as V,s as M,v as G,x as S,y as $,z as w,A as W,R as U,B as z,C as J,D as q,E as K,G as Q,H as X,I as Y,J as Z,K as ee,L as te,M as se,N as ae,O as ne}from"./chunks/framework.-K2UgQQN.js";const N=JSON.parse('{"posts":[{"title":"PaddlePaddle Hackathon Episode 03 | 创新碰撞,技术狂欢,飞桨黑客马拉松第五期活动圆满收官!","url":"/posts/hackathon-5th-episode03","excerpt":"

让我们看看哪些最强“Hacker”脱颖而出!

\\n","date":{"time":1703505600000,"string":"2023年12月25日"}},{"title":"如何在开源社区摸 🐟?","url":"/posts/loaf-sharing","excerpt":"

本篇博客文章的内容,来源于作者在「第八届中国开源年会」上分享的一次主题为 「如何在开源社区摸 🐟」 的闪电演讲,以下的部分为演讲的具体内容。

\\n","date":{"time":1702900800000,"string":"2023年12月18日"}},{"title":"【开源江湖闲聊录】初中生也能当开发者❓少年黄瓜的开源奇遇记","url":"/posts/huanggua-story","excerpt":"

他来了,他来了,他带着满满的故事,迈着自信的步伐向我们走来了!虽然刚满 15 岁,但小小黄瓜的开源史却已有好几年!学校趣事?开源经历?迷人帅照?成山作业?你都能在本篇博客看到!

\\n","date":{"time":1702382400000,"string":"2023年12月12日"}},{"title":"【开源江湖闲聊录】躺平健身搞开源:敏师傅的三十而立","url":"/posts/limin-story","excerpt":"

从对 Git 一窍不通到如今能够丝滑完成黑客松赛题,从曾经历鬼门关的生死挣扎到现在能够轻松跑几公里不喘气,从毕业于武大国软学的有志青年到佛系养生的新时代躺平中年,敏师傅 的人生经历就像是那瓶经年陈酿的老酒,醇厚细腻、回味无穷。

\\n","date":{"time":1701950400000,"string":"2023年12月7日"}},{"title":"【开源江湖闲聊录】从入门到入职(入土):黄师傅的校招 offer 指南!","url":"/posts/huangjiyi-story","excerpt":"

从积极参与社区开源任务,到加入飞桨成为 (练习生) 实习生,到最终正式成为飞桨研发团队的一员。以兴趣为起点, 黄济懿师傅 将我们展示了一条通往职业的道路,希望他的故事能够激励所有对开源充满热情的开发者们。接下来,原神启动 🚀!

\\n","date":{"time":1701777600000,"string":"2023年12月5日"}},{"title":"飞桨开源社区成为国内 Top,我们做对了什么?","url":"/posts/2023-os-report","excerpt":"

什么是开源项目和开源社区?国内活跃度 Top 的开源社区,都有哪些有趣的人和事?开源社区之于开源项目有何重要意义?

\\n","date":{"time":1701518400000,"string":"2023年12月2日"}},{"title":"PaddlePaddle Hackathon Episode 02 | 第五期活动上线 8 周,框架赛道提交率近 90%","url":"/posts/hackathon-5th-episode02","excerpt":"

向大家快速介绍飞桨黑客松第五期开展以来的进展(11.4-12.1)

\\n","date":{"time":1701432000000,"string":"2023年12月1日"}},{"title":"【开源江湖闲聊录】英雄不问出处:川师傅的逆袭之路","url":"/posts/chuan-story","excerpt":"

“桨声川水悠悠过,长路漫漫风光留”,这次我们要采访的是小伙伴们都熟悉的励志富哥儿——川川师傅

\\n","date":{"time":1701172800000,"string":"2023年11月28日"}},{"title":"飞桨开源社区走进北京大学课堂","url":"/posts/pku-course","excerpt":"","date":{"time":1700568000000,"string":"2023年11月21日"}},{"title":"【开源江湖闲聊录】社区掌舵人:顺师傅的 Paddle 之旅","url":"/posts/shun-story","excerpt":"

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。

\\n","date":{"time":1700568000000,"string":"2023年11月21日"}},{"title":"PaddlePaddle Hackathon Episode 01 | 第五期活动上线 4 周,直播圆满收官,三大赛道进展顺利","url":"/posts/hackathon-5th-episode01","excerpt":"

向大家快速介绍飞桨黑客松第五期活动上线以来的进展(9.25-11.3)

\\n","date":{"time":1699012800000,"string":"2023年11月3日"}},{"title":"飞桨社区成都行:开源社活动与开发者线下 Meetup","url":"/posts/chengdu-kaiyuanshe","excerpt":"

2023 年 10 月 28 日、29 日参加开源社举办的「第八届中国开源年会」的精彩瞬间,以及与咱 Paddle 社区成都开发者们的线下见面~

\\n","date":{"time":1698926400000,"string":"2023年11月2日"}},{"title":"飞桨开源社区参加中国开源软件创新大赛剪影","url":"/posts/xian-event","excerpt":"","date":{"time":1698235200000,"string":"2023年10月25日"}},{"title":"在这里,记录有趣的飞桨开源社区故事!","url":"/posts/first-post","excerpt":"","date":{"time":1698148800000,"string":"2023年10月24日"}}],"postsPerPage":10,"numPages":2}'),oe=t("dt",{class:"sr-only"},"Published on",-1),re={class:"text-base leading-6 font-medium text-gray-500 dark:text-gray-300"},ie=["datetime"],I=p({__name:"Date",props:{date:{}},setup(s){const e=s;function a(){return new Date(e.date.time).toISOString()}return(n,i)=>(o(),r("dl",null,[oe,t("dd",re,[t("time",{datetime:a()},c(n.date.string),9,ie)])]))}}),le={class:"flex justify-center space-x-2 py-4"},de=["href"],ce=p({__name:"Pagination",props:{numPages:{},pageIndex:{}},setup(s){return(e,a)=>(o(),r("div",le,[(o(!0),r(P,null,A(e.numPages,n=>(o(),r("a",{class:T(["px-3 py-2 rounded-md font-bold hover:outline outline-green-700",{"bg-green-200 dark:bg-green-700":e.pageIndex===n,"text-green-700 dark:text-green-300":e.pageIndex!==n}]),key:n,href:d(B)(n===1?"/index.html":`/pages/${n}.html`)},c(n),11,de))),128))]))}}),pe={class:"divide-y divide-gray-200 dark:divide-slate-200/5"},ue={class:"pt-6 pb-8 space-y-2 md:space-y-5"},_e={class:"text-3xl leading-9 font-extrabold text-gray-900 dark:text-white tracking-tight sm:text-4xl sm:leading-10 md:text-6xl md:leading-14"},he={class:"text-lg leading-7 text-gray-500 dark:text-white"},xe={class:"divide-y divide-gray-200 dark:divide-slate-200/5"},ge={class:"py-12"},me={class:"space-y-2 xl:grid xl:grid-cols-4 xl:space-y-0 xl:items-baseline"},fe={class:"space-y-5 xl:col-span-3"},ye={class:"space-y-6"},ve={class:"text-2xl leading-8 font-bold tracking-tight"},ke=["href"],be=["innerHTML"],$e={class:"text-base leading-6 font-medium"},we=["href"],Pe=p({__name:"Home",setup(s){const e=E(),{posts:a,postsPerPage:n,numPages:i}=N,{frontmatter:l,site:u}=f(),x=h(()=>e.path==="/"?1:Number(e.path.split("/")[2])),y=h(()=>{const k=(x.value-1)*n,b=k+n;return a.slice(k,b)});return(k,b)=>(o(),r("div",pe,[t("div",ue,[t("h1",_e,c(d(l).title||d(u).title),1),t("p",he,c(d(l).subtext||d(u).description),1)]),t("ul",xe,[(o(!0),r(P,null,A(y.value,({title:F,url:C,date:H,excerpt:R})=>(o(),r("li",ge,[t("article",me,[v(I,{date:H},null,8,["date"]),t("div",fe,[t("div",ye,[t("h2",ve,[t("a",{class:"text-gray-900 dark:text-white",href:C},c(F),9,ke)]),R?(o(),r("div",{key:0,class:"prose dark:prose-invert max-w-none text-gray-500 dark:text-gray-300",innerHTML:R},null,8,be)):_("",!0)]),t("div",$e,[t("a",{class:"link","aria-label":"read more",href:C},"Read more →",8,we)])])])]))),256))]),y.value.length!==d(a).length?(o(),g(ce,{key:0,"num-pages":d(i),"page-index":x.value},null,8,["num-pages","page-index"])):_("",!0)]))}}),Ae={class:"flex items-center space-x-2"},Ce=["src"],Re={class:"text-sm font-medium leading-5 whitespace-nowrap"},Ee=t("dt",{class:"sr-only"},"Name",-1),Le={class:"text-gray-900 dark:text-white"},Se={key:0,class:"sr-only"},Ne={key:1},Ie=["href"],De=p({__name:"Author",props:{name:{},github:{},avatar:{}},setup(s){const{name:e,github:a,avatar:n}=s,i=h(()=>n??(a?`https://github.com/${a}.png`:void 0)),l=h(()=>a?`https://github.com/${a}`:void 0);return(u,x)=>(o(),r("li",Ae,[i.value?(o(),r("img",{key:0,src:i.value,alt:"author image",class:"w-10 h-10 rounded-full"},null,8,Ce)):_("",!0),t("dl",Re,[Ee,t("dd",Le,c(u.name),1),l.value?(o(),r("dt",Se,"GitHub")):_("",!0),l.value?(o(),r("dd",Ne,[t("a",{href:l.value,target:"_blank",rel:"noopnener noreferrer",class:"link"},"@"+c(u.github),9,Ie)])):_("",!0)])]))}}),Fe={class:"pt-6 pb-10 xl:pt-11 xl:border-b xl:border-gray-200 dark:xl:border-slate-200/5"},He=t("dt",{class:"sr-only"},"Authors",-1),Te={class:"flex flex-col pl-10 space-y-5 md:justify-center md:flex-row md:space-y-0 md:space-x-12 md:pl-0 xl:block xl:space-x-0 xl:space-y-8"},Be=p({__name:"Authors",setup(s){const{frontmatter:e}=f(),a=h(()=>{const n=e.value.co_authors??[];return[e.value.author,...n]});return(n,i)=>(o(),r("dl",Fe,[He,t("dd",null,[t("ul",Te,[(o(!0),r(P,null,A(a.value,l=>(o(),g(De,{key:l.name,name:l.name,github:l.github,avatar:l.avatar},null,8,["name","github","avatar"]))),128))])])]))}}),Oe={class:"xl:divide-y xl:divide-gray-200 dark:xl:divide-slate-200/5"},je={class:"pt-6 xl:pb-10 space-y-1 text-center"},Ve={class:"text-3xl leading-9 font-extrabold text-gray-900 dark:text-white tracking-tight sm:text-4xl sm:leading-10 md:text-5xl md:leading-14"},Me={class:"divide-y xl:divide-y-0 divide-gray-200 dark:divide-slate-200/5 xl:grid xl:grid-cols-4 xl:gap-x-10 pb-16 xl:pb-20",style:{"grid-template-rows":"auto 1fr"}},Ge={class:"divide-y divide-gray-200 dark:divide-slate-200/5 xl:pb-0 xl:col-span-3 xl:row-span-2"},We={class:"text-sm font-medium leading-5 divide-y divide-gray-200 dark:divide-slate-200/5 xl:col-start-1 xl:row-start-2"},Ue={key:0,class:"py-8"},ze=t("h2",{class:"text-xs tracking-wide uppercase text-gray-500 dark:text-white"}," Next Article ",-1),Je={class:"link"},qe=["href"],Ke={key:1,class:"py-8"},Qe=t("h2",{class:"text-xs tracking-wide uppercase text-gray-500 dark:text-white"}," Previous Article ",-1),Xe={class:"link"},Ye=["href"],Ze=t("div",{class:"pt-8"},[t("a",{class:"link",href:"/"},"← Back to the blog")],-1),et=p({__name:"Article",setup(s){const{posts:e}=N,{frontmatter:a}=f(),n=E();function i(){return e.findIndex(y=>y.url===n.path)}const l=h(()=>e[i()].date),u=h(()=>e[i()-1]),x=h(()=>e[i()+1]);return(y,k)=>{const b=L("Content");return o(),r("article",Oe,[t("header",je,[v(I,{date:l.value},null,8,["date"]),t("h1",Ve,c(d(a).title),1)]),t("div",Me,[v(Be),t("div",Ge,[v(b,{class:"prose dark:prose-invert max-w-none pt-10 pb-8"})]),t("footer",We,[u.value?(o(),r("div",Ue,[ze,t("div",Je,[t("a",{href:u.value.url},c(u.value.title),9,qe)])])):_("",!0),x.value?(o(),r("div",Ke,[Qe,t("div",Xe,[t("a",{href:x.value.url},c(x.value.title),9,Ye)])])):_("",!0),Ze])])])}}}),tt={},st={class:"text-3xl font-bold dark:text-white"};function at(s,e){return o(),r("h1",st,"404 Page Not Found")}const nt=O(tt,[["render",at]]),ot={class:"xl:divide-y xl:divide-gray-200 dark:xl:divide-slate-200/5"},rt={class:"pt-6 xl:pb-10 space-y-1 text-center"},it={class:"text-3xl leading-9 font-extrabold text-gray-900 dark:text-white tracking-tight sm:text-4xl sm:leading-10 md:text-5xl md:leading-14"},lt=t("footer",{class:"text-sm font-medium leading-5 divide-y divide-gray-200 dark:divide-slate-200/5 xl:col-start-1 xl:row-start-2"},null,-1),dt=p({__name:"About",setup(s){const{frontmatter:e}=f();return(a,n)=>{const i=L("Content");return o(),r("article",ot,[t("header",rt,[t("h1",it,c(d(e).title),1)]),v(i,{class:"prose dark:prose-invert max-w-none pt-10 pb-8"}),lt])}}}),ct={class:"antialiased dark:bg-neutral-900 min-h-screen"},pt={class:"max-w-3xl mx-auto px-4 sm:px-6 xl:max-w-5xl xl:px-0"},ut={class:"flex justify-between items-center py-10 font-bold"},_t=["aria-label"],ht=t("img",{class:"inline-block mr-2",style:{width:"120px"},alt:"logo",src:j},null,-1),xt={key:0,class:"hidden md:inline dark:text-white"},gt=V('
Source·About·PFCCLab →
',1),mt={class:"max-w-3xl mx-auto px-4 sm:px-6 xl:max-w-5xl xl:px-0"},ft=p({__name:"Layout",setup(s){const{page:e,frontmatter:a,site:n}=f();return(i,l)=>(o(),r("div",ct,[t("div",pt,[t("nav",ut,[t("a",{class:"text-xl",href:"/","aria-label":d(n).title},[ht,d(a).index?_("",!0):(o(),r("span",xt,c(d(n).title),1))],8,_t),gt])]),t("main",mt,[d(a).layout==="home"?(o(),g(Pe,{key:0})):d(a).layout==="about"?(o(),g(dt,{key:1})):d(e).isNotFound?(o(),g(nt,{key:2})):(o(),g(et,{key:3}))])]))}}),yt={key:0,class:"pwa-toast",role:"alertdialog","aria-labelledby":"pwa-message"},vt=t("div",{id:"pwa-message",class:"mb-3"},"App ready to work offline",-1),kt=p({__name:"RegisterSW",setup(s){const e=M(!1),a=()=>{e.value=!0},n=async()=>{e.value=!1};return G(async()=>{const{registerSW:i}=await S(()=>import("./chunks/virtual_pwa-register.AUg9w1EU.js"),__vite__mapDeps([0,1]));i({immediate:!0,onOfflineReady:a,onRegistered(){console.info("Service Worker registered")},onRegisterError(l){console.error("Service Worker registration error!",l)}})}),(i,l)=>e.value?(o(),r("div",yt,[vt,t("button",{type:"button",class:"pwa-cancel",onClick:n},"Close")])):_("",!0)}}),bt={Layout(){return $(ft,null,{"layout-bottom":()=>$(kt)})}};function D(s){if(s.extends){const e=D(s.extends);return{...e,...s,async enhanceApp(a){e.enhanceApp&&await e.enhanceApp(a),s.enhanceApp&&await s.enhanceApp(a)}}}return s}const m=D(bt),$t=p({name:"VitePressApp",setup(){const{site:s}=f();return ee(()=>{te(()=>{document.documentElement.lang=s.value.lang,document.documentElement.dir=s.value.dir})}),s.value.router.prefetchLinks&&se(),ae(),ne(),m.setup&&m.setup(),()=>$(m.Layout)}});async function wt(){const s=At(),e=Pt();e.provide(U,s);const a=z(s.route);return e.provide(J,a),e.component("Content",q),e.component("ClientOnly",K),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}}),m.enhanceApp&&await m.enhanceApp({app:e,router:s,siteData:Q}),{app:e,router:s,data:a}}function Pt(){return X($t)}function At(){let s=w,e;return Y(a=>{let n=Z(a),i=null;return n&&(s&&(e=n),(s||e===n)&&(n=n.replace(/\.js$/,".lean.js")),i=S(()=>import(n),__vite__mapDeps([]))),w&&(s=!1),i},m.NotFound)}w&&wt().then(({app:s,router:e,data:a})=>{e.go().then(()=>{W(e.route,a.site),s.mount("#app")})});export{wt as createApp}; +function __vite__mapDeps(indexes) { + if (!__vite__mapDeps.viteFileDeps) { + __vite__mapDeps.viteFileDeps = ["assets/chunks/virtual_pwa-register.AUg9w1EU.js","assets/chunks/framework.-K2UgQQN.js"] + } + return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) +} \ No newline at end of file diff --git a/assets/chengdu-egg.Q3-Pq_K_.jpg b/assets/chengdu-egg.Q3-Pq_K_.jpg new file mode 100644 index 0000000..173e3a3 Binary files /dev/null and b/assets/chengdu-egg.Q3-Pq_K_.jpg differ diff --git a/assets/chengdu-kaiyuanshe-01._4LXNiWA.jpg b/assets/chengdu-kaiyuanshe-01._4LXNiWA.jpg new file mode 100644 index 0000000..528b6de Binary files /dev/null and b/assets/chengdu-kaiyuanshe-01._4LXNiWA.jpg differ diff --git a/assets/chengdu-kaiyuanshe-02.EyG1HLeE.jpg b/assets/chengdu-kaiyuanshe-02.EyG1HLeE.jpg new file mode 100644 index 0000000..97ead06 Binary files /dev/null and b/assets/chengdu-kaiyuanshe-02.EyG1HLeE.jpg differ diff --git a/assets/chengdu-kaiyuanshe-03._SCyV9PU.jpg b/assets/chengdu-kaiyuanshe-03._SCyV9PU.jpg new file mode 100644 index 0000000..02c237b Binary files /dev/null and b/assets/chengdu-kaiyuanshe-03._SCyV9PU.jpg differ diff --git a/assets/chengdu-kaiyuanshe-04.bqO-leAc.jpg b/assets/chengdu-kaiyuanshe-04.bqO-leAc.jpg new file mode 100644 index 0000000..5568410 Binary files /dev/null and b/assets/chengdu-kaiyuanshe-04.bqO-leAc.jpg differ diff --git a/assets/chengdu-kaiyuanshe-05.3YM4UJaX.jpg b/assets/chengdu-kaiyuanshe-05.3YM4UJaX.jpg new file mode 100644 index 0000000..8da36f6 Binary files /dev/null and b/assets/chengdu-kaiyuanshe-05.3YM4UJaX.jpg differ diff --git a/assets/chuan-01.BvnMSUcM.jpg b/assets/chuan-01.BvnMSUcM.jpg new file mode 100644 index 0000000..2bc3e23 Binary files /dev/null and b/assets/chuan-01.BvnMSUcM.jpg differ diff --git a/assets/chuan-02.KhOSUl-W.jpg b/assets/chuan-02.KhOSUl-W.jpg new file mode 100644 index 0000000..d52a4ae Binary files /dev/null and b/assets/chuan-02.KhOSUl-W.jpg differ diff --git a/assets/chuan-03.DVz_lsP1.jpg b/assets/chuan-03.DVz_lsP1.jpg new file mode 100644 index 0000000..0530996 Binary files /dev/null and b/assets/chuan-03.DVz_lsP1.jpg differ diff --git a/assets/chuan-04.Ka2bKmg3.jpg b/assets/chuan-04.Ka2bKmg3.jpg new file mode 100644 index 0000000..6c8a1db Binary files /dev/null and b/assets/chuan-04.Ka2bKmg3.jpg differ diff --git a/assets/chuan-05.k2Nf0D4c.jpg b/assets/chuan-05.k2Nf0D4c.jpg new file mode 100644 index 0000000..d3ea5e0 Binary files /dev/null and b/assets/chuan-05.k2Nf0D4c.jpg differ diff --git a/assets/chuan-06.EnI-qzwM.jpg b/assets/chuan-06.EnI-qzwM.jpg new file mode 100644 index 0000000..fe94038 Binary files /dev/null and b/assets/chuan-06.EnI-qzwM.jpg differ diff --git a/assets/chuan-07.6D-05KuB.jpg b/assets/chuan-07.6D-05KuB.jpg new file mode 100644 index 0000000..8370c1c Binary files /dev/null and b/assets/chuan-07.6D-05KuB.jpg differ diff --git a/assets/chuan-08.NIP_y4Io.jpg b/assets/chuan-08.NIP_y4Io.jpg new file mode 100644 index 0000000..ce20092 Binary files /dev/null and b/assets/chuan-08.NIP_y4Io.jpg differ diff --git a/assets/chuan-09.KOMCcV5Z.jpg b/assets/chuan-09.KOMCcV5Z.jpg new file mode 100644 index 0000000..9969f4c Binary files /dev/null and b/assets/chuan-09.KOMCcV5Z.jpg differ diff --git a/assets/chuan-10.kLO-niB4.jpg b/assets/chuan-10.kLO-niB4.jpg new file mode 100644 index 0000000..fd5f7e5 Binary files /dev/null and b/assets/chuan-10.kLO-niB4.jpg differ diff --git a/assets/chuan-11.dDFoZ_Xf.jpg b/assets/chuan-11.dDFoZ_Xf.jpg new file mode 100644 index 0000000..dee03be Binary files /dev/null and b/assets/chuan-11.dDFoZ_Xf.jpg differ diff --git a/assets/chuan-12.LktrM_Fc.jpg b/assets/chuan-12.LktrM_Fc.jpg new file mode 100644 index 0000000..0550f02 Binary files /dev/null and b/assets/chuan-12.LktrM_Fc.jpg differ diff --git a/assets/chuan-13.c5SlvAhq.jpg b/assets/chuan-13.c5SlvAhq.jpg new file mode 100644 index 0000000..d0d6203 Binary files /dev/null and b/assets/chuan-13.c5SlvAhq.jpg differ diff --git a/assets/chuan-14.dWLFx5z0.jpg b/assets/chuan-14.dWLFx5z0.jpg new file mode 100644 index 0000000..4d73f4f Binary files /dev/null and b/assets/chuan-14.dWLFx5z0.jpg differ diff --git a/assets/chuan-15.8X6v0TXa.jpg b/assets/chuan-15.8X6v0TXa.jpg new file mode 100644 index 0000000..b6b4e87 Binary files /dev/null and b/assets/chuan-15.8X6v0TXa.jpg differ diff --git a/assets/chuan-16.CJBaiNrg.jpg b/assets/chuan-16.CJBaiNrg.jpg new file mode 100644 index 0000000..ce94d6f Binary files /dev/null and b/assets/chuan-16.CJBaiNrg.jpg differ diff --git a/assets/chuan-17.U-xJxWcO.jpg b/assets/chuan-17.U-xJxWcO.jpg new file mode 100644 index 0000000..967c875 Binary files /dev/null and b/assets/chuan-17.U-xJxWcO.jpg differ diff --git a/assets/chunks/MessageBox.Gn3asJyB.js b/assets/chunks/MessageBox.Gn3asJyB.js new file mode 100644 index 0000000..b748a15 --- /dev/null +++ b/assets/chunks/MessageBox.Gn3asJyB.js @@ -0,0 +1 @@ +import{f as g,g as t,o as r,c as n,h,d as a,t as v,r as i,n as u,_ as y}from"./framework.-K2UgQQN.js";const x=["src"],b={class:"text-neutral-500 dark:text-neutral-400"},k={class:"inline-block bg-slate-200 px-2 py-2 rounded-md dark:bg-zinc-700"},z=g({__name:"Message",props:{name:{},github:{},avatar:{},type:{}},setup(s){const{name:m,github:o,avatar:d,type:p}=s,l=t(()=>d??(o?`https://github.com/${o}.png`:void 0)),c=t(()=>{const e=p??"left";return["left","right"].includes(e)?e:(console.warn(`Message type must be 'left' or 'right', but got '${e}'`),"left")}),_=t(()=>c.value==="left"?{"mr-10":!0}:{"flex-row-reverse":!0,"ml-10":!0}),f=t(()=>c.value==="left"?{"items-start":!0}:{"items-end":!0});return(e,B)=>(r(),n("li",{class:u(["flex items-start space-y-2",_.value])},[l.value?(r(),n("img",{key:0,src:l.value,alt:"author image",class:"w-10 h-10 rounded-md m-0"},null,8,x)):h("",!0),a("div",{class:u(["flex flex-col px-3 !mt-0",f.value])},[a("span",b,v(e.name),1),a("div",k,[i(e.$slots,"default")])],2)],2))}}),$={},C={class:"p-0"};function M(s,m){return r(),n("ul",C,[i(s.$slots,"default")])}const D=y($,[["render",M]]);export{D as M,z as _}; diff --git a/assets/chunks/first-post.B_qpWiqd.js b/assets/chunks/first-post.B_qpWiqd.js new file mode 100644 index 0000000..d1e59cd --- /dev/null +++ b/assets/chunks/first-post.B_qpWiqd.js @@ -0,0 +1 @@ +const s="/assets/first-post.VRjUlY8P.jpg";export{s as _}; diff --git a/assets/chunks/framework.-K2UgQQN.js b/assets/chunks/framework.-K2UgQQN.js new file mode 100644 index 0000000..0a88e88 --- /dev/null +++ b/assets/chunks/framework.-K2UgQQN.js @@ -0,0 +1,2 @@ +function Hn(e,t){const n=Object.create(null),i=e.split(",");for(let s=0;s!!n[s.toLowerCase()]:s=>!!n[s]}const G={},st=[],Oe=()=>{},gl=()=>!1,xl=/^on[^a-z]/,Mt=e=>xl.test(e),$n=e=>e.startsWith("onUpdate:"),re=Object.assign,Un=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},bl=Object.prototype.hasOwnProperty,W=(e,t)=>bl.call(e,t),L=Array.isArray,lt=e=>ln(e)==="[object Map]",ts=e=>ln(e)==="[object Set]",$=e=>typeof e=="function",ie=e=>typeof e=="string",sn=e=>typeof e=="symbol",Z=e=>e!==null&&typeof e=="object",ns=e=>(Z(e)||$(e))&&$(e.then)&&$(e.catch),is=Object.prototype.toString,ln=e=>is.call(e),_l=e=>ln(e).slice(8,-1),ss=e=>ln(e)==="[object Object]",Dn=e=>ie(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,vt=Hn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),on=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},yl=/-(\w)/g,Pe=on(e=>e.replace(yl,(t,n)=>n?n.toUpperCase():"")),vl=/\B([A-Z])/g,mt=on(e=>e.replace(vl,"-$1").toLowerCase()),rn=on(e=>e.charAt(0).toUpperCase()+e.slice(1)),_n=on(e=>e?`on${rn(e)}`:""),Ge=(e,t)=>!Object.is(e,t),yn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},wl=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let pi;const Rn=()=>pi||(pi=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Bn(e){if(L(e)){const t={};for(let n=0;n{if(n){const i=n.split(Cl);i.length>1&&(t[i[0].trim()]=i[1].trim())}}),t}function Kn(e){let t="";if(ie(e))t=e;else if(L(e))for(let n=0;nie(e)?e:e==null?"":L(e)||Z(e)&&(e.toString===is||!$(e.toString))?JSON.stringify(e,os,2):String(e),os=(e,t)=>t&&t.__v_isRef?os(e,t.value):lt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[i,s])=>(n[`${i} =>`]=s,n),{})}:ts(t)?{[`Set(${t.size})`]:[...t.values()]}:Z(t)&&!L(t)&&!ss(t)?String(t):t;let ge;class Ol{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=ge,!t&&ge&&(this.index=(ge.scopes||(ge.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=ge;try{return ge=this,t()}finally{ge=n}}}on(){ge=this}off(){ge=this.parent}stop(t){if(this._active){let n,i;for(n=0,i=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},as=e=>(e.w&qe)>0,cs=e=>(e.n&qe)>0,Ml=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let i=0;i{(p==="length"||!sn(p)&&p>=c)&&r.push(f)})}else switch(n!==void 0&&r.push(o.get(n)),t){case"add":L(e)?Dn(n)&&r.push(o.get("length")):(r.push(o.get(Ye)),lt(e)&&r.push(o.get(On)));break;case"delete":L(e)||(r.push(o.get(Ye)),lt(e)&&r.push(o.get(On)));break;case"set":lt(e)&&r.push(o.get(Ye));break}if(r.length===1)r[0]&&Pn(r[0]);else{const c=[];for(const f of r)f&&c.push(...f);Pn(qn(c))}}function Pn(e,t){const n=L(e)?e:[...e];for(const i of n)i.computed&&mi(i);for(const i of n)i.computed||mi(i)}function mi(e,t){(e!==we||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function Fl(e,t){var n;return(n=Yt.get(e))==null?void 0:n.get(t)}const kl=Hn("__proto__,__v_isRef,__isVue"),ps=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(sn)),hi=Ll();function Ll(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const i=J(this);for(let l=0,o=this.length;l{e[t]=function(...n){ht();const i=J(this)[t].apply(this,n);return gt(),i}}),e}function Nl(e){const t=J(this);return me(t,"has",e),t.hasOwnProperty(e)}class ds{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,i){const s=this._isReadonly,l=this._shallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return l;if(n==="__v_raw"&&i===(s?l?Xl:xs:l?gs:hs).get(t))return t;const o=L(t);if(!s){if(o&&W(hi,n))return Reflect.get(hi,n,i);if(n==="hasOwnProperty")return Nl}const r=Reflect.get(t,n,i);return(sn(n)?ps.has(n):kl(n))||(s||me(t,"get",n),l)?r:le(r)?o&&Dn(n)?r:r.value:Z(r)?s?fn(r):cn(r):r}}class ms extends ds{constructor(t=!1){super(!1,t)}set(t,n,i,s){let l=t[n];if(ft(l)&&le(l)&&!le(i))return!1;if(!this._shallow&&(!Xt(i)&&!ft(i)&&(l=J(l),i=J(i)),!L(t)&&le(l)&&!le(i)))return l.value=i,!0;const o=L(t)&&Dn(n)?Number(n)e,an=e=>Reflect.getPrototypeOf(e);function Lt(e,t,n=!1,i=!1){e=e.__v_raw;const s=J(e),l=J(t);n||(Ge(t,l)&&me(s,"get",t),me(s,"get",l));const{has:o}=an(s),r=i?zn:n?Yn:Tt;if(o.call(s,t))return r(e.get(t));if(o.call(s,l))return r(e.get(l));e!==s&&e.get(t)}function Nt(e,t=!1){const n=this.__v_raw,i=J(n),s=J(e);return t||(Ge(e,s)&&me(i,"has",e),me(i,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function Ht(e,t=!1){return e=e.__v_raw,!t&&me(J(e),"iterate",Ye),Reflect.get(e,"size",e)}function gi(e){e=J(e);const t=J(this);return an(t).has.call(t,e)||(t.add(e),ke(t,"add",e,e)),this}function xi(e,t){t=J(t);const n=J(this),{has:i,get:s}=an(n);let l=i.call(n,e);l||(e=J(e),l=i.call(n,e));const o=s.call(n,e);return n.set(e,t),l?Ge(t,o)&&ke(n,"set",e,t):ke(n,"add",e,t),this}function bi(e){const t=J(this),{has:n,get:i}=an(t);let s=n.call(t,e);s||(e=J(e),s=n.call(t,e)),i&&i.call(t,e);const l=t.delete(e);return s&&ke(t,"delete",e,void 0),l}function _i(){const e=J(this),t=e.size!==0,n=e.clear();return t&&ke(e,"clear",void 0,void 0),n}function $t(e,t){return function(i,s){const l=this,o=l.__v_raw,r=J(o),c=t?zn:e?Yn:Tt;return!e&&me(r,"iterate",Ye),o.forEach((f,p)=>i.call(s,c(f),c(p),l))}}function Ut(e,t,n){return function(...i){const s=this.__v_raw,l=J(s),o=lt(l),r=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,f=s[e](...i),p=n?zn:t?Yn:Tt;return!t&&me(l,"iterate",c?On:Ye),{next(){const{value:h,done:E}=f.next();return E?{value:h,done:E}:{value:r?[p(h[0]),p(h[1])]:p(h),done:E}},[Symbol.iterator](){return this}}}}function $e(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Bl(){const e={get(l){return Lt(this,l)},get size(){return Ht(this)},has:Nt,add:gi,set:xi,delete:bi,clear:_i,forEach:$t(!1,!1)},t={get(l){return Lt(this,l,!1,!0)},get size(){return Ht(this)},has:Nt,add:gi,set:xi,delete:bi,clear:_i,forEach:$t(!1,!0)},n={get(l){return Lt(this,l,!0)},get size(){return Ht(this,!0)},has(l){return Nt.call(this,l,!0)},add:$e("add"),set:$e("set"),delete:$e("delete"),clear:$e("clear"),forEach:$t(!0,!1)},i={get(l){return Lt(this,l,!0,!0)},get size(){return Ht(this,!0)},has(l){return Nt.call(this,l,!0)},add:$e("add"),set:$e("set"),delete:$e("delete"),clear:$e("clear"),forEach:$t(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(l=>{e[l]=Ut(l,!1,!1),n[l]=Ut(l,!0,!1),t[l]=Ut(l,!1,!0),i[l]=Ut(l,!0,!0)}),[e,n,t,i]}const[Kl,ql,Wl,zl]=Bl();function Vn(e,t){const n=t?e?zl:Wl:e?ql:Kl;return(i,s,l)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?i:Reflect.get(W(n,s)&&s in i?n:i,s,l)}const Vl={get:Vn(!1,!1)},Jl={get:Vn(!1,!0)},Yl={get:Vn(!0,!1)},hs=new WeakMap,gs=new WeakMap,xs=new WeakMap,Xl=new WeakMap;function Ql(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Zl(e){return e.__v_skip||!Object.isExtensible(e)?0:Ql(_l(e))}function cn(e){return ft(e)?e:Jn(e,!1,$l,Vl,hs)}function Gl(e){return Jn(e,!1,Dl,Jl,gs)}function fn(e){return Jn(e,!0,Ul,Yl,xs)}function Jn(e,t,n,i,s){if(!Z(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const l=s.get(e);if(l)return l;const o=Zl(e);if(o===0)return e;const r=new Proxy(e,o===2?i:n);return s.set(e,r),r}function ot(e){return ft(e)?ot(e.__v_raw):!!(e&&e.__v_isReactive)}function ft(e){return!!(e&&e.__v_isReadonly)}function Xt(e){return!!(e&&e.__v_isShallow)}function bs(e){return ot(e)||ft(e)}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function wt(e){return Jt(e,"__v_skip",!0),e}const Tt=e=>Z(e)?cn(e):e,Yn=e=>Z(e)?fn(e):e;function Xn(e){Be&&we&&(e=J(e),us(e.dep||(e.dep=qn())))}function Qn(e,t){e=J(e);const n=e.dep;n&&Pn(n)}function le(e){return!!(e&&e.__v_isRef===!0)}function Le(e){return ys(e,!1)}function _s(e){return ys(e,!0)}function ys(e,t){return le(e)?e:new eo(e,t)}class eo{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:J(t),this._value=n?t:Tt(t)}get value(){return Xn(this),this._value}set value(t){const n=this.__v_isShallow||Xt(t)||ft(t);t=n?t:J(t),Ge(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Tt(t),Qn(this))}}function vs(e){return le(e)?e.value:e}const to={get:(e,t,n)=>vs(Reflect.get(e,t,n)),set:(e,t,n,i)=>{const s=e[t];return le(s)&&!le(n)?(s.value=n,!0):Reflect.set(e,t,n,i)}};function ws(e){return ot(e)?e:new Proxy(e,to)}class no{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:i}=t(()=>Xn(this),()=>Qn(this));this._get=n,this._set=i}get value(){return this._get()}set value(t){this._set(t)}}function io(e){return new no(e)}class so{constructor(t,n,i){this._object=t,this._key=n,this._defaultValue=i,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Fl(J(this._object),this._key)}}class lo{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function oo(e,t,n){return le(e)?e:$(e)?new lo(e):Z(e)&&arguments.length>1?ro(e,t,n):Le(e)}function ro(e,t,n){const i=e[t];return le(i)?i:new so(e,t,n)}class ao{constructor(t,n,i,s){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new Wn(t,()=>{this._dirty||(this._dirty=!0,Qn(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=i}get value(){const t=J(this);return Xn(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function co(e,t,n=!1){let i,s;const l=$(e);return l?(i=e,s=Oe):(i=e.get,s=e.set),new ao(i,s,l||!s,n)}function Ke(e,t,n,i){let s;try{s=i?e(...i):e()}catch(l){un(l,t,n)}return s}function Ce(e,t,n,i){if($(e)){const l=Ke(e,t,n,i);return l&&ns(l)&&l.catch(o=>{un(o,t,n)}),l}const s=[];for(let l=0;l>>1,s=ce[i],l=At(s);lAe&&ce.splice(t,1)}function mo(e){L(e)?rt.push(...e):(!Fe||!Fe.includes(e,e.allowRecurse?Ve+1:Ve))&&rt.push(e),Cs()}function yi(e,t=Rt?Ae+1:0){for(;tAt(n)-At(i)),Ve=0;Vee.id==null?1/0:e.id,ho=(e,t)=>{const n=At(e)-At(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function js(e){Sn=!1,Rt=!0,ce.sort(ho);try{for(Ae=0;Aeie(j)?j.trim():j)),h&&(s=n.map(wl))}let r,c=i[r=_n(t)]||i[r=_n(Pe(t))];!c&&l&&(c=i[r=_n(mt(t))]),c&&Ce(c,e,6,s);const f=i[r+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[r])return;e.emitted[r]=!0,Ce(f,e,6,s)}}function Ts(e,t,n=!1){const i=t.emitsCache,s=i.get(e);if(s!==void 0)return s;const l=e.emits;let o={},r=!1;if(!$(e)){const c=f=>{const p=Ts(f,t,!0);p&&(r=!0,re(o,p))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!l&&!r?(Z(e)&&i.set(e,null),null):(L(l)?l.forEach(c=>o[c]=null):re(o,l),Z(e)&&i.set(e,o),o)}function dn(e,t){return!e||!Mt(t)?!1:(t=t.slice(2).replace(/Once$/,""),W(e,t[0].toLowerCase()+t.slice(1))||W(e,mt(t))||W(e,t))}let fe=null,Rs=null;function Zt(e){const t=fe;return fe=e,Rs=e&&e.type.__scopeId||null,t}function xo(e,t=fe,n){if(!t||e._n)return e;const i=(...s)=>{i._d&&Si(-1);const l=Zt(t);let o;try{o=e(...s)}finally{Zt(l),i._d&&Si(1)}return o};return i._n=!0,i._c=!0,i._d=!0,i}function vn(e){const{type:t,vnode:n,proxy:i,withProxy:s,props:l,propsOptions:[o],slots:r,attrs:c,emit:f,render:p,renderCache:h,data:E,setupState:j,ctx:k,inheritAttrs:O}=e;let N,z;const V=Zt(e);try{if(n.shapeFlag&4){const m=s||i,I=m;N=ve(p.call(I,m,h,l,j,E,k)),z=c}else{const m=t;N=ve(m.length>1?m(l,{attrs:c,slots:r,emit:f}):m(l,null)),z=t.props?c:bo(c)}}catch(m){jt.length=0,un(m,e,1),N=oe(Ne)}let g=N;if(z&&O!==!1){const m=Object.keys(z),{shapeFlag:I}=g;m.length&&I&7&&(o&&m.some($n)&&(z=_o(z,o)),g=pt(g,z))}return n.dirs&&(g=pt(g),g.dirs=g.dirs?g.dirs.concat(n.dirs):n.dirs),n.transition&&(g.transition=n.transition),N=g,Zt(V),N}const bo=e=>{let t;for(const n in e)(n==="class"||n==="style"||Mt(n))&&((t||(t={}))[n]=e[n]);return t},_o=(e,t)=>{const n={};for(const i in e)(!$n(i)||!(i.slice(9)in t))&&(n[i]=e[i]);return n};function yo(e,t,n){const{props:i,children:s,component:l}=e,{props:o,children:r,patchFlag:c}=t,f=l.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return i?vi(i,o,f):!!o;if(c&8){const p=t.dynamicProps;for(let h=0;he.__isSuspense;function Os(e,t){t&&t.pendingBranch?L(e)?t.effects.push(...e):t.effects.push(e):mo(e)}function Ps(e,t){return ei(e,null,t)}const Dt={};function Xe(e,t,n){return ei(e,t,n)}function ei(e,t,{immediate:n,deep:i,flush:s,onTrack:l,onTrigger:o}=G){var r;const c=rs()===((r=se)==null?void 0:r.scope)?se:null;let f,p=!1,h=!1;if(le(e)?(f=()=>e.value,p=Xt(e)):ot(e)?(f=()=>e,i=!0):L(e)?(h=!0,p=e.some(m=>ot(m)||Xt(m)),f=()=>e.map(m=>{if(le(m))return m.value;if(ot(m))return it(m);if($(m))return Ke(m,c,2)})):$(e)?t?f=()=>Ke(e,c,2):f=()=>{if(!(c&&c.isUnmounted))return E&&E(),Ce(e,c,3,[j])}:f=Oe,t&&i){const m=f;f=()=>it(m())}let E,j=m=>{E=V.onStop=()=>{Ke(m,c,4),E=V.onStop=void 0}},k;if(Pt)if(j=Oe,t?n&&Ce(t,c,3,[f(),h?[]:void 0,j]):f(),s==="sync"){const m=gr();k=m.__watcherHandles||(m.__watcherHandles=[])}else return Oe;let O=h?new Array(e.length).fill(Dt):Dt;const N=()=>{if(V.active)if(t){const m=V.run();(i||p||(h?m.some((I,B)=>Ge(I,O[B])):Ge(m,O)))&&(E&&E(),Ce(t,c,3,[m,O===Dt?void 0:h&&O[0]===Dt?[]:O,j]),O=m)}else V.run()};N.allowRecurse=!!t;let z;s==="sync"?z=N:s==="post"?z=()=>de(N,c&&c.suspense):(N.pre=!0,c&&(N.id=c.uid),z=()=>Gn(N));const V=new Wn(f,z);t?n?N():O=V.run():s==="post"?de(V.run.bind(V),c&&c.suspense):V.run();const g=()=>{V.stop(),c&&c.scope&&Un(c.scope.effects,V)};return k&&k.push(g),g}function jo(e,t,n){const i=this.proxy,s=ie(e)?e.includes(".")?Ss(i,e):()=>i[e]:e.bind(i,i);let l;$(t)?l=t:(l=t.handler,n=t);const o=se;dt(this);const r=ei(s,l.bind(i),n);return o?dt(o):Qe(),r}function Ss(e,t){const n=t.split(".");return()=>{let i=e;for(let s=0;s{it(n,t)});else if(ss(e))for(const n in e)it(e[n],t);return e}function Re(e,t,n,i){const s=e.dirs,l=t&&t.dirs;for(let o=0;o!!e.type.__asyncLoader,Is=e=>e.type.__isKeepAlive;function To(e,t){Fs(e,"a",t)}function Ro(e,t){Fs(e,"da",t)}function Fs(e,t,n=se){const i=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(mn(t,i,n),n){let s=n.parent;for(;s&&s.parent;)Is(s.parent.vnode)&&Ao(i,t,n,s),s=s.parent}}function Ao(e,t,n,i){const s=mn(t,e,i,!0);ti(()=>{Un(i[t],s)},n)}function mn(e,t,n=se,i=!1){if(n){const s=n[e]||(n[e]=[]),l=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;ht(),dt(n);const r=Ce(t,n,e,o);return Qe(),gt(),r});return i?s.unshift(l):s.push(l),l}}const He=e=>(t,n=se)=>(!Pt||e==="sp")&&mn(e,(...i)=>t(...i),n),Oo=He("bm"),It=He("m"),Po=He("bu"),So=He("u"),Mo=He("bum"),ti=He("um"),Io=He("sp"),Fo=He("rtg"),ko=He("rtc");function Lo(e,t=se){mn("ec",e,t)}function ka(e,t,n,i){let s;const l=n&&n[i];if(L(e)||ie(e)){s=new Array(e.length);for(let o=0,r=e.length;ot(o,r,void 0,l&&l[r]));else{const o=Object.keys(e);s=new Array(o.length);for(let r=0,c=o.length;rnn(t)?!(t.type===Ne||t.type===xe&&!ks(t.children)):!0)?e:null}const Mn=e=>e?Zs(e)?oi(e)||e.proxy:Mn(e.parent):null,Et=re(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Mn(e.parent),$root:e=>Mn(e.root),$emit:e=>e.emit,$options:e=>ni(e),$forceUpdate:e=>e.f||(e.f=()=>Gn(e.update)),$nextTick:e=>e.n||(e.n=pn.bind(e.proxy)),$watch:e=>jo.bind(e)}),wn=(e,t)=>e!==G&&!e.__isScriptSetup&&W(e,t),No={get({_:e},t){const{ctx:n,setupState:i,data:s,props:l,accessCache:o,type:r,appContext:c}=e;let f;if(t[0]!=="$"){const j=o[t];if(j!==void 0)switch(j){case 1:return i[t];case 2:return s[t];case 4:return n[t];case 3:return l[t]}else{if(wn(i,t))return o[t]=1,i[t];if(s!==G&&W(s,t))return o[t]=2,s[t];if((f=e.propsOptions[0])&&W(f,t))return o[t]=3,l[t];if(n!==G&&W(n,t))return o[t]=4,n[t];In&&(o[t]=0)}}const p=Et[t];let h,E;if(p)return t==="$attrs"&&me(e,"get",t),p(e);if((h=r.__cssModules)&&(h=h[t]))return h;if(n!==G&&W(n,t))return o[t]=4,n[t];if(E=c.config.globalProperties,W(E,t))return E[t]},set({_:e},t,n){const{data:i,setupState:s,ctx:l}=e;return wn(s,t)?(s[t]=n,!0):i!==G&&W(i,t)?(i[t]=n,!0):W(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(l[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:i,appContext:s,propsOptions:l}},o){let r;return!!n[o]||e!==G&&W(e,o)||wn(t,o)||(r=l[0])&&W(r,o)||W(i,o)||W(Et,o)||W(s.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:W(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Ei(e){return L(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let In=!0;function Ho(e){const t=ni(e),n=e.proxy,i=e.ctx;In=!1,t.beforeCreate&&Ci(t.beforeCreate,e,"bc");const{data:s,computed:l,methods:o,watch:r,provide:c,inject:f,created:p,beforeMount:h,mounted:E,beforeUpdate:j,updated:k,activated:O,deactivated:N,beforeDestroy:z,beforeUnmount:V,destroyed:g,unmounted:m,render:I,renderTracked:B,renderTriggered:U,errorCaptured:D,serverPrefetch:A,expose:R,inheritAttrs:Y,components:ee,directives:ne,filters:Se}=t;if(f&&$o(f,i,null),o)for(const q in o){const P=o[q];$(P)&&(i[q]=P.bind(n))}if(s){const q=s.call(n,n);Z(q)&&(e.data=cn(q))}if(In=!0,l)for(const q in l){const P=l[q],Me=$(P)?P.bind(n,n):$(P.get)?P.get.bind(n,n):Oe,Ft=!$(P)&&$(P.set)?P.set.bind(n):Oe,We=ae({get:Me,set:Ft});Object.defineProperty(i,q,{enumerable:!0,configurable:!0,get:()=>We.value,set:je=>We.value=je})}if(r)for(const q in r)Ls(r[q],i,n,q);if(c){const q=$(c)?c.call(n):c;Reflect.ownKeys(q).forEach(P=>{Wo(P,q[P])})}p&&Ci(p,e,"c");function F(q,P){L(P)?P.forEach(Me=>q(Me.bind(n))):P&&q(P.bind(n))}if(F(Oo,h),F(It,E),F(Po,j),F(So,k),F(To,O),F(Ro,N),F(Lo,D),F(ko,B),F(Fo,U),F(Mo,V),F(ti,m),F(Io,A),L(R))if(R.length){const q=e.exposed||(e.exposed={});R.forEach(P=>{Object.defineProperty(q,P,{get:()=>n[P],set:Me=>n[P]=Me})})}else e.exposed||(e.exposed={});I&&e.render===Oe&&(e.render=I),Y!=null&&(e.inheritAttrs=Y),ee&&(e.components=ee),ne&&(e.directives=ne)}function $o(e,t,n=Oe){L(e)&&(e=Fn(e));for(const i in e){const s=e[i];let l;Z(s)?"default"in s?l=ct(s.from||i,s.default,!0):l=ct(s.from||i):l=ct(s),le(l)?Object.defineProperty(t,i,{enumerable:!0,configurable:!0,get:()=>l.value,set:o=>l.value=o}):t[i]=l}}function Ci(e,t,n){Ce(L(e)?e.map(i=>i.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ls(e,t,n,i){const s=i.includes(".")?Ss(n,i):()=>n[i];if(ie(e)){const l=t[e];$(l)&&Xe(s,l)}else if($(e))Xe(s,e.bind(n));else if(Z(e))if(L(e))e.forEach(l=>Ls(l,t,n,i));else{const l=$(e.handler)?e.handler.bind(n):t[e.handler];$(l)&&Xe(s,l,e)}}function ni(e){const t=e.type,{mixins:n,extends:i}=t,{mixins:s,optionsCache:l,config:{optionMergeStrategies:o}}=e.appContext,r=l.get(t);let c;return r?c=r:!s.length&&!n&&!i?c=t:(c={},s.length&&s.forEach(f=>Gt(c,f,o,!0)),Gt(c,t,o)),Z(t)&&l.set(t,c),c}function Gt(e,t,n,i=!1){const{mixins:s,extends:l}=t;l&&Gt(e,l,n,!0),s&&s.forEach(o=>Gt(e,o,n,!0));for(const o in t)if(!(i&&o==="expose")){const r=Uo[o]||n&&n[o];e[o]=r?r(e[o],t[o]):t[o]}return e}const Uo={data:ji,props:Ti,emits:Ti,methods:yt,computed:yt,beforeCreate:ue,created:ue,beforeMount:ue,mounted:ue,beforeUpdate:ue,updated:ue,beforeDestroy:ue,beforeUnmount:ue,destroyed:ue,unmounted:ue,activated:ue,deactivated:ue,errorCaptured:ue,serverPrefetch:ue,components:yt,directives:yt,watch:Bo,provide:ji,inject:Do};function ji(e,t){return t?e?function(){return re($(e)?e.call(this,this):e,$(t)?t.call(this,this):t)}:t:e}function Do(e,t){return yt(Fn(e),Fn(t))}function Fn(e){if(L(e)){const t={};for(let n=0;n1)return n&&$(t)?t.call(i&&i.proxy):t}}function zo(e,t,n,i=!1){const s={},l={};Jt(l,hn,1),e.propsDefaults=Object.create(null),Hs(e,t,s,l);for(const o in e.propsOptions[0])o in s||(s[o]=void 0);n?e.props=i?s:Gl(s):e.type.props?e.props=s:e.props=l,e.attrs=l}function Vo(e,t,n,i){const{props:s,attrs:l,vnode:{patchFlag:o}}=e,r=J(s),[c]=e.propsOptions;let f=!1;if((i||o>0)&&!(o&16)){if(o&8){const p=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[E,j]=$s(h,t,!0);re(o,E),j&&r.push(...j)};!n&&t.mixins.length&&t.mixins.forEach(p),e.extends&&p(e.extends),e.mixins&&e.mixins.forEach(p)}if(!l&&!c)return Z(e)&&i.set(e,st),st;if(L(l))for(let p=0;p-1,j[1]=O<0||k-1||W(j,"default"))&&r.push(h)}}}const f=[o,r];return Z(e)&&i.set(e,f),f}function Ri(e){return e[0]!=="$"}function Ai(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function Oi(e,t){return Ai(e)===Ai(t)}function Pi(e,t){return L(t)?t.findIndex(n=>Oi(n,e)):$(t)&&Oi(t,e)?0:-1}const Us=e=>e[0]==="_"||e==="$stable",ii=e=>L(e)?e.map(ve):[ve(e)],Jo=(e,t,n)=>{if(t._n)return t;const i=xo((...s)=>ii(t(...s)),n);return i._c=!1,i},Ds=(e,t,n)=>{const i=e._ctx;for(const s in e){if(Us(s))continue;const l=e[s];if($(l))t[s]=Jo(s,l,i);else if(l!=null){const o=ii(l);t[s]=()=>o}}},Bs=(e,t)=>{const n=ii(t);e.slots.default=()=>n},Yo=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=J(t),Jt(t,"_",n)):Ds(t,e.slots={})}else e.slots={},t&&Bs(e,t);Jt(e.slots,hn,1)},Xo=(e,t,n)=>{const{vnode:i,slots:s}=e;let l=!0,o=G;if(i.shapeFlag&32){const r=t._;r?n&&r===1?l=!1:(re(s,t),!n&&r===1&&delete s._):(l=!t.$stable,Ds(t,s)),o=t}else t&&(Bs(e,t),o={default:1});if(l)for(const r in s)!Us(r)&&o[r]==null&&delete s[r]};function tn(e,t,n,i,s=!1){if(L(e)){e.forEach((E,j)=>tn(E,t&&(L(t)?t[j]:t),n,i,s));return}if(at(i)&&!s)return;const l=i.shapeFlag&4?oi(i.component)||i.component.proxy:i.el,o=s?null:l,{i:r,r:c}=e,f=t&&t.r,p=r.refs===G?r.refs={}:r.refs,h=r.setupState;if(f!=null&&f!==c&&(ie(f)?(p[f]=null,W(h,f)&&(h[f]=null)):le(f)&&(f.value=null)),$(c))Ke(c,r,12,[o,p]);else{const E=ie(c),j=le(c);if(E||j){const k=()=>{if(e.f){const O=E?W(h,c)?h[c]:p[c]:c.value;s?L(O)&&Un(O,l):L(O)?O.includes(l)||O.push(l):E?(p[c]=[l],W(h,c)&&(h[c]=p[c])):(c.value=[l],e.k&&(p[e.k]=c.value))}else E?(p[c]=o,W(h,c)&&(h[c]=o)):j&&(c.value=o,e.k&&(p[e.k]=o))};o?(k.id=-1,de(k,n)):k()}}}let Ue=!1;const Bt=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Kt=e=>e.nodeType===8;function Qo(e){const{mt:t,p:n,o:{patchProp:i,createText:s,nextSibling:l,parentNode:o,remove:r,insert:c,createComment:f}}=e,p=(g,m)=>{if(!m.hasChildNodes()){n(null,g,m),Qt(),m._vnode=g;return}Ue=!1,h(m.firstChild,g,null,null,null),Qt(),m._vnode=g,Ue&&console.error("Hydration completed but contains mismatches.")},h=(g,m,I,B,U,D=!1)=>{const A=Kt(g)&&g.data==="[",R=()=>O(g,m,I,B,U,A),{type:Y,ref:ee,shapeFlag:ne,patchFlag:Se}=m;let pe=g.nodeType;m.el=g,Se===-2&&(D=!1,m.dynamicChildren=null);let F=null;switch(Y){case ut:pe!==3?m.children===""?(c(m.el=s(""),o(g),g),F=g):F=R():(g.data!==m.children&&(Ue=!0,g.data=m.children),F=l(g));break;case Ne:V(g)?(F=l(g),z(m.el=g.content.firstChild,g,I)):pe!==8||A?F=R():F=l(g);break;case Ct:if(A&&(g=l(g),pe=g.nodeType),pe===1||pe===3){F=g;const q=!m.children.length;for(let P=0;P{D=D||!!m.dynamicChildren;const{type:A,props:R,patchFlag:Y,shapeFlag:ee,dirs:ne,transition:Se}=m,pe=A==="input"||A==="option";if(pe||Y!==-1){if(ne&&Re(m,null,I,"created"),R)if(pe||!D||Y&48)for(const P in R)(pe&&(P.endsWith("value")||P==="indeterminate")||Mt(P)&&!vt(P)||P[0]===".")&&i(g,P,null,R[P],!1,void 0,I);else R.onClick&&i(g,"onClick",null,R.onClick,!1,void 0,I);let F;(F=R&&R.onVnodeBeforeMount)&&be(F,I,m);let q=!1;if(V(g)){q=Ks(B,Se)&&I&&I.vnode.props&&I.vnode.props.appear;const P=g.content.firstChild;q&&Se.beforeEnter(P),z(P,g,I),m.el=g=P}if(ne&&Re(m,null,I,"beforeMount"),((F=R&&R.onVnodeMounted)||ne||q)&&Os(()=>{F&&be(F,I,m),q&&Se.enter(g),ne&&Re(m,null,I,"mounted")},B),ee&16&&!(R&&(R.innerHTML||R.textContent))){let P=j(g.firstChild,m,g,I,B,U,D);for(;P;){Ue=!0;const Me=P;P=P.nextSibling,r(Me)}}else ee&8&&g.textContent!==m.children&&(Ue=!0,g.textContent=m.children)}return g.nextSibling},j=(g,m,I,B,U,D,A)=>{A=A||!!m.dynamicChildren;const R=m.children,Y=R.length;for(let ee=0;ee{const{slotScopeIds:A}=m;A&&(U=U?U.concat(A):A);const R=o(g),Y=j(l(g),m,R,I,B,U,D);return Y&&Kt(Y)&&Y.data==="]"?l(m.anchor=Y):(Ue=!0,c(m.anchor=f("]"),R,Y),Y)},O=(g,m,I,B,U,D)=>{if(Ue=!0,m.el=null,D){const Y=N(g);for(;;){const ee=l(g);if(ee&&ee!==Y)r(ee);else break}}const A=l(g),R=o(g);return r(g),n(null,m,R,A,I,B,Bt(R),U),A},N=(g,m="[",I="]")=>{let B=0;for(;g;)if(g=l(g),g&&Kt(g)&&(g.data===m&&B++,g.data===I)){if(B===0)return l(g);B--}return g},z=(g,m,I)=>{const B=m.parentNode;B&&B.replaceChild(g,m);let U=I;for(;U;)U.vnode.el===m&&(U.vnode.el=U.subTree.el=g),U=U.parent},V=g=>g.nodeType===1&&g.tagName.toLowerCase()==="template";return[p,h]}const de=Os;function Zo(e){return Go(e,Qo)}function Go(e,t){const n=Rn();n.__VUE__=!0;const{insert:i,remove:s,patchProp:l,createElement:o,createText:r,createComment:c,setText:f,setElementText:p,parentNode:h,nextSibling:E,setScopeId:j=Oe,insertStaticContent:k}=e,O=(a,u,d,x=null,b=null,v=null,C=!1,y=null,w=!!u.dynamicChildren)=>{if(a===u)return;a&&!bt(a,u)&&(x=kt(a),je(a,b,v,!0),a=null),u.patchFlag===-2&&(w=!1,u.dynamicChildren=null);const{type:_,ref:S,shapeFlag:T}=u;switch(_){case ut:N(a,u,d,x);break;case Ne:z(a,u,d,x);break;case Ct:a==null&&V(u,d,x,C);break;case xe:ee(a,u,d,x,b,v,C,y,w);break;default:T&1?I(a,u,d,x,b,v,C,y,w):T&6?ne(a,u,d,x,b,v,C,y,w):(T&64||T&128)&&_.process(a,u,d,x,b,v,C,y,w,et)}S!=null&&b&&tn(S,a&&a.ref,v,u||a,!u)},N=(a,u,d,x)=>{if(a==null)i(u.el=r(u.children),d,x);else{const b=u.el=a.el;u.children!==a.children&&f(b,u.children)}},z=(a,u,d,x)=>{a==null?i(u.el=c(u.children||""),d,x):u.el=a.el},V=(a,u,d,x)=>{[a.el,a.anchor]=k(a.children,u,d,x,a.el,a.anchor)},g=({el:a,anchor:u},d,x)=>{let b;for(;a&&a!==u;)b=E(a),i(a,d,x),a=b;i(u,d,x)},m=({el:a,anchor:u})=>{let d;for(;a&&a!==u;)d=E(a),s(a),a=d;s(u)},I=(a,u,d,x,b,v,C,y,w)=>{C=C||u.type==="svg",a==null?B(u,d,x,b,v,C,y,w):A(a,u,b,v,C,y,w)},B=(a,u,d,x,b,v,C,y)=>{let w,_;const{type:S,props:T,shapeFlag:M,transition:H,dirs:K}=a;if(w=a.el=o(a.type,v,T&&T.is,T),M&8?p(w,a.children):M&16&&D(a.children,w,null,x,b,v&&S!=="foreignObject",C,y),K&&Re(a,null,x,"created"),U(w,a,a.scopeId,C,x),T){for(const X in T)X!=="value"&&!vt(X)&&l(w,X,null,T[X],v,a.children,x,b,Ie);"value"in T&&l(w,"value",null,T.value),(_=T.onVnodeBeforeMount)&&be(_,x,a)}K&&Re(a,null,x,"beforeMount");const Q=Ks(b,H);Q&&H.beforeEnter(w),i(w,u,d),((_=T&&T.onVnodeMounted)||Q||K)&&de(()=>{_&&be(_,x,a),Q&&H.enter(w),K&&Re(a,null,x,"mounted")},b)},U=(a,u,d,x,b)=>{if(d&&j(a,d),x)for(let v=0;v{for(let _=w;_{const y=u.el=a.el;let{patchFlag:w,dynamicChildren:_,dirs:S}=u;w|=a.patchFlag&16;const T=a.props||G,M=u.props||G;let H;d&&ze(d,!1),(H=M.onVnodeBeforeUpdate)&&be(H,d,u,a),S&&Re(u,a,d,"beforeUpdate"),d&&ze(d,!0);const K=b&&u.type!=="foreignObject";if(_?R(a.dynamicChildren,_,y,d,x,K,v):C||P(a,u,y,null,d,x,K,v,!1),w>0){if(w&16)Y(y,u,T,M,d,x,b);else if(w&2&&T.class!==M.class&&l(y,"class",null,M.class,b),w&4&&l(y,"style",T.style,M.style,b),w&8){const Q=u.dynamicProps;for(let X=0;X{H&&be(H,d,u,a),S&&Re(u,a,d,"updated")},x)},R=(a,u,d,x,b,v,C)=>{for(let y=0;y{if(d!==x){if(d!==G)for(const y in d)!vt(y)&&!(y in x)&&l(a,y,d[y],null,C,u.children,b,v,Ie);for(const y in x){if(vt(y))continue;const w=x[y],_=d[y];w!==_&&y!=="value"&&l(a,y,_,w,C,u.children,b,v,Ie)}"value"in x&&l(a,"value",d.value,x.value)}},ee=(a,u,d,x,b,v,C,y,w)=>{const _=u.el=a?a.el:r(""),S=u.anchor=a?a.anchor:r("");let{patchFlag:T,dynamicChildren:M,slotScopeIds:H}=u;H&&(y=y?y.concat(H):H),a==null?(i(_,d,x),i(S,d,x),D(u.children,d,S,b,v,C,y,w)):T>0&&T&64&&M&&a.dynamicChildren?(R(a.dynamicChildren,M,d,b,v,C,y),(u.key!=null||b&&u===b.subTree)&&qs(a,u,!0)):P(a,u,d,S,b,v,C,y,w)},ne=(a,u,d,x,b,v,C,y,w)=>{u.slotScopeIds=y,a==null?u.shapeFlag&512?b.ctx.activate(u,d,x,C,w):Se(u,d,x,b,v,C,w):pe(a,u,w)},Se=(a,u,d,x,b,v,C)=>{const y=a.component=ar(a,x,b);if(Is(a)&&(y.ctx.renderer=et),cr(y),y.asyncDep){if(b&&b.registerDep(y,F),!a.el){const w=y.subTree=oe(Ne);z(null,w,u,d)}return}F(y,a,u,d,b,v,C)},pe=(a,u,d)=>{const x=u.component=a.component;if(yo(a,u,d))if(x.asyncDep&&!x.asyncResolved){q(x,u,d);return}else x.next=u,po(x.update),x.update();else u.el=a.el,x.vnode=u},F=(a,u,d,x,b,v,C)=>{const y=()=>{if(a.isMounted){let{next:S,bu:T,u:M,parent:H,vnode:K}=a,Q=S,X;ze(a,!1),S?(S.el=K.el,q(a,S,C)):S=K,T&&yn(T),(X=S.props&&S.props.onVnodeBeforeUpdate)&&be(X,H,S,K),ze(a,!0);const te=vn(a),ye=a.subTree;a.subTree=te,O(ye,te,h(ye.el),kt(ye),a,b,v),S.el=te.el,Q===null&&vo(a,te.el),M&&de(M,b),(X=S.props&&S.props.onVnodeUpdated)&&de(()=>be(X,H,S,K),b)}else{let S;const{el:T,props:M}=u,{bm:H,m:K,parent:Q}=a,X=at(u);if(ze(a,!1),H&&yn(H),!X&&(S=M&&M.onVnodeBeforeMount)&&be(S,Q,u),ze(a,!0),T&&bn){const te=()=>{a.subTree=vn(a),bn(T,a.subTree,a,b,null)};X?u.type.__asyncLoader().then(()=>!a.isUnmounted&&te()):te()}else{const te=a.subTree=vn(a);O(null,te,d,x,a,b,v),u.el=te.el}if(K&&de(K,b),!X&&(S=M&&M.onVnodeMounted)){const te=u;de(()=>be(S,Q,te),b)}(u.shapeFlag&256||Q&&at(Q.vnode)&&Q.vnode.shapeFlag&256)&&a.a&&de(a.a,b),a.isMounted=!0,u=d=x=null}},w=a.effect=new Wn(y,()=>Gn(_),a.scope),_=a.update=()=>w.run();_.id=a.uid,ze(a,!0),_()},q=(a,u,d)=>{u.component=a;const x=a.vnode.props;a.vnode=u,a.next=null,Vo(a,u.props,x,d),Xo(a,u.children,d),ht(),yi(),gt()},P=(a,u,d,x,b,v,C,y,w=!1)=>{const _=a&&a.children,S=a?a.shapeFlag:0,T=u.children,{patchFlag:M,shapeFlag:H}=u;if(M>0){if(M&128){Ft(_,T,d,x,b,v,C,y,w);return}else if(M&256){Me(_,T,d,x,b,v,C,y,w);return}}H&8?(S&16&&Ie(_,b,v),T!==_&&p(d,T)):S&16?H&16?Ft(_,T,d,x,b,v,C,y,w):Ie(_,b,v,!0):(S&8&&p(d,""),H&16&&D(T,d,x,b,v,C,y,w))},Me=(a,u,d,x,b,v,C,y,w)=>{a=a||st,u=u||st;const _=a.length,S=u.length,T=Math.min(_,S);let M;for(M=0;MS?Ie(a,b,v,!0,!1,T):D(u,d,x,b,v,C,y,w,T)},Ft=(a,u,d,x,b,v,C,y,w)=>{let _=0;const S=u.length;let T=a.length-1,M=S-1;for(;_<=T&&_<=M;){const H=a[_],K=u[_]=w?De(u[_]):ve(u[_]);if(bt(H,K))O(H,K,d,null,b,v,C,y,w);else break;_++}for(;_<=T&&_<=M;){const H=a[T],K=u[M]=w?De(u[M]):ve(u[M]);if(bt(H,K))O(H,K,d,null,b,v,C,y,w);else break;T--,M--}if(_>T){if(_<=M){const H=M+1,K=HM)for(;_<=T;)je(a[_],b,v,!0),_++;else{const H=_,K=_,Q=new Map;for(_=K;_<=M;_++){const he=u[_]=w?De(u[_]):ve(u[_]);he.key!=null&&Q.set(he.key,_)}let X,te=0;const ye=M-K+1;let tt=!1,ci=0;const xt=new Array(ye);for(_=0;_=ye){je(he,b,v,!0);continue}let Te;if(he.key!=null)Te=Q.get(he.key);else for(X=K;X<=M;X++)if(xt[X-K]===0&&bt(he,u[X])){Te=X;break}Te===void 0?je(he,b,v,!0):(xt[Te-K]=_+1,Te>=ci?ci=Te:tt=!0,O(he,u[Te],d,null,b,v,C,y,w),te++)}const fi=tt?er(xt):st;for(X=fi.length-1,_=ye-1;_>=0;_--){const he=K+_,Te=u[he],ui=he+1{const{el:v,type:C,transition:y,children:w,shapeFlag:_}=a;if(_&6){We(a.component.subTree,u,d,x);return}if(_&128){a.suspense.move(u,d,x);return}if(_&64){C.move(a,u,d,et);return}if(C===xe){i(v,u,d);for(let T=0;Ty.enter(v),b);else{const{leave:T,delayLeave:M,afterLeave:H}=y,K=()=>i(v,u,d),Q=()=>{T(v,()=>{K(),H&&H()})};M?M(v,K,Q):Q()}else i(v,u,d)},je=(a,u,d,x=!1,b=!1)=>{const{type:v,props:C,ref:y,children:w,dynamicChildren:_,shapeFlag:S,patchFlag:T,dirs:M}=a;if(y!=null&&tn(y,null,d,a,!0),S&256){u.ctx.deactivate(a);return}const H=S&1&&M,K=!at(a);let Q;if(K&&(Q=C&&C.onVnodeBeforeUnmount)&&be(Q,u,a),S&6)hl(a.component,d,x);else{if(S&128){a.suspense.unmount(d,x);return}H&&Re(a,null,u,"beforeUnmount"),S&64?a.type.remove(a,u,d,b,et,x):_&&(v!==xe||T>0&&T&64)?Ie(_,u,d,!1,!0):(v===xe&&T&384||!b&&S&16)&&Ie(w,u,d),x&&ri(a)}(K&&(Q=C&&C.onVnodeUnmounted)||H)&&de(()=>{Q&&be(Q,u,a),H&&Re(a,null,u,"unmounted")},d)},ri=a=>{const{type:u,el:d,anchor:x,transition:b}=a;if(u===xe){ml(d,x);return}if(u===Ct){m(a);return}const v=()=>{s(d),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(a.shapeFlag&1&&b&&!b.persisted){const{leave:C,delayLeave:y}=b,w=()=>C(d,v);y?y(a.el,v,w):w()}else v()},ml=(a,u)=>{let d;for(;a!==u;)d=E(a),s(a),a=d;s(u)},hl=(a,u,d)=>{const{bum:x,scope:b,update:v,subTree:C,um:y}=a;x&&yn(x),b.stop(),v&&(v.active=!1,je(C,a,u,d)),y&&de(y,u),de(()=>{a.isUnmounted=!0},u),u&&u.pendingBranch&&!u.isUnmounted&&a.asyncDep&&!a.asyncResolved&&a.suspenseId===u.pendingId&&(u.deps--,u.deps===0&&u.resolve())},Ie=(a,u,d,x=!1,b=!1,v=0)=>{for(let C=v;Ca.shapeFlag&6?kt(a.component.subTree):a.shapeFlag&128?a.suspense.next():E(a.anchor||a.el),ai=(a,u,d)=>{a==null?u._vnode&&je(u._vnode,null,null,!0):O(u._vnode||null,a,u,null,null,null,d),yi(),Qt(),u._vnode=a},et={p:O,um:je,m:We,r:ri,mt:Se,mc:D,pc:P,pbc:R,n:kt,o:e};let xn,bn;return t&&([xn,bn]=t(et)),{render:ai,hydrate:xn,createApp:qo(ai,xn)}}function ze({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Ks(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function qs(e,t,n=!1){const i=e.children,s=t.children;if(L(i)&&L(s))for(let l=0;l>1,e[n[r]]0&&(t[i]=n[l-1]),n[l]=i)}}for(l=n.length,o=n[l-1];l-- >0;)n[l]=o,o=t[o];return n}const tr=e=>e.__isTeleport,xe=Symbol.for("v-fgt"),ut=Symbol.for("v-txt"),Ne=Symbol.for("v-cmt"),Ct=Symbol.for("v-stc"),jt=[];let Ee=null;function Ws(e=!1){jt.push(Ee=e?null:[])}function nr(){jt.pop(),Ee=jt[jt.length-1]||null}let Ot=1;function Si(e){Ot+=e}function zs(e){return e.dynamicChildren=Ot>0?Ee||st:null,nr(),Ot>0&&Ee&&Ee.push(e),e}function Na(e,t,n,i,s,l){return zs(Ys(e,t,n,i,s,l,!0))}function Vs(e,t,n,i,s){return zs(oe(e,t,n,i,s,!0))}function nn(e){return e?e.__v_isVNode===!0:!1}function bt(e,t){return e.type===t.type&&e.key===t.key}const hn="__vInternal",Js=({key:e})=>e??null,Vt=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ie(e)||le(e)||$(e)?{i:fe,r:e,k:t,f:!!n}:e:null);function Ys(e,t=null,n=null,i=0,s=null,l=e===xe?0:1,o=!1,r=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Js(t),ref:t&&Vt(t),scopeId:Rs,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:l,patchFlag:i,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:fe};return r?(si(c,n),l&128&&e.normalize(c)):n&&(c.shapeFlag|=ie(n)?8:16),Ot>0&&!o&&Ee&&(c.patchFlag>0||l&6)&&c.patchFlag!==32&&Ee.push(c),c}const oe=ir;function ir(e,t=null,n=null,i=0,s=null,l=!1){if((!e||e===wo)&&(e=Ne),nn(e)){const r=pt(e,t,!0);return n&&si(r,n),Ot>0&&!l&&Ee&&(r.shapeFlag&6?Ee[Ee.indexOf(e)]=r:Ee.push(r)),r.patchFlag|=-2,r}if(mr(e)&&(e=e.__vccOpts),t){t=sr(t);let{class:r,style:c}=t;r&&!ie(r)&&(t.class=Kn(r)),Z(c)&&(bs(c)&&!L(c)&&(c=re({},c)),t.style=Bn(c))}const o=ie(e)?1:Co(e)?128:tr(e)?64:Z(e)?4:$(e)?2:0;return Ys(e,t,n,i,s,o,l,!0)}function sr(e){return e?bs(e)||hn in e?re({},e):e:null}function pt(e,t,n=!1){const{props:i,ref:s,patchFlag:l,children:o}=e,r=t?lr(i||{},t):i;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:r,key:r&&Js(r),ref:t&&t.ref?n&&s?L(s)?s.concat(Vt(t)):[s,Vt(t)]:Vt(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==xe?l===-1?16:l|16:l,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&pt(e.ssContent),ssFallback:e.ssFallback&&pt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Xs(e=" ",t=0){return oe(ut,null,e,t)}function Ha(e,t){const n=oe(Ct,null,e);return n.staticCount=t,n}function $a(e="",t=!1){return t?(Ws(),Vs(Ne,null,e)):oe(Ne,null,e)}function ve(e){return e==null||typeof e=="boolean"?oe(Ne):L(e)?oe(xe,null,e.slice()):typeof e=="object"?De(e):oe(ut,null,String(e))}function De(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:pt(e)}function si(e,t){let n=0;const{shapeFlag:i}=e;if(t==null)t=null;else if(L(t))n=16;else if(typeof t=="object")if(i&65){const s=t.default;s&&(s._c&&(s._d=!1),si(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!(hn in t)?t._ctx=fe:s===3&&fe&&(fe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else $(t)?(t={default:t,_ctx:fe},n=32):(t=String(t),i&64?(n=16,t=[Xs(t)]):n=8);e.children=t,e.shapeFlag|=n}function lr(...e){const t={};for(let n=0;nse||fe;let li,nt,Mi="__VUE_INSTANCE_SETTERS__";(nt=Rn()[Mi])||(nt=Rn()[Mi]=[]),nt.push(e=>se=e),li=e=>{nt.length>1?nt.forEach(t=>t(e)):nt[0](e)};const dt=e=>{li(e),e.scope.on()},Qe=()=>{se&&se.scope.off(),li(null)};function Zs(e){return e.vnode.shapeFlag&4}let Pt=!1;function cr(e,t=!1){Pt=t;const{props:n,children:i}=e.vnode,s=Zs(e);zo(e,n,s,t),Yo(e,i);const l=s?fr(e,t):void 0;return Pt=!1,l}function fr(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=wt(new Proxy(e.ctx,No));const{setup:i}=n;if(i){const s=e.setupContext=i.length>1?pr(e):null;dt(e),ht();const l=Ke(i,e,0,[e.props,s]);if(gt(),Qe(),ns(l)){if(l.then(Qe,Qe),t)return l.then(o=>{Ii(e,o,t)}).catch(o=>{un(o,e,0)});e.asyncDep=l}else Ii(e,l,t)}else Gs(e,t)}function Ii(e,t,n){$(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Z(t)&&(e.setupState=ws(t)),Gs(e,n)}let Fi;function Gs(e,t,n){const i=e.type;if(!e.render){if(!t&&Fi&&!i.render){const s=i.template||ni(e).template;if(s){const{isCustomElement:l,compilerOptions:o}=e.appContext.config,{delimiters:r,compilerOptions:c}=i,f=re(re({isCustomElement:l,delimiters:r},o),c);i.render=Fi(s,f)}}e.render=i.render||Oe}{dt(e),ht();try{Ho(e)}finally{gt(),Qe()}}}function ur(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return me(e,"get","$attrs"),t[n]}}))}function pr(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return ur(e)},slots:e.slots,emit:e.emit,expose:t}}function oi(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(ws(wt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Et)return Et[n](e)},has(t,n){return n in t||n in Et}}))}function dr(e,t=!0){return $(e)?e.displayName||e.name:e.name||t&&e.__name}function mr(e){return $(e)&&"__vccOpts"in e}const ae=(e,t)=>co(e,t,Pt);function ki(e,t,n){const i=arguments.length;return i===2?Z(t)&&!L(t)?nn(t)?oe(e,null,[t]):oe(e,t):oe(e,null,t):(i>3?n=Array.prototype.slice.call(arguments,2):i===3&&nn(n)&&(n=[n]),oe(e,t,n))}const hr=Symbol.for("v-scx"),gr=()=>ct(hr),xr="3.3.9",br="http://www.w3.org/2000/svg",Je=typeof document<"u"?document:null,Li=Je&&Je.createElement("template"),_r={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,i)=>{const s=t?Je.createElementNS(br,e):Je.createElement(e,n?{is:n}:void 0);return e==="select"&&i&&i.multiple!=null&&s.setAttribute("multiple",i.multiple),s},createText:e=>Je.createTextNode(e),createComment:e=>Je.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Je.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,i,s,l){const o=n?n.previousSibling:t.lastChild;if(s&&(s===l||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===l||!(s=s.nextSibling)););else{Li.innerHTML=i?`${e}`:e;const r=Li.content;if(i){const c=r.firstChild;for(;c.firstChild;)r.appendChild(c.firstChild);r.removeChild(c)}t.insertBefore(r,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},yr=Symbol("_vtc");function vr(e,t,n){const i=e[yr];i&&(t=(t?[t,...i]:[...i]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const wr=Symbol("_vod");function Er(e,t,n){const i=e.style,s=ie(n);if(n&&!s){if(t&&!ie(t))for(const l in t)n[l]==null&&Ln(i,l,"");for(const l in n)Ln(i,l,n[l])}else{const l=i.display;s?t!==n&&(i.cssText=n):t&&e.removeAttribute("style"),wr in e&&(i.display=l)}}const Ni=/\s*!important$/;function Ln(e,t,n){if(L(n))n.forEach(i=>Ln(e,t,i));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const i=Cr(e,t);Ni.test(n)?e.setProperty(mt(i),n.replace(Ni,""),"important"):e[i]=n}}const Hi=["Webkit","Moz","ms"],En={};function Cr(e,t){const n=En[t];if(n)return n;let i=Pe(t);if(i!=="filter"&&i in e)return En[t]=i;i=rn(i);for(let s=0;sCn||(Sr.then(()=>Cn=0),Cn=Date.now());function Ir(e,t){const n=i=>{if(!i._vts)i._vts=Date.now();else if(i._vts<=n.attached)return;Ce(Fr(i,n.value),t,5,[i])};return n.value=e,n.attached=Mr(),n}function Fr(e,t){if(L(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(i=>s=>!s._stopped&&i&&i(s))}else return t}const Bi=/^on[a-z]/,kr=(e,t,n,i,s=!1,l,o,r,c)=>{t==="class"?vr(e,i,s):t==="style"?Er(e,n,i):Mt(t)?$n(t)||Or(e,t,n,i,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Lr(e,t,i,s))?Tr(e,t,i,l,o,r,c):(t==="true-value"?e._trueValue=i:t==="false-value"&&(e._falseValue=i),jr(e,t,i,s))};function Lr(e,t,n,i){return i?!!(t==="innerHTML"||t==="textContent"||t in e&&Bi.test(t)&&$(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||Bi.test(t)&&ie(n)?!1:t in e}const Nr=re({patchProp:kr},_r);let jn,Ki=!1;function Hr(){return jn=Ki?jn:Zo(Nr),Ki=!0,jn}const Ua=(...e)=>{const t=Hr().createApp(...e),{mount:n}=t;return t.mount=i=>{const s=$r(i);if(s)return n(s,!0,s instanceof SVGElement)},t};function $r(e){return ie(e)?document.querySelector(e):e}const Da=(e,t)=>{const n=e.__vccOpts||e;for(const[i,s]of t)n[i]=s;return n},Ur="modulepreload",Dr=function(e){return"/"+e},qi={},Ba=function(t,n,i){if(!n||n.length===0)return t();const s=document.getElementsByTagName("link");return Promise.all(n.map(l=>{if(l=Dr(l),l in qi)return;qi[l]=!0;const o=l.endsWith(".css"),r=o?'[rel="stylesheet"]':"";if(!!i)for(let p=s.length-1;p>=0;p--){const h=s[p];if(h.href===l&&(!o||h.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${l}"]${r}`))return;const f=document.createElement("link");if(f.rel=o?"stylesheet":Ur,o||(f.as="script",f.crossOrigin=""),f.href=l,document.head.appendChild(f),o)return new Promise((p,h)=>{f.addEventListener("load",p),f.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${l}`)))})})).then(()=>t()).catch(l=>{const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=l,window.dispatchEvent(o),!o.defaultPrevented)throw l})},Ka="/logo.png",Br=window.__VP_SITE_DATA__;function el(e){return rs()?(Sl(e),!0):!1}function gn(e){return typeof e=="function"?e():vs(e)}const Kr=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const qr=Object.prototype.toString,Wr=e=>qr.call(e)==="[object Object]",tl=()=>{};function zr(e,t){function n(...i){return new Promise((s,l)=>{Promise.resolve(e(()=>t.apply(this,i),{fn:t,thisArg:this,args:i})).then(s).catch(l)})}return n}const nl=e=>e();function Vr(e=nl){const t=Le(!0);function n(){t.value=!1}function i(){t.value=!0}const s=(...l)=>{t.value&&e(...l)};return{isActive:fn(t),pause:n,resume:i,eventFilter:s}}function Jr(...e){if(e.length!==1)return oo(...e);const t=e[0];return typeof t=="function"?fn(io(()=>({get:t,set:tl}))):Le(t)}function Yr(e,t,n={}){const{eventFilter:i=nl,...s}=n;return Xe(e,zr(i,t),s)}function Xr(e,t,n={}){const{eventFilter:i,...s}=n,{eventFilter:l,pause:o,resume:r,isActive:c}=Vr(i);return{stop:Yr(e,t,{...s,eventFilter:l}),pause:o,resume:r,isActive:c}}function il(e,t=!0){Qs()?It(e):t?e():pn(e)}function sl(e){var t;const n=gn(e);return(t=n==null?void 0:n.$el)!=null?t:n}const St=Kr?window:void 0;function Wi(...e){let t,n,i,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,i,s]=e,t=St):[t,n,i,s]=e,!t)return tl;Array.isArray(n)||(n=[n]),Array.isArray(i)||(i=[i]);const l=[],o=()=>{l.forEach(p=>p()),l.length=0},r=(p,h,E,j)=>(p.addEventListener(h,E,j),()=>p.removeEventListener(h,E,j)),c=Xe(()=>[sl(t),gn(s)],([p,h])=>{if(o(),!p)return;const E=Wr(h)?{...h}:h;l.push(...n.flatMap(j=>i.map(k=>r(p,j,k,E))))},{immediate:!0,flush:"post"}),f=()=>{c(),o()};return el(f),f}function Qr(){const e=Le(!1);return Qs()&&It(()=>{e.value=!0}),e}function Zr(e){const t=Qr();return ae(()=>(t.value,!!e()))}function Gr(e,t={}){const{window:n=St}=t,i=Zr(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const l=Le(!1),o=f=>{l.value=f.matches},r=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",o):s.removeListener(o))},c=Ps(()=>{i.value&&(r(),s=n.matchMedia(gn(e)),"addEventListener"in s?s.addEventListener("change",o):s.addListener(o),l.value=s.matches)});return el(()=>{c(),r(),s=void 0}),l}const qt=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Wt="__vueuse_ssr_handlers__",ea=ta();function ta(){return Wt in qt||(qt[Wt]=qt[Wt]||{}),qt[Wt]}function ll(e,t){return ea[e]||t}function na(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const ia={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},zi="vueuse-storage";function sa(e,t,n,i={}){var s;const{flush:l="pre",deep:o=!0,listenToStorageChanges:r=!0,writeDefaults:c=!0,mergeDefaults:f=!1,shallow:p,window:h=St,eventFilter:E,onError:j=A=>{console.error(A)},initOnMounted:k}=i,O=(p?_s:Le)(typeof t=="function"?t():t);if(!n)try{n=ll("getDefaultStorage",()=>{var A;return(A=St)==null?void 0:A.localStorage})()}catch(A){j(A)}if(!n)return O;const N=gn(t),z=na(N),V=(s=i.serializer)!=null?s:ia[z],{pause:g,resume:m}=Xr(O,()=>I(O.value),{flush:l,deep:o,eventFilter:E});return h&&r&&il(()=>{Wi(h,"storage",D),Wi(h,zi,U),k&&D()}),k||D(),O;function I(A){try{if(A==null)n.removeItem(e);else{const R=V.write(A),Y=n.getItem(e);Y!==R&&(n.setItem(e,R),h&&h.dispatchEvent(new CustomEvent(zi,{detail:{key:e,oldValue:Y,newValue:R,storageArea:n}})))}}catch(R){j(R)}}function B(A){const R=A?A.newValue:n.getItem(e);if(R==null)return c&&N!==null&&n.setItem(e,V.write(N)),N;if(!A&&f){const Y=V.read(R);return typeof f=="function"?f(Y,N):z==="object"&&!Array.isArray(Y)?{...N,...Y}:Y}else return typeof R!="string"?R:V.read(R)}function U(A){D(A.detail)}function D(A){if(!(A&&A.storageArea!==n)){if(A&&A.key==null){O.value=N;return}if(!(A&&A.key!==e)){g();try{(A==null?void 0:A.newValue)!==V.write(O.value)&&(O.value=B(A))}catch(R){j(R)}finally{A?pn(m):m()}}}}}function la(e){return Gr("(prefers-color-scheme: dark)",e)}function oa(e={}){const{selector:t="html",attribute:n="class",initialValue:i="auto",window:s=St,storage:l,storageKey:o="vueuse-color-scheme",listenToStorageChanges:r=!0,storageRef:c,emitAuto:f,disableTransition:p=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},E=la({window:s}),j=ae(()=>E.value?"dark":"light"),k=c||(o==null?Jr(i):sa(o,i,l,{window:s,listenToStorageChanges:r})),O=ae(()=>k.value==="auto"?j.value:k.value),N=ll("updateHTMLAttrs",(m,I,B)=>{const U=typeof m=="string"?s==null?void 0:s.document.querySelector(m):sl(m);if(!U)return;let D;if(p){D=s.document.createElement("style");const A="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";D.appendChild(document.createTextNode(A)),s.document.head.appendChild(D)}if(I==="class"){const A=B.split(/\s/g);Object.values(h).flatMap(R=>(R||"").split(/\s/g)).filter(Boolean).forEach(R=>{A.includes(R)?U.classList.add(R):U.classList.remove(R)})}else U.setAttribute(I,B);p&&(s.getComputedStyle(D).opacity,document.head.removeChild(D))});function z(m){var I;N(t,n,(I=h[m])!=null?I:m)}function V(m){e.onChanged?e.onChanged(m,z):z(m)}Xe(O,V,{flush:"post",immediate:!0}),il(()=>V(O.value));const g=ae({get(){return f?k.value:O.value},set(m){k.value=m}});try{return Object.assign(g,{store:k,system:j,state:O})}catch{return g}}function ra(e={}){const{valueDark:t="dark",valueLight:n=""}=e,i=oa({...e,onChanged:(l,o)=>{var r;e.onChanged?(r=e.onChanged)==null||r.call(e,l==="dark",o,l):o(l)},modes:{dark:t,light:n}});return ae({get(){return i.value==="dark"},set(l){const o=l?"dark":"light";i.system.value===o?i.value="auto":i.value=o}})}const ol=/^(?:[a-z]+:|\/\/)/i,aa="vitepress-theme-appearance",rl=/#.*$/,ca=/(index)?\.(md|html)$/,_e=typeof document<"u",al={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function fa(e,t,n=!1){if(t===void 0)return!1;if(e=Vi(`/${e}`),n)return new RegExp(t).test(e);if(Vi(t)!==e)return!1;const i=t.match(rl);return i?(_e?location.hash:"")===i[0]:!0}function Vi(e){return decodeURI(e).replace(rl,"").replace(ca,"")}function ua(e){return ol.test(e)}function pa(e,t){var i,s,l,o,r,c,f;const n=Object.keys(e.locales).find(p=>p!=="root"&&!ua(p)&&fa(t,`/${p}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((i=e.locales[n])==null?void 0:i.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((l=e.locales[n])==null?void 0:l.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((r=e.locales[n])==null?void 0:r.description)??e.description,head:fl(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(f=e.locales[n])==null?void 0:f.themeConfig}})}function cl(e,t){const n=t.title||e.title,i=t.titleTemplate??e.titleTemplate;if(typeof i=="string"&&i.includes(":title"))return i.replace(/:title/g,n);const s=da(e.title,i);return`${n}${s}`}function da(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function ma(e,t){const[n,i]=t;if(n!=="meta")return!1;const s=Object.entries(i)[0];return s==null?!1:e.some(([l,o])=>l===n&&o[s[0]]===s[1])}function fl(e,t){return[...e.filter(n=>!ma(t,n)),...t]}const ha=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,ga=/^[a-z]:/i;function Ji(e){const t=ga.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(ha,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const xa=Symbol(),Ze=_s(Br);function qa(e){const t=ae(()=>pa(Ze.value,e.data.relativePath)),n=t.value.appearance,i=n==="force-dark"?Le(!0):n?ra({storageKey:aa,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):Le(!1);return{site:t,theme:ae(()=>t.value.themeConfig),page:ae(()=>e.data),frontmatter:ae(()=>e.data.frontmatter),params:ae(()=>e.data.params),lang:ae(()=>t.value.lang),dir:ae(()=>t.value.dir),localeIndex:ae(()=>t.value.localeIndex||"root"),title:ae(()=>cl(t.value,e.data)),description:ae(()=>e.data.description||t.value.description),isDark:i}}function ba(){const e=ct(xa);if(!e)throw new Error("vitepress data not properly injected in app");return e}const _a={ez:"application/andrew-inset",aw:"application/applixware",atom:"application/atom+xml",atomcat:"application/atomcat+xml",atomdeleted:"application/atomdeleted+xml",atomsvc:"application/atomsvc+xml",dwd:"application/atsc-dwd+xml",held:"application/atsc-held+xml",rsat:"application/atsc-rsat+xml",bdoc:"application/bdoc",xcs:"application/calendar+xml",ccxml:"application/ccxml+xml",cdfx:"application/cdfx+xml",cdmia:"application/cdmi-capability",cdmic:"application/cdmi-container",cdmid:"application/cdmi-domain",cdmio:"application/cdmi-object",cdmiq:"application/cdmi-queue",cu:"application/cu-seeme",mpd:"application/dash+xml",davmount:"application/davmount+xml",dbk:"application/docbook+xml",dssc:"application/dssc+der",xdssc:"application/dssc+xml",es:"application/ecmascript",ecma:"application/ecmascript",emma:"application/emma+xml",emotionml:"application/emotionml+xml",epub:"application/epub+zip",exi:"application/exi",fdt:"application/fdt+xml",pfr:"application/font-tdpfr",geojson:"application/geo+json",gml:"application/gml+xml",gpx:"application/gpx+xml",gxf:"application/gxf",gz:"application/gzip",hjson:"application/hjson",stk:"application/hyperstudio",ink:"application/inkml+xml",inkml:"application/inkml+xml",ipfix:"application/ipfix",its:"application/its+xml",jar:"application/java-archive",war:"application/java-archive",ear:"application/java-archive",ser:"application/java-serialized-object",class:"application/java-vm",js:"application/javascript",mjs:"application/javascript",json:"application/json",map:"application/json",json5:"application/json5",jsonml:"application/jsonml+json",jsonld:"application/ld+json",lgr:"application/lgr+xml",lostxml:"application/lost+xml",hqx:"application/mac-binhex40",cpt:"application/mac-compactpro",mads:"application/mads+xml",webmanifest:"application/manifest+json",mrc:"application/marc",mrcx:"application/marcxml+xml",ma:"application/mathematica",nb:"application/mathematica",mb:"application/mathematica",mathml:"application/mathml+xml",mbox:"application/mbox",mscml:"application/mediaservercontrol+xml",metalink:"application/metalink+xml",meta4:"application/metalink4+xml",mets:"application/mets+xml",maei:"application/mmt-aei+xml",musd:"application/mmt-usd+xml",mods:"application/mods+xml",m21:"application/mp21",mp21:"application/mp21",mp4s:"application/mp4",m4p:"application/mp4",doc:"application/msword",dot:"application/msword",mxf:"application/mxf",nq:"application/n-quads",nt:"application/n-triples",cjs:"application/node",bin:"application/octet-stream",dms:"application/octet-stream",lrf:"application/octet-stream",mar:"application/octet-stream",so:"application/octet-stream",dist:"application/octet-stream",distz:"application/octet-stream",pkg:"application/octet-stream",bpk:"application/octet-stream",dump:"application/octet-stream",elc:"application/octet-stream",deploy:"application/octet-stream",exe:"application/octet-stream",dll:"application/octet-stream",deb:"application/octet-stream",dmg:"application/octet-stream",iso:"application/octet-stream",img:"application/octet-stream",msi:"application/octet-stream",msp:"application/octet-stream",msm:"application/octet-stream",buffer:"application/octet-stream",oda:"application/oda",opf:"application/oebps-package+xml",ogx:"application/ogg",omdoc:"application/omdoc+xml",onetoc:"application/onenote",onetoc2:"application/onenote",onetmp:"application/onenote",onepkg:"application/onenote",oxps:"application/oxps",relo:"application/p2p-overlay+xml",xer:"application/patch-ops-error+xml",pdf:"application/pdf",pgp:"application/pgp-encrypted",asc:"application/pgp-signature",sig:"application/pgp-signature",prf:"application/pics-rules",p10:"application/pkcs10",p7m:"application/pkcs7-mime",p7c:"application/pkcs7-mime",p7s:"application/pkcs7-signature",p8:"application/pkcs8",ac:"application/pkix-attr-cert",cer:"application/pkix-cert",crl:"application/pkix-crl",pkipath:"application/pkix-pkipath",pki:"application/pkixcmp",pls:"application/pls+xml",ai:"application/postscript",eps:"application/postscript",ps:"application/postscript",provx:"application/provenance+xml",cww:"application/prs.cww",pskcxml:"application/pskc+xml",raml:"application/raml+yaml",rdf:"application/rdf+xml",owl:"application/rdf+xml",rif:"application/reginfo+xml",rnc:"application/relax-ng-compact-syntax",rl:"application/resource-lists+xml",rld:"application/resource-lists-diff+xml",rs:"application/rls-services+xml",rapd:"application/route-apd+xml",sls:"application/route-s-tsid+xml",rusd:"application/route-usd+xml",gbr:"application/rpki-ghostbusters",mft:"application/rpki-manifest",roa:"application/rpki-roa",rsd:"application/rsd+xml",rss:"application/rss+xml",rtf:"application/rtf",sbml:"application/sbml+xml",scq:"application/scvp-cv-request",scs:"application/scvp-cv-response",spq:"application/scvp-vp-request",spp:"application/scvp-vp-response",sdp:"application/sdp",senmlx:"application/senml+xml",sensmlx:"application/sensml+xml",setpay:"application/set-payment-initiation",setreg:"application/set-registration-initiation",shf:"application/shf+xml",siv:"application/sieve",sieve:"application/sieve",smi:"application/smil+xml",smil:"application/smil+xml",rq:"application/sparql-query",srx:"application/sparql-results+xml",gram:"application/srgs",grxml:"application/srgs+xml",sru:"application/sru+xml",ssdl:"application/ssdl+xml",ssml:"application/ssml+xml",swidtag:"application/swid+xml",tei:"application/tei+xml",teicorpus:"application/tei+xml",tfi:"application/thraud+xml",tsd:"application/timestamped-data",toml:"application/toml",trig:"application/trig",ttml:"application/ttml+xml",ubj:"application/ubjson",rsheet:"application/urc-ressheet+xml",td:"application/urc-targetdesc+xml",vxml:"application/voicexml+xml",wasm:"application/wasm",wgt:"application/widget",hlp:"application/winhlp",wsdl:"application/wsdl+xml",wspolicy:"application/wspolicy+xml",xaml:"application/xaml+xml",xav:"application/xcap-att+xml",xca:"application/xcap-caps+xml",xdf:"application/xcap-diff+xml",xel:"application/xcap-el+xml",xns:"application/xcap-ns+xml",xenc:"application/xenc+xml",xhtml:"application/xhtml+xml",xht:"application/xhtml+xml",xlf:"application/xliff+xml",xml:"application/xml",xsl:"application/xml",xsd:"application/xml",rng:"application/xml",dtd:"application/xml-dtd",xop:"application/xop+xml",xpl:"application/xproc+xml",xslt:"application/xml",xspf:"application/xspf+xml",mxml:"application/xv+xml",xhvml:"application/xv+xml",xvml:"application/xv+xml",xvm:"application/xv+xml",yang:"application/yang",yin:"application/yin+xml",zip:"application/zip","3gpp":"video/3gpp",adp:"audio/adpcm",amr:"audio/amr",au:"audio/basic",snd:"audio/basic",mid:"audio/midi",midi:"audio/midi",kar:"audio/midi",rmi:"audio/midi",mxmf:"audio/mobile-xmf",mp3:"audio/mpeg",m4a:"audio/mp4",mp4a:"audio/mp4",mpga:"audio/mpeg",mp2:"audio/mpeg",mp2a:"audio/mpeg",m2a:"audio/mpeg",m3a:"audio/mpeg",oga:"audio/ogg",ogg:"audio/ogg",spx:"audio/ogg",opus:"audio/ogg",s3m:"audio/s3m",sil:"audio/silk",wav:"audio/wav",weba:"audio/webm",xm:"audio/xm",ttc:"font/collection",otf:"font/otf",ttf:"font/ttf",woff:"font/woff",woff2:"font/woff2",exr:"image/aces",apng:"image/apng",avif:"image/avif",bmp:"image/bmp",cgm:"image/cgm",drle:"image/dicom-rle",emf:"image/emf",fits:"image/fits",g3:"image/g3fax",gif:"image/gif",heic:"image/heic",heics:"image/heic-sequence",heif:"image/heif",heifs:"image/heif-sequence",hej2:"image/hej2k",hsj2:"image/hsj2",ief:"image/ief",jls:"image/jls",jp2:"image/jp2",jpg2:"image/jp2",jpeg:"image/jpeg",jpg:"image/jpeg",jpe:"image/jpeg",jph:"image/jph",jhc:"image/jphc",jpm:"image/jpm",jpx:"image/jpx",jpf:"image/jpx",jxr:"image/jxr",jxra:"image/jxra",jxrs:"image/jxrs",jxs:"image/jxs",jxsc:"image/jxsc",jxsi:"image/jxsi",jxss:"image/jxss",ktx:"image/ktx",ktx2:"image/ktx2",png:"image/png",btif:"image/prs.btif",pti:"image/prs.pti",sgi:"image/sgi",svg:"image/svg+xml",svgz:"image/svg+xml",t38:"image/t38",tif:"image/tiff",tiff:"image/tiff",tfx:"image/tiff-fx",webp:"image/webp",wmf:"image/wmf","disposition-notification":"message/disposition-notification",u8msg:"message/global",u8dsn:"message/global-delivery-status",u8mdn:"message/global-disposition-notification",u8hdr:"message/global-headers",eml:"message/rfc822",mime:"message/rfc822","3mf":"model/3mf",gltf:"model/gltf+json",glb:"model/gltf-binary",igs:"model/iges",iges:"model/iges",msh:"model/mesh",mesh:"model/mesh",silo:"model/mesh",mtl:"model/mtl",obj:"model/obj",stpz:"model/step+zip",stpxz:"model/step-xml+zip",stl:"model/stl",wrl:"model/vrml",vrml:"model/vrml",x3db:"model/x3d+fastinfoset",x3dbz:"model/x3d+binary",x3dv:"model/x3d-vrml",x3dvz:"model/x3d+vrml",x3d:"model/x3d+xml",x3dz:"model/x3d+xml",appcache:"text/cache-manifest",manifest:"text/cache-manifest",ics:"text/calendar",ifb:"text/calendar",coffee:"text/coffeescript",litcoffee:"text/coffeescript",css:"text/css",csv:"text/csv",html:"text/html",htm:"text/html",shtml:"text/html",jade:"text/jade",jsx:"text/jsx",less:"text/less",markdown:"text/markdown",md:"text/markdown",mml:"text/mathml",mdx:"text/mdx",n3:"text/n3",txt:"text/plain",text:"text/plain",conf:"text/plain",def:"text/plain",list:"text/plain",log:"text/plain",in:"text/plain",ini:"text/plain",dsc:"text/prs.lines.tag",rtx:"text/richtext",sgml:"text/sgml",sgm:"text/sgml",shex:"text/shex",slim:"text/slim",slm:"text/slim",spdx:"text/spdx",stylus:"text/stylus",styl:"text/stylus",tsv:"text/tab-separated-values",t:"text/troff",tr:"text/troff",roff:"text/troff",man:"text/troff",me:"text/troff",ms:"text/troff",ttl:"text/turtle",uri:"text/uri-list",uris:"text/uri-list",urls:"text/uri-list",vcard:"text/vcard",vtt:"text/vtt",yaml:"text/yaml",yml:"text/yaml","3gp":"video/3gpp","3g2":"video/3gpp2",h261:"video/h261",h263:"video/h263",h264:"video/h264",m4s:"video/iso.segment",jpgv:"video/jpeg",jpgm:"image/jpm",mj2:"video/mj2",mjp2:"video/mj2",ts:"video/mp2t",mp4:"video/mp4",mp4v:"video/mp4",mpg4:"video/mp4",mpeg:"video/mpeg",mpg:"video/mpeg",mpe:"video/mpeg",m1v:"video/mpeg",m2v:"video/mpeg",ogv:"video/ogg",qt:"video/quicktime",mov:"video/quicktime",webm:"video/webm"};function ya(e){let t=(""+e).trim().toLowerCase(),n=t.lastIndexOf(".");return _a[~n?t.substring(++n):t]}function va(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Yi(e){return ol.test(e)||!e.startsWith("/")?e:va(Ze.value.base,e)}function wa(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),_e){const n="/";t=Ji(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let i=__VP_HASH_MAP__[t.toLowerCase()];if(i||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",i=__VP_HASH_MAP__[t.toLowerCase()]),!i)return null;t=`${n}assets/${t}.${i}.js`}else t=`./${Ji(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let Ea=[];const Ca=Symbol(),ul="http://a.com",ja=()=>({path:"/",component:null,data:al});function Wa(e,t){const n=cn(ja()),i={route:n,go:s};async function s(r=_e?location.href:"/"){var c,f;r=Nn(r),await((c=i.onBeforeRouteChange)==null?void 0:c.call(i,r))!==!1&&(Zi(r),await o(r),await((f=i.onAfterRouteChanged)==null?void 0:f.call(i,r)))}let l=null;async function o(r,c=0,f=!1){var E;if(await((E=i.onBeforePageLoad)==null?void 0:E.call(i,r))===!1)return;const p=new URL(r,ul),h=l=p.pathname;try{let j=await e(h);if(!j)throw new Error(`Page not found: ${h}`);if(l===h){l=null;const{default:k,__pageData:O}=j;if(!k)throw new Error(`Invalid route component: ${k}`);n.path=_e?h:Yi(h),n.component=wt(k),n.data=wt(O),_e&&pn(()=>{let N=Ze.value.base+O.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!Ze.value.cleanUrls&&!N.endsWith("/")&&(N+=".html"),N!==p.pathname&&(p.pathname=N,r=N+p.search+p.hash,history.replaceState(null,"",r)),p.hash&&!c){let z=null;try{z=document.getElementById(decodeURIComponent(p.hash).slice(1))}catch(V){console.warn(V)}if(z){Xi(z,p.hash);return}}window.scrollTo(0,c)})}}catch(j){if(!/fetch|Page not found/.test(j.message)&&!/^\/404(\.html|\/)?$/.test(r)&&console.error(j),!f)try{const k=await fetch(Ze.value.base+"hashmap.json");window.__VP_HASH_MAP__=await k.json(),await o(r,c,!0);return}catch{}l===h&&(l=null,n.path=_e?h:Yi(h),n.component=t?wt(t):null,n.data=al)}}return _e&&(window.addEventListener("click",r=>{if(r.target.closest("button"))return;const f=r.target.closest("a");if(f&&!f.closest(".vp-raw")&&(f instanceof SVGElement||!f.download)){const{target:p}=f,{href:h,origin:E,pathname:j,hash:k,search:O}=new URL(f.href instanceof SVGAnimatedString?f.href.animVal:f.href,f.baseURI),N=window.location,z=ya(j);!r.ctrlKey&&!r.shiftKey&&!r.altKey&&!r.metaKey&&!p&&E===N.origin&&(!z||z==="text/html")&&(r.preventDefault(),j===N.pathname&&O===N.search?(k!==N.hash&&(history.pushState(null,"",k),window.dispatchEvent(new Event("hashchange"))),k?Xi(f,k,f.classList.contains("header-anchor")):(Zi(h),window.scrollTo(0,0))):s(h))}},{capture:!0}),window.addEventListener("popstate",async r=>{var c;await o(Nn(location.href),r.state&&r.state.scrollPosition||0),(c=i.onAfterRouteChanged)==null||c.call(i,location.href)}),window.addEventListener("hashchange",r=>{r.preventDefault()})),i}function Ta(){const e=ct(Ca);if(!e)throw new Error("useRouter() is called without provider.");return e}function pl(){return Ta().route}function Xi(e,t,n=!1){let i=null;try{i=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(i){let s=function(){!n||Math.abs(f-window.scrollY)>window.innerHeight?window.scrollTo(0,f):window.scrollTo({left:0,top:f,behavior:"smooth"})},l=Ze.value.scrollOffset,o=0,r=24;if(typeof l=="object"&&"padding"in l&&(r=l.padding,l=l.selector),typeof l=="number")o=l;else if(typeof l=="string")o=Qi(l,r);else if(Array.isArray(l))for(const p of l){const h=Qi(p,r);if(h){o=h;break}}const c=parseInt(window.getComputedStyle(i).paddingTop,10),f=window.scrollY+i.getBoundingClientRect().top-o+c;requestAnimationFrame(s)}}function Qi(e,t){const n=document.querySelector(e);if(!n)return 0;const i=n.getBoundingClientRect().bottom;return i<0?0:i+t}function Zi(e){_e&&e!==Nn(location.href)&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}function Nn(e){const t=new URL(e,ul);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),Ze.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const Gi=()=>Ea.forEach(e=>e()),za=Ms({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=pl(),{site:n}=ba();return()=>ki(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?ki(t.component,{onVnodeMounted:Gi,onVnodeUpdated:Gi}):"404 Page Not Found"])}}),Va=Ms({setup(e,{slots:t}){const n=Le(!1);return It(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Ja(){_e&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const i=(n=t.parentElement)==null?void 0:n.parentElement;if(!i)return;const s=Array.from(i.querySelectorAll("input")).indexOf(t);if(s<0)return;const l=i.querySelector(".blocks");if(!l)return;const o=Array.from(l.children).find(f=>f.classList.contains("active"));if(!o)return;const r=l.children[s];if(!r||o===r)return;o.classList.remove("active"),r.classList.add("active");const c=i==null?void 0:i.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function Ya(){if(_e){const e=new WeakMap;window.addEventListener("click",t=>{var i;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,l=(i=n.nextElementSibling)==null?void 0:i.nextElementSibling;if(!s||!l)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className);let r="";l.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>r+=(c.textContent||"")+` +`),r=r.slice(0,-1),o&&(r=r.replace(/^ *(\$|>) /gm,"").trim()),Ra(r).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const c=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,c)})}})}}async function Ra(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const i=document.getSelection(),s=i?i.rangeCount>0&&i.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(i.removeAllRanges(),i.addRange(s)),n&&n.focus()}}function Xa(e,t){let n=[],i=!0;const s=l=>{if(i){i=!1;return}const o=l.map(es);n.forEach((r,c)=>{const f=o.findIndex(p=>p==null?void 0:p.isEqualNode(r??null));f!==-1?delete o[f]:(r==null||r.remove(),delete n[c])}),o.forEach(r=>r&&document.head.appendChild(r)),n=[...n,...o].filter(Boolean)};Ps(()=>{const l=e.data,o=t.value,r=l&&l.description,c=l&&l.frontmatter.head||[],f=cl(o,l);f!==document.title&&(document.title=f);const p=r||o.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==p&&h.setAttribute("content",p):es(["meta",{name:"description",content:p}]),s(fl(o.head,Oa(c)))})}function es([e,t,n]){const i=document.createElement(e);for(const s in t)i.setAttribute(s,t[s]);return n&&(i.innerHTML=n),e==="script"&&!t.async&&(i.async=!1),i}function Aa(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Oa(e){return e.filter(t=>!Aa(t))}const Tn=new Set,dl=()=>document.createElement("link"),Pa=e=>{const t=dl();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Sa=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let zt;const Ma=_e&&(zt=dl())&&zt.relList&&zt.relList.supports&&zt.relList.supports("prefetch")?Pa:Sa;function Qa(){if(!_e||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const i=()=>{n&&n.disconnect(),n=new IntersectionObserver(l=>{l.forEach(o=>{if(o.isIntersecting){const r=o.target;n.unobserve(r);const{pathname:c}=r;if(!Tn.has(c)){Tn.add(c);const f=wa(c);f&&Ma(f)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(l=>{const{hostname:o,pathname:r}=new URL(l.href instanceof SVGAnimatedString?l.href.animVal:l.href,l.baseURI),c=r.match(/\.\w+$/);c&&c[0]!==".html"||l.target!=="_blank"&&o===location.hostname&&(r!==location.pathname?n.observe(l):Tn.add(r))})})};It(i);const s=pl();Xe(()=>s.path,i),ti(()=>{n&&n.disconnect()})}export{Xa as A,qa as B,xa as C,za as D,Va as E,xe as F,Ze as G,Ua as H,Wa as I,wa as J,It as K,Ps as L,Qa as M,Ya as N,Ja as O,Ca as R,Da as _,Ha as a,oe as b,Na as c,Ys as d,Xs as e,Ms as f,ae as g,$a as h,ka as i,Yi as j,pl as k,ba as l,Vs as m,Kn as n,Ws as o,Fa as p,Ka as q,La as r,Le as s,Ia as t,vs as u,Oo as v,xo as w,Ba as x,ki as y,_e as z}; diff --git a/assets/chunks/virtual_pwa-register.AUg9w1EU.js b/assets/chunks/virtual_pwa-register.AUg9w1EU.js new file mode 100644 index 0000000..282f9a6 --- /dev/null +++ b/assets/chunks/virtual_pwa-register.AUg9w1EU.js @@ -0,0 +1,7 @@ +import{x as w}from"./framework.-K2UgQQN.js";function v(c={}){const{immediate:d=!1,onNeedRefresh:_,onOfflineReady:i,onRegistered:r,onRegisteredSW:a,onRegisterError:s}=c;let t,o;const l=async(n=!0)=>{await o};async function p(){if("serviceWorker"in navigator){const{Workbox:n}=await w(()=>import("./workbox-window.prod.es5.prqDwDSL.js"),__vite__mapDeps([]));t=new n("/sw.js",{scope:"/",type:"classic"}),t.addEventListener("activated",e=>{(e.isUpdate||e.isExternal)&&window.location.reload()}),t.addEventListener("installed",e=>{e.isUpdate||i==null||i()}),t.register({immediate:d}).then(e=>{a?a("/sw.js",e):r==null||r(e)}).catch(e=>{s==null||s(e)})}}return o=p(),l}export{v as registerSW}; +function __vite__mapDeps(indexes) { + if (!__vite__mapDeps.viteFileDeps) { + __vite__mapDeps.viteFileDeps = [] + } + return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) +} \ No newline at end of file diff --git a/assets/chunks/workbox-window.prod.es5.prqDwDSL.js b/assets/chunks/workbox-window.prod.es5.prqDwDSL.js new file mode 100644 index 0000000..6822d18 --- /dev/null +++ b/assets/chunks/workbox-window.prod.es5.prqDwDSL.js @@ -0,0 +1,2 @@ +try{self["workbox:window:7.0.0"]&&_()}catch{}function S(t,r){return new Promise(function(e){var i=new MessageChannel;i.port1.onmessage=function(f){e(f.data)},t.postMessage(r,[i.port2])})}function W(t,r){for(var e=0;et.length)&&(r=t.length);for(var e=0,i=new Array(r);e"u"||t[Symbol.iterator]==null){if(Array.isArray(t)||(e=function(f,d){if(f){if(typeof f=="string")return E(f,d);var h=Object.prototype.toString.call(f).slice(8,-1);return h==="Object"&&f.constructor&&(h=f.constructor.name),h==="Map"||h==="Set"?Array.from(f):h==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(h)?E(f,d):void 0}}(t))||r&&t&&typeof t.length=="number"){e&&(t=e);var i=0;return function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}return(e=t[Symbol.iterator]()).next.bind(e)}try{self["workbox:core:7.0.0"]&&_()}catch{}var y=function(){var t=this;this.promise=new Promise(function(r,e){t.resolve=r,t.reject=e})};function b(t,r){var e=location.href;return new URL(t,e).href===new URL(r,e).href}var g=function(t,r){this.type=t,Object.assign(this,r)};function p(t,r,e){return e?r?r(t):t:(t&&t.then||(t=Promise.resolve(t)),r?t.then(r):t)}function L(){}var j={type:"SKIP_WAITING"};function P(t,r){if(!r)return t&&t.then?t.then(L):Promise.resolve()}var x=function(t){var r,e;function i(v,c){var n,o;return c===void 0&&(c={}),(n=t.call(this)||this).nn={},n.tn=0,n.rn=new y,n.en=new y,n.on=new y,n.un=0,n.an=new Set,n.cn=function(){var s=n.fn,a=s.installing;n.tn>0||!b(a.scriptURL,n.sn.toString())||performance.now()>n.un+6e4?(n.vn=a,s.removeEventListener("updatefound",n.cn)):(n.hn=a,n.an.add(a),n.rn.resolve(a)),++n.tn,a.addEventListener("statechange",n.ln)},n.ln=function(s){var a=n.fn,u=s.target,l=u.state,m=u===n.vn,w={sw:u,isExternal:m,originalEvent:s};!m&&n.mn&&(w.isUpdate=!0),n.dispatchEvent(new g(l,w)),l==="installed"?n.wn=self.setTimeout(function(){l==="installed"&&a.waiting===u&&n.dispatchEvent(new g("waiting",w))},200):l==="activating"&&(clearTimeout(n.wn),m||n.en.resolve(u))},n.dn=function(s){var a=n.hn,u=a!==navigator.serviceWorker.controller;n.dispatchEvent(new g("controlling",{isExternal:u,originalEvent:s,sw:a,isUpdate:n.mn})),u||n.on.resolve(a)},n.gn=(o=function(s){var a=s.data,u=s.ports,l=s.source;return p(n.getSW(),function(){n.an.has(l)&&n.dispatchEvent(new g("message",{data:a,originalEvent:s,ports:u,sw:l}))})},function(){for(var s=[],a=0;a什么是开源项目和开源社区?国内活跃度 Top 的开源社区,都有哪些有趣的人和事?开源社区之于开源项目有何重要意义?

开源项目(Open Source Project),顾名思义是指开放源代码的可以被公众使用的软件项目,在开源合规的基础上,其他开发者可以对软件进行使用、修改和发行。基于「共建共治共享」的开源理念,许多开源项目汇聚了一批拥有共同兴趣爱好的开发者,形成了一个个独特的开源社区(Open Source Community)。据第三方数据显示,飞桨开源社区已成为国内 Top 的开源社区,作为社区维护者,我们做对了什么?

1. 飞桨开源数据一览

2. 整体飞桨平台的情况

来一段官方介绍:

飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,集核心框架、基础模型库、端到端开发套件、丰富的工具组件、星河社区于一体,是中国首个自主研发、功能丰富、开源开放的产业级深度学习平台。飞桨在业内率先实现了动静统一的框架设计,兼顾科研和产业需求,在开发便捷的深度学习框架、大规模分布式训练、高性能推理引擎、产业级模型库等技术上处于国际领先水平。

飞桨端到端自适应混合并行训练技术以及压缩、推理、服务部署的协同优化,高效支撑以文心一言为代表的文心大模型的生产与应用。

IDC 发布的 2022 年中国深度学习框架和平台市场份额报告显示,百度稳居中国深度学习平台市场综合份额第一。中国信息通信研究院《深度学习平台发展报告(2022)》指出,飞桨已经成为中国深度学习市场应用规模第一的深度学习框架和赋能平台。

当前飞桨已凝聚 800 万开发者,基于飞桨创建 80 万个模型,服务 22 万家企事业单位,广泛服务于金融、能源、制造、交通等领域。

截至 2023 年 8 月,飞桨开源社区累计提交 Commits 超过 93 万次,以 PR 或 ISSUE 提交形式的开源贡献者超过 18000 人。

3. 谁开发了飞桨

BAIDU Contributors:专职的研发部门(深度学习技术平台部),及非专职的其他部门的工程师。

尽管并没有一种特定的方法来识别某位 contributor 是否是百度的雇员,但你依然可以从 github profile 或者 author email 中来找到大量活跃的百度工程师的身影。

Corporate Contributors:NVIDIA、INTEL、昆仑芯、寒武纪,等等多家硬件公司的专职工程师。

翻看AUTHORS.md文件,或者查看飞桨的代码仓库的 commits log,你总能看到来自于这些硬件公司的优秀的工程师的贡献。(小彩蛋:你甚至能找到 intel 工程师们的一张合照)

Individual Contributors:来自高校的学生及来自企业的工程师在业余时间的贡献。

individual-contributors

我们今天对开源社区及开发者的讨论,会聚焦到 Individual Contributors 群体。当前,个人贡献者群体已经成为飞桨开源社区必不可少的研发力量,在提升开源项目影响力、社区活跃度、扩大开源声量方面,更是有着十分重要的意义。

4. 社区开源贡献为飞桨带来了什么

这是一些 2023 年至今社区开发者为飞桨核心框架做出的代码贡献合辑,可以看到从工程效能优化、文档体验提升,到飞桨内核十分重要的 PHI 算子库独立编译,社区开发者都做出了非常重要的贡献。值得一提的是,飞桨 2.4 版本中发布的 API 有三分之一是由社区开发者完成的,到飞桨 2.5 版本,新增的 API 贡献几乎都来自社区开发者。

projects

除此之外,在飞桨的端到端开发套件 PaddleOCR、PaddleClas、PaddleDetection、PaddleSeg,以及大模型套件 PaddleNLP、PaddleMIX 中,社区开发者贡献了许多 SOTA 的算法模型、训推一体 pipeline、tutorials&demo,与飞桨团队共同打磨易用的深度学习框架与工具组件。

这里可以查看更多进行中和已结项的项目:https://github.com/orgs/PaddlePaddle/projects/7

5. 参与飞桨社区的开源贡献会获得什么

技术实力与开源影响力提升

  • 飞桨社区开源项目覆盖深度学习框架、模型、应用全领域,你想提升的技术,这里全都有;
  • 与飞桨产研团队紧密沟通协作,和飞桨共同成长;
  • 开源贡献行为全部公开可查,飞桨社区丰富的开源贡献活动助你树立个人开源影响力;
  • 鼓励社区孵化项目,你可以在这里找到志同道合的小伙伴,把想法变成现实。

荣誉证书、现金激励与工作机会

  • 颁发开源贡献证书、社区曝光度、奖状徽章等,致敬每一位贡献者;
  • 举办丰富社区赛事,提供奖金/奖品激励与权威机构认证;
  • 开源社区贡献者在招聘中会被优先考虑。

硬件支持

  • 提供线上 V100 开发环境,随时可以开发与编译。

honours

6. 飞桨快乐开源:Grow Together, and Have Fun

先来讲一个故事。

大概在 2022 年 12 月份的时候,通过代码扫描工具发现了飞桨框架的 100 多个小 bug 🐛。说是 bug,但是问题真的很小,诸如堆栈溢出(stack overflow)、UFA 非法地址访问(UFA illegal address access)、Python IndexError、空指针(Null pointer)、除 0 错误(divide by 0),大部分 bug 可以被很少的一行或几行代码 fix。

issues

bug 发现了不能不修,怎么修呢?我们把目光放到了开源社区。这是一批极易上手的开发任务,开发者可以在不熟悉框架的情况下完成 bug 修复任务,获得满满成就感;时间上来看,刚好赶上高校学生们放寒假,有大量的空闲时间参与开源活动;研发人力方面,我们协调到 1 个完整人力来支持 code review,保障 bug 修复质量。天时地利人和,我们把这一批 bug 修复任务包装成了一个社区活动 —— 飞桨快乐开源:提 PR 领取新年礼物 🎁。

这个活动一经推出,立马受到了社区开发者的广泛关注和参与,出乎我们意料的是,看到了很多老朋友和新面孔的 PR 提交,有些人(点名 DrRyanHuang)嘴上说着「年后再说」,表情包做了不少,背地里 PR 也提了不少。

nianhouzaishuo

更为经典的是一名社区开发者 RedContritio 在除夕夜连着提了 18 个 PR,因为那个时间点大家都在欢度春节,没有人和他抢,导致他的 PR 编号都是连号的,由于 PR 质量过高,最后也顺利的全部完成了合入 ✅,给了我们一点小小的开源震撼

pullrequests

后来,快乐开源活动就顺理成章的成为了飞桨开源社区长期有效的日常活动,旨在通过简单易上手的开发任务,帮助开发者渐进的了解飞桨、参与开源。我们会按季度更新礼品清单、统计参与活动的开发者信息,并完成礼品邮寄。随着开发者参与热情越来越高,礼品也从游戏键盘、无线耳机升级到了 PS5、iPad、Apple Watch 等。

在 2023 年 Q4,快乐开源活动完成了一次全新升级 🔥,任务范围从 Paddle 框架扩展到科学计算 PaddleScience、大模型套件(PaddleMIX、PaddleNLP)、端到端开发套件(PaddleOCR、PaddleSeg、PaddleClas、PaddleDetection)、动转静孵化项目 PaddleSOT 等更多飞桨生态开源项目,上线「✨ 热身任务」、「🎯 命题任务」与「💡 开放任务」,使用「HappyOpenSource」 标签追踪相关的 issue 与 pr,我们确立了「 Grow Together, and Have Fun!」为口号,快乐开源活动逐渐做大做强~

更多信息可访问活动 issue 了解:https://github.com/PaddlePaddle/Paddle/issues/56689

7. 社区主导项目:Community over Code

Community over Code 是 Apache 软件基金会的项目中最广为人知的理念。尽管在社区的沟通方式上,跟 ASF 所鼓励的用邮件组来沟通不一样,飞桨社区的绝大部分沟通方式是在大家熟悉的微信群里,但从解决 「Good First Issue」 加入进来的社区开发者们, 在熟悉了社区之后,同样可以迸发更大的能量。

再来讲一个故事。

作为源自百度的开源项目,飞桨的运营团队通常可以接触到一些第三方办赛的邀请,这次找到我们的是第六届『中国软件开源创新大赛』,这是一个由中国计算机学会(CCF)主办,西北工业大学、绿色计算产业联盟、CCF 开源发展委员会联合承办的大型赛事,联合百度、清华大学等企业单位以及多所高校共同设置赛题,飞桨参与了『开源任务挑战赛』赛道,发布了 16 道具有一定难度的、需要参赛选手自行拆解与项目管理的开源任务。我们称其为 「HappyOpenSource Pro」 ,快乐开源进阶版。任务详情:飞桨框架任务挑战赛(上)飞桨框架任务挑战赛(下)

让我们惊喜的是,这些即使是内部研发团队都觉得棘手的开发任务,被一批高水平的开发者完美的解决了。以飞桨赛道一等奖项目:赛题五:将 xdoctest 引入到飞桨框架工作流中 为例,项目涉及修改 1400+ API,数十万行代码,24 位开发者近 3 个月协同工作,队长 megemini 成长为 Reviewer,800 万飞桨用户从中受益。

xdoctest-project

更多顺师傅的专访可以查看往期 blog:https://pfcc.blog/posts/shun-story

这件事情让我们愈发相信开源的力量,即使是如此历史包袱重、项目管理难、工程量巨大的开源任务,在找到合适的 owner,提供足够资源支持的情况下,都是有可能被社区开发者们联合解决的。

正在进行中的第五期飞桨黑客马拉松 PaddlePaddle Hackathon 5th,是飞桨开源社区一年两度的大型编程活动。

第五期活动发布三大赛道:开源贡献个人挑战赛、大模型应用与创意赛、飞桨护航计划集训营,上线当天即获得了开发者的广泛报名和参与,目前总体任务认领率 100%,核心框架任务提交率接近 90%,许多开发者直呼「卷出新高度」。

paddlepaddle-hackathon

由社区开发者 Tomoko-hjf 开发黑客松小助手,自动更新任务榜单与看板,极大提升了社区活动的自动管理水平。在护航计划集训营中,学员 MarioLulab 兼任助教,搭建开源项目用于管理开发进度与周报提交,欢迎大家前往围观 ➡️ PFCCLab/Camp

与此同时,配套直播课程经过多期打磨,已形成完整的飞桨开源贡献视频资料,并发布在星河社区课程专区 深度学习开发指南——黑客松 5.0 - 飞桨 AI Studio 星河社区-人工智能学习与实训社区,跟着飞桨导师,从这里开始你的黑客松之旅吧 💕

更多黑客松活动情况,可查看 blog:PaddlePaddle Hackathon Episode01PaddlePaddle Hackathon Episode02

8. 飞桨开源社区有哪些玩法

如果你正在寻找一个开源项目做贡献,或有意向加入一个开源组织 or 社区,我们非常欢迎你来飞桨开源社区玩,与我们一起执桨破浪,让深度学习技术的创新与应用更简单

你可以 follow 这样的路径:

社区活动

入门:快乐开源、启航计划

「快乐开源活动」 旨在鼓励更多的开发者参与到飞桨社区的开源建设中,帮助社区修复 bug 或贡献 feature,加入开源、共建飞桨。如果你是刚接触飞桨 or 开源社区的小白,我们十分推荐你从打卡任务开始:

  • 任务一:修改飞桨文档,完成你的第一个 PR,练习 git 操作,熟悉 GitHub 开源协作方式
  • 任务二:拉取 Paddle 代码,完成本地编译,让你对 Paddle 代码有更深入的理解,便于参与后续的框架开发任务
  • 任务三:在 PaddleMIX 中跑通 Stable-Diffusion 训练推理,你会快速掌握飞桨开发套件的使用,便于参与后续的套件开发任务

详情可查看 issue:https://github.com/PaddlePaddle/Paddle/issues/56689

「启航计划」飞桨社区 发起的远程项目,也是「护航计划」的前置活动(不了解护航计划请看这里 ➡️ 护航计划说明)。我们以集训营的形式,鼓励开发者积极参与快乐开源活动,以此提升自己的代码实践能力。你可以把它当做【HACKATHON 预备营】,在这里找到志同道合的小伙伴,一起开发,一起成长。

详情可查看 issue:https://github.com/PaddlePaddle/Paddle/issues/58497

进阶:黑客松、护航计划

「PaddlePaddle Hackathon 飞桨黑客马拉松」 是飞桨社区的大型编程活动,鼓励社区开发者了解与参与飞桨深度学习开源项目与文心大模型开发实践,为飞桨框架、套件、大模型、合作伙伴等生态进行开源贡献。适合具备一定开源贡献基础和代码基础的朋友前来挑战自我~~

第五期黑客松活动火热进行中,详情可查看 issue:

社区组织

技术交流组织:飞桨核心框架贡献者俱乐部 PFCC

PFCC,全称 Paddle Framework Contributor Club,飞桨核心框架贡献者俱乐部,是一个有兴趣、正在、或者已经为飞桨开源框架做开源贡献的贡献者成立的虚拟组织,在这里,飞桨开源框架的贡献者进行讨论、交流和分享,并为飞桨框架做出持续的贡献。

目前,PFCC 已汇聚 100+ Contributor,6 名贡献者成长为 Committer,维持双周一次技术分享会,累计召开 30+ 次,产生上百个议题(详见会议纪要),与飞桨产研团队探讨飞桨框架硬核技术难题,发起联合开发项目。

更多信息可前往社区查看:https://github.com/PaddlePaddle/community/tree/master/pfcc

社区治理组织:飞桨社区开源发展工作组 PPOSDWG

PPOSDWG,全称 PaddlePaddle OpenSource Development Working Group,飞桨社区开源发展工作组,为加强飞桨开源社区的透明治理,提升社区成员的参与感和社区认同,决策飞桨社区的关键事项与治理策略而成立。

2023 年 11 月 16 日,飞桨开源社区举行线上投票选举与成立仪式,39 名合格投票人完成投票,选举产生第一届工作组成员。

更多信息可前往社区查看:https://github.com/PaddlePaddle/community/tree/master/pposdwg

9. 写在最后

我们始终相信,开源社区因为人的汇聚而变得有意义。在这一年中,我们参与和见证了许许多多社区故事,为每一个精彩的 PR 鼓掌喝彩,为每一次「我们 paddle 如何如何」的句式感动,向每一位热爱开源的开发者和研发工程师致敬。

在飞桨开源社区,我们结识了许多有趣可爱的人,程序员不再是一个标签化 🏷 的群体。他们中,有「摸资本主义的鱼,建设社会主义框架」的 Intel 工程师 jinyouzhi,有社区 Committer 手搓框架入职百度的全栈 001 喵喵喵 SigureMo,有「水遍」所有开发任务群强势进入贡献者排行榜的 002 张师傅 Liyulingyue,有获得硬件伙伴高度称赞的 3w+ 部署代码贡献达人 Zheng-Bicheng,...,甚至还有五年级的小朋友 zhiheng-liu 刷新飞桨 Contributor 最小年龄记录。

因此我们萌生了创建这个 blog 网站的想法,由全栈工程师 001 搭建,代码开源在 GitHub,记录飞桨开源社区的故事,欢迎各位开发者投稿呀~~ https://pfcc.blog/

funny-memes

👆一些流传度很广的开发者自制表情包👆

「Shaping PaddlePaddle Future with You,与你一起定义飞桨的未来!」 从来不只是一句口号,就是在这日复一日的平凡生活中,在一行行代码的设计与运行里,在一次次前沿技术的交流与碰撞下,一些改变正在悄然发生。期待飞桨与你共同成长,让我们一起打造易用的深度学习框架与工具组件,在开源的世界走得更远!

',88),P=[c];function b(m,f,_,k,C,S){return r(),a("div",null,P)}const x=e(u,[["render",b]]);export{y as __pageData,x as default}; diff --git a/assets/posts_2023-os-report.md.Pmo8QKJO.lean.js b/assets/posts_2023-os-report.md.Pmo8QKJO.lean.js new file mode 100644 index 0000000..8f83537 --- /dev/null +++ b/assets/posts_2023-os-report.md.Pmo8QKJO.lean.js @@ -0,0 +1 @@ +import{_ as e,o as r,c as a,a as t}from"./chunks/framework.-K2UgQQN.js";const o="/assets/3-3-individual-contributors.GmPWOkG8.jpg",l="/assets/4-1-projects.oGNxzZ7-.jpg",s="/assets/5-1-honours.ySk-nSpf.jpg",d="/assets/6-1-issues.Wy-UHNLr.jpg",n="/assets/6-2-nianhouzaishuo.KmYlS5E8.jpg",i="/assets/6-3-pullrequests.FKAJXid_.jpg",p="/assets/7-1-xdoctest-project.KKsNIISm.jpg",h="/assets/7-2-paddlepaddle-hackathon.qGrD_HXl.jpg",g="/assets/9-1-funny-memes.pvEq2GpS.jpg",y=JSON.parse('{"title":"飞桨开源社区成为国内 Top,我们做对了什么?","description":"","frontmatter":{"title":"飞桨开源社区成为国内 Top,我们做对了什么?","date":"2023-12-02T00:00:00.000Z","author":{"name":"梦师傅","github":"Ligoml"}},"headers":[],"relativePath":"posts/2023-os-report.md","filePath":"posts/2023-os-report.md"}'),u={name:"posts/2023-os-report.md"},c=t("",88),P=[c];function b(m,f,_,k,C,S){return r(),a("div",null,P)}const x=e(u,[["render",b]]);export{y as __pageData,x as default}; diff --git a/assets/posts_chengdu-kaiyuanshe.md.H7ofFX8l.js b/assets/posts_chengdu-kaiyuanshe.md.H7ofFX8l.js new file mode 100644 index 0000000..5995e92 --- /dev/null +++ b/assets/posts_chengdu-kaiyuanshe.md.H7ofFX8l.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,a as r}from"./chunks/framework.-K2UgQQN.js";const s="/assets/chengdu-kaiyuanshe-01._4LXNiWA.jpg",n="/assets/chengdu-kaiyuanshe-02.EyG1HLeE.jpg",o="/assets/chengdu-kaiyuanshe-03._SCyV9PU.jpg",p="/assets/chengdu-kaiyuanshe-04.bqO-leAc.jpg",h="/assets/chengdu-kaiyuanshe-05.3YM4UJaX.jpg",i="/assets/chengdu-egg.Q3-Pq_K_.jpg",y=JSON.parse('{"title":"飞桨社区成都行:开源社活动与开发者线下 Meetup","description":"","frontmatter":{"title":"飞桨社区成都行:开源社活动与开发者线下 Meetup","date":"2023-11-02T00:00:00.000Z","author":{"name":"孙师傅","github":"sunzhongkai588"}},"headers":[],"relativePath":"posts/chengdu-kaiyuanshe.md","filePath":"posts/chengdu-kaiyuanshe.md"}'),c={name:"posts/chengdu-kaiyuanshe.md"},g=r('

2023 年 10 月 28 日、29 日参加开源社举办的「第八届中国开源年会」的精彩瞬间,以及与咱 Paddle 社区成都开发者们的线下见面~

第八届中国开源年会

飞桨开源社区受邀参加第八届中国开源年会,梦师傅和我(孙师傅)都贡献了两场精彩的演讲 🎉。

28 日的活动中,梦师傅在青少年开源与开源教育分论坛上,分享了主题为「走进开源社区」的演讲,向祖国的仙人掌们 🌵 宣传咱们充满趣味和活力的飞桨开源社区。

图片1

图片2

梦师傅还鼓励了很多青年开发者加入飞桨开源社区,其中甚至有一名刚年满 15 岁的初中学生,在活动后提交了 PR 并成功合入,成为了 Paddle 的 contributor @BernieHuang2008

29 日的主论坛上,孙师傅进行了闪电演讲,分享了「如何在开源社区摸 🐟」,介绍了孙师傅工作 0.5kun 年🐔 里总结的摸鱼心得。

图片3

演讲的详细内容将在后续的博客中分享,敬请期待~

飞桨社区成都开发者 Meetup

在 29 日,我们还相约飞桨社区成都的开发者们线下面基,以下是痛失真名的成都开发者(网友):

图片4

梦师傅还很贴心的给每位开发者赠送了 PaddlePaddle contributor 专属徽章 🥳。

图片5

期待未来与成都的伙伴们再次见面!

彩蛋 🎊

最后,我们还一起跟随军哥 @jzhang533 观看了一场外国小姐姐的 livehouse,很精彩哟!

图片6

',20),u=[g];function l(_,d,m,f,b,k){return a(),t("div",null,u)}const j=e(c,[["render",l]]);export{y as __pageData,j as default}; diff --git a/assets/posts_chengdu-kaiyuanshe.md.H7ofFX8l.lean.js b/assets/posts_chengdu-kaiyuanshe.md.H7ofFX8l.lean.js new file mode 100644 index 0000000..5c942d7 --- /dev/null +++ b/assets/posts_chengdu-kaiyuanshe.md.H7ofFX8l.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,a as r}from"./chunks/framework.-K2UgQQN.js";const s="/assets/chengdu-kaiyuanshe-01._4LXNiWA.jpg",n="/assets/chengdu-kaiyuanshe-02.EyG1HLeE.jpg",o="/assets/chengdu-kaiyuanshe-03._SCyV9PU.jpg",p="/assets/chengdu-kaiyuanshe-04.bqO-leAc.jpg",h="/assets/chengdu-kaiyuanshe-05.3YM4UJaX.jpg",i="/assets/chengdu-egg.Q3-Pq_K_.jpg",y=JSON.parse('{"title":"飞桨社区成都行:开源社活动与开发者线下 Meetup","description":"","frontmatter":{"title":"飞桨社区成都行:开源社活动与开发者线下 Meetup","date":"2023-11-02T00:00:00.000Z","author":{"name":"孙师傅","github":"sunzhongkai588"}},"headers":[],"relativePath":"posts/chengdu-kaiyuanshe.md","filePath":"posts/chengdu-kaiyuanshe.md"}'),c={name:"posts/chengdu-kaiyuanshe.md"},g=r("",20),u=[g];function l(_,d,m,f,b,k){return a(),t("div",null,u)}const j=e(c,[["render",l]]);export{y as __pageData,j as default}; diff --git a/assets/posts_chuan-story.md.HU9Msoba.js b/assets/posts_chuan-story.md.HU9Msoba.js new file mode 100644 index 0000000..9a4d736 --- /dev/null +++ b/assets/posts_chuan-story.md.HU9Msoba.js @@ -0,0 +1 @@ +import{M as r,_ as o}from"./chunks/MessageBox.Gn3asJyB.js";import{o as i,c as l,b as a,w as e,a as n,d as t,e as s}from"./chunks/framework.-K2UgQQN.js";const p="/assets/chuan-01.BvnMSUcM.jpg",g="/assets/chuan-02.KhOSUl-W.jpg",h="/assets/chuan-03.DVz_lsP1.jpg",u="/assets/chuan-04.Ka2bKmg3.jpg",c="/assets/chuan-05.k2Nf0D4c.jpg",d="/assets/chuan-06.EnI-qzwM.jpg",_="/assets/chuan-07.6D-05KuB.jpg",f="/assets/chuan-08.NIP_y4Io.jpg",m="/assets/chuan-09.KOMCcV5Z.jpg",b="/assets/chuan-10.kLO-niB4.jpg",y="/assets/chuan-11.dDFoZ_Xf.jpg",P="/assets/chuan-12.LktrM_Fc.jpg",k="/assets/chuan-13.c5SlvAhq.jpg",S="/assets/chuan-14.dWLFx5z0.jpg",j="/assets/chuan-15.8X6v0TXa.jpg",x="/assets/chuan-16.CJBaiNrg.jpg",A="/assets/chuan-17.U-xJxWcO.jpg",T=n('

“桨声川水悠悠过,长路漫漫风光留”,这次我们要采访的是小伙伴们都熟悉的励志富哥儿——川川师傅

一、前言

按川川要求,以下均以 🍢🍢 代称川川。

川川目前是一名平平无奇的大学生🧑‍🎓,也是 Paddle 社区里的一名资深开发者。他精通(🍢🍢: 我没有,不是,别瞎说🐶)Java、Python、C++ 等多门编程语言,还掌握 Flutter、Android、Vue 等工具,可谓多才多艺!

川川加入 Paddle 社区后,从最简单的文档修改任务开始,到参与快乐开源、熟悉 paddle 框架,到参与充满难度和挑战的护航计划,到最终自己能够独立的拆解问题、发起社区项目(ruff 升级),我们亲眼见证了他一步步的成长 (怎么有种养成系的感觉)

chuan-01

在提升自我外,川师傅也多次热心地帮助新伙伴们解决 bug、回答问题。(所以大家如果有问题,可以随时在群里骚扰他哦

chuan-02

然而当抛开“Paddle 社区开发者”“学生”等形象标签后,单独地看川师傅自身的人生经历,可谓是非常的励志。你敢相信,川师傅是从中专、大专一路读上来的吗?川师傅的经历像是一本精彩绝伦的探险故事集。接下来让我们来读读他的探险之旅吧!

chuan-03

!!!注意!!!上图为川川师傅の帅照,小伙伴们可以截图保存哦!😝😝😝😝

二、采访内容

  1. 介绍一下自己吧,川川师傅 o(_ ̄3 ̄)o !

    🍢🍢: 我的 AI Studio 账号是 gouzi,GitHub 的账号是 gouzil!o( ̄ε ̄_)o

  2. 作为一个 21 岁青春男大,平时有什么兴趣爱好?听说你喜欢出去玩,你在福建有什么推荐给大家打卡的景点么?哈哈~

    🍢🍢: 爱好当然是出去走走玩玩,感受一下人间烟火气。打卡的话当然是福建的省会厦门啦🐶,在十里长堤跟着男女朋友看看夕阳,鼓浪屿的小巷子。平潭岛也挺不错的(🍢🍢没去过但是朋友圈已经发爆了,图中为蓝眼泪时期,需要特定的季节,且肉眼看不出来这种效果,需要相机长曝光,大家别跑空咯)。

    厦门杏林大桥(来源: 川川相册)
    厦门杏林大桥(来源: 川川相册)
    十里长堤(来源: 川川相册)
    十里长堤(来源: 川川相册)
    鼓浪屿(来源:厦门文旅公众号)
    鼓浪屿(来源:厦门文旅公众号)
    平潭(来源: 新华社 2023/04/29 )
    平潭(来源: 新华社 2023/04/29 )
  3. 据我了解,你在初中时就用易语言写了个安卓 APP 给奶奶使用,你能详细讲讲这个 APP 的设计目的和功能么?你当时学习了些什么技术才把这个 APP 做成?那又是通过哪种方式(看书?上网学习?视频?)学习的呢?

    🍢🍢: 1️⃣ 其实设计这个 APP 是因为奶奶不识字,但是又需要使用手机(而正常手机打电话都是看人的名字进行拨打)。这个 APP 可以理解为一个默认桌面,手机解锁后 APP 就打开,打开后是像下图一样的手机联系人的照片,其实就是把联系人名字变成对应的他们的图片,这样尽管奶奶不识字,也可以看照片进行操作了!🐶 2️⃣ 当时学了啥技术: 其实也没具体的学,因为易语言是中文,有一定的思维逻辑就能实现啦。3️⃣ 通过哪种方式: 翻翻编译器自带的易语言说明(那时候 bilibili 还没有那么火,也没有啥书,只有一台能跑安卓模拟器的电脑)。

    chuan-08
  4. 在 16 岁左右,你就陆陆续续自学了 Python、Java、C,后来又自学了 Go、Android 等等,在这个自学过程中你遇到了那些困难,又有想过放弃么?

    🍢🍢: 遇到困难当然是有的,很难想象 C 我看了半年视频才学会的(有部分原因是我比较拖, 学习一门新的语言时长最好不要超过两周, 因为后续的项目会慢慢的补上来的)。每次接触一门新的语言都会对计算机有更深的理解,理解不同语言为什么要这么做,这么做的优缺点,这也是不断学习的动力吧。想过放弃么: 没有,我还挺感兴趣的,兴趣是最好的老师。

  5. 能简单聊聊你的这几年的学习经历么?

    🍢🍢: 下图最右侧那一列就是学习的顺序啦(学那么多真没啥用,学好一个精通它就行)。也没啥经验,顺其自然就好啦,等学完技术应该也更新了。最快的方式就是跟着项目走,不断的优化它 (最后就会发现:我写的什么玩意,要不要重构🐶) 。不过倒是有几个提升比较大的时间段,一个是去参加了云计算比赛,让我会了 linux 和 docker 这些。一个是实习的那一年,让我整明白了网站这一套(B/S,C/S)。

    chuan-09

  6. 现在社区开发者都认为你的编程能力很强,和学历形成了很大反差,能透露一下当时是为什么会上中专呢?是因为偏科吗?

    🍢🍢: 不是偏科啦,我差的很平均🐶。顺带说一下厦门的初升高录取率为 45%,现在好些了 50%,卷不动卷不动,当然更多是因为我比较菜。

  7. 事实上在目前的舆论环境里,“专科生”是一个很遭受非议的标签😮‍💨,而作为一个亲历者,你内心的是怎么面对的呢?你当时又做了哪些方面的努力?

    🍢🍢: 关于这个标签的话,我只想说:你说的对。没啥必要在乎别人的看法,做自己热爱的事情就好啦。

  8. 作为目前考上本科的计算机应用技术专业的学生,你对未来的职业发展有怎样的规划和期望✊✊✊?

    🍢🍢: 我更喜欢做一些底层的工作,不太喜欢做应用层。规划:入职百度,重构 paddle

  9. 作为厦门领航团的一员,你当时是什么契机接触 Paddle 社区的?在 Paddle 社区做的第一个开源项目是什么?

    🍢🍢: 说到这个契机啊,非常简单,你的上司是厦门领航团团长就行。第一个开源项目当然是我们孙师傅(@sunzhongkai588)的 docs 啦,当然非常感谢佳维姐姐(@dingjiaweiww)和梦师傅(@Ligoml)的鼓励和协助我完成了在 paddle 的第一个 pr。

  10. 在社区里如何和其他开发者进行互动的?有没有什么特别有意思的经历或故事?

    🍢🍢: 我一般有碰上问题就出来回答啦,或者一些技术讨论。特别的故事:五年级的小朋友叫我叔叔算嘛

    chuan-10

  11. 对于 Paddle 框架护航计划,可以分享一下你的面试经历和感受吗?你觉得到达什么水平可以通过护航计划的面试?

    🍢🍢: 经历的话,放心研发大哥不会难为你的,真诚就行。感受 emmm,大家一定要提前准备啊,刷刷算法什么的。什么水平 emmm,我也不太清楚,但是最好是熟悉 padlle,或者你的能力超级无敌强。

    编者注✍️:「护航计划」可以简单理解为飞桨的远程实习项目,可参考 护航计划集训营说明

  12. 参与护航计划时,有什么不一样的感受吗?实际开发过程有没有遇到困难,是怎么解决的?

    🍢🍢: 最大的感受就是,终于从应用层转向了框架层。困难是肯定有的,也有非常多不会的,但是这没关系,问研发大哥就行。就像昆昆(@2742195759)说的: 你尽管问,我就是你的文档。

  13. 在 Paddle 社区中,你参与的哪个项目(或活动)你印象最深刻,能简单描述一下这个项目么?这个项目让你收获了什么?

    🍢🍢: 印象最深的项目是下一个项目,下一个项目可以把之前项目的经验集结起来,也可以学到一些新的知识。当然 PaddleSOT 印象也挺深的,这也是我护航计划的项目。收获更多的是技术的进步吧。有时候看看喵喵(@SigureMo)的修改会发现,噢原来还能这么写。

    chuan-11

  14. 对于深度学习领域,你有哪些想法和研究方向?目前有没有感兴趣的方向?

    🍢🍢: 我其实更多的还是喜欢框架层,怎样才能让整个框架跑的更快,占用更低,更加的易用化。

  15. 发挥一下想象力,如果将深度学习比作一种食物,你觉得它会是什么?为什么?

    🍢🍢: 可能是米饭吧,喂的越多越有力气,跑的越快,力大砖飞。

  16. 听说你使用飞桨解决过很多企业实际问题时,你遇到过最有趣的案例是什么?那么你是如何应用深度学习技术解决这个问题的?

    🍢🍢: 我实习这个企业吧,他刚尝试深度学习,所以一般调调 API 就行了,更多的是怎样去分配资源,做到效率最大化 (我司全是 1050 的卡,我能咋办,我也很绝望啊)

  17. 除了深度学习,你还对其他领域感兴趣吗?有没有想过将深度学习与其他领域结合,创造出一些令人惊喜的应用?

    🍢🍢: 其他领域其实有的,比如摄影和游戏,结合的话有想过,但是还没新建文件夹就不说了🐶

  18. 如果你有机会和 Paddle 社区 or 深度学习领域 or 计算机领域 的一位顶级专家进行合作,你希望和他/她一起研究什么问题?为什么?

    🍢🍢: 这可就太多了,比如:不同语言的通信,怎么做到程序的相对安全,怎样去减少硬件之间的瓶颈。为什么 emmm,可能是因为自己对这方面感兴趣吧。

  19. 如果让你形容一下你和 Paddle 社区的关系,你会怎么说?

    🍢🍢: 相互促进,互相成就(更多还是 paddle 社区的大佬单方面带着我)

  20. 最后,作为一个热情、励志的年轻人,你想对 Paddle 社区里的开源者们说些什么呢?

    🍢🍢: 放开那道题,让我来🐶

三、“鲁迅之我确实说过这话”专区

同样我们也邀请了一些和川川很熟悉的、有过合作经历的朋友们,贡献一下和川师傅相关的故事,或者他们对川师傅的评价~以下均为真心话,请放心看!

chuan-12

by 散步(sanbuphy

',17),q=t("h3",{id:"by-卢师傅-andsonder",tabindex:"-1"},[s("by 卢师傅("),t("a",{href:"https://github.com/AndSonder",target:"_blank",rel:"noreferrer"},"AndSonder"),s(") "),t("a",{class:"header-anchor",href:"#by-卢师傅-andsonder","aria-label":'Permalink to "by 卢师傅([AndSonder](https://github.com/AndSonder))"'},"​")],-1),w=t("blockquote",null,[t("p",null,"编者注✍️:迪迪小组是上海 meetup 期间,相约去迪士尼玩的小分队")],-1),v=t("h3",{id:"by-一师傅-siguremo",tabindex:"-1"},[s("by 一师傅("),t("a",{href:"https://github.com/SigureMo",target:"_blank",rel:"noreferrer"},"SigureMo"),s(") "),t("a",{class:"header-anchor",href:"#by-一师傅-siguremo","aria-label":'Permalink to "by 一师傅([SigureMo](https://github.com/SigureMo))"'},"​")],-1),M=t("br",null,null,-1),C=t("br",null,null,-1),V=t("h3",{id:"by-花花-tulip-hua",tabindex:"-1"},[s("by 花花("),t("a",{href:"https://github.com/Tulip-hua",target:"_blank",rel:"noreferrer"},"Tulip-hua"),s(") "),t("a",{class:"header-anchor",href:"#by-花花-tulip-hua","aria-label":'Permalink to "by 花花([Tulip-hua](https://github.com/Tulip-hua))"'},"​")],-1),z=t("h2",{id:"四、特别栏目——爱在何方之川川相亲帖",tabindex:"-1"},[s("四、特别栏目——爱在何方之川川相亲帖 "),t("a",{class:"header-anchor",href:"#四、特别栏目——爱在何方之川川相亲帖","aria-label":'Permalink to "四、特别栏目——爱在何方之川川相亲帖"'},"​")],-1),N=t("p",null,"接下来,有请男嘉宾——小富哥儿川川来进行一段自我介绍✨。",-1),B=n('

有意者,请扫码加入快乐开源群,联系川川师傅(找头像即可)。

chuan-13

彩蛋 🥚

最后让我们欣赏一下川大摄影师的大作吧 📷

北京 798 艺术区
北京 798 艺术区
福州三江口大桥
福州三江口大桥
福州烟台山
福州烟台山
厦门中医院附近
厦门中医院附近

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


',11),L=JSON.parse('{"title":"【开源江湖闲聊录】英雄不问出处:川师傅的逆袭之路","description":"","frontmatter":{"title":"【开源江湖闲聊录】英雄不问出处:川师傅的逆袭之路","date":"2023-11-28T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇","github":"wenxiaohahaha"},{"name":"田川(川川)","github":"gouzil"}]},"headers":[],"relativePath":"posts/chuan-story.md","filePath":"posts/chuan-story.md"}'),I={name:"posts/chuan-story.md"},E=Object.assign(I,{setup(O){return(D,R)=>(i(),l("div",null,[T,a(r,null,{default:e(()=>[a(o,{name:"散佬",github:"sanbuphy"},{default:e(()=>[s(" 和川川交流还算比较多,川川基本上有空都会帮你解决任何疑问,甚至是看代码。虽然是年轻的富哥,但很努力上进,甚至比孙师傅还努力🐶;总体来说算很善良的小哥,教过我很多东西。希望能和他一起学习成长,向他多学习请教一些代码之道,早日都一起为中国开源社区多做一些更有价值的事情。 在我无数个老师中,他肯定是我印象深刻的老师之一。 ")]),_:1})]),_:1}),q,a(r,null,{default:e(()=>[a(o,{name:"卢畅",github:"AndSonder"},{default:e(()=>[s(" 有幸在今年暑期上海 meetup 上认识了川师傅,很低调的技术大佬。在川师傅身上能看到对开源活动的热情,各大活动上都能看到川师傅的身影。希望以后还有机会和川师傅线下面基,迪迪小组再次出发! ")]),_:1})]),_:1}),w,v,a(r,null,{default:e(()=>[a(o,{name:"喵喵",github:"SigureMo"},{default:e(()=>[s(" 自川子参与第一期护航计划开始已经马上就要 6 个月了,我和川子也算是深度交流了 6 个月。从护航计划来看,川子始终保持十足的热情,在 PaddleSOT 那时候还是以开源任务的形式发放,但每次有任务川子都会第一时间认领。之后到现在动转静单测推全,我的 review 速度都赶不上川子提 PR 的速度了……此外川子涉猎甚广,在交流的过程中我也学到了很多东西,川子也会参加各种开源任务,你基本上可以在任何「角落」里看到川子的身影~ "),M,s(" 川子这 6 个月也是成长了很多,从早期每个任务都需要细致沟通到现在发完任务基本就心照不宣了,也能独立完成很多任务了。比如 Ruff 的升级优化,目前川子对 Ruff 的了解程度已经仅次于我了,再比如 OpResult 方法的 patch 补全,以及动转静单测机制,基本都是川子独立完成的。对于大多数任务,现在我已经能放心地说:「川子,这个就交给你了」 "),C,s(" 另外,「提前」说一下,川子贼有钱~ ")]),_:1})]),_:1}),V,a(r,null,{default:e(()=>[a(o,{name:"花花",github:"Tulip-hua"},{default:e(()=>[s(" 我愿称川川为飞桨开源社区小天使 ")]),_:1})]),_:1}),z,N,a(r,null,{default:e(()=>[a(o,{name:"🍢🍢",github:"gouzil"},{default:e(()=>[s(" 报菜名环节,身高179cm,体重65kg(±5kg),来自福建厦门,2002年出生,目前在福州读书,不抽烟,不喝酒。性格有点太温柔了,不太凶得起来。对陌生人有点社恐,熟悉了之后就好很多。有一点点宅,但不会非常宅,还是会出去走走(不然咋拍照片🐶)。有一点点强迫症,比如下面这张798的照片好像有点歪了。喔对了川川不会做饭。期望伴侣,可以稍微e一点,拉着我出去玩🐶。(🍢🍢: 咱就是说还有几个月才到22,也不至于这么着急吧🐶) ")]),_:1})]),_:1}),B]))}});export{L as __pageData,E as default}; diff --git a/assets/posts_chuan-story.md.HU9Msoba.lean.js b/assets/posts_chuan-story.md.HU9Msoba.lean.js new file mode 100644 index 0000000..eadde38 --- /dev/null +++ b/assets/posts_chuan-story.md.HU9Msoba.lean.js @@ -0,0 +1 @@ +import{M as r,_ as o}from"./chunks/MessageBox.Gn3asJyB.js";import{o as i,c as l,b as a,w as e,a as n,d as t,e as s}from"./chunks/framework.-K2UgQQN.js";const p="/assets/chuan-01.BvnMSUcM.jpg",g="/assets/chuan-02.KhOSUl-W.jpg",h="/assets/chuan-03.DVz_lsP1.jpg",u="/assets/chuan-04.Ka2bKmg3.jpg",c="/assets/chuan-05.k2Nf0D4c.jpg",d="/assets/chuan-06.EnI-qzwM.jpg",_="/assets/chuan-07.6D-05KuB.jpg",f="/assets/chuan-08.NIP_y4Io.jpg",m="/assets/chuan-09.KOMCcV5Z.jpg",b="/assets/chuan-10.kLO-niB4.jpg",y="/assets/chuan-11.dDFoZ_Xf.jpg",P="/assets/chuan-12.LktrM_Fc.jpg",k="/assets/chuan-13.c5SlvAhq.jpg",S="/assets/chuan-14.dWLFx5z0.jpg",j="/assets/chuan-15.8X6v0TXa.jpg",x="/assets/chuan-16.CJBaiNrg.jpg",A="/assets/chuan-17.U-xJxWcO.jpg",T=n("",17),q=t("h3",{id:"by-卢师傅-andsonder",tabindex:"-1"},[s("by 卢师傅("),t("a",{href:"https://github.com/AndSonder",target:"_blank",rel:"noreferrer"},"AndSonder"),s(") "),t("a",{class:"header-anchor",href:"#by-卢师傅-andsonder","aria-label":'Permalink to "by 卢师傅([AndSonder](https://github.com/AndSonder))"'},"​")],-1),w=t("blockquote",null,[t("p",null,"编者注✍️:迪迪小组是上海 meetup 期间,相约去迪士尼玩的小分队")],-1),v=t("h3",{id:"by-一师傅-siguremo",tabindex:"-1"},[s("by 一师傅("),t("a",{href:"https://github.com/SigureMo",target:"_blank",rel:"noreferrer"},"SigureMo"),s(") "),t("a",{class:"header-anchor",href:"#by-一师傅-siguremo","aria-label":'Permalink to "by 一师傅([SigureMo](https://github.com/SigureMo))"'},"​")],-1),M=t("br",null,null,-1),C=t("br",null,null,-1),V=t("h3",{id:"by-花花-tulip-hua",tabindex:"-1"},[s("by 花花("),t("a",{href:"https://github.com/Tulip-hua",target:"_blank",rel:"noreferrer"},"Tulip-hua"),s(") "),t("a",{class:"header-anchor",href:"#by-花花-tulip-hua","aria-label":'Permalink to "by 花花([Tulip-hua](https://github.com/Tulip-hua))"'},"​")],-1),z=t("h2",{id:"四、特别栏目——爱在何方之川川相亲帖",tabindex:"-1"},[s("四、特别栏目——爱在何方之川川相亲帖 "),t("a",{class:"header-anchor",href:"#四、特别栏目——爱在何方之川川相亲帖","aria-label":'Permalink to "四、特别栏目——爱在何方之川川相亲帖"'},"​")],-1),N=t("p",null,"接下来,有请男嘉宾——小富哥儿川川来进行一段自我介绍✨。",-1),B=n("",11),L=JSON.parse('{"title":"【开源江湖闲聊录】英雄不问出处:川师傅的逆袭之路","description":"","frontmatter":{"title":"【开源江湖闲聊录】英雄不问出处:川师傅的逆袭之路","date":"2023-11-28T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇","github":"wenxiaohahaha"},{"name":"田川(川川)","github":"gouzil"}]},"headers":[],"relativePath":"posts/chuan-story.md","filePath":"posts/chuan-story.md"}'),I={name:"posts/chuan-story.md"},E=Object.assign(I,{setup(O){return(D,R)=>(i(),l("div",null,[T,a(r,null,{default:e(()=>[a(o,{name:"散佬",github:"sanbuphy"},{default:e(()=>[s(" 和川川交流还算比较多,川川基本上有空都会帮你解决任何疑问,甚至是看代码。虽然是年轻的富哥,但很努力上进,甚至比孙师傅还努力🐶;总体来说算很善良的小哥,教过我很多东西。希望能和他一起学习成长,向他多学习请教一些代码之道,早日都一起为中国开源社区多做一些更有价值的事情。 在我无数个老师中,他肯定是我印象深刻的老师之一。 ")]),_:1})]),_:1}),q,a(r,null,{default:e(()=>[a(o,{name:"卢畅",github:"AndSonder"},{default:e(()=>[s(" 有幸在今年暑期上海 meetup 上认识了川师傅,很低调的技术大佬。在川师傅身上能看到对开源活动的热情,各大活动上都能看到川师傅的身影。希望以后还有机会和川师傅线下面基,迪迪小组再次出发! ")]),_:1})]),_:1}),w,v,a(r,null,{default:e(()=>[a(o,{name:"喵喵",github:"SigureMo"},{default:e(()=>[s(" 自川子参与第一期护航计划开始已经马上就要 6 个月了,我和川子也算是深度交流了 6 个月。从护航计划来看,川子始终保持十足的热情,在 PaddleSOT 那时候还是以开源任务的形式发放,但每次有任务川子都会第一时间认领。之后到现在动转静单测推全,我的 review 速度都赶不上川子提 PR 的速度了……此外川子涉猎甚广,在交流的过程中我也学到了很多东西,川子也会参加各种开源任务,你基本上可以在任何「角落」里看到川子的身影~ "),M,s(" 川子这 6 个月也是成长了很多,从早期每个任务都需要细致沟通到现在发完任务基本就心照不宣了,也能独立完成很多任务了。比如 Ruff 的升级优化,目前川子对 Ruff 的了解程度已经仅次于我了,再比如 OpResult 方法的 patch 补全,以及动转静单测机制,基本都是川子独立完成的。对于大多数任务,现在我已经能放心地说:「川子,这个就交给你了」 "),C,s(" 另外,「提前」说一下,川子贼有钱~ ")]),_:1})]),_:1}),V,a(r,null,{default:e(()=>[a(o,{name:"花花",github:"Tulip-hua"},{default:e(()=>[s(" 我愿称川川为飞桨开源社区小天使 ")]),_:1})]),_:1}),z,N,a(r,null,{default:e(()=>[a(o,{name:"🍢🍢",github:"gouzil"},{default:e(()=>[s(" 报菜名环节,身高179cm,体重65kg(±5kg),来自福建厦门,2002年出生,目前在福州读书,不抽烟,不喝酒。性格有点太温柔了,不太凶得起来。对陌生人有点社恐,熟悉了之后就好很多。有一点点宅,但不会非常宅,还是会出去走走(不然咋拍照片🐶)。有一点点强迫症,比如下面这张798的照片好像有点歪了。喔对了川川不会做饭。期望伴侣,可以稍微e一点,拉着我出去玩🐶。(🍢🍢: 咱就是说还有几个月才到22,也不至于这么着急吧🐶) ")]),_:1})]),_:1}),B]))}});export{L as __pageData,E as default}; diff --git a/assets/posts_first-post.md.-jvuBI1_.js b/assets/posts_first-post.md.-jvuBI1_.js new file mode 100644 index 0000000..891420d --- /dev/null +++ b/assets/posts_first-post.md.-jvuBI1_.js @@ -0,0 +1 @@ +import{_ as s}from"./chunks/first-post.B_qpWiqd.js";import{_ as o,o as r,c as a,d as t,e}from"./chunks/framework.-K2UgQQN.js";const P=JSON.parse('{"title":"在这里,记录有趣的飞桨开源社区故事!","description":"","frontmatter":{"title":"在这里,记录有趣的飞桨开源社区故事!","date":"2023-10-24T00:00:00.000Z","author":{"name":"Nyakku Shigure","github":"SigureMo"}},"headers":[],"relativePath":"posts/first-post.md","filePath":"posts/first-post.md"}'),i={name:"posts/first-post.md"},l=t("p",null,[e("这是一个半官方的飞桨开源社区博客,由社区成员自发维护,记录社区的有趣的故事,欢迎大家投稿。投稿方式:在 "),t("a",{href:"https://github.com/PFCCLab/blog",target:"_blank",rel:"noreferrer"},"blog"),e(" 代码仓库里提交 PullRequest 即可,Pull Request 会自动触发 CI,CI 通过后,你的文章就会被自动发布到这里。")],-1),n=t("p",null,[e("感谢 001 "),t("a",{href:"https://github.com/SigureMo",target:"_blank",rel:"noreferrer"},"@SigureMo"),e(" 帮忙搭建了这个博客。")],-1),c=t("p",null,[t("img",{src:s,alt:"first-blog"})],-1),p=[l,n,c];function _(u,d,f,h,m,g){return r(),a("div",null,p)}const S=o(i,[["render",_]]);export{P as __pageData,S as default}; diff --git a/assets/posts_first-post.md.-jvuBI1_.lean.js b/assets/posts_first-post.md.-jvuBI1_.lean.js new file mode 100644 index 0000000..891420d --- /dev/null +++ b/assets/posts_first-post.md.-jvuBI1_.lean.js @@ -0,0 +1 @@ +import{_ as s}from"./chunks/first-post.B_qpWiqd.js";import{_ as o,o as r,c as a,d as t,e}from"./chunks/framework.-K2UgQQN.js";const P=JSON.parse('{"title":"在这里,记录有趣的飞桨开源社区故事!","description":"","frontmatter":{"title":"在这里,记录有趣的飞桨开源社区故事!","date":"2023-10-24T00:00:00.000Z","author":{"name":"Nyakku Shigure","github":"SigureMo"}},"headers":[],"relativePath":"posts/first-post.md","filePath":"posts/first-post.md"}'),i={name:"posts/first-post.md"},l=t("p",null,[e("这是一个半官方的飞桨开源社区博客,由社区成员自发维护,记录社区的有趣的故事,欢迎大家投稿。投稿方式:在 "),t("a",{href:"https://github.com/PFCCLab/blog",target:"_blank",rel:"noreferrer"},"blog"),e(" 代码仓库里提交 PullRequest 即可,Pull Request 会自动触发 CI,CI 通过后,你的文章就会被自动发布到这里。")],-1),n=t("p",null,[e("感谢 001 "),t("a",{href:"https://github.com/SigureMo",target:"_blank",rel:"noreferrer"},"@SigureMo"),e(" 帮忙搭建了这个博客。")],-1),c=t("p",null,[t("img",{src:s,alt:"first-blog"})],-1),p=[l,n,c];function _(u,d,f,h,m,g){return r(),a("div",null,p)}const S=o(i,[["render",_]]);export{P as __pageData,S as default}; diff --git a/assets/posts_hackathon-5th-episode01.md.m4EkiTMR.js b/assets/posts_hackathon-5th-episode01.md.m4EkiTMR.js new file mode 100644 index 0000000..64f45ab --- /dev/null +++ b/assets/posts_hackathon-5th-episode01.md.m4EkiTMR.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as d,a}from"./chunks/framework.-K2UgQQN.js";const g=JSON.parse('{"title":"PaddlePaddle Hackathon Episode 01 | 第五期活动上线 4 周,直播圆满收官,三大赛道进展顺利","description":"","frontmatter":{"title":"PaddlePaddle Hackathon Episode 01 | 第五期活动上线 4 周,直播圆满收官,三大赛道进展顺利","date":"2023-11-03T00:00:00.000Z","author":{"name":"梦师傅","github":"Ligoml"},"co_authors":[{"name":"花花","github":"Tulip-hua"}]},"headers":[],"relativePath":"posts/hackathon-5th-episode01.md","filePath":"posts/hackathon-5th-episode01.md"}'),E={name:"posts/hackathon-5th-episode01.md"},r=a('

向大家快速介绍飞桨黑客松第五期活动上线以来的进展(9.25-11.3)

为了吸引社区开发者了解与参与飞桨深度学习开源项目与文心大模型开发实践,为飞桨框架、套件、大模型、合作伙伴等生态进行开源贡献,进一步扩大飞桨开源生态与文心大模型应用生态,我们组织了 PaddlePaddle Hackathon 飞桨黑客松第五期活动。活动开展 4 周的进展速览如下:

  • 开源贡献个人挑战赛:发布 111 个开源贡献任务,包括框架、科学计算、套件和合作伙伴方向,与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品,109 个任务完成认领,60 个任务提交作品,13 个任务已经完成,感谢各位开发者的积极参与,感谢各位导师的及时 review。
  • 大模型应用与创意赛:作为飞桨星河社区五周年预热活动,目标挖掘优质文心一言应用,共发布趣味创意与生产力工具 2 个方向的任务,已有 12 名开发者产出基于 EB SDK 的应用 18 个,均已部署至飞桨星河社区
  • 飞桨护航计划集训营:发布 18 个框架与套件开发项目,1 对 1 带教形式,已完成 18 名学员招募,并提交第一期周报,是飞桨开源社区首次 Code Camp 形式的开源活动,由开发者担任助教

赛道一:开源贡献个人挑战赛

进度看板

任务方向任务数量提交作品 / 任务认领提交率完成完成率
热身赛117 / 1163.64%218.18%
框架 API 开发任务3122 / 3170.97%13.23%
框架其他开发任务1614 / 1687.5%637.5%
科学计算模型复现117 / 1163.64%19.09%
套件开发任务245 / 2320.83%28.33%
合作伙伴任务185 / 1727.78%15.56%

赛道亮点

  • 社区开发者参与热情高,活动发布 1 周认领率接近 100%,提交率 50%+;
  • Tomoko-hjf 开发黑客松小助手,自动更新任务榜单与看板,提升社区活动自动化水平;
  • 直播活动圆满收官,已形成完整的飞桨开源贡献视频资料,详见 issues#58125
  • 本次活动英特尔作为赞助方,并与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品。

参与提示

  • 在上面的看板中能看出来,套件开发任务和合作伙伴开发任务,提交率相对较低,欢迎社区的开发者选择这些任务来挑战~~

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57262

赛道二: 大模型应用与创意赛

我们收到了 127 人报名,提交了 18 个应用,加精项目 10 个。

赛道亮点

  • 全新赛道,作为飞桨星河社区五周年预热活动,推广重点产品星河社区 ERNIE Bot SDK;
  • 完成情况符合预期,上线 4 周即提交 18 个 EB SDK 应用,作品种类多样,涵盖游戏娱乐、办公助手、知识科普等多领域,符合赛道初衷;
  • 社群气氛活跃,新老选手积极交流,且建立了沟通产研的 EB SDK 反馈文档。

参与提示

  • 欢迎大家继续发挥创意,提交更多有趣的应用。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57585

赛道三:飞桨护航计划集训营

18 个任务已全部完成招募,名单公示如下:

项目编号开源贡献 repo项目标题&介绍(点击链接跳转)导师学员
1Paddle算子规范和 ProgramTranslator 功能优化@kangguangli@xingmingyyj
2Paddle新 IR Pass 建设和依赖的核心组件完善@zyfncg@zhangyuqin1998
3Paddle新 IR API + 自动微分推全和核心组件完善@Aurelius84@MarioLulab
4Paddle组合机制前反向架构统一@cyber-pioneer@kevincheng2
5Paddle算子支持复数计算专项@GGBond8488@zyt1024
6Paddle量化算子集成@RichardWooSJTU@Wanglongzhi2001
7Paddle开源模型加速复现@xiaoxiaohehe001@DanGuge
8PaddleCPU 融合算子 / GPU 算子融合 pass@yuanlehome@Xinyu302
9Paddle动态图半自动并行架构研发@LiYuRio@HermitSun
10Paddle静态图半自动并行执行架构升级@From00@AndSonder
11Paddle分布式能力矩阵建设@zhangting2020@SecretXV
12Paddle全自动并行架构升级@Caozhou1995@Corle-hyz
13PaddleScience科学计算领域拓展专项@HydrogenSulfate@xusuyong
14PaddleClasClas 套件全流程建设@cuicheng01@psky1111
15Paddle3D3D 方向模型全流程建设@juncaipeng@kongdebug
16PaddleOCRNougat 复现及优化@tink2123@Frida-a
17PaddleNLPNLP 大模型复现@w5688414@rampage0303
18PaddleSlim套件压缩能力建设@shiyutang@ranchongzhi

集训营亮点

  • 飞桨社区首次以 Code Camp 的形式招募远程开发者,吸引到很多新人,2 周时间迅速完成学员招募与开营仪式;
  • 学员 MarioLulab 兼任助教,搭建开源项目 PFCCLab/Camp 管理开发进度与周报提交,已完成第一期,周报详见 [WeeklyReports] 2023.10.10~2023.10.24
  • 搭建技术分享平台:每周一次源码解读,顺利完成第一期,分享人 DrRyanHuang

参与提示

  • 欢迎大家到代码仓库: Camp 里围观集训营的同学们的工作。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57264

活动运营与推广

联合宣传

与开源中国、启智、OpenVINO、思否、开源社、示说、InfoQ、白玉兰开源、开源之夏等合作伙伴以及海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目联合宣传。

直播

多平台同步直播,10 场直播共计约 1.4 万人次观看,直播信息与学习资料已发布在开源社区,并整理成 AI Studio 专题课程: 深度学习开发指南——黑客松 5.0 - 飞桨 AI Studio 星河社区-人工智能学习与实训社区

日期主题观看总人次
10.16(周一)第五期飞桨黑客松来啦!1956
10.17(周二)新 IR Python API 适配升级967
10.18(周三)模型复现和贡献指南975
10.19(周四)OpenVINO 开源生态建设与贡献任务解析884
10.20(周五)动转静全套件适配任务989
10.23(周一)Arm 虚拟硬件助力边缘人工智能软件开发1887
10.27(周五)跨平台推理框架 InfiniTensor2049
10.30(周一)拓展 LLM 边界:使用向量数据库构建知识库2193
10.31(周二)Paddle 框架在昇腾平台上的推理优化分享1097
11.1(周三)飞桨硬件生态伙伴任务介绍420
',32),l=[r];function A(h,n,o,i,s,B){return e(),d("div",null,l)}const m=t(E,[["render",A]]);export{g as __pageData,m as default}; diff --git a/assets/posts_hackathon-5th-episode01.md.m4EkiTMR.lean.js b/assets/posts_hackathon-5th-episode01.md.m4EkiTMR.lean.js new file mode 100644 index 0000000..5784850 --- /dev/null +++ b/assets/posts_hackathon-5th-episode01.md.m4EkiTMR.lean.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as d,a}from"./chunks/framework.-K2UgQQN.js";const g=JSON.parse('{"title":"PaddlePaddle Hackathon Episode 01 | 第五期活动上线 4 周,直播圆满收官,三大赛道进展顺利","description":"","frontmatter":{"title":"PaddlePaddle Hackathon Episode 01 | 第五期活动上线 4 周,直播圆满收官,三大赛道进展顺利","date":"2023-11-03T00:00:00.000Z","author":{"name":"梦师傅","github":"Ligoml"},"co_authors":[{"name":"花花","github":"Tulip-hua"}]},"headers":[],"relativePath":"posts/hackathon-5th-episode01.md","filePath":"posts/hackathon-5th-episode01.md"}'),E={name:"posts/hackathon-5th-episode01.md"},r=a("",32),l=[r];function A(h,n,o,i,s,B){return e(),d("div",null,l)}const m=t(E,[["render",A]]);export{g as __pageData,m as default}; diff --git a/assets/posts_hackathon-5th-episode02.md.chHv1KWn.js b/assets/posts_hackathon-5th-episode02.md.chHv1KWn.js new file mode 100644 index 0000000..fb20175 --- /dev/null +++ b/assets/posts_hackathon-5th-episode02.md.chHv1KWn.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as a,a as r}from"./chunks/framework.-K2UgQQN.js";const l="/assets/pp-coffee.esm3s-xL.jpeg",m=JSON.parse('{"title":"PaddlePaddle Hackathon Episode 02 | 第五期活动上线 8 周,框架赛道提交率近 90%","description":"","frontmatter":{"title":"PaddlePaddle Hackathon Episode 02 | 第五期活动上线 8 周,框架赛道提交率近 90%","date":"2023-12-01T00:00:00.000Z","author":{"name":"梦师傅","github":"Ligoml"},"co_authors":[{"name":"花花","github":"Tulip-hua"}]},"headers":[],"relativePath":"posts/hackathon-5th-episode02.md","filePath":"posts/hackathon-5th-episode02.md"}'),n={name:"posts/hackathon-5th-episode02.md"},d=r('

向大家快速介绍飞桨黑客松第五期开展以来的进展(11.4-12.1)

为了吸引社区开发者了解与参与飞桨深度学习开源项目与文心大模型开发实践,为飞桨框架、套件、大模型、合作伙伴等生态进行开源贡献,进一步扩大飞桨开源生态与文心大模型应用生态,我们组织了 PaddlePaddle Hackathon 飞桨黑客松第五期活动。活动开展 8 周的进展速览如下:

  • 开源贡献个人挑战赛:发布 110 个开源贡献任务,包括框架、科学计算、套件和合作伙伴方向,与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品,全部任务完成认领,72 个任务提交作品,32 个任务已经完成,框架方向提交率近 90%,科学计算方向提交率 70%+,进展超出预期,感谢各位开发者的积极参与,感谢各位导师的及时 review。
  • 大模型应用与创意赛:作为飞桨星河社区五周年预热活动,目标挖掘优质文心一言应用,共发布趣味创意与生产力工具 2 个方向的任务,已有 22 名开发者产出基于 EB SDK 的应用 34 个,均已部署至应用中心
  • 飞桨护航计划集训营:共有 22 名社区开源开发者在社区导师的指导下,进行飞桨开源项目开发。 按期完成了两期双周报提交,完成了 3 期技术分享,成果全部沉淀到开源社区

赛道一:开源贡献个人挑战赛

进度看板

任务方向任务数量提交作品 / 任务认领提交率完成完成率
热身赛1110 / 1190.91%436.36%
框架 API 开发任务3128 / 3190.32%619.35%
框架其他开发任务1615 / 1693.75%1381.25%
科学计算模型复现118 / 1172.73%436.36%
套件开发任务246 / 2425.0%312.5%
合作伙伴任务175 / 1729.41%211.76%

赛道亮点

  • 尽管本期黑客松整体难度较往期提升,但社区开发者表现出了极大的专业能力和热情,任务已经 100% 被大家认领;
  • 框架方向提交率近 90%,科学计算方向提交率 70%+,均高于往期黑客松。

参与提示

  • 在上面的看板中能看出来,套件开发任务和合作伙伴开发任务,提交率依然较低,欢迎社区的开发者选择这些任务来挑战。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57262

赛道二: 大模型应用与创意赛

部分应用展示

我们收到了 270 人报名,提交了 34 个应用,在这里节选部分有趣的应用,欢迎大家在线体验。

赛道亮点

  • 社区开发者们基于文心大模型的 SDK: ERNIE Bot SDK,提交了种类多样,涵盖多领域作品,充分探索了使用文心大模型能做到的创意和创新。

参与提示

  • 欢迎大家继续发挥创意,提交更多有趣的应用。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57585

赛道三:飞桨护航计划集训营

活动进展

集训营的同学已经完成了两次开源开发的双周报: WeeklyReports 2023.10.25~2023.11.07WeeklyReports 2023.11.08~2023.11.21 和三次技术分享

集训营亮点

  • 集训营将整个过程以开源的方式公开和协作,学员和导师在线研讨和互相促进。
  • 社区开发者展现了极高的专业性和热情,详见导师点评:@Aurelius84@From00@RichardWooSJTU@Caozhou1995

参与提示

  • 欢迎大家到代码仓库: Camp 里围观集训营的同学们的工作。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57264

彩蛋 🎊: 欢迎大家线下来见面

本周六(12 月 2 日)14:00 - 17:00 在 北京 798 举行飞桨开源社区 meetup,报名问卷:https://paddle.wjx.cn/vm/m1OLk4E.aspx# ,欢迎大家来聊天,飞桨定制咖啡等你打卡,梦师傅和花花在咖啡厅等着大家~

hackathon-5th-pp-coffee

',31),i=[d];function s(o,h,c,g,p,u){return e(),a("div",null,i)}const x=t(n,[["render",s]]);export{m as __pageData,x as default}; diff --git a/assets/posts_hackathon-5th-episode02.md.chHv1KWn.lean.js b/assets/posts_hackathon-5th-episode02.md.chHv1KWn.lean.js new file mode 100644 index 0000000..97cfd44 --- /dev/null +++ b/assets/posts_hackathon-5th-episode02.md.chHv1KWn.lean.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as a,a as r}from"./chunks/framework.-K2UgQQN.js";const l="/assets/pp-coffee.esm3s-xL.jpeg",m=JSON.parse('{"title":"PaddlePaddle Hackathon Episode 02 | 第五期活动上线 8 周,框架赛道提交率近 90%","description":"","frontmatter":{"title":"PaddlePaddle Hackathon Episode 02 | 第五期活动上线 8 周,框架赛道提交率近 90%","date":"2023-12-01T00:00:00.000Z","author":{"name":"梦师傅","github":"Ligoml"},"co_authors":[{"name":"花花","github":"Tulip-hua"}]},"headers":[],"relativePath":"posts/hackathon-5th-episode02.md","filePath":"posts/hackathon-5th-episode02.md"}'),n={name:"posts/hackathon-5th-episode02.md"},d=r("",31),i=[d];function s(o,h,c,g,p,u){return e(),a("div",null,i)}const x=t(n,[["render",s]]);export{m as __pageData,x as default}; diff --git a/assets/posts_hackathon-5th-episode03.md.CRF5SbW0.js b/assets/posts_hackathon-5th-episode03.md.CRF5SbW0.js new file mode 100644 index 0000000..198f2c0 --- /dev/null +++ b/assets/posts_hackathon-5th-episode03.md.CRF5SbW0.js @@ -0,0 +1 @@ +import{_ as a,o as e,c as t,a as r}from"./chunks/framework.-K2UgQQN.js";const o="/assets/track-1.PdsHNl9G.jpg",s="/assets/track-2.jcQzK7hh.jpg",p="/assets/track-3.dCEdNlMR.jpg",k=JSON.parse('{"title":"PaddlePaddle Hackathon Episode 03 | 创新碰撞,技术狂欢,飞桨黑客马拉松第五期活动圆满收官!","description":"","frontmatter":{"title":"PaddlePaddle Hackathon Episode 03 | 创新碰撞,技术狂欢,飞桨黑客马拉松第五期活动圆满收官!","date":"2023-12-25T00:00:00.000Z","author":{"name":"花花","github":"Tulip-hua"},"co_authors":[{"name":"梦师傅","github":"Ligoml"}]},"headers":[],"relativePath":"posts/hackathon-5th-episode03.md","filePath":"posts/hackathon-5th-episode03.md"}'),d={name:"posts/hackathon-5th-episode03.md"},l=r('

让我们看看哪些最强“Hacker”脱颖而出!

这是一次好奇心的远航,也是一场创作激情与团队协作的较量。

你懂技术,有想法,在这里可以尽情发挥!

我们希望你,不只埋头创造,一起享受不确定的乐趣,才能涌现意想不到的灵感和收获。

在这里,不止精益求精的竞技,去结识志同道合的小伙伴,去和研发导师 1V1 深度交流。

在飞桨黑客松的舞台上,创造力释放,“码”上见真章!

经过激烈的角逐,让我们看看哪些最强“Hacker”脱颖而出!

01 - 高手云集的飞桨黑客松活动

PaddlePaddle Hackathon 飞桨黑客马拉松(以下简称为“飞桨黑客松”)第五期活动自 2023 年 9 月中旬发布后,开发者热情响应,比赛历经三个月完美收官!

本次活动任务难度持续升级,飞桨联合 OpenVINO™ 等生态伙伴发布 100+ 开源贡献任务。赛制全新升级,本期黑客松活动在延续开源贡献个人挑战赛的基础上,首次探索以 Code Camp 形式组织开源活动,1 对 1 带教形式,并由开发者担任助教。并发布全新赛道——大模型应用与创意赛,基于文心大模型,创意无限,打开想象力,开发 AI 原生应用。

共有 800+ 位社区开发者参与到飞桨黑客松中,160+ 支队伍进行任务认领,本期黑客松活动在任务完成数量、参与团队规模、项目类型丰富度等方面均有提升,足可见开发者们建设飞桨和文心生态的热情。 我们期待这些开发者团队持续在飞桨开源生态中迸发出光彩和力量,与飞桨一路同行,一起建设更优雅的飞桨开源社区。

02 - 三大赛道 开源贡献

飞桨与生态伙伴携手,发布了三大赛道共计 26 个方向的开源贡献任务,从框架开发、模型套件开发、论文复现、硬件部署到产业应用任务应有尽有。开发者们结合自己的兴趣与能力在不同方向为飞桨做出重要贡献,感谢你们!

开源贡献个人挑战赛

发布 124 个开源贡献任务,包括框架、科学计算、套件和合作伙伴方向,与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品,120 个任务完成认领,96 个任务提交作品,85 个任务顺利完成,完成率 70%,感谢各位开发者的积极参与,致敬每一个开源贡献!

在第五期飞桨黑客松个人挑战赛中,开发者们码力全开,共计为飞桨新增 50+ API,增加 6 组共计 120+ API 转换规则,15 个 PHI 算子迁移、4 个分布式切分推导规则和 3 个转换函数,完成 9 篇 AI4S 领域论文代码复现,为大模型套件 PaddleMIX、PaddleNLP 及计算机视觉套件 PaddleSeg、PaddleClas、PaddleDetection 新增 10 个重要模型或新功能,为全套件模型接入动转静训练功能,为飞桨开源社区伙伴 OpenVINO™、Arm、InfiniTensor 新增 12 个新功能。

注:部分任务还有细节需要沟通,暂未完成 PR 合入,请锁定任务的开发者尽快完成 PR 合入哦~

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57262

大模型应用与创意赛

作为飞桨星河社区五周年预热活动,共发布趣味创意与生产力工具 2 个方向的任务,鼓励开发者发挥想象力和创新精神,构思基于文心大模型的创意方案,开发创新应用,从技术创新到应用实践,共有 37 名开发者产出基于 EB SDK 的应用 60+ 个,作品种类多样,涵盖多领域,欢迎大家进入飞桨星河社区应用中心体验。

趣味创意赛道一等奖作品:AI 数字人 | 数字诗人&数字发言人&数字人聊天

生产力工具赛道一等奖作品:【Hackathon 5th】基于文心一言的日报系统

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57585

飞桨护航计划集训营

发布 18 个框架与套件开发项目,1 对 1 带教形式,完成 18 名学员招募,共计提交 4 期周报,组织 5 期技术分享会,9 名学员进行技术分享,15 名学员通过考核。这是飞桨开源社区首次 Code Camp 形式的开源活动,所有学习笔记与周报记录留存在开源项目 PFCCLab/Camp 中,欢迎大家围观交流

集训营开源项目地址:https://github.com/PFCCLab/Camp

本期飞桨护航计划集训营开发项目内容硬核,既包括自动微分、新 IR Pass、自动混合精度、组合机制前反向统一、量化推理、算子类型扩展到复数、分布式能力建设与架构升级等核心组件开发工作,还有科学计算领域拓展专项、套件压缩能力建设、多模态大模型全流程建设等重要套件能力建设工作,营员们的开发能力、开源热情与丰富成果不仅得到了各位导师的高度认可,也获得了研发经理的肯定,3 名同学获得百度正式实习生 Offer。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57264

03 - 飞桨黑客松完成榜单

2023 PaddlePaddle Hackathon 飞桨黑客马拉松第五期由深度学习技术及应用国家工程研究中心主办,飞桨承办,英特尔作为顶级赞助方,OpenVINO™、华为、海光、Arm、高通、Zilliz、开放麒麟社区等共同出品,以线上认领任务的形式进行。 本次共有三大赛道:开源贡献个人挑战赛、大模型应用与创意赛、飞桨护航计划集训营。根据开发难度分为基础任务和进阶任务,为大家提供丰富的深度学习开发体验。对飞桨黑客松第五期公示榜单如有异议,请于 2023 年 12 月 25 日 24 点前反馈至 paddle-hack@baidu.com ,我们将在 12 月 26 日前对您的异议进行复核反馈。

hackathon-5th-track-1

hackathon-5th-track-2

hackathon-5th-track-3

恭喜完成开发任务的团队,将获得任务对应奖金以及飞桨黑客松结项证书,同时也可以获得百度招聘绿色通道。

04 - 新的身份等你点亮

在参与飞桨黑客松活动时,部分开发者们向飞桨框架提交 PR(Pull Request)参与开源贡献,成为飞桨框架的贡献者,并且有意愿为飞桨框架做出持续的贡献。他们接受了来自 PFCC 的邀请,正在用自己的方式参与飞桨框架建设,与飞桨共同成长。如果你也热爱开源、如果你有意愿成为飞桨开源社区的 Contributor,就快加入 PFCC 吧!

关于 PFCC

PFCC 全称 Paddle Framework Contributor Club ,意为飞桨框架贡献者俱乐部,是一个有兴趣、正在或者已经为飞桨开源框架做开源贡献的贡献者成立的虚拟组织。在这里,飞桨开源框架的贡献者进行讨论、交流和分享,并为飞桨框架做出持续的贡献。如果你有意愿加入我们,请发邮件到 ext_paddle_oss@baidu.com,在邮件中附上自己的 GitHub ID、贡献详情与联系方式,会有工作人员邀请你加入。

加入 PFCC,与我们一起参与到飞桨框架的开发中吧!

戳这里看飞桨开源社区故事 ➡️ https://pfcc.blog/

原文链接:https://mp.weixin.qq.com/s/Yjvwj8br84sPard1lLoNOQ

',39),h=[l];function i(n,c,u,P,b,m){return e(),t("div",null,h)}const g=a(d,[["render",i]]);export{k as __pageData,g as default}; diff --git a/assets/posts_hackathon-5th-episode03.md.CRF5SbW0.lean.js b/assets/posts_hackathon-5th-episode03.md.CRF5SbW0.lean.js new file mode 100644 index 0000000..c2f0d86 --- /dev/null +++ b/assets/posts_hackathon-5th-episode03.md.CRF5SbW0.lean.js @@ -0,0 +1 @@ +import{_ as a,o as e,c as t,a as r}from"./chunks/framework.-K2UgQQN.js";const o="/assets/track-1.PdsHNl9G.jpg",s="/assets/track-2.jcQzK7hh.jpg",p="/assets/track-3.dCEdNlMR.jpg",k=JSON.parse('{"title":"PaddlePaddle Hackathon Episode 03 | 创新碰撞,技术狂欢,飞桨黑客马拉松第五期活动圆满收官!","description":"","frontmatter":{"title":"PaddlePaddle Hackathon Episode 03 | 创新碰撞,技术狂欢,飞桨黑客马拉松第五期活动圆满收官!","date":"2023-12-25T00:00:00.000Z","author":{"name":"花花","github":"Tulip-hua"},"co_authors":[{"name":"梦师傅","github":"Ligoml"}]},"headers":[],"relativePath":"posts/hackathon-5th-episode03.md","filePath":"posts/hackathon-5th-episode03.md"}'),d={name:"posts/hackathon-5th-episode03.md"},l=r("",39),h=[l];function i(n,c,u,P,b,m){return e(),t("div",null,h)}const g=a(d,[["render",i]]);export{k as __pageData,g as default}; diff --git a/assets/posts_huanggua-story.md.rXgMLZKS.js b/assets/posts_huanggua-story.md.rXgMLZKS.js new file mode 100644 index 0000000..1155191 --- /dev/null +++ b/assets/posts_huanggua-story.md.rXgMLZKS.js @@ -0,0 +1 @@ +import{M as a,_ as u}from"./chunks/MessageBox.Gn3asJyB.js";import{o as s,c as i,d as l,b as n,w as t,e,a as o}from"./chunks/framework.-K2UgQQN.js";const d="/assets/huanggua-01.ObGzz2Ww.jpg",_="/assets/huanggua-02.SnHUjg9H.jpg",r="/assets/huanggua-03.T8yqbLvk.jpg",h="/assets/huanggua-04.4jK5J02P.jpg",c=l("p",null,[e("他来了,他来了,他带着满满的故事,迈着自信的步伐向我们走来了!虽然刚满 15 岁,但"),l("strong",null,"小小黄瓜"),e("的开源史却已有好几年!学校趣事?开源经历?迷人帅照?成山作业?你都能在本篇博客看到!")],-1),g=l("h2",{id:"一、前言",tabindex:"-1"},[e("一、前言 "),l("a",{class:"header-anchor",href:"#一、前言","aria-label":'Permalink to "一、前言"'},"​")],-1),f=l("p",null,[l("strong",null,"Berniehuang2008"),e("(人送外号:黄瓜),是深圳一位 15 岁的初中生,同时也是 OpenTeens(全国甚至全世界第一个青少年开源社区)创始人之一。黄瓜曾贡献过开源项目 SearXNG 和 GestureX 等,是一位优秀的青少年开发者。他在 10 月加入 Paddle 社区,并且以迅雷不及掩耳之势合入 PR,成为 Paddle 社区的 contributor。现在,他正在准备参加 Paddle 黑客松,让我们一起看看他的故事吧😀~")],-1),p=l("h2",{id:"二、采访内容",tabindex:"-1"},[e("二、采访内容 "),l("a",{class:"header-anchor",href:"#二、采访内容","aria-label":'Permalink to "二、采访内容"'},"​")],-1),b=l("p",null,[l("strong",null,"简单介绍一下自己吧!")],-1),m=l("p",null,[l("strong",null,"现在是一名初三学生,课程学习忙么?有什么喜欢的科目没有?😁😁")],-1),P=l("p",null,[l("strong",null,"学校最近有什么有趣的事情可以和大家分享一下!")],-1),y=l("p",null,[l("strong",null,"当初你是如何被编程和开源世界吸引的?是什么驱使你成为了一名青少年开发者和开源社区创始人呢?")],-1),B=l("br",null,null,-1),S=l("p",null,[l("strong",null,"之前看你的 GitHub 主页里,有对 SearXNG 提交过 PR,这是一个怎样的项目?你在 SearXNG 项目中的具体贡献是什么?你最喜欢的部分是什么?这个经历让你有什么样的收获?")],-1),x=l("br",null,null,-1),A=l("blockquote",null,[l("p",null,"编者注✍️:现在初中生都已经开始接触算法了吗!")],-1),G=l("p",null,[l("strong",null,"除了在 SearXNG 项目中的贡献,我发现你还设计了一些开源小程序(eg:Dairy APP),能否分享一下你最引以为傲的作品是什么?你觉得这个作品的意义是什么?")],-1),N=l("br",null,null,-1),j=l("div",{style:{display:"flex","justify-content":"center"}},[l("figure",{style:{width:"40%"}},[l("img",{src:d,alt:"APP"}),l("figcaption",null,"Dairy APP 部分截图")])],-1),k={start:"7"},I=l("p",null,[l("strong",null,"你如何了解到 Paddle 社区的,是什么吸引你加入这个社区并开始贡献?可以分享一下你和 Paddle 社区的小故事么?")],-1),T=l("br",null,null,-1),v=l("br",null,null,-1),w=l("p",null,[l("strong",null,"加入 Paddle 社区后的第一次合并 PR 经历如何?有没有什么有趣的插曲或者教训🤓🤓🤓🤓?")],-1),C=l("blockquote",null,[l("p",null,[e("编者注✍️:文档任务很适合刚接触 Paddle 的开发者们,而相关的 PR 也很可能是大家在 Paddle 的第一个 PR。感兴趣可查看 ➡️"),l("a",{href:"https://github.com/PaddlePaddle/docs/issues/6165",target:"_blank",rel:"noreferrer"},"文档 Docathon 系列任务")])],-1),R=l("p",null,[l("strong",null,"你觉得今后 Paddle 社区对你的个人成长和技术发展有何影响?")],-1),X=l("br",null,null,-1),D=l("p",null,[l("strong",null,"作为一名青少年开发者,你一般是如何学习技术的,听说你曾经以 AI 学 AI?哈哈哈"),e("~~")],-1),V=l("br",null,null,-1),q=l("p",null,[l("strong",null,"在你的同龄人中,有多少人对编程和开发感兴趣?你是如何看待青少年参与开源的?")],-1),M=l("p",null,[l("strong",null,"你对于即将参加 Paddle 黑客松有什么样的期待和目标?你希望在黑客松中取得什么样的成绩?")],-1),H=l("br",null,null,-1),L=l("p",null,[l("strong",null,"那么在整个开源学习中,对你影响最深的是谁?为什么?(🤔🤔🤔)")],-1),O=l("br",null,null,-1),z=l("br",null,null,-1),Q=l("p",null,[l("strong",null,"对于其他年轻开发者来说,你有什么建议?或者你想鼓励他们参与到开源社区,特别是 Paddle 社区中么?")],-1),E=l("br",null,null,-1),J=l("br",null,null,-1),F=o('

三、生活中的点点滴滴——黄瓜篇

life
黄锦源同学的日常
homework
黄瓜的作业
cat
黄瓜的猫🐱
',4),ll=JSON.parse('{"title":"【开源江湖闲聊录】初中生也能当开发者❓少年黄瓜的开源奇遇记","description":"","frontmatter":{"title":"【开源江湖闲聊录】初中生也能当开发者❓少年黄瓜的开源奇遇记","date":"2023-12-12T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇(小记者)","github":"wenxiaohahaha"},{"name":"黄锦源(黄瓜大帝)","github":"Berniehuang2008"}]},"headers":[],"relativePath":"posts/huanggua-story.md","filePath":"posts/huanggua-story.md"}'),K={name:"posts/huanggua-story.md"},el=Object.assign(K,{setup(U){return(W,Z)=>(s(),i("div",null,[c,g,f,p,l("ol",null,[l("li",null,[b,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 我叫黄锦源,外号黄瓜,是深圳的一个初三学生。 ")]),_:1})]),_:1})]),l("li",null,[m,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 忙啊,当然忙。每天周考,从四点半考到六点,放学回家一堆卷子烦的要死。最喜欢的是数学,没有原因,就是喜欢😳。 ")]),_:1})]),_:1})]),l("li",null,[P,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" emmm,有趣的事情?没啥,天天考试有啥有趣的。。。不过昨天我还骑车来着,扫了一辆小黄车就一路骑到深圳湾,14 公里,挺开心的。我们几个朋友还去烧纸,哇塞,烧数学书真解气!(黄瓜自注:我们数学课从来不用书) ")]),_:1})]),_:1})]),l("li",null,[y,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 我是从 Scratch 学起的,一开始就感觉 Scratch 这玩意很有意思,想让他干啥他就干啥,有一种掌控世界的感觉。后来,Scratch 写了一百多个游戏之后玩无聊了,转行 Python,才发现这玩意比 Scratch 好玩 10086 倍! "),B,e(" 初一的时候,被我们学校信竞老师征召入伍,但我对竞赛类的东西不感冒,学了一年就退坑了。 ")]),_:1})]),_:1})]),l("li",null,[S,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" SearXNG 是一个开源的搜索引擎,我当时对搜索引擎算法特别着迷,就找了一个,最后发现这玩意就是从 Google、Bing 上面爬数据然后整理! "),x,e(" 不过既然点进去了,索性就帮他们修个 bug 吧,结果这就成为了我第一个参与的开源项目。现在越做越深入,跟 Maintainer 已经算得上认识了 hhh ")]),_:1})]),_:1}),A]),l("li",null,[G,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" addd,Diary app 确实是我前几周的重点。我比较喜欢创新新功能,比如说一打开就弹出一篇以往的日记,配上符合当时心情的音乐,让你朝花夕拾一下。 "),N,e(" 现在嘛,我写了一个 Python 库,叫做 MercurySQLite,提供了一个高级的接口,能不用写 SQL 语句就能操作数据库,贼方便告诉你。 ")]),_:1})]),_:1})])]),j,l("ol",k,[l("li",null,[I,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 我也忘了第一次看 Paddle 是哪年了。。。不过当时我应该处于“AI 发烧友”阶段。后来,一年前?文心不是火了吗?我就想再看看 AI,就算是对 Paddle 有了一个大概的了解吧。 "),T,e(" 直到今年的中国开源年会,我不是办青少年分论坛吗?我们接下来就是教育分论坛,然后我听了梦老师的演讲,觉得“快乐开源”这档子活动挺有意思的。 "),v,e(" 其实我几个月前看过黑客松,那玩意儿实在是太难了做不来,但是快乐开源就挺好的啊,又不难,改文档也能学到很多,比如说文档的语法之类的,我的那个 SQL 项目文档就是受到了这个的启发。。 ")]),_:1})]),_:1})]),l("li",null,[w,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 哈哈哈,第一次我故意挑了一个最简单的任务做,只有几行代码,属于是投机取巧摸鱼了。。不过第二次——也就是现在正在进行的 PR——没那么轻松了。原文档的格式超级乱,我都不理解他是什么意思。然后又是 CI 的报错看不懂。。。现在差不多改完了,还有亿点点小问题,也快了 ")]),_:1})]),_:1}),C]),l("li",null,[R,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" Paddle 社区的技术实力肯定是没得说的。能跟这么多大佬在一起,我觉得不管是现在还是未来,都会对我有很大的影响。就比如说吧,虽然我现在还没有深入地接触到 Paddle 的技术层面,但是我只是在 PFCC 那个群里面苟着,就能学到很多东西,比如说 Paddle 的 CI 啊、代码规范啊之类的。 "),X,e(" 然后我准备试着,只是试着哈,参加下一次的黑客松,或者是黑客松简单版。我相信,只需要一次任务,就可以把那一块的相关知识掌握熟练,然后社交技能也可以上来,这绝对是一举两得。 ")]),_:1})]),_:1})]),l("li",null,[D,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 以 AI 学 AI?试过,但是效果真的不咋地。那时候 GPT3.5 才刚出来,我问他啥都是乱答的。所以我还是觉得以前的学习方式比较好。我喜欢那种“在实际应用里学习”。也就是说,给我一个应用场景,或者是项目,然后我先想该怎么实现,遇到哪里有不懂的技术问题,再去搜,再去问别人(当然,嫌麻烦的话就问 AI /doge) "),V,e(" 我觉得这样的学习效率是最高的。 ")]),_:1})]),_:1})]),l("li",null,[q,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 我的同龄人。。。如果你指的是我们学校的话。。。那么应该不多,应该不超过五个。所有学计算机的,基本上都是为了信竞。剩下的为数不多的四五个人,也只是用 GitHub 找找东西,玩玩游戏而已。 ")]),_:1})]),_:1})]),l("li",null,[M,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 我的目标就是试一下,看看自己的水平在哪,然后顺便学一些知识。所以?只能期待题目不要太难了 hhh "),H,e(" 至于成绩嘛,我也不奢求,能得一颗星就算是重大成就了,如果我是“有技术的”,也许可以尝试 may be 多弄一点星??? ")]),_:1})]),_:1})]),l("li",null,[L,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 这个问题很难答啊 hhh,说谁都不太好。 "),O,e(" 但是如果要说真话,这就必须提到 SearXNG 那个搜索引擎的 Maintainer。他特别有耐心,还跟我闲聊,那段时间我初出茅庐啥也不懂,要不是他,我到现在还没入门呢! "),z,e(" 当然啦,我必须希望以后能有更多影响我的人,超越他,对吧? ")]),_:1})]),_:1})]),l("li",null,[Q,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 我觉得开源社区的一大魅力就在于“社区”——你永远可以找到帮助,永远可以与志同道合的人一起 coding,Paddle 社区更是一个典型。 "),E,e(" 在 Paddle,如果你有什么问题——无论白痴问题还是神级难度——都会有人来看,都会有人来帮助你解决。 "),J,e(" 我觉得 Paddle 的一大优点就是他是任务式的这种贡献机制。你可以选择各种不同难度的任务,循序渐进,慢慢提升自己。任务式贡献也可以让你有一个明确的目标,甚至是一个明确的思路,该怎么解决这个问题。 ")]),_:1})]),_:1})])]),F]))}});export{ll as __pageData,el as default}; diff --git a/assets/posts_huanggua-story.md.rXgMLZKS.lean.js b/assets/posts_huanggua-story.md.rXgMLZKS.lean.js new file mode 100644 index 0000000..f5a8e62 --- /dev/null +++ b/assets/posts_huanggua-story.md.rXgMLZKS.lean.js @@ -0,0 +1 @@ +import{M as a,_ as u}from"./chunks/MessageBox.Gn3asJyB.js";import{o as s,c as i,d as l,b as n,w as t,e,a as o}from"./chunks/framework.-K2UgQQN.js";const d="/assets/huanggua-01.ObGzz2Ww.jpg",_="/assets/huanggua-02.SnHUjg9H.jpg",r="/assets/huanggua-03.T8yqbLvk.jpg",h="/assets/huanggua-04.4jK5J02P.jpg",c=l("p",null,[e("他来了,他来了,他带着满满的故事,迈着自信的步伐向我们走来了!虽然刚满 15 岁,但"),l("strong",null,"小小黄瓜"),e("的开源史却已有好几年!学校趣事?开源经历?迷人帅照?成山作业?你都能在本篇博客看到!")],-1),g=l("h2",{id:"一、前言",tabindex:"-1"},[e("一、前言 "),l("a",{class:"header-anchor",href:"#一、前言","aria-label":'Permalink to "一、前言"'},"​")],-1),f=l("p",null,[l("strong",null,"Berniehuang2008"),e("(人送外号:黄瓜),是深圳一位 15 岁的初中生,同时也是 OpenTeens(全国甚至全世界第一个青少年开源社区)创始人之一。黄瓜曾贡献过开源项目 SearXNG 和 GestureX 等,是一位优秀的青少年开发者。他在 10 月加入 Paddle 社区,并且以迅雷不及掩耳之势合入 PR,成为 Paddle 社区的 contributor。现在,他正在准备参加 Paddle 黑客松,让我们一起看看他的故事吧😀~")],-1),p=l("h2",{id:"二、采访内容",tabindex:"-1"},[e("二、采访内容 "),l("a",{class:"header-anchor",href:"#二、采访内容","aria-label":'Permalink to "二、采访内容"'},"​")],-1),b=l("p",null,[l("strong",null,"简单介绍一下自己吧!")],-1),m=l("p",null,[l("strong",null,"现在是一名初三学生,课程学习忙么?有什么喜欢的科目没有?😁😁")],-1),P=l("p",null,[l("strong",null,"学校最近有什么有趣的事情可以和大家分享一下!")],-1),y=l("p",null,[l("strong",null,"当初你是如何被编程和开源世界吸引的?是什么驱使你成为了一名青少年开发者和开源社区创始人呢?")],-1),B=l("br",null,null,-1),S=l("p",null,[l("strong",null,"之前看你的 GitHub 主页里,有对 SearXNG 提交过 PR,这是一个怎样的项目?你在 SearXNG 项目中的具体贡献是什么?你最喜欢的部分是什么?这个经历让你有什么样的收获?")],-1),x=l("br",null,null,-1),A=l("blockquote",null,[l("p",null,"编者注✍️:现在初中生都已经开始接触算法了吗!")],-1),G=l("p",null,[l("strong",null,"除了在 SearXNG 项目中的贡献,我发现你还设计了一些开源小程序(eg:Dairy APP),能否分享一下你最引以为傲的作品是什么?你觉得这个作品的意义是什么?")],-1),N=l("br",null,null,-1),j=l("div",{style:{display:"flex","justify-content":"center"}},[l("figure",{style:{width:"40%"}},[l("img",{src:d,alt:"APP"}),l("figcaption",null,"Dairy APP 部分截图")])],-1),k={start:"7"},I=l("p",null,[l("strong",null,"你如何了解到 Paddle 社区的,是什么吸引你加入这个社区并开始贡献?可以分享一下你和 Paddle 社区的小故事么?")],-1),T=l("br",null,null,-1),v=l("br",null,null,-1),w=l("p",null,[l("strong",null,"加入 Paddle 社区后的第一次合并 PR 经历如何?有没有什么有趣的插曲或者教训🤓🤓🤓🤓?")],-1),C=l("blockquote",null,[l("p",null,[e("编者注✍️:文档任务很适合刚接触 Paddle 的开发者们,而相关的 PR 也很可能是大家在 Paddle 的第一个 PR。感兴趣可查看 ➡️"),l("a",{href:"https://github.com/PaddlePaddle/docs/issues/6165",target:"_blank",rel:"noreferrer"},"文档 Docathon 系列任务")])],-1),R=l("p",null,[l("strong",null,"你觉得今后 Paddle 社区对你的个人成长和技术发展有何影响?")],-1),X=l("br",null,null,-1),D=l("p",null,[l("strong",null,"作为一名青少年开发者,你一般是如何学习技术的,听说你曾经以 AI 学 AI?哈哈哈"),e("~~")],-1),V=l("br",null,null,-1),q=l("p",null,[l("strong",null,"在你的同龄人中,有多少人对编程和开发感兴趣?你是如何看待青少年参与开源的?")],-1),M=l("p",null,[l("strong",null,"你对于即将参加 Paddle 黑客松有什么样的期待和目标?你希望在黑客松中取得什么样的成绩?")],-1),H=l("br",null,null,-1),L=l("p",null,[l("strong",null,"那么在整个开源学习中,对你影响最深的是谁?为什么?(🤔🤔🤔)")],-1),O=l("br",null,null,-1),z=l("br",null,null,-1),Q=l("p",null,[l("strong",null,"对于其他年轻开发者来说,你有什么建议?或者你想鼓励他们参与到开源社区,特别是 Paddle 社区中么?")],-1),E=l("br",null,null,-1),J=l("br",null,null,-1),F=o("",4),ll=JSON.parse('{"title":"【开源江湖闲聊录】初中生也能当开发者❓少年黄瓜的开源奇遇记","description":"","frontmatter":{"title":"【开源江湖闲聊录】初中生也能当开发者❓少年黄瓜的开源奇遇记","date":"2023-12-12T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇(小记者)","github":"wenxiaohahaha"},{"name":"黄锦源(黄瓜大帝)","github":"Berniehuang2008"}]},"headers":[],"relativePath":"posts/huanggua-story.md","filePath":"posts/huanggua-story.md"}'),K={name:"posts/huanggua-story.md"},el=Object.assign(K,{setup(U){return(W,Z)=>(s(),i("div",null,[c,g,f,p,l("ol",null,[l("li",null,[b,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 我叫黄锦源,外号黄瓜,是深圳的一个初三学生。 ")]),_:1})]),_:1})]),l("li",null,[m,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 忙啊,当然忙。每天周考,从四点半考到六点,放学回家一堆卷子烦的要死。最喜欢的是数学,没有原因,就是喜欢😳。 ")]),_:1})]),_:1})]),l("li",null,[P,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" emmm,有趣的事情?没啥,天天考试有啥有趣的。。。不过昨天我还骑车来着,扫了一辆小黄车就一路骑到深圳湾,14 公里,挺开心的。我们几个朋友还去烧纸,哇塞,烧数学书真解气!(黄瓜自注:我们数学课从来不用书) ")]),_:1})]),_:1})]),l("li",null,[y,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 我是从 Scratch 学起的,一开始就感觉 Scratch 这玩意很有意思,想让他干啥他就干啥,有一种掌控世界的感觉。后来,Scratch 写了一百多个游戏之后玩无聊了,转行 Python,才发现这玩意比 Scratch 好玩 10086 倍! "),B,e(" 初一的时候,被我们学校信竞老师征召入伍,但我对竞赛类的东西不感冒,学了一年就退坑了。 ")]),_:1})]),_:1})]),l("li",null,[S,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" SearXNG 是一个开源的搜索引擎,我当时对搜索引擎算法特别着迷,就找了一个,最后发现这玩意就是从 Google、Bing 上面爬数据然后整理! "),x,e(" 不过既然点进去了,索性就帮他们修个 bug 吧,结果这就成为了我第一个参与的开源项目。现在越做越深入,跟 Maintainer 已经算得上认识了 hhh ")]),_:1})]),_:1}),A]),l("li",null,[G,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" addd,Diary app 确实是我前几周的重点。我比较喜欢创新新功能,比如说一打开就弹出一篇以往的日记,配上符合当时心情的音乐,让你朝花夕拾一下。 "),N,e(" 现在嘛,我写了一个 Python 库,叫做 MercurySQLite,提供了一个高级的接口,能不用写 SQL 语句就能操作数据库,贼方便告诉你。 ")]),_:1})]),_:1})])]),j,l("ol",k,[l("li",null,[I,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 我也忘了第一次看 Paddle 是哪年了。。。不过当时我应该处于“AI 发烧友”阶段。后来,一年前?文心不是火了吗?我就想再看看 AI,就算是对 Paddle 有了一个大概的了解吧。 "),T,e(" 直到今年的中国开源年会,我不是办青少年分论坛吗?我们接下来就是教育分论坛,然后我听了梦老师的演讲,觉得“快乐开源”这档子活动挺有意思的。 "),v,e(" 其实我几个月前看过黑客松,那玩意儿实在是太难了做不来,但是快乐开源就挺好的啊,又不难,改文档也能学到很多,比如说文档的语法之类的,我的那个 SQL 项目文档就是受到了这个的启发。。 ")]),_:1})]),_:1})]),l("li",null,[w,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 哈哈哈,第一次我故意挑了一个最简单的任务做,只有几行代码,属于是投机取巧摸鱼了。。不过第二次——也就是现在正在进行的 PR——没那么轻松了。原文档的格式超级乱,我都不理解他是什么意思。然后又是 CI 的报错看不懂。。。现在差不多改完了,还有亿点点小问题,也快了 ")]),_:1})]),_:1}),C]),l("li",null,[R,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" Paddle 社区的技术实力肯定是没得说的。能跟这么多大佬在一起,我觉得不管是现在还是未来,都会对我有很大的影响。就比如说吧,虽然我现在还没有深入地接触到 Paddle 的技术层面,但是我只是在 PFCC 那个群里面苟着,就能学到很多东西,比如说 Paddle 的 CI 啊、代码规范啊之类的。 "),X,e(" 然后我准备试着,只是试着哈,参加下一次的黑客松,或者是黑客松简单版。我相信,只需要一次任务,就可以把那一块的相关知识掌握熟练,然后社交技能也可以上来,这绝对是一举两得。 ")]),_:1})]),_:1})]),l("li",null,[D,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 以 AI 学 AI?试过,但是效果真的不咋地。那时候 GPT3.5 才刚出来,我问他啥都是乱答的。所以我还是觉得以前的学习方式比较好。我喜欢那种“在实际应用里学习”。也就是说,给我一个应用场景,或者是项目,然后我先想该怎么实现,遇到哪里有不懂的技术问题,再去搜,再去问别人(当然,嫌麻烦的话就问 AI /doge) "),V,e(" 我觉得这样的学习效率是最高的。 ")]),_:1})]),_:1})]),l("li",null,[q,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 我的同龄人。。。如果你指的是我们学校的话。。。那么应该不多,应该不超过五个。所有学计算机的,基本上都是为了信竞。剩下的为数不多的四五个人,也只是用 GitHub 找找东西,玩玩游戏而已。 ")]),_:1})]),_:1})]),l("li",null,[M,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 我的目标就是试一下,看看自己的水平在哪,然后顺便学一些知识。所以?只能期待题目不要太难了 hhh "),H,e(" 至于成绩嘛,我也不奢求,能得一颗星就算是重大成就了,如果我是“有技术的”,也许可以尝试 may be 多弄一点星??? ")]),_:1})]),_:1})]),l("li",null,[L,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 这个问题很难答啊 hhh,说谁都不太好。 "),O,e(" 但是如果要说真话,这就必须提到 SearXNG 那个搜索引擎的 Maintainer。他特别有耐心,还跟我闲聊,那段时间我初出茅庐啥也不懂,要不是他,我到现在还没入门呢! "),z,e(" 当然啦,我必须希望以后能有更多影响我的人,超越他,对吧? ")]),_:1})]),_:1})]),l("li",null,[Q,n(a,null,{default:t(()=>[n(u,{name:"黄瓜🥒",github:"Berniehuang2008"},{default:t(()=>[e(" 我觉得开源社区的一大魅力就在于“社区”——你永远可以找到帮助,永远可以与志同道合的人一起 coding,Paddle 社区更是一个典型。 "),E,e(" 在 Paddle,如果你有什么问题——无论白痴问题还是神级难度——都会有人来看,都会有人来帮助你解决。 "),J,e(" 我觉得 Paddle 的一大优点就是他是任务式的这种贡献机制。你可以选择各种不同难度的任务,循序渐进,慢慢提升自己。任务式贡献也可以让你有一个明确的目标,甚至是一个明确的思路,该怎么解决这个问题。 ")]),_:1})]),_:1})])]),F]))}});export{ll as __pageData,el as default}; diff --git a/assets/posts_huangjiyi-story.md.x5lxcZ8g.js b/assets/posts_huangjiyi-story.md.x5lxcZ8g.js new file mode 100644 index 0000000..d204d26 --- /dev/null +++ b/assets/posts_huangjiyi-story.md.x5lxcZ8g.js @@ -0,0 +1 @@ +import{M as r,_ as s}from"./chunks/MessageBox.Gn3asJyB.js";import{o as n,c as l,b as t,w as e,a as i,d as o,e as a}from"./chunks/framework.-K2UgQQN.js";const g="/assets/huangjiyi-01.1y67zq8G.jpg",d="/assets/huangjiyi-02.O6RzXBg-.jpg",p="/assets/huangjiyi-06.ssQM486N.jpg",u="/assets/huangjiyi-03.2DT_PxWy.jpg",h="/assets/huangjiyi-04.Gox0ch6f.jpg",c="/assets/huangjiyi-05.81KTHOFS.jpg",_=i('

从积极参与社区开源任务,到加入飞桨成为 (练习生) 实习生,到最终正式成为飞桨研发团队的一员。以兴趣为起点, 黄济懿师傅 将我们展示了一条通往职业的道路,希望他的故事能够激励所有对开源充满热情的开发者们。接下来,原神启动 🚀!

一、前言

黄师傅是一个地地道道的江西人,喜欢吃辣🌶️🌶️🌶️。他本科研究生都就读于广州的华南理工大学,现为电子信息专业,即将毕业前往 Paddle 工作。作为一名研究僧,他在空余时间喜欢吃吃美食或者玩玩游戏,像是原神/LOL/金铲铲之战(各位要是也在玩,可以找黄师傅哦~黄师傅求大佬带带!!)。

偷偷告诉你们:黄师傅最近的主线任务就是毕设,请务必多找他打游戏让他延毕(不是)

去年 11 月,他出于对深度学习框架的底层实现的兴趣,联系花花加入了快乐开源群。在这一年里,他陆续完成社区里各项开源任务以熟悉 Paddle 框架,期间他也把握住了来飞桨实习的机会,他不断积累开发经验,不断加深对 Paddle 的理解,最终,他通过了飞桨团队的面试,成功拿下了飞桨校招 offer!

黄师傅曾说:"我将继续在飞桨开源活动完成一些任务,希望能够学到更多的同时也能为飞桨的建设做出小小的贡献"。事实上,黄师傅曾分别参与了 PHI 算子库独立编译算子定义自动生成Fluid Kernel 函数式改造等多个快乐开源活动项目以及飞桨框架护航计划,到目前为 Paddle 贡献了 100 多个 PR。抛开实习生和正式员工的身份,黄师傅自身也是飞桨社区的自发贡献者和推动者。接下来,就让我们来瞅瞅黄师傅的精彩 Paddle 之旅吧!!

原神,启动!!(请读者自行脑补 BGM)

huangjiyi-01

二、采访内容

  1. 介绍一下自己吧,黄师傅!(●'◡'●)

    黄师傅: 我的 AI Studio 和 GitHub 的账号是 huangjiyi,也是我名字的全拼(黄济懿)。

  2. 可以简单和大家分享一下你生活中有什么兴趣爱好吗⊙o⊙(游戏、旅游、运动等等)?

    黄师傅: 我就是个死宅,平时就是打打游戏,刷刷 B 站,出门也就是找点好吃的。

  3. 听说你本科研究生都在华南理工大学,你们学校周围有什么好吃的啊?🍔🍟🍿🥯🥪🥗🎂🍬🍹🍉

    黄师傅: 因为在华工太久学校食堂已经吃腻了,我会经常出校找点吃的,但活动范围有限,学校周边我吃过比较好吃的不多,就川菜小炒、麻辣香锅、鸡公煲、螺狮粉、泰国菜这些。

  4. 我了解到你平时有在玩 LOL,那么如果把 Paddle 比作一个英雄🦸,你觉得它最像谁?为什么嘞?

    黄师傅: 我的答案是维克托,我的想象力有限,我只是觉得维克托的技能是会进化的,而 Paddle 也是在不断进化(更新)和扩展的,另外在维克托的背景故事里,他发明了很多具有智能的机械,比如蒸汽机器人,这和我们用 Paddle 来做的事比较相关,我只能想到这么多了。

维克托形象
维克托
  1. 你在加入飞桨开源群之前对 Paddle 的了解是什么样的?有没有听说过一些关于 Paddle 的传闻或者故事?

    黄师傅: 我在加入飞桨开源社区之前,我主要是一个用 PyTorch 跑深度学习实验的研究牲,对 Paddle 的了解也是和 PyTorch 类似的深度学习框架。关于 Paddle 的传闻的话像是国内最早开源的深度学习框架,以及国内最好的深度学习框架。

  2. 你第一个在 GitHub 上完成的 PR 是关于什么的呢?在 PR 的过程中你遇到了什么难题吗?

    黄师傅: 我第一个在 GitHub 上完成的 PR 是 PHI 算子库独立编译开源活动的一个子任务,只需要进行简单的代码替换,没有遇到什么难题,只是第一次改这么大项目的代码有点担心会不会改出什么问题。

    编者注✍️:【PHI 算子库独立编译】是飞桨开源社区的快乐开源活动之一~我们社区有很多类似的、名字听起来很高大上但实际上难度不大的开源活动

  3. 你觉得 Paddle 相比其他深度学习框架有什么优势?可以举个例子么?

    黄师傅: 其他深度学习框架我主要使用过 PyTorch,从用户的视角来比较的话,Paddle 具有丰富的中文文档,包括一些 API 文档和框架开发的技术文档,同时在 AI Studio 上有很多开发者分享的基于 Paddle 实现的项目和以及开发心得可以参考,这些对于国内用户十分友好。另外 Paddle 还有很多开源的套件,用户能够使用这些套件更快地完成一些深度学习应用任务。

  4. 飞桨的开源活动中,你完成的任务中有没有什么特别有趣或者有挑战性的项目?有没有什么技术难题让你觉得很兴奋或者很有成就感?

    黄师傅: 我参加过的很多关于框架开发的开源活动都比较有挑战性,期间遇到的一些困难主要是一些编译问题,然后在通过调试定位问题所在代码、弄清楚问题原因、最后解决问题的时候会比较有成就感。

  5. 据了解,你接触 Paddle 已经有一年多,那么你最欣赏 Paddle 团队中的哪些特点或价值观?为什么?

    黄师傅: 我比较欣赏的一点是 Paddle 团队非常重视开源社区生态,这一点从丰富的社区活动可以看出来,社区开发者可以从中学习到很多东西同时能够获得丰厚的奖励。

  6. 我记得你说过花花和涛姐给了你很多帮助,你觉得他们是怎样的人呢(分别说说🫶🫶)?为什么?

    黄师傅: 花花:飞桨最美运营,关键人家还很努力。 涛姐:为了让开发者能一直有新鲜热乎的开源任务做操碎了心。

    编者注✍️:花花是飞桨社区顶尖运营,涛姐是飞桨社区顶尖研发。

  7. 你是怎么获得去 Paddle 实习的机会的呢?

    黄师傅: 关于我如何获得去 Paddle 实习的机会,当时我刚开始做了一些开源任务,然后在和花花交流的时候以一种半开玩笑的语气问花花能不能去实习,结果没想到花花真的和涛姐提了,然后涛姐真的申请了,飞桨真的给我面试了,然后我面试也真的通过了,然后我就去实习了,一切都是这么突然。

    编者注✍️:其实目前已经有相当多的社区开发者,通过参与开源活动接触到 Paddle,并最终获得实习机会。另外,对于不方便线下实习的同学,我们也提供了远程实习的方案,可以了解往期【护航计划】。

  8. 在 Paddle 实习的时候,你是否参与了某个具体项目的开发?可以分享一下你在项目中的具体角色和贡献吗?

    黄师傅: 我在实习期间刚开始是接着之前在社区参加的 PHI 算子库独立编译开源项目,完成剩下的一些比较困难的任务,花了一个多月的时间完成,剩下的大部分时间参与了结构体 Kernel 注册统一这个项目,期间也会接到一些其他小任务,一共实习了 3 个月吧,基本状态是要我干啥干啥,不会的就问。

  9. 你认为实习那段时间你最大的收获是什么?你认为这段实习经历对你以后的职业生涯规划有起到什么影响?

    黄师傅: 收获很多,体验到了与在学校实验室不同的工作氛围,认识了一些研发大佬,深入了解了 Paddle 的一些机制,积累了一些编译调试和解决问题的经验。在 Paddle 的开源经历和实习经历让我找工作的目标从算法工程师转向了开发工程师,相比于具有不确定性同时很多时候凭借直觉的深度学习算法研究或者应用工作,我发现我更喜欢逻辑性更强且大多数问题都能找到原因的开发工作。

  10. 最后也恭喜你拿到 Paddle 的 offer 🎉,对于同样有志加入 Paddle 团队的学生党,你可以分享一些建议议、经验或者成功路径吗?

    黄师傅: 我感觉我能拿到飞桨 offer 很大一部分原因是我在飞桨的实习经历和参加了一些开源活动,所以我的建议是在学习技术的同时多参加飞桨的开源活动,或者有机会去飞桨实习。

offer
黄师傅的校招 offer 部分截图

三、“著名平台——虎扑评论”专区

这次,我们邀请了一些和黄师傅有过合作经历的朋友们(以及实习期间的导师🐶),贡献一下和黄师傅相关的故事,或者他们对黄师傅的评价~以下均为真心话,请放心看!

编者注✍️:黄师傅有些社恐,所以认识的社区朋友不多,大家正好可以借此机会认识一下。

by 涛姐(luotao1

',17),f=o("h3",{id:"by-日升-yuanrisheng",tabindex:"-1"},[a("by 日升("),o("a",{href:"https://github.com/YuanRisheng",target:"_blank",rel:"noreferrer"},"YuanRisheng"),a(") "),o("a",{class:"header-anchor",href:"#by-日升-yuanrisheng","aria-label":'Permalink to "by 日升([YuanRisheng](https://github.com/YuanRisheng))"'},"​")],-1),b=o("h3",{id:"by-花花-tulip-hua",tabindex:"-1"},[a("by 花花("),o("a",{href:"https://github.com/Tulip-hua",target:"_blank",rel:"noreferrer"},"Tulip-hua"),a(") "),o("a",{class:"header-anchor",href:"#by-花花-tulip-hua","aria-label":'Permalink to "by 花花([Tulip-hua](https://github.com/Tulip-hua))"'},"​")],-1),P=i('
花花的证据
黄师傅欠花花一次分享的证据(花花强烈要求贴上来的)

四、生活中的点点滴滴——黄师傅篇

',2),y=i('
螺狮粉
黄师傅力荐的他认为广州最好吃的《周成芝螺蛳粉》!
原神抽卡
谁懂十连双黄的概念?黄师傅玩几年原神了就这一次

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


',6),S=JSON.parse('{"title":"【开源江湖闲聊录】从入门到入职(入土):黄师傅的校招 offer 指南!","description":"","frontmatter":{"title":"【开源江湖闲聊录】从入门到入职(入土):黄师傅的校招 offer 指南!","date":"2023-12-05T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇(小记者)","github":"wenxiaohahaha"},{"name":"黄济懿(黄师傅)","github":"huangjiyi"}]},"headers":[],"relativePath":"posts/huangjiyi-story.md","filePath":"posts/huangjiyi-story.md"}'),m={name:"posts/huangjiyi-story.md"},I=Object.assign(m,{setup(T){return(k,q)=>(n(),l("div",null,[_,t(r,null,{default:e(()=>[t(s,{name:"骆涛",github:"luotao1"},{default:e(()=>[a(" 我觉得黄师傅是运气真好,类似张无忌,各种捡到宝,当然实力也是重要的。他刚来的时候其实对深度学习框架基本上不了解,然后我们快乐开源刚好放了第一个大任务-phi算子库(解决 CMake 依赖不需要懂深度学习框架)。然后他做啊做,问我们有没有机会来实习,当时 hc 太太太少了,但我们刚做起来,就给他申请,然后他就开挂了 ")]),_:1})]),_:1}),f,t(r,null,{default:e(()=>[t(s,{name:"元日升",github:"YuanRisheng"},{default:e(()=>[a(" 这位同学的工程素养很高,学习能力很强,经常超预期推进项目,最近独立完成高难度项目:飞桨 Flags 工具库建设,开源成果丰硕。另外也是原神大佬,工作累了还能带你打游戏,梦幻队友。 ")]),_:1})]),_:1}),b,t(r,null,{default:e(()=>[t(s,{name:"花花",github:"Tulip-hua"},{default:e(()=>[a(" 原神60级大佬!还欠我一次开源社区分享,请记得! ")]),_:1})]),_:1}),P,t(r,null,{default:e(()=>[t(s,{name:"黄师傅",github:"huangjiyi"},{default:e(()=>[a(" 一张螺狮粉照片,一张游戏截图,这两张图片就代表我大部分的生活了,我也就是个喜欢吃点美食、打打游戏、敲敲代码的普通人。 ")]),_:1})]),_:1}),y]))}});export{S as __pageData,I as default}; diff --git a/assets/posts_huangjiyi-story.md.x5lxcZ8g.lean.js b/assets/posts_huangjiyi-story.md.x5lxcZ8g.lean.js new file mode 100644 index 0000000..5e2ac1c --- /dev/null +++ b/assets/posts_huangjiyi-story.md.x5lxcZ8g.lean.js @@ -0,0 +1 @@ +import{M as r,_ as s}from"./chunks/MessageBox.Gn3asJyB.js";import{o as n,c as l,b as t,w as e,a as i,d as o,e as a}from"./chunks/framework.-K2UgQQN.js";const g="/assets/huangjiyi-01.1y67zq8G.jpg",d="/assets/huangjiyi-02.O6RzXBg-.jpg",p="/assets/huangjiyi-06.ssQM486N.jpg",u="/assets/huangjiyi-03.2DT_PxWy.jpg",h="/assets/huangjiyi-04.Gox0ch6f.jpg",c="/assets/huangjiyi-05.81KTHOFS.jpg",_=i("",17),f=o("h3",{id:"by-日升-yuanrisheng",tabindex:"-1"},[a("by 日升("),o("a",{href:"https://github.com/YuanRisheng",target:"_blank",rel:"noreferrer"},"YuanRisheng"),a(") "),o("a",{class:"header-anchor",href:"#by-日升-yuanrisheng","aria-label":'Permalink to "by 日升([YuanRisheng](https://github.com/YuanRisheng))"'},"​")],-1),b=o("h3",{id:"by-花花-tulip-hua",tabindex:"-1"},[a("by 花花("),o("a",{href:"https://github.com/Tulip-hua",target:"_blank",rel:"noreferrer"},"Tulip-hua"),a(") "),o("a",{class:"header-anchor",href:"#by-花花-tulip-hua","aria-label":'Permalink to "by 花花([Tulip-hua](https://github.com/Tulip-hua))"'},"​")],-1),P=i("",2),y=i("",6),S=JSON.parse('{"title":"【开源江湖闲聊录】从入门到入职(入土):黄师傅的校招 offer 指南!","description":"","frontmatter":{"title":"【开源江湖闲聊录】从入门到入职(入土):黄师傅的校招 offer 指南!","date":"2023-12-05T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇(小记者)","github":"wenxiaohahaha"},{"name":"黄济懿(黄师傅)","github":"huangjiyi"}]},"headers":[],"relativePath":"posts/huangjiyi-story.md","filePath":"posts/huangjiyi-story.md"}'),m={name:"posts/huangjiyi-story.md"},I=Object.assign(m,{setup(T){return(k,q)=>(n(),l("div",null,[_,t(r,null,{default:e(()=>[t(s,{name:"骆涛",github:"luotao1"},{default:e(()=>[a(" 我觉得黄师傅是运气真好,类似张无忌,各种捡到宝,当然实力也是重要的。他刚来的时候其实对深度学习框架基本上不了解,然后我们快乐开源刚好放了第一个大任务-phi算子库(解决 CMake 依赖不需要懂深度学习框架)。然后他做啊做,问我们有没有机会来实习,当时 hc 太太太少了,但我们刚做起来,就给他申请,然后他就开挂了 ")]),_:1})]),_:1}),f,t(r,null,{default:e(()=>[t(s,{name:"元日升",github:"YuanRisheng"},{default:e(()=>[a(" 这位同学的工程素养很高,学习能力很强,经常超预期推进项目,最近独立完成高难度项目:飞桨 Flags 工具库建设,开源成果丰硕。另外也是原神大佬,工作累了还能带你打游戏,梦幻队友。 ")]),_:1})]),_:1}),b,t(r,null,{default:e(()=>[t(s,{name:"花花",github:"Tulip-hua"},{default:e(()=>[a(" 原神60级大佬!还欠我一次开源社区分享,请记得! ")]),_:1})]),_:1}),P,t(r,null,{default:e(()=>[t(s,{name:"黄师傅",github:"huangjiyi"},{default:e(()=>[a(" 一张螺狮粉照片,一张游戏截图,这两张图片就代表我大部分的生活了,我也就是个喜欢吃点美食、打打游戏、敲敲代码的普通人。 ")]),_:1})]),_:1}),y]))}});export{S as __pageData,I as default}; diff --git a/assets/posts_limin-story.md.gVro2_B8.js b/assets/posts_limin-story.md.gVro2_B8.js new file mode 100644 index 0000000..1d2b68d --- /dev/null +++ b/assets/posts_limin-story.md.gVro2_B8.js @@ -0,0 +1 @@ +import{M as o,_ as n}from"./chunks/MessageBox.Gn3asJyB.js";import{o as l,c as s,b as a,w as r,a as i,d as e,e as t}from"./chunks/framework.-K2UgQQN.js";const g="/assets/limin-01.YYyZ4mRI.jpg",p="/assets/limin-02.3uTbgskr.jpg",h="/assets/limin-03.MoKYB8x9.jpg",u="/assets/limin-04.C-Zsg4zl.jpg",c="/assets/limin-05.9kz8E5Zn.jpg",d="/assets/limin-06.fJoboaLl.jpg",b="/assets/limin-07.hgz3U1Nn.jpg",_=i('

从对 Git 一窍不通到如今能够丝滑完成黑客松赛题,从曾经历鬼门关的生死挣扎到现在能够轻松跑几公里不喘气,从毕业于武大国软学的有志青年到佛系养生的新时代躺平中年,敏师傅 的人生经历就像是那瓶经年陈酿的老酒,醇厚细腻、回味无穷。

一、前言

是谁,天天说自己是 “老咸鱼” ?是谁,戏称自己是 “快奔 4️⃣的老头子”?又是谁,自诩为 “摸🐟王者“?是他、是他、就是他~我们的朋友——敏师傅!!!

limin-01

匿名回复: 我没有,假的,都是假的

敏师傅毕业于武汉大学,目前在珠海某甲方企业工作。作为新时代中年人,敏师傅和许多开源者一样,喜欢躺平、宅家、吃吃吃!但敏师傅不仅喜欢吃,还喜欢做。不仅喜欢做,还擅长烹饪各式各样的美味佳肴,堪称“当代好男人”(敏:“相对的,比群里其他大佬差距还很大!”)、“顶级家庭煮夫”、“万千少女的理想老公🫰❤️(敏:“不是不是,我有主的,理想厨子是真!”)连米国五星上将麦克阿瑟见了都评价道:“不是米其林大厨请不起,而是李敏更具性价比!”

后文有敏师傅的厨艺展示哦~

在健身养身方面,李敏师傅也颇有经验。给他一根杠铃杆,他能撬动整个亚欧大陆!给他一套跑步装备,他能漫步宇宙!著名物理学家阿基米德曾说:“李敏所创造出来的物理奇迹足以改写人类此前所有的力学研究!”无论是极限深蹲、恐怖硬拉还是痛苦卧推,在李敏的面前都不过是老八进厕所手到擒来!

匿名回复: 没有没有,都是瞎说的,手无缚鸡之力!

而在开源方面,作为一个非专业的开源开发者,敏师傅从学习如何提交 PR 做起,到加入 Paddle 的 API 文档修改组,再到后面又积极参加一系列快乐开源活动和更具挑战性的黑客松。正如敏师傅所说:“自己在 Paddle 就像打怪升级一样做各种任务”。在这段 Paddle 的这段旅程中,他一点点精进了自己的技术,也结识了许多热爱开源的小伙伴。接下来让我们去瞧瞧这位多才多艺的“摸🐟老头子”(just kidding😉😉😉)!

左图:李敏师傅
左图:李敏师傅
右图:水群摸鱼日常
右图:水群摸鱼日常

二、采访内容

  1. 介绍一下自己吧,敏师傅!

    敏师傅: 各位大佬好,专业摸鱼,日常躺平晒太阳的咸鱼就是我了。身高 183,体重 170。老胖鱼一条。

  2. 敏师傅说个人爱好之一是宅,那么平时宅在家干什么呢?

    敏师傅: 宅家追剧,鉴于囊中羞涩,又秉持开源,所以都是看免费的(大家不要学我,要支持正版,知识产权法在头顶)。有时会神经质发现地脏,就做个简单的扫除;有时就去公园跑跑步、做做拉伸,尽量让自己活的久点,要不然养老金白交了;要么小主想逛苍蝇馆子,就祭出地图精准定位去吃,吃完回家。

  3. 你曾经有提到在机器学习的过程中自己差点 “见了太祖”,请给大家分享一下这次惊险的经历😮

    匿名回复:不是学习中,是那会刚好在学基础,我出事跟学习无关啊~

    敏师傅: 某年,我在工作中,可能因为淋雨作业、感冒,加上伙食里有沙吧...多种原因叠加在一起,一天上午在办公室突然感到头昏。一开始估摸自己是低血压了,就去卫生队让值班人员量了个血压,结果 40/20。我估计自己身体出了大问题,赶忙让他们打了针 NE,然后喊队长把我送医院。

    到了医院迷迷糊糊的,不敢让自己睡着。一天下了 3 张病危,好像是急性胆囊炎合并肺炎,附加胸腔积液。指标各种超标,医生也不敢手术,一直发烧,让医生给打了丙球续命,中间因为升压药泵注射漏了,整个胳膊肿得不像样,让护士帮忙买土豆切片敷那吸收了才完事,同为三甲,简直了。

    过了 5 天医生估计受不了了,让转广州医院,还好领导派了个人跟着,就整了个车把我送到广总。那边直接说割胆囊,我怕,就说保守治疗,主任也同意了,就在广总住了一个多月。抽血都抽了三四十管,也没查出来病因,多科会诊好几次,像实验体一样躺着被几十人围观好几次。最后我看化验单,连非洲的传染病都查了,结果全是阴性。也就不了了之保守治疗了。先住传染科,然后呼吸内科,然后心内科。反正躺床上被推来推去,哈哈哈。

    那一个多月禁食,每天就是打营养针。就记得那脂肪乳,一瓶能打几个小时,每天从上午 8 点打到晚上 8 点。最后几天,医生才让吃流食,粥都不能喝,只能喝粥上面的米汤,唉。然后回到单位吃了半年的过汤菜(就是把所有菜都放水里洗洗尽量没有油),肚子上的肉都没了,皮都耷拉下来了😂

    编者注✍️:真・大难不死,必有后福啊。不过咱们社区开发者怎么什么离奇的经历都有...?

  4. 听说敏师傅的工作经历也非常曲折有趣,能具体说说么?

    敏师傅: 这个,也没啥。毕业稀里糊涂进了某集团,一开始说干计算机的事,结果一点不沾边,各种其他技能点点了个遍。架设卫星锅,招待上级,液压系统维修,汽车机油液压油更换,气路维修,强电弱电架设,挖坑种树等各种。

    全国各地的沙漠,森林,海岛跑了大半,格尔木睡沙漠,半夜帐篷被吹飞去追帐篷,靖宇睡森林,半夜下暴雨水淹帐篷急忙转移,跟着护林工逛森林,吃野果,挖人参,烧松子,反正东北比西北好玩的多。海岛就懵了,坐船就吐的昏天暗地,然后各种晒脱皮,最难受的地儿。

    后面几年总算是接触计算机,做了个仿真训练系统,抄了一堆网站,各种借调打黑工。然后就想着赶紧滚蛋啥都不想干了,躺平。后面就是学机器学习,接着住院,接着佛系养生。

  5. 你最早接触开源是在什么时候?

    敏师傅: 大学吧,那会为了看越狱、迷失、危机边缘那些。好用的播放器不多,关键是字幕。射手网开源了个播放器,就 SVN 拿下来看了看,支持各种制式视频,最大的特点是可以在线搜索字幕源并选择,在那个 RealPlayer 的年代,真的是非常的优秀。

  6. 那你又是怎么加入到 Paddle 社区的?您对于开源社区的价值和意义是怎样理解的?你认为这些价值和意义在 Paddle 社区又是如何体现的?

    敏师傅: 好像是查飞桨文档学习时,梦师傅的文档修改任务,然后就上了大船。 我觉得在国内做开源真的挺不容易,毕竟开源在绝大部分人认为就是免费,其实也就是免费,而且大家都信奉拿来主义,开源协议那块也不关心。开源需要投入的人力物力财力都是不小的,投入少了,社区和维护不够,BUG 就多了。但绝大多数软件,都是从开源起家的,操作系统、中间件、数据库、应用软件等等,所有层面都有开源的身影,是开源让计算机发展的更迅速,微软都不得不妥协进行开源,可想开源的力量。

    价值和意义的话,就用我接触的几个大佬概括下吧:

    • 涛姐,我所接触到飞桨负责开源的最高级别人物。涛姐从研发那割下来的开源任务,要考虑到我们的能力,不能太难,适众面又要广泛,对应负责的研发还要 Review,都是增加飞桨内部的工作量。然后做黑客松题目时发现,题目所需的,可以把开源题目串起来。这时才发现涛姐选题的前瞻性、系统性、大局观。对整体框架的全局把握才能轻车熟路深入浅出的发布出我们能做的题目。可想而知涛姐的能力有多强 👍。

    • 梦师傅花花,运营的核心 CP,原文档负责人,从任务发布、统计信息、数据到对接第三方,做过统计上报的都能懂,那就是个磨人想砸键盘的活,我们一堆人是一个个点,她们那是一整个面,但凡报上去的信息不对,就是反复的核实修改,线下的活动也组织的有声有色,从历次活动照片能看出参与者欢快的笑容,也反映出组织者的能力有多强。

    • 孙师傅,现 Docathon 发起人和文档总负责任。虽然他总是潜水,而且使用者总说文档有错误。但反过来看,那还不是因为 API 更新快,参数修复多。孙师傅负责的是很庞大的费眼睛的项目,代码嘛,能跑就行,有的使用者只关心 API 怎么用。但文档,是所有人必须要看的,严谨系数其实比代码要高的多,孙师傅劳心劳力确实不容易。

    编者注✍️:梦师傅是产品经理,不是运营哈哈哈。另外,我潜水是因为沉迷工作

  7. 作为一个非专业的开发者,一开始接触 Paddle 的时候你遇了过什么困难或者问题,是怎么解决的?

    敏师傅: 刚开始,对流行的开发是一窍不通。对于 Git,只会把代码下下来自己用,从来没有提过 PR。那会在群里啥也不懂,连 PR 是啥也不知道,Git 其他命令也不会,只会 clone,后来在梦师傅和张师傅的帮助下,看教程。但是那会儿,前面几个 PR 只会在 GitHub 打开单文件修改提交,CI 流程过不去。后来看了张师傅的 PR 教程,才学会了命令提交。

  8. 你有提到最初是看教程学习 Paddle 的,你觉得飞桨的文档和教程怎么样?

    敏师傅: 飞桨文档和教程,在主线这块是维护的很及时的,就是对于分支一些,教程和代码的不同步还是很明显的,记得有个给黑白视频上色的教程,怎么都跑不下来,最后才知道,得用老的仓库代码才行。但教程里的代码,clone 下来必然是最新的。

  9. 你参加过哪些飞桨的开源项目?你最喜欢哪个项目,为什么?

    敏师傅: 参加的挺多,都是摸鱼做做边缘任务,最喜欢的应该是 001 带的任务,因为他基本 724 在线,改 PR 的速度赶不上他 Comment 的速度,哈哈哈哈哈哈。

    编者注✍️:001 (SigureMo)是 Paddle 社区出了名的劳模,望周知。由于是第一位社区 commiter 而被大家称为 001。

  10. 听说你还参加了黑客松,那段经历一定很精彩,能否分享一下你在那期间遇到的有趣事情或者特别人呢?

    敏师傅: 在婷姐带领下做了点 FP16 的任务,在花花带领下写了个 API,跟其他大佬比起来,我这基本就是小学生水平,就记得那会 CI 各种拥挤(当然,责任在我,因为我没环境,只能靠 CI,哈哈哈哈)。

  11. 你觉得 Paddle 社区在吸引和培养新的开发者方面做得如何?是否有一些改进的建议或者想法?

    敏师傅: 我觉得一直都很吸引人,梦师傅、花花、酥酥、孙师傅各种活动都能面面俱到(虽然没实地参加,但看照片能看得出)。 建议想法啥的,我这四肢不发达头脑简单的脑子就算了,跟着大家学就好。🙂

  12. 除了 Paddle 之外,您还参与过其他开源项目吗?如果有的话,您觉得 PaddlePaddle 与其他项目相比有哪些独特之处?

    敏师傅: 其他的么,好像真没,MMEngine 算么,当时要找框架,所以提了 1 个还是 2 个 PR 吧,后面就放弃了,因为没有免费算力可以用😀,还是咱飞桨好用。

  13. 在与花花、孙师傅、梦师傅、涛姐和其他 Paddle 大佬的交流中,您学到了哪些知识和经验?对您的技术有哪些影响呢

    敏师傅: 平时怕他们忙,基本不主动找各位大佬。我们这都是点,她(他)们那是面,所以她们的工作量肯定是非常大的,能不打扰就不打扰。

  14. 对于在某甲方公司工作,敏师傅有没有一些摸鱼小技巧可以分享一下呢?你是如何平衡工作和生活的?

    敏师傅: 摸鱼技巧?开会带本书,看看会议就过去了,反正路人甲一个,一般就用“三不”回答:不会、不懂、不知道。领导的决定都是对的,领导的决策都不会错,错了那也是我们马仔理解不够深,执行不彻底,落实不到位。

    平衡工作生活的话,下了班就 不干活,遵守 995,除了大值班,这都得参加,没啥说的。

    编者注✍️:学到了。

  15. 对于那些想要成为开源贡献者的人,您有什么鼓励和建议?

    敏师傅: 不管是不是科班出身,大项目里开源一般有利无害的吧。我毕业太久,现在的应聘肯定卷出了天际,啥力扣 ACM 估计都是基操,能用开源项目加分的话,先进大厂实习再氪肝留大厂也是条路吧。说的不一定对,请客观看待。

  16. 最后,敏师傅还有什么想和大家说的么?

    敏师傅: 有新手怪的话,大佬们给我留点。我还是砍砍史莱姆和稻草人就好😀。

三、著名大型评论平台——虎扑评论专区

敏师傅和太多的人打过交道了。由于篇幅的原因,我们邀请了部分和敏师傅有过合作经历的朋友们,贡献一下他们和敏师傅发生的故事,或者对敏师傅的评价~以下均为真心话,请放心食用!

limin-04

by 孙师傅(sunzhongkai588

',17),m=e("br",null,null,-1),f=e("h3",{id:"by-婷姐-zhangting2020",tabindex:"-1"},[t("by 婷姐("),e("a",{href:"https://github.com/zhangting2020",target:"_blank",rel:"noreferrer"},"zhangting2020"),t(") "),e("a",{class:"header-anchor",href:"#by-婷姐-zhangting2020","aria-label":'Permalink to "by 婷姐([zhangting2020](https://github.com/zhangting2020))"'},"​")],-1),y=e("h3",{id:"by-汪师傅-greatv",tabindex:"-1"},[t("by 汪师傅("),e("a",{href:"https://github.com/GreatV",target:"_blank",rel:"noreferrer"},"GreatV"),t(") "),e("a",{class:"header-anchor",href:"#by-汪师傅-greatv","aria-label":'Permalink to "by 汪师傅([GreatV](https://github.com/GreatV))"'},"​")],-1),k=e("h3",{id:"by-花花-tulip-hua",tabindex:"-1"},[t("by 花花("),e("a",{href:"https://github.com/Tulip-hua",target:"_blank",rel:"noreferrer"},"Tulip-hua"),t(") "),e("a",{class:"header-anchor",href:"#by-花花-tulip-hua","aria-label":'Permalink to "by 花花([Tulip-hua](https://github.com/Tulip-hua))"'},"​")],-1),P=e("blockquote",null,[e("p",null,"编者注✍️:下面这位就是花师傅说的时好时坏的 002 ⬇️")],-1),q=e("h3",{id:"by-张师傅-liyulingyue",tabindex:"-1"},[t("by 张师傅("),e("a",{href:"https://github.com/liyulingyue",target:"_blank",rel:"noreferrer"},"liyulingyue"),t(") "),e("a",{class:"header-anchor",href:"#by-张师傅-liyulingyue","aria-label":'Permalink to "by 张师傅([liyulingyue](https://github.com/liyulingyue))"'},"​")],-1),T=e("h3",{id:"by-独师傅-longranger2",tabindex:"-1"},[t("by 独师傅("),e("a",{href:"https://github.com/longranger2",target:"_blank",rel:"noreferrer"},"longranger2"),t(") "),e("a",{class:"header-anchor",href:"#by-独师傅-longranger2","aria-label":'Permalink to "by 独师傅([longranger2](https://github.com/longranger2))"'},"​")],-1),x=e("br",null,null,-1),I=e("h3",{id:"by-陈沧夜-mrcangye",tabindex:"-1"},[t("by 陈沧夜("),e("a",{href:"https://github.com/mrcangye",target:"_blank",rel:"noreferrer"},"mrcangye"),t(") "),e("a",{class:"header-anchor",href:"#by-陈沧夜-mrcangye","aria-label":'Permalink to "by 陈沧夜([mrcangye](https://github.com/mrcangye))"'},"​")],-1),z=e("h3",{id:"by-梦师傅-ligoml",tabindex:"-1"},[t("by 梦师傅("),e("a",{href:"https://github.com/Ligoml",target:"_blank",rel:"noreferrer"},"Ligoml"),t(") "),e("a",{class:"header-anchor",href:"#by-梦师傅-ligoml","aria-label":'Permalink to "by 梦师傅([Ligoml](https://github.com/Ligoml))"'},"​")],-1),C=i('
梦的证据
敏哥安慰梦师傅的聊天截图

四、敏师傅的佛系养身 TIME~🏃‍♀️🏋️‍♀️⛹️‍♀️🚴‍♀️🤸‍♀️👯‍♂️💪

经历

先设定个小目标,就减肥吧,然后开始了漫长的减肥计划。 一开始 3 公里都难跑及格,啥也不管,先开跑,同时补充氨糖和维生素,免得关节废了。好像从 95 跑到 85 后,各种体测也没问题了。前几个月体重掉的快,后来基本一个月一公斤,逐渐五公里到十公里,最后跑了个半马试试自己的耐力。然后体重就到了瓶颈期,跑步成了热身,体重不减,体脂不减,请教专业人士,开始上力量,原始三件套:深蹲,硬拉,卧推。先慢跑 3 公里,然后负重训练。后来逐渐加上 HIIT,体重最轻的时候到了 70 公斤。

过来人的小 tips💡

总结一下大概如下:热身是必要的,体重大先用有氧减脂,一开始不用太在意体重,练就完了,碳水和蛋白质要保证,氨糖和维生素也是必备,到了某天会发现衣服大了,体重下来了。到了瓶颈期就可以上力量,没有条件就用 HIIT 代替,比如斯巴达 500,虽然痛苦,但是非常有效,提升新陈代谢率,提高心肺功能。在上力量时,如果有体检,会发现尿酸升高,这个是力量训练中常有的,可以暂停一周再复测,正常值后就说明是力量训练导致,就不用担心了。

五、彩蛋 🥚

1. 十项全能的家庭煮夫敏敏子在线狂秀厨艺

',8),R=i('
左图:李敏师傅
敏哥做的菜-1
右图:水群摸鱼日常
敏哥做的菜-2

2. 敏哥个人自述

敏哥在采访前也精心写了一份【个人自述】,篇幅过长就不贴在正文了,好奇的话可以读一下哦~

编者注✍️:留个彩蛋!我把它放在了博客 GitHub repo 下的 src/eggs/limin-story/ 文件夹下哦~


写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


',8),w=JSON.parse('{"title":"【开源江湖闲聊录】躺平健身搞开源:敏师傅的三十而立","description":"","frontmatter":{"title":"【开源江湖闲聊录】躺平健身搞开源:敏师傅的三十而立","date":"2023-12-07T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇(小记者)","github":"wenxiaohahaha"},{"name":"李敏(敏师傅)","github":"enkilee"}]},"headers":[],"relativePath":"posts/limin-story.md","filePath":"posts/limin-story.md"}'),V={name:"posts/limin-story.md"},N=Object.assign(V,{setup(A){return(S,j)=>(l(),s("div",null,[_,a(o,null,{default:r(()=>[a(n,{name:"孙钟恺",github:"sunzhongkai588"},{default:r(()=>[t(" 一开始对敏哥印象深刻,是因为敏哥的微信昵称拼音——讷言敏行(nè yán mǐn xíng),总共 4 个,有位前同事能把其中 2 个读错成 nà ... ... háng。🤣 "),m,t(" 之后,从提文档修复的 PR 开始,就能明显感觉到敏哥的进步,再到后来敏哥能一口气把好多快乐开源任务都认领完成了,真的非常厉害。 ")]),_:1})]),_:1}),f,a(o,null,{default:r(()=>[a(n,{name:"张婷",github:"zhangting2020"},{default:r(()=>[t(" 敏师傅领题目、push 研发超积极。最厉害的是自己不做测试的,都是一把改完 push 上去看 CI 结果,也不需要 GPU 算力(手动狗头),以充分利用婷姐的脑力资源为主。 ")]),_:1})]),_:1}),y,a(o,null,{default:r(()=>[a(n,{name:"汪昕",github:"GreatV"},{default:r(()=>[t(" 敏师傅,当然是实力超强的摸鱼仙人 ")]),_:1})]),_:1}),k,a(o,null,{default:r(()=>[a(n,{name:"花花",github:"Tulip-hua"},{default:r(()=>[t(" 众所周知,飞桨开源社区分为两股势力:以敏师傅为首的好人阵营,以 002 为首的时好时坏阵营。 ")]),_:1})]),_:1}),P,q,a(o,null,{default:r(()=>[a(n,{name:"张一乔",github:"liyulingyue"},{default:r(()=>[t(" 敏师傅简直是吾辈楷模,能愉快的摸鱼提 PR,还有老婆,真让人羡慕。 ")]),_:1})]),_:1}),T,a(o,null,{default:r(()=>[a(n,{name:"张伟鸿",github:"longranger2"},{default:r(()=>[t(" 敏师傅给我的感觉就如同金庸武侠小说里的扫地僧,活跃在飞桨各大大小小的社区当中,神秘而且武功深不可测,有极高技艺却又深藏不露。嘴上说着摸鱼,但上班的时候提起 PR 毫不手软(敏师傅,咱贵公司还招人吗[可怜])。敏师傅也是一部行走的百科全书,上知天文,下知地理,尤其对吃的颇有造诣,如果你想知道不同地方的美食,问敏师傅就对了。 "),x,t(" 不过我也得来吐槽下敏师傅,平时我认领的任务还没开始做的时候,张师傅都是口嗨说要背刺我,但只有敏师傅是来真的,直接把我认领的任务做了,希望敏师傅下次能给我留口汤喝,ball ball you 了😭 ")]),_:1})]),_:1}),I,a(o,null,{default:r(()=>[a(n,{name:"陈龙",github:"mrcangye"},{default:r(()=>[t(" 敏师傅是我人生重要的领路人之一,每次抉择迷茫时候,敏师傅总会用他经验满满的信息差对我的迷茫分叉口进行降维打击!最后让我拨云见月,酣畅淋漓! ")]),_:1})]),_:1}),z,a(o,null,{default:r(()=>[a(n,{name:"梦柳",github:"Ligoml"},{default:r(()=>[t(" 敏哥人超好!职场导师+1 ")]),_:1})]),_:1}),C,a(o,null,{default:r(()=>[a(n,{name:"敏师傅",github:"enkilee"},{default:r(()=>[t(" 自我宣言:本人手艺还行,刀工一般,之前在某集团时没事跑去炊事班练练手,打打牙祭。煎、炒、烹、炸、焖、炖、溜、熬、蒸、烩、煮、烙、汆、酿、扒、烧都会烧点。 ")]),_:1})]),_:1}),R]))}});export{w as __pageData,N as default}; diff --git a/assets/posts_limin-story.md.gVro2_B8.lean.js b/assets/posts_limin-story.md.gVro2_B8.lean.js new file mode 100644 index 0000000..f47571c --- /dev/null +++ b/assets/posts_limin-story.md.gVro2_B8.lean.js @@ -0,0 +1 @@ +import{M as o,_ as n}from"./chunks/MessageBox.Gn3asJyB.js";import{o as l,c as s,b as a,w as r,a as i,d as e,e as t}from"./chunks/framework.-K2UgQQN.js";const g="/assets/limin-01.YYyZ4mRI.jpg",p="/assets/limin-02.3uTbgskr.jpg",h="/assets/limin-03.MoKYB8x9.jpg",u="/assets/limin-04.C-Zsg4zl.jpg",c="/assets/limin-05.9kz8E5Zn.jpg",d="/assets/limin-06.fJoboaLl.jpg",b="/assets/limin-07.hgz3U1Nn.jpg",_=i("",17),m=e("br",null,null,-1),f=e("h3",{id:"by-婷姐-zhangting2020",tabindex:"-1"},[t("by 婷姐("),e("a",{href:"https://github.com/zhangting2020",target:"_blank",rel:"noreferrer"},"zhangting2020"),t(") "),e("a",{class:"header-anchor",href:"#by-婷姐-zhangting2020","aria-label":'Permalink to "by 婷姐([zhangting2020](https://github.com/zhangting2020))"'},"​")],-1),y=e("h3",{id:"by-汪师傅-greatv",tabindex:"-1"},[t("by 汪师傅("),e("a",{href:"https://github.com/GreatV",target:"_blank",rel:"noreferrer"},"GreatV"),t(") "),e("a",{class:"header-anchor",href:"#by-汪师傅-greatv","aria-label":'Permalink to "by 汪师傅([GreatV](https://github.com/GreatV))"'},"​")],-1),k=e("h3",{id:"by-花花-tulip-hua",tabindex:"-1"},[t("by 花花("),e("a",{href:"https://github.com/Tulip-hua",target:"_blank",rel:"noreferrer"},"Tulip-hua"),t(") "),e("a",{class:"header-anchor",href:"#by-花花-tulip-hua","aria-label":'Permalink to "by 花花([Tulip-hua](https://github.com/Tulip-hua))"'},"​")],-1),P=e("blockquote",null,[e("p",null,"编者注✍️:下面这位就是花师傅说的时好时坏的 002 ⬇️")],-1),q=e("h3",{id:"by-张师傅-liyulingyue",tabindex:"-1"},[t("by 张师傅("),e("a",{href:"https://github.com/liyulingyue",target:"_blank",rel:"noreferrer"},"liyulingyue"),t(") "),e("a",{class:"header-anchor",href:"#by-张师傅-liyulingyue","aria-label":'Permalink to "by 张师傅([liyulingyue](https://github.com/liyulingyue))"'},"​")],-1),T=e("h3",{id:"by-独师傅-longranger2",tabindex:"-1"},[t("by 独师傅("),e("a",{href:"https://github.com/longranger2",target:"_blank",rel:"noreferrer"},"longranger2"),t(") "),e("a",{class:"header-anchor",href:"#by-独师傅-longranger2","aria-label":'Permalink to "by 独师傅([longranger2](https://github.com/longranger2))"'},"​")],-1),x=e("br",null,null,-1),I=e("h3",{id:"by-陈沧夜-mrcangye",tabindex:"-1"},[t("by 陈沧夜("),e("a",{href:"https://github.com/mrcangye",target:"_blank",rel:"noreferrer"},"mrcangye"),t(") "),e("a",{class:"header-anchor",href:"#by-陈沧夜-mrcangye","aria-label":'Permalink to "by 陈沧夜([mrcangye](https://github.com/mrcangye))"'},"​")],-1),z=e("h3",{id:"by-梦师傅-ligoml",tabindex:"-1"},[t("by 梦师傅("),e("a",{href:"https://github.com/Ligoml",target:"_blank",rel:"noreferrer"},"Ligoml"),t(") "),e("a",{class:"header-anchor",href:"#by-梦师傅-ligoml","aria-label":'Permalink to "by 梦师傅([Ligoml](https://github.com/Ligoml))"'},"​")],-1),C=i("",8),R=i("",8),w=JSON.parse('{"title":"【开源江湖闲聊录】躺平健身搞开源:敏师傅的三十而立","description":"","frontmatter":{"title":"【开源江湖闲聊录】躺平健身搞开源:敏师傅的三十而立","date":"2023-12-07T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇(小记者)","github":"wenxiaohahaha"},{"name":"李敏(敏师傅)","github":"enkilee"}]},"headers":[],"relativePath":"posts/limin-story.md","filePath":"posts/limin-story.md"}'),V={name:"posts/limin-story.md"},N=Object.assign(V,{setup(A){return(S,j)=>(l(),s("div",null,[_,a(o,null,{default:r(()=>[a(n,{name:"孙钟恺",github:"sunzhongkai588"},{default:r(()=>[t(" 一开始对敏哥印象深刻,是因为敏哥的微信昵称拼音——讷言敏行(nè yán mǐn xíng),总共 4 个,有位前同事能把其中 2 个读错成 nà ... ... háng。🤣 "),m,t(" 之后,从提文档修复的 PR 开始,就能明显感觉到敏哥的进步,再到后来敏哥能一口气把好多快乐开源任务都认领完成了,真的非常厉害。 ")]),_:1})]),_:1}),f,a(o,null,{default:r(()=>[a(n,{name:"张婷",github:"zhangting2020"},{default:r(()=>[t(" 敏师傅领题目、push 研发超积极。最厉害的是自己不做测试的,都是一把改完 push 上去看 CI 结果,也不需要 GPU 算力(手动狗头),以充分利用婷姐的脑力资源为主。 ")]),_:1})]),_:1}),y,a(o,null,{default:r(()=>[a(n,{name:"汪昕",github:"GreatV"},{default:r(()=>[t(" 敏师傅,当然是实力超强的摸鱼仙人 ")]),_:1})]),_:1}),k,a(o,null,{default:r(()=>[a(n,{name:"花花",github:"Tulip-hua"},{default:r(()=>[t(" 众所周知,飞桨开源社区分为两股势力:以敏师傅为首的好人阵营,以 002 为首的时好时坏阵营。 ")]),_:1})]),_:1}),P,q,a(o,null,{default:r(()=>[a(n,{name:"张一乔",github:"liyulingyue"},{default:r(()=>[t(" 敏师傅简直是吾辈楷模,能愉快的摸鱼提 PR,还有老婆,真让人羡慕。 ")]),_:1})]),_:1}),T,a(o,null,{default:r(()=>[a(n,{name:"张伟鸿",github:"longranger2"},{default:r(()=>[t(" 敏师傅给我的感觉就如同金庸武侠小说里的扫地僧,活跃在飞桨各大大小小的社区当中,神秘而且武功深不可测,有极高技艺却又深藏不露。嘴上说着摸鱼,但上班的时候提起 PR 毫不手软(敏师傅,咱贵公司还招人吗[可怜])。敏师傅也是一部行走的百科全书,上知天文,下知地理,尤其对吃的颇有造诣,如果你想知道不同地方的美食,问敏师傅就对了。 "),x,t(" 不过我也得来吐槽下敏师傅,平时我认领的任务还没开始做的时候,张师傅都是口嗨说要背刺我,但只有敏师傅是来真的,直接把我认领的任务做了,希望敏师傅下次能给我留口汤喝,ball ball you 了😭 ")]),_:1})]),_:1}),I,a(o,null,{default:r(()=>[a(n,{name:"陈龙",github:"mrcangye"},{default:r(()=>[t(" 敏师傅是我人生重要的领路人之一,每次抉择迷茫时候,敏师傅总会用他经验满满的信息差对我的迷茫分叉口进行降维打击!最后让我拨云见月,酣畅淋漓! ")]),_:1})]),_:1}),z,a(o,null,{default:r(()=>[a(n,{name:"梦柳",github:"Ligoml"},{default:r(()=>[t(" 敏哥人超好!职场导师+1 ")]),_:1})]),_:1}),C,a(o,null,{default:r(()=>[a(n,{name:"敏师傅",github:"enkilee"},{default:r(()=>[t(" 自我宣言:本人手艺还行,刀工一般,之前在某集团时没事跑去炊事班练练手,打打牙祭。煎、炒、烹、炸、焖、炖、溜、熬、蒸、烩、煮、烙、汆、酿、扒、烧都会烧点。 ")]),_:1})]),_:1}),R]))}});export{w as __pageData,N as default}; diff --git a/assets/posts_loaf-sharing.md.sT6p5rBR.js b/assets/posts_loaf-sharing.md.sT6p5rBR.js new file mode 100644 index 0000000..4d7ba13 --- /dev/null +++ b/assets/posts_loaf-sharing.md.sT6p5rBR.js @@ -0,0 +1 @@ +import{_ as t,o as s,c as o,a}from"./chunks/framework.-K2UgQQN.js";const r="/assets/loaf-1.2WhV2hpf.jpg",p="/assets/loaf-2.ub4pVJHv.jpg",e="/assets/loaf-3.Pr_KikTr.jpg",n="/assets/loaf-4.smpVSkFS.jpg",l="/assets/loaf-5.rWWY3lMw.jpg",i="/assets/loaf-6.YtL7HAYb.jpg",g="/assets/loaf-7.iav3FEPs.jpg",_="/assets/loaf-8.FVrOJ4Ep.jpg",c="/assets/loaf-9.uFI16d1N.jpg",h="/assets/loaf-10.m92-IOgQ.jpg",T=JSON.parse('{"title":"如何在开源社区摸 🐟?","description":"","frontmatter":{"title":"如何在开源社区摸 🐟?","date":"2023-12-18T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"}},"headers":[],"relativePath":"posts/loaf-sharing.md","filePath":"posts/loaf-sharing.md"}'),m={name:"posts/loaf-sharing.md"},f=a('

本篇博客文章的内容,来源于作者在「第八届中国开源年会」上分享的一次主题为 「如何在开源社区摸 🐟」 的闪电演讲,以下的部分为演讲的具体内容。

loaf-01

01-个人简介

大家好,今天我想分享的主题是 「如何在开源社区摸 🐟」。在演讲开始前先自我介绍一下,我叫孙钟恺,社区里的开发者都称呼我为 孙师傅,下图为我的 Github ID、头像和贡献热力图。

loaf-02

从上面的职业标签可以看出,我是入职百度一年半(0.5🐔年)、目前负责 Paddle 开源社区以及官网文档的飞桨校招产品经理。作为一名新人,我也没有什么特长,唯一擅长的就是摸 🐟 吧~所以在这里也和大家分享一下我的摸 🐟 经验。

02-摸 🐟 经验

我的摸鱼经验其实从这幅图就可以说明白,就是工作上三思而后行

  • 第一,这工作能不能不做
  • 第二,这工作能不能晚点做
  • 第三,这工作能不能交给别人做

loaf-03

但是,理想是丰满的,现实是骨感的。老板的回复也很直接:

  • 第一,你能不能滚蛋;
  • 第二,你能不能早点滚蛋。

不过对于第三点呢,老板似乎不太抗拒(反正不是交给他做🐶)。于是我就在思考,也许可以通过“把工作转交给别人”的方式,来简单摸个 🐟。

那么问题来了,具体交给谁做呢?我看向了我的同事和研发大爷们。经过几百回的试探和心理博弈后,研发大爷们均以“人力不够”、“优先级低”等借口来拒绝我。而且咱们研发工作日做牛做马,一到周末直接原地消失了,一看 GitHub 热力图,周六、周日都是空的。

补充:不过这也说明百度还算是一个遵守劳动法的公司,周末都是双休的~

然后,我把我的目光转向了社区开发者们。哎,发现他们的开源热情似乎还是很高涨的,有的开发者甚至把开源视为人生价值(“工作就是图一乐”、“人生价值实现还得靠开源”)我又翻了翻一些社区开发者的 GitHub 热力图,一看吓一跳 😮,绿油油的一片,7*24 小时全职开源。

loaf-04

至此之后呢,我就把 “把活儿交给社区开发者”,作为我摸 🐟 的核心思想。

loaf-05

但是,怎么“把活儿交给社区开发者”,也是需要讲点基本法的,所以我总结了两条方法~

03-「把活儿交给社区开发者」初级版

首先,我先介绍一下初级版,即把一些 明确的轻量级任务 交给社区开发者做。

怎么理解呢?其实很多问题已经由社区开发者和内部研发进行多轮讨论了,并经过 任务拆解 后,形成了可以直接去上手做的轻量级任务。这些轻量级任务最终会公布到社区,并以 tracking issue 的形式进行发布和追踪,下图右方就是部分的这类任务。

loaf-06

因为这些任务相对简单、好上手,社区开发者反馈其实非常好,有些人可能周末会去做,有些人甚至上班摸鱼的时候也在做。

发布这类任务的优点在于——因为任务比较简单,“啪”的一下做的很快,完成率又特别高。更重要的是,开发者也会很愉悦,比如花一个小时提一个 PR 上来,就能把任务做完了,很容易带来满足感~(而且也会有小礼品)

不过这类任务也有一些缺点——这些任务需要花精力进行任务的拆解、详细的描述,甚至还可能需要指导和大量的 Review。所以这 🐟 虽然摸了,但只摸了一半。

loaf-07

03-「把活儿交给社区开发者」终极摸鱼版

基于上述,我之后又总结了终极摸鱼版的方法,就是 把问题交由社区开发者来主导

怎么理解呢?就是我们飞桨只提供大概的题目和方向,由社区开发者根据问题 自行进行拆解,然后在我们的指导下开展任务。比较典型的是 将 xdoctest 引入飞桨工作流,这个题目是由社区开发者顺师傅(@megemini)来完成的。

xdoctest 是一个文档示例代码的检查工具。

从下面右半边可以看到,顺师傅按自己的理解对任务进行拆解,分为不同的阶段,并有条不紊的完成。并且还衍生出了一些批量的社区任务,比如全量的修改了飞桨一千多个 API 的示例代码。这是一个人完成不了的,需要号召更多的社区开发者来参与,因此这个项目也极大调动了整个社区的氛围和活力。

loaf-08

所以说,其实把问题交给社区开发者主导,会有很多积极的方面~一方面能够帮我们分担了很大的研发精力(帮我们摸 🐟),另一方面也会不经意间对整个社区有正向的影响力。

04-摸 🐟 的前提条件

最后也提一下,其实摸鱼也有很多前提条件,需要有良好的社区氛围丝滑的社区交流研发的大力支持运营的宣传推广...这些条件都是缺一不可的~所以虽然是摸鱼,但也需要遵循很多客观规律。

loaf-09


以上是我演讲的全部内容,感谢大家的观看~

loaf-10

',41),d=[f];function u(b,k,P,q,j,x){return s(),o("div",null,d)}const V=t(m,[["render",u]]);export{T as __pageData,V as default}; diff --git a/assets/posts_loaf-sharing.md.sT6p5rBR.lean.js b/assets/posts_loaf-sharing.md.sT6p5rBR.lean.js new file mode 100644 index 0000000..f37144a --- /dev/null +++ b/assets/posts_loaf-sharing.md.sT6p5rBR.lean.js @@ -0,0 +1 @@ +import{_ as t,o as s,c as o,a}from"./chunks/framework.-K2UgQQN.js";const r="/assets/loaf-1.2WhV2hpf.jpg",p="/assets/loaf-2.ub4pVJHv.jpg",e="/assets/loaf-3.Pr_KikTr.jpg",n="/assets/loaf-4.smpVSkFS.jpg",l="/assets/loaf-5.rWWY3lMw.jpg",i="/assets/loaf-6.YtL7HAYb.jpg",g="/assets/loaf-7.iav3FEPs.jpg",_="/assets/loaf-8.FVrOJ4Ep.jpg",c="/assets/loaf-9.uFI16d1N.jpg",h="/assets/loaf-10.m92-IOgQ.jpg",T=JSON.parse('{"title":"如何在开源社区摸 🐟?","description":"","frontmatter":{"title":"如何在开源社区摸 🐟?","date":"2023-12-18T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"}},"headers":[],"relativePath":"posts/loaf-sharing.md","filePath":"posts/loaf-sharing.md"}'),m={name:"posts/loaf-sharing.md"},f=a("",41),d=[f];function u(b,k,P,q,j,x){return s(),o("div",null,d)}const V=t(m,[["render",u]]);export{T as __pageData,V as default}; diff --git a/assets/posts_pku-course.md.vgA8_dn2.js b/assets/posts_pku-course.md.vgA8_dn2.js new file mode 100644 index 0000000..c20a16a --- /dev/null +++ b/assets/posts_pku-course.md.vgA8_dn2.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,a as r}from"./chunks/framework.-K2UgQQN.js";const s="/assets/jun-present.bRm38uME.jpg",o="/assets/jie-present.Wf2U-8sz.jpg",n="/assets/apollo-park-all.eayktu2y.jpg",p="/assets/apollo-park-meng-present.vP2EfT4Y.jpg",g=JSON.parse('{"title":"飞桨开源社区走进北京大学课堂","description":"","frontmatter":{"title":"飞桨开源社区走进北京大学课堂","date":"2023-11-21T00:00:00.000Z","author":{"name":"Jun","github":"jzhang533"},"co_authors":[{"name":"杰师傅","github":"Aurelius84"}]},"headers":[],"relativePath":"posts/pku-course.md","filePath":"posts/pku-course.md"}'),l={name:"posts/pku-course.md"},i=r('

飞桨开源社区走进北京大学课堂

10 月 11 日,飞桨开源社区应北京大学计算机学院周明辉副院长邀请,在周老师的开源软件开发课程的第四次课上,为北大的同学们介绍了飞桨开源社区和飞桨新一代 IR 设计。

Jun 给同学们介绍了飞桨开源社区的基本情况 jun-present

杰师傅给同学们深入浅出的介绍了飞桨新一代 IR 设计。 jie-present

课程材料在线观看

这次课程的 Slides,可以在这里在线浏览:飞桨-北大讲课-2023-10-11

彩蛋 🎊

飞桨开源社区曾经在 Apollo Park 接待过北大的国际留学生,梦师傅曾经全英文给参加北京大学夏季夏令营的牛校的神兽们讲解过飞桨。 apollo-park-allapollo-park-meng-present

',8),c=[i];function _(u,E,m,A,h,B){return a(),t("div",null,c)}const k=e(l,[["render",_]]);export{g as __pageData,k as default}; diff --git a/assets/posts_pku-course.md.vgA8_dn2.lean.js b/assets/posts_pku-course.md.vgA8_dn2.lean.js new file mode 100644 index 0000000..4704e34 --- /dev/null +++ b/assets/posts_pku-course.md.vgA8_dn2.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,a as r}from"./chunks/framework.-K2UgQQN.js";const s="/assets/jun-present.bRm38uME.jpg",o="/assets/jie-present.Wf2U-8sz.jpg",n="/assets/apollo-park-all.eayktu2y.jpg",p="/assets/apollo-park-meng-present.vP2EfT4Y.jpg",g=JSON.parse('{"title":"飞桨开源社区走进北京大学课堂","description":"","frontmatter":{"title":"飞桨开源社区走进北京大学课堂","date":"2023-11-21T00:00:00.000Z","author":{"name":"Jun","github":"jzhang533"},"co_authors":[{"name":"杰师傅","github":"Aurelius84"}]},"headers":[],"relativePath":"posts/pku-course.md","filePath":"posts/pku-course.md"}'),l={name:"posts/pku-course.md"},i=r("",8),c=[i];function _(u,E,m,A,h,B){return a(),t("div",null,c)}const k=e(l,[["render",_]]);export{g as __pageData,k as default}; diff --git a/assets/posts_shun-story.md.pNwDx0qR.js b/assets/posts_shun-story.md.pNwDx0qR.js new file mode 100644 index 0000000..4f68fd0 --- /dev/null +++ b/assets/posts_shun-story.md.pNwDx0qR.js @@ -0,0 +1 @@ +import{_ as t,o,c as e,a as r}from"./chunks/framework.-K2UgQQN.js";const a="/assets/shun-01.lh4i3Vum.jpg",s="/assets/shun-05.ZylgHSxU.jpg",n="/assets/shun-02._3do16aP.jpg",l="/assets/shun-03.1LRYu66s.jpg",i="/assets/shun-04.kN0icqfQ.jpg",q=JSON.parse('{"title":"【开源江湖闲聊录】社区掌舵人:顺师傅的 Paddle 之旅","description":"","frontmatter":{"title":"【开源江湖闲聊录】社区掌舵人:顺师傅的 Paddle 之旅","date":"2023-11-21T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇","github":"wenxiaohahaha"},{"name":"柳顺(顺师傅)","github":"megemini"}]},"headers":[],"relativePath":"posts/shun-story.md","filePath":"posts/shun-story.md"}'),p={name:"posts/shun-story.md"},g=r('

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。

一、前言

是谁,能让最摸 🐟 的开发者禁不住 PR 的诱惑,疯狂求 review?又是谁,让向来严于待人、宽以律己的 Paddle 开发者忍不住夸夸?接下来,有请我们的大佬——顺师傅

shun-01

顺师傅是一名 Paddle 的社区开发者,但在社区里,顺师傅不仅仅是一个称呼,更是一股推动力。他主导的项目 【将 xdoctest 引入飞桨工作流】 是 Paddle 社区迄今为止最大的开源活动 🎊。该项目规模极其庞大,涉及超过一千多个 API 示例的整合和数十万行代码的优化,由超过 20 名社区开发者共同完成。顺师傅的领导力不仅显著提升了 API 示例代码的规范性,还极大地促进了整个开源生态的发展和繁荣 🎉。

而顺师傅本身,作为一位经验丰富的资深开发者,也拥有着深厚的技术背景和广泛的知识储备。我们怀着对他的好奇(膜拜)🤩,通过文字采访的形式来深入了解顺师傅的故事,以下是我们与顺师傅的采访内容 📄。

二、采访内容

  1. 可以介绍一下自己吗?平时有什么兴趣爱好?

    顺师傅: 我的 AI Studio 和 GitHub 的账号是 megemini,平时喜欢看看书爬爬山跑跑步~

  2. 作为一名技术佬,你的一天是如何度过的呢? 可以分享一下你的日常生活么?

    顺师傅: 每天都会做的事情,比如写代码、跑步、看书之外,由于最近需要用到 C++,而上一次用 C++ 都是十多年前的事情了,所以近期看一些 C++ 新特性相关的书和视频教程会比较多 ~

  3. 可以简单向大家展示一下你一天的生活作息嘛?

    顺师傅: 家里情况比较特殊,没有什么可参考性~ 不过现在不会熬夜写代码了,晚上一般七八点钟也会出去跑跑~

  4. “上一次用 C++ 都是十多年前的事情了”这句话太有年代感了,是在学生时代用的吗?

    顺师傅: 嗯,工作之后 Java、Python 用的比较多 ~

  5. 你是如何成为 Paddle 社区的开发者的?

    顺师傅: 毫不避讳的说,当初是因为 AI Studio 有比较多的免费算力才接触到 Paddle 社区并真正的开始使用 PaddlePaddle 框架,慢慢的后面才接触到黑客松、快乐开源之类的活动 ~

  6. Paddle 社区开发者都称呼你为“顺师傅”,这个称呼是怎么来的?是谁第一个开始这么称呼你的(笑)?

    顺师傅: 微信的昵称就是「顺」,好像是涛姐还是 001 开始这么叫的 ... ... 惭愧 ... ...

  7. 外界对开发者的固有印象(社恐,直男),你周围的开发者形象是怎样的?你对 Paddle 哪位社区开发者印象最深?

    顺师傅: 开发者都比较坦诚,由于平时基本都是跟技术打交道,所以不管是话多也好、话少也罢,交流起来都是比较简单、热心的感觉~001 对于开源的那种热爱对我印象最为深刻~

    SigureMo 是 Paddle 社区的资深开发者,由于是第一位社区 commiter 而被大家称为 001。

  8. 为什么 001 会给你带来这样深刻的印象?可以分享一下其中的小故事嘛?

    顺师傅: 记得当时为了修改示例代码写了一个小工具,本来还只是想发出来试一下,结果好像第二天 001 的 PR 就来了~技术能力和执行力都太强了,惭愧 ... ...

  9. 你可以谈谈你对开源社区的理解和认识吗?

    顺师傅: 抛开自由、开放不谈,开源项目的参与门槛其实是比较高的,这里主要是针对正规的、规模较大的开源项目、代码类的贡献来说~因此,飞桨能够组织快乐开源、黑客松之类的活动,并且是由中文社区主导,个人感觉是非常有意义的一件事情~

  10. “将 xdoctest 引入飞桨工作流”这个项目是如何诞生的?你可以谈谈这个项目的初衷和目标吗?

    顺师傅: 这个项目是第六届中国软件开源创新大赛 Paddle 挑战赛的一个赛题,主要目标是使用 xdoctest 替换掉 CI 流水线中的不怎么好用的示例代码检查工具~

  11. 你是如何组织和号召其他社区开发者参与这个项目的?在这个过程中遇到了哪些挑战,又是如何克服的?

    顺师傅: 嗯 ... ... 这里应该主要感谢涛姐帮忙摇人吧~~~我所做的只是把事情讲清楚,仅此而已 ~

  12. 这个项目涉及到一千多个 API 示例、数十万行代码的修改,你是如何管理和协调这么大规模的项目的?

    顺师傅: 飞桨开源社区的参与者能力都很强,所以,只要把事情讲清楚,做什么、怎么做,大家自然会把事情做好~期间,001、涛姐、孙师傅、军哥等等很多人,都帮助一起分析如何把这个事情讲清楚,大家目标一致,水到渠成吧~

  13. 这个项目的完成对 Paddle 社区的开源生态有何影响?你认为它在推动开源生态繁荣方面的作用体现在哪里?

    顺师傅: 提升代码质量、对齐主流 Python 解决方案~能够引导更多 “新人” 参与到开源项目中来~

  14. 在你看来,这个项目的最大贡献是什么?为什么?

    顺师傅: 丢掉历史包袱,以后大家都是在统一的 Python 标准下参与贡献,未来的技术选择灵活性都大很多~

  15. 回顾这个项目,有哪些时刻让你印象深刻?为什么?

    顺师傅: 印象最深刻的是当时 RFC 讨论的时候~参与之前本来是抱着试一试、捡漏的心态来的,结果 RFC 一番讨论下来,有种骑虎难下的感觉 ... ... 另外,在发起示例代码修改这个快乐开源活动之后,看到能有这么多开发者参与进来,并且最终把这个项目做了下来,飞桨开源社区号召力之大,属实给了我一次小小的震撼~

  16. 对于未来,你对 Paddle 社区有哪些期待和建议?

    顺师傅: 希望能够引导更多中文社区的开发者参与进来,能够有更多在校的学生参与进来~另外,提一点小小的建议,虽然已经参与飞桨开源社区快一年了,但是,仍然对 Paddle 本身的框架技术路线、技术规划以及一些细节考量非常模糊,希望能有这方面较为系统的文档、视频教程吧~

  17. 作为一名经验丰富的老开发,对于想要参与开源社区,特别是 Paddle 社区的年轻人,你有什么建议或者寄语?

    顺师傅: 只有让更多年轻的开发者不断接过手中的桨,才能将开源社区一直行驶下去,直至星辰大海~

三、“五星评论家麦克阿瑟”专区

我们也邀请了一些和顺师傅很熟悉的、有过合作经历的朋友们,贡献一下和顺师傅相关的故事,或者他们对顺师傅的评价~以下均为真心话,请放心看! shun-05

001(SigureMo

就 Xdoctest 这个任务而言,最开始其实我自己都是没有多少信心的,毕竟是整个框架级别的,光是任务量想想就头疼,而且历史遗留问题特别多,怎么想都做不来吧?当初想着在 RFC 阶段就尽可能抛出我已知的各种坑,让开发者知难而退,这样我也能省心些,要是啥也不懂的我也带不动。

但是顺师傅的出现打破了我的摸鱼计划,顺师傅上千行的 RFC 调研地比我了解的还清楚,对于我提出的各种「劝退」问题也逐一回复了合理的解决方案,这时候我突然觉得,也许真的能成?

RFC 合入后顺师傅有条不紊地推进着整个任务,每一次遇到疑难问题时,顺师傅总能选出合适的解决方案。比如 Paddle Tensor 打印时候 Place 不对齐的问题、输出精度问题、运行环境隔离问题等等,这些都是 Xdoctest 本身存在的诸多问题,经过顺师傅的调整和优化,Xdoctest 已经基本能够完美适配我们 Paddle 了。

此外大家可能比较熟悉顺师傅发放的两个开源任务,也是整个任务耗时最久的部分,顺师傅在开源任务中从开发者转变为了 reviewer,帮助我们 review 了很大一部分的 PR,并且 review 地十分细致且专业。

然后就如大家所见到的,真的成了。

顺师傅太强了~期待下次合作~

涛姐(luotao1

本任务难点在于工程量大、历史包袱重,感谢顺师傅带着所有队员(24 位)用强大的耐心、细心完成了这一旷日持久的推进,你们的工匠精神值得全体同学学习!众人拾柴火焰高,感谢项目的所有参与的同学!

编者注✍️: 涛姐的话太官方了,所以我挑了句重点,希望涛姐能原谅我 🤪

敏师傅(enkilee

有幸通过软件开源创新大赛,结识了顺师傅,他的大赛课题是将 xdoctest 引入到飞桨框架工作流中,为了提升效率,减少错误,还不辞辛苦做了一个简单的转换工具 convert_doctest,极大的节省了修改的工作量,减少了出错成本。

此任务工作量巨大,而且很多 API 历史遗留问题繁杂,顺师傅在工作中展现出的极高的职业素养和敬业精神令我们为之侧目。他对待每一个细节都非常用心,力求做到尽善尽美。在面对复杂的问题时,他总是能够迅速找到解决办法,充分体现了他的专业能力和经验。

此外,顺师傅还具有很强的团队协作能力,他乐于与大家分享经验和技巧,共同提高整个团队的工作效率。在工作中,他总是能够主动承担责任,为团队的发展贡献自己的力量。

川川(gouzil

顺师傅好强,带带弟弟 shun-02 顺师傅的分析能力和组织能力都超强 shun-03

孙师傅(sunzhongkai588

在参与顺师傅的项目过程中,我甚至感觉顺师傅像我的 mentor,因为从他身上切切实实学到了很多东西,比如问题的拆解、项目的组织、技术的交流等...

尤其是看到顺师傅逻辑非常清晰的 RFC 文档后,仅从文档写作方面都让我受益匪浅(因为文档的编写需要非常多的逻辑推理和思考,而像顺师傅一样把事情讲清楚的研发,真的不多,大家感兴趣也可以去看看)功利地说,顺师傅对我的职业发展有非常大的提升,希望顺师傅能够继续加油,影响更多人!

四、结尾

在探索顺师傅的旅程中,我们不仅发现了一个技术上的资深开发者,也见证了一个开源社区领路人的成长和影响力。他的故事和成就展示了开源社区不仅是技术的聚集地,更是所有开发者开源热情的熔炉 🔥。

期待顺师傅在未来的旅程中继续发光发热,为 Paddle 或是其他开源社区带来更多的创新和启示 💡。

最后,应顺师傅要求,就不附照片了,以一棵柳树作为结尾 🌲

shun-04

彩蛋 🥚

往期 blog 有顺师傅真容哦~大家可以去探索一下!

',28),h=[g];function d(u,c,b,m,P,_){return o(),e("div",null,h)}const f=t(p,[["render",d]]);export{q as __pageData,f as default}; diff --git a/assets/posts_shun-story.md.pNwDx0qR.lean.js b/assets/posts_shun-story.md.pNwDx0qR.lean.js new file mode 100644 index 0000000..056cc03 --- /dev/null +++ b/assets/posts_shun-story.md.pNwDx0qR.lean.js @@ -0,0 +1 @@ +import{_ as t,o,c as e,a as r}from"./chunks/framework.-K2UgQQN.js";const a="/assets/shun-01.lh4i3Vum.jpg",s="/assets/shun-05.ZylgHSxU.jpg",n="/assets/shun-02._3do16aP.jpg",l="/assets/shun-03.1LRYu66s.jpg",i="/assets/shun-04.kN0icqfQ.jpg",q=JSON.parse('{"title":"【开源江湖闲聊录】社区掌舵人:顺师傅的 Paddle 之旅","description":"","frontmatter":{"title":"【开源江湖闲聊录】社区掌舵人:顺师傅的 Paddle 之旅","date":"2023-11-21T00:00:00.000Z","author":{"name":"孙钟恺","github":"sunzhongkai588"},"co_authors":[{"name":"文潇","github":"wenxiaohahaha"},{"name":"柳顺(顺师傅)","github":"megemini"}]},"headers":[],"relativePath":"posts/shun-story.md","filePath":"posts/shun-story.md"}'),p={name:"posts/shun-story.md"},g=r("",28),h=[g];function d(u,c,b,m,P,_){return o(),e("div",null,h)}const f=t(p,[["render",d]]);export{q as __pageData,f as default}; diff --git a/assets/posts_xian-event.md.6a_wLK8y.js b/assets/posts_xian-event.md.6a_wLK8y.js new file mode 100644 index 0000000..73e4fef --- /dev/null +++ b/assets/posts_xian-event.md.6a_wLK8y.js @@ -0,0 +1 @@ +import{_ as e,o as r,c as t,a}from"./chunks/framework.-K2UgQQN.js";const n="/assets/xian-event-01.ZfbVQODC.jpg",o="/assets/xian-event-02.X6Ku-YR-.jpg",i="/assets/xian-event-03.Jda_UfMC.jpg",s="/assets/xian-event-04.-xjUaLnr.jpg",h="/assets/xian-event-05.guGYjzl4.jpg",g="/assets/xian-event-06.UapPvsDJ.jpg",v=JSON.parse('{"title":"飞桨开源社区参加中国开源软件创新大赛剪影","description":"","frontmatter":{"title":"飞桨开源社区参加中国开源软件创新大赛剪影","date":"2023-10-25T00:00:00.000Z","author":{"name":"Jun","github":"jzhang533"}},"headers":[],"relativePath":"posts/xian-event.md","filePath":"posts/xian-event.md"}'),l={name:"posts/xian-event.md"},p=a('

在中国计算机学会组织的中国软件开源创新大赛上,飞桨开源社区的全部比赛已经完成。恭喜以下获奖的同学:

飞桨开源社区有四名同学参加了中国计算机学会组织的中国软件开源创新大赛决赛,这里记录一下在西安参加活动时候的一些照片。大赛的决赛的结果在这里:第六届 CCF 开源创新大赛决赛结果通知

活动签到处

xian-event-01

@megemini 在做《将 xdoctest 引入到飞桨框架工作流中》的项目答辩。

xian-event-02

@qiuwenbogdut在做《实现飞桨框架动态图反向图的可视化》的项目答辩。 xian-event-03

@co63oc在做《PaddleScience 领域前沿论文复现》的项目答辩(远程接入,遗憾没见到真人)。 xian-event-04

@zrr1999在做《实现飞桨框架的 python level jit compiler》的项目答辩。 xian-event-05

梦师傅在跟顺师傅和詹师傅交流。

xian-event-06

',12),c=[p];function _(f,m,u,b,d,k){return r(),t("div",null,c)}const z=e(l,[["render",_]]);export{v as __pageData,z as default}; diff --git a/assets/posts_xian-event.md.6a_wLK8y.lean.js b/assets/posts_xian-event.md.6a_wLK8y.lean.js new file mode 100644 index 0000000..04cbfd9 --- /dev/null +++ b/assets/posts_xian-event.md.6a_wLK8y.lean.js @@ -0,0 +1 @@ +import{_ as e,o as r,c as t,a}from"./chunks/framework.-K2UgQQN.js";const n="/assets/xian-event-01.ZfbVQODC.jpg",o="/assets/xian-event-02.X6Ku-YR-.jpg",i="/assets/xian-event-03.Jda_UfMC.jpg",s="/assets/xian-event-04.-xjUaLnr.jpg",h="/assets/xian-event-05.guGYjzl4.jpg",g="/assets/xian-event-06.UapPvsDJ.jpg",v=JSON.parse('{"title":"飞桨开源社区参加中国开源软件创新大赛剪影","description":"","frontmatter":{"title":"飞桨开源社区参加中国开源软件创新大赛剪影","date":"2023-10-25T00:00:00.000Z","author":{"name":"Jun","github":"jzhang533"}},"headers":[],"relativePath":"posts/xian-event.md","filePath":"posts/xian-event.md"}'),l={name:"posts/xian-event.md"},p=a("",12),c=[p];function _(f,m,u,b,d,k){return r(),t("div",null,c)}const z=e(l,[["render",_]]);export{v as __pageData,z as default}; diff --git a/assets/pp-coffee.esm3s-xL.jpeg b/assets/pp-coffee.esm3s-xL.jpeg new file mode 100644 index 0000000..0888ae1 Binary files /dev/null and b/assets/pp-coffee.esm3s-xL.jpeg differ diff --git a/assets/shun-01.lh4i3Vum.jpg b/assets/shun-01.lh4i3Vum.jpg new file mode 100644 index 0000000..0aa3736 Binary files /dev/null and b/assets/shun-01.lh4i3Vum.jpg differ diff --git a/assets/shun-02._3do16aP.jpg b/assets/shun-02._3do16aP.jpg new file mode 100644 index 0000000..be46d7d Binary files /dev/null and b/assets/shun-02._3do16aP.jpg differ diff --git a/assets/shun-03.1LRYu66s.jpg b/assets/shun-03.1LRYu66s.jpg new file mode 100644 index 0000000..41d3ca0 Binary files /dev/null and b/assets/shun-03.1LRYu66s.jpg differ diff --git a/assets/shun-04.kN0icqfQ.jpg b/assets/shun-04.kN0icqfQ.jpg new file mode 100644 index 0000000..9c6f282 Binary files /dev/null and b/assets/shun-04.kN0icqfQ.jpg differ diff --git a/assets/shun-05.ZylgHSxU.jpg b/assets/shun-05.ZylgHSxU.jpg new file mode 100644 index 0000000..609fe30 Binary files /dev/null and b/assets/shun-05.ZylgHSxU.jpg differ diff --git a/assets/style.TM1zjq9v.css b/assets/style.TM1zjq9v.css new file mode 100644 index 0000000..5c50ad3 --- /dev/null +++ b/assets/style.TM1zjq9v.css @@ -0,0 +1 @@ +figure{text-align:center}figcaption{color:orange;border-bottom:1px solid #d9d9d9;display:inline-block;color:#999;padding:2px}*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-left-width:.25rem;border-left-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%),0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%);font-size:.875em;border-radius:.3125rem;padding:.1875em .375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding:.8571429em 1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body: #374151;--tw-prose-headings: #111827;--tw-prose-lead: #4b5563;--tw-prose-links: #111827;--tw-prose-bold: #111827;--tw-prose-counters: #6b7280;--tw-prose-bullets: #d1d5db;--tw-prose-hr: #e5e7eb;--tw-prose-quotes: #111827;--tw-prose-quote-borders: #e5e7eb;--tw-prose-captions: #6b7280;--tw-prose-kbd: #111827;--tw-prose-kbd-shadows: 17 24 39;--tw-prose-code: #111827;--tw-prose-pre-code: #e5e7eb;--tw-prose-pre-bg: #1f2937;--tw-prose-th-borders: #d1d5db;--tw-prose-td-borders: #e5e7eb;--tw-prose-invert-body: #d1d5db;--tw-prose-invert-headings: #fff;--tw-prose-invert-lead: #9ca3af;--tw-prose-invert-links: #fff;--tw-prose-invert-bold: #fff;--tw-prose-invert-counters: #9ca3af;--tw-prose-invert-bullets: #4b5563;--tw-prose-invert-hr: #374151;--tw-prose-invert-quotes: #f3f4f6;--tw-prose-invert-quote-borders: #374151;--tw-prose-invert-captions: #9ca3af;--tw-prose-invert-kbd: #fff;--tw-prose-invert-kbd-shadows: 255 255 255;--tw-prose-invert-code: #fff;--tw-prose-invert-pre-code: #d1d5db;--tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);--tw-prose-invert-th-borders: #4b5563;--tw-prose-invert-td-borders: #374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>*:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>*:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>*:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>*:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-left:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-right:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-right:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.m-0{margin:0}.mx-auto{margin-left:auto;margin-right:auto}.\!mt-0{margin-top:0!important}.mb-3{margin-bottom:.75rem}.ml-10{margin-left:2.5rem}.ml-2{margin-left:.5rem}.mr-10{margin-right:2.5rem}.mr-2{margin-right:.5rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.table{display:table}.hidden{display:none}.h-10{height:2.5rem}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.max-w-3xl{max-width:48rem}.max-w-none{max-width:none}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity))}.whitespace-nowrap{white-space:nowrap}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.border{border-width:1px}.bg-green-200{--tw-bg-opacity: 1;background-color:rgb(187 247 208 / var(--tw-bg-opacity))}.bg-green-700{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity))}.bg-slate-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity))}.p-0{padding:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-10{padding-bottom:2.5rem}.pb-16{padding-bottom:4rem}.pb-8{padding-bottom:2rem}.pl-10{padding-left:2.5rem}.pt-10{padding-top:2.5rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.uppercase{text-transform:uppercase}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-8{line-height:2rem}.leading-9{line-height:2.25rem}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.text-green-300{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity))}.text-neutral-500{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.outline{outline-style:solid}.outline-green-700{outline-color:#15803d}:root{--c-brand: #3eaf7c;--c-brand-light: #4abf8a}nav img{vertical-align:middle}p img{margin:0 auto}.prose hr{border-top:1px solid #e5e7eb}.link{color:var(--c-brand)}.link:hover{color:var(--c-brand-light)}.header-anchor{display:none}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999}.token.punctuation{color:#ccc}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.number,.token.function{color:#f08d49}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699}.token.operator,.token.entity,.token.url{color:#67cdcc}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:#67cdcc}button.copy{display:none}span.lang{position:absolute;right:.5em;font-size:.75em;color:#999;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.custom-block{margin:28px 0;padding:0 24px 2px;border-radius:8px;overflow-x:auto;position:relative;font-size:14px;line-height:1.3;font-weight:500;color:#444;background-color:#f9f9f9}.custom-block .custom-block-title{margin-bottom:8px;font-size:15px;font-weight:700}.custom-block.tip{border:1px solid #42b883}.custom-block.tip:before{color:#42b883}@media (prefers-color-scheme: dark){.dark\:prose-invert{--tw-prose-body: var(--tw-prose-invert-body);--tw-prose-headings: var(--tw-prose-invert-headings);--tw-prose-lead: var(--tw-prose-invert-lead);--tw-prose-links: var(--tw-prose-invert-links);--tw-prose-bold: var(--tw-prose-invert-bold);--tw-prose-counters: var(--tw-prose-invert-counters);--tw-prose-bullets: var(--tw-prose-invert-bullets);--tw-prose-hr: var(--tw-prose-invert-hr);--tw-prose-quotes: var(--tw-prose-invert-quotes);--tw-prose-quote-borders: var(--tw-prose-invert-quote-borders);--tw-prose-captions: var(--tw-prose-invert-captions);--tw-prose-kbd: var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows: var(--tw-prose-invert-kbd-shadows);--tw-prose-code: var(--tw-prose-invert-code);--tw-prose-pre-code: var(--tw-prose-invert-pre-code);--tw-prose-pre-bg: var(--tw-prose-invert-pre-bg);--tw-prose-th-borders: var(--tw-prose-invert-th-borders);--tw-prose-td-borders: var(--tw-prose-invert-td-borders)}}.hover\:text-gray-700:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.hover\:outline:hover{outline-style:solid}@media (prefers-color-scheme: dark){.dark\:divide-slate-200\/5>:not([hidden])~:not([hidden]){border-color:#e2e8f00d}.dark\:bg-green-700{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity))}.dark\:bg-neutral-900{--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity))}.dark\:bg-zinc-700{--tw-bg-opacity: 1;background-color:rgb(63 63 70 / var(--tw-bg-opacity))}.dark\:text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity))}.dark\:text-green-300{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity))}.dark\:text-neutral-400{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity))}.dark\:text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.dark\:hover\:text-gray-200:hover{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity))}}@media (min-width: 640px){.sm\:inline{display:inline}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:leading-10{line-height:2.5rem}}@media (min-width: 768px){.md\:inline{display:inline}.md\:flex-row{flex-direction:row}.md\:justify-center{justify-content:center}.md\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(3rem * var(--tw-space-x-reverse));margin-left:calc(3rem * calc(1 - var(--tw-space-x-reverse)))}.md\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.md\:space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.md\:pl-0{padding-left:0}.md\:text-5xl{font-size:3rem;line-height:1}.md\:text-6xl{font-size:3.75rem;line-height:1}}@media (min-width: 1280px){.xl\:col-span-3{grid-column:span 3 / span 3}.xl\:col-start-1{grid-column-start:1}.xl\:row-span-2{grid-row:span 2 / span 2}.xl\:row-start-2{grid-row-start:2}.xl\:block{display:block}.xl\:grid{display:grid}.xl\:max-w-5xl{max-width:64rem}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:items-baseline{align-items:baseline}.xl\:gap-x-10{column-gap:2.5rem}.xl\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(0px * var(--tw-space-x-reverse));margin-left:calc(0px * calc(1 - var(--tw-space-x-reverse)))}.xl\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.xl\:space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.xl\:divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.xl\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px * var(--tw-divide-y-reverse))}.xl\:divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity))}.xl\:border-b{border-bottom-width:1px}.xl\:border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.xl\:px-0{padding-left:0;padding-right:0}.xl\:pb-0{padding-bottom:0}.xl\:pb-10{padding-bottom:2.5rem}.xl\:pb-20{padding-bottom:5rem}.xl\:pt-11{padding-top:2.75rem}}@media (prefers-color-scheme: dark){@media (min-width: 1280px){.dark\:xl\:divide-slate-200\/5>:not([hidden])~:not([hidden]){border-color:#e2e8f00d}.dark\:xl\:border-slate-200\/5{border-color:#e2e8f00d}}}table{display:block;width:100%;width:max-content;max-width:100%;overflow:auto}div{word-wrap:break-word}.pwa-toast{position:fixed;right:0;bottom:0;margin:16px;padding:12px;border:1px solid #8885;border-radius:4px;z-index:100;text-align:left;box-shadow:3px 4px 5px #8885;background-color:#fff}.pwa-toast #pwa-message{margin-bottom:8px}.pwa-toast button{border:1px solid #8885;outline:none;margin-right:5px;border-radius:2px;padding:3px 10px} diff --git a/assets/track-1.PdsHNl9G.jpg b/assets/track-1.PdsHNl9G.jpg new file mode 100644 index 0000000..7f41784 Binary files /dev/null and b/assets/track-1.PdsHNl9G.jpg differ diff --git a/assets/track-2.jcQzK7hh.jpg b/assets/track-2.jcQzK7hh.jpg new file mode 100644 index 0000000..f6a14b3 Binary files /dev/null and b/assets/track-2.jcQzK7hh.jpg differ diff --git a/assets/track-3.dCEdNlMR.jpg b/assets/track-3.dCEdNlMR.jpg new file mode 100644 index 0000000..661a352 Binary files /dev/null and b/assets/track-3.dCEdNlMR.jpg differ diff --git a/assets/xian-event-01.ZfbVQODC.jpg b/assets/xian-event-01.ZfbVQODC.jpg new file mode 100644 index 0000000..6a74a88 Binary files /dev/null and b/assets/xian-event-01.ZfbVQODC.jpg differ diff --git a/assets/xian-event-02.X6Ku-YR-.jpg b/assets/xian-event-02.X6Ku-YR-.jpg new file mode 100644 index 0000000..c3085d5 Binary files /dev/null and b/assets/xian-event-02.X6Ku-YR-.jpg differ diff --git a/assets/xian-event-03.Jda_UfMC.jpg b/assets/xian-event-03.Jda_UfMC.jpg new file mode 100644 index 0000000..c363d3a Binary files /dev/null and b/assets/xian-event-03.Jda_UfMC.jpg differ diff --git a/assets/xian-event-04.-xjUaLnr.jpg b/assets/xian-event-04.-xjUaLnr.jpg new file mode 100644 index 0000000..9cd59bd Binary files /dev/null and b/assets/xian-event-04.-xjUaLnr.jpg differ diff --git a/assets/xian-event-05.guGYjzl4.jpg b/assets/xian-event-05.guGYjzl4.jpg new file mode 100644 index 0000000..af018e6 Binary files /dev/null and b/assets/xian-event-05.guGYjzl4.jpg differ diff --git a/assets/xian-event-06.UapPvsDJ.jpg b/assets/xian-event-06.UapPvsDJ.jpg new file mode 100644 index 0000000..4438a7c Binary files /dev/null and b/assets/xian-event-06.UapPvsDJ.jpg differ diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..84ad3cf Binary files /dev/null and b/favicon.ico differ diff --git a/hashmap.json b/hashmap.json new file mode 100644 index 0000000..a169430 --- /dev/null +++ b/hashmap.json @@ -0,0 +1 @@ +{"posts_hackathon-5th-episode02.md":"chHv1KWn","pages_1.md":"2741IVj7","pages_2.md":"X931t6v5","posts_first-post.md":"-jvuBI1_","posts_hackathon-5th-episode03.md":"CRF5SbW0","about.md":"h4__TlQ2","index.md":"D6q36Xo0","posts_2023-os-report.md":"Pmo8QKJO","posts_pku-course.md":"vgA8_dn2","posts_loaf-sharing.md":"sT6p5rBR","posts_chuan-story.md":"HU9Msoba","posts_xian-event.md":"6a_wLK8y","posts_hackathon-5th-episode01.md":"m4EkiTMR","posts_huanggua-story.md":"rXgMLZKS","posts_limin-story.md":"gVro2_B8","posts_shun-story.md":"pNwDx0qR","posts_chengdu-kaiyuanshe.md":"H7ofFX8l","posts_huangjiyi-story.md":"x5lxcZ8g"} diff --git a/icons/apple-touch-icon-180x180.png b/icons/apple-touch-icon-180x180.png new file mode 100644 index 0000000..addeb1f Binary files /dev/null and b/icons/apple-touch-icon-180x180.png differ diff --git a/icons/maskable-icon-512x512.png b/icons/maskable-icon-512x512.png new file mode 100644 index 0000000..d89daa2 Binary files /dev/null and b/icons/maskable-icon-512x512.png differ diff --git a/icons/pwa-192x192.png b/icons/pwa-192x192.png new file mode 100644 index 0000000..2bf7c9b Binary files /dev/null and b/icons/pwa-192x192.png differ diff --git a/icons/pwa-512x512.png b/icons/pwa-512x512.png new file mode 100644 index 0000000..59aff23 Binary files /dev/null and b/icons/pwa-512x512.png differ diff --git a/icons/pwa-64x64.png b/icons/pwa-64x64.png new file mode 100644 index 0000000..9be60b2 Binary files /dev/null and b/icons/pwa-64x64.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..bcc7ae7 --- /dev/null +++ b/index.html @@ -0,0 +1,40 @@ + + + + + + 飞桨开源社区博客 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +

飞桨开源社区博客

Wonderful stories from PaddlePaddle contributors

+ + + + \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100644 index 0000000..4240632 Binary files /dev/null and b/logo.png differ diff --git a/manifest.webmanifest b/manifest.webmanifest new file mode 100644 index 0000000..7adec54 --- /dev/null +++ b/manifest.webmanifest @@ -0,0 +1 @@ +{"name":"飞桨开源社区博客","short_name":"飞桨开源社区博客","start_url":"/","display":"standalone","background_color":"#ffffff","lang":"zh-CN","scope":"/","id":"/","description":"Wonderful stories from PaddlePaddle contributors","theme_color":"#ffffff","icons":[{"src":"icons/pwa-64x64.png","sizes":"64x64","type":"image/png"},{"src":"icons/pwa-192x192.png","sizes":"192x192","type":"image/png"},{"src":"icons/pwa-512x512.png","sizes":"512x512","type":"image/png"},{"src":"icons/maskable-icon-512x512.png","sizes":"512x512","type":"image/png","purpose":"maskable"}]} diff --git a/pages/1.html b/pages/1.html new file mode 100644 index 0000000..026a40f --- /dev/null +++ b/pages/1.html @@ -0,0 +1,40 @@ + + + + + + 飞桨开源社区博客 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +

飞桨开源社区博客

Wonderful stories from PaddlePaddle contributors

+ + + + \ No newline at end of file diff --git a/pages/2.html b/pages/2.html new file mode 100644 index 0000000..d2b75af --- /dev/null +++ b/pages/2.html @@ -0,0 +1,33 @@ + + + + + + 飞桨开源社区博客 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +

飞桨开源社区博客

Wonderful stories from PaddlePaddle contributors

+ + + + \ No newline at end of file diff --git a/posts/2023-os-report.html b/posts/2023-os-report.html new file mode 100644 index 0000000..8da0fd5 --- /dev/null +++ b/posts/2023-os-report.html @@ -0,0 +1,31 @@ + + + + + + 飞桨开源社区成为国内 Top,我们做对了什么? | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

飞桨开源社区成为国内 Top,我们做对了什么?

Authors

什么是开源项目和开源社区?国内活跃度 Top 的开源社区,都有哪些有趣的人和事?开源社区之于开源项目有何重要意义?

开源项目(Open Source Project),顾名思义是指开放源代码的可以被公众使用的软件项目,在开源合规的基础上,其他开发者可以对软件进行使用、修改和发行。基于「共建共治共享」的开源理念,许多开源项目汇聚了一批拥有共同兴趣爱好的开发者,形成了一个个独特的开源社区(Open Source Community)。据第三方数据显示,飞桨开源社区已成为国内 Top 的开源社区,作为社区维护者,我们做对了什么?

1. 飞桨开源数据一览

2. 整体飞桨平台的情况

来一段官方介绍:

飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,集核心框架、基础模型库、端到端开发套件、丰富的工具组件、星河社区于一体,是中国首个自主研发、功能丰富、开源开放的产业级深度学习平台。飞桨在业内率先实现了动静统一的框架设计,兼顾科研和产业需求,在开发便捷的深度学习框架、大规模分布式训练、高性能推理引擎、产业级模型库等技术上处于国际领先水平。

飞桨端到端自适应混合并行训练技术以及压缩、推理、服务部署的协同优化,高效支撑以文心一言为代表的文心大模型的生产与应用。

IDC 发布的 2022 年中国深度学习框架和平台市场份额报告显示,百度稳居中国深度学习平台市场综合份额第一。中国信息通信研究院《深度学习平台发展报告(2022)》指出,飞桨已经成为中国深度学习市场应用规模第一的深度学习框架和赋能平台。

当前飞桨已凝聚 800 万开发者,基于飞桨创建 80 万个模型,服务 22 万家企事业单位,广泛服务于金融、能源、制造、交通等领域。

截至 2023 年 8 月,飞桨开源社区累计提交 Commits 超过 93 万次,以 PR 或 ISSUE 提交形式的开源贡献者超过 18000 人。

3. 谁开发了飞桨

BAIDU Contributors:专职的研发部门(深度学习技术平台部),及非专职的其他部门的工程师。

尽管并没有一种特定的方法来识别某位 contributor 是否是百度的雇员,但你依然可以从 github profile 或者 author email 中来找到大量活跃的百度工程师的身影。

Corporate Contributors:NVIDIA、INTEL、昆仑芯、寒武纪,等等多家硬件公司的专职工程师。

翻看AUTHORS.md文件,或者查看飞桨的代码仓库的 commits log,你总能看到来自于这些硬件公司的优秀的工程师的贡献。(小彩蛋:你甚至能找到 intel 工程师们的一张合照)

Individual Contributors:来自高校的学生及来自企业的工程师在业余时间的贡献。

individual-contributors

我们今天对开源社区及开发者的讨论,会聚焦到 Individual Contributors 群体。当前,个人贡献者群体已经成为飞桨开源社区必不可少的研发力量,在提升开源项目影响力、社区活跃度、扩大开源声量方面,更是有着十分重要的意义。

4. 社区开源贡献为飞桨带来了什么

这是一些 2023 年至今社区开发者为飞桨核心框架做出的代码贡献合辑,可以看到从工程效能优化、文档体验提升,到飞桨内核十分重要的 PHI 算子库独立编译,社区开发者都做出了非常重要的贡献。值得一提的是,飞桨 2.4 版本中发布的 API 有三分之一是由社区开发者完成的,到飞桨 2.5 版本,新增的 API 贡献几乎都来自社区开发者。

projects

除此之外,在飞桨的端到端开发套件 PaddleOCR、PaddleClas、PaddleDetection、PaddleSeg,以及大模型套件 PaddleNLP、PaddleMIX 中,社区开发者贡献了许多 SOTA 的算法模型、训推一体 pipeline、tutorials&demo,与飞桨团队共同打磨易用的深度学习框架与工具组件。

这里可以查看更多进行中和已结项的项目:https://github.com/orgs/PaddlePaddle/projects/7

5. 参与飞桨社区的开源贡献会获得什么

技术实力与开源影响力提升

  • 飞桨社区开源项目覆盖深度学习框架、模型、应用全领域,你想提升的技术,这里全都有;
  • 与飞桨产研团队紧密沟通协作,和飞桨共同成长;
  • 开源贡献行为全部公开可查,飞桨社区丰富的开源贡献活动助你树立个人开源影响力;
  • 鼓励社区孵化项目,你可以在这里找到志同道合的小伙伴,把想法变成现实。

荣誉证书、现金激励与工作机会

  • 颁发开源贡献证书、社区曝光度、奖状徽章等,致敬每一位贡献者;
  • 举办丰富社区赛事,提供奖金/奖品激励与权威机构认证;
  • 开源社区贡献者在招聘中会被优先考虑。

硬件支持

  • 提供线上 V100 开发环境,随时可以开发与编译。

honours

6. 飞桨快乐开源:Grow Together, and Have Fun

先来讲一个故事。

大概在 2022 年 12 月份的时候,通过代码扫描工具发现了飞桨框架的 100 多个小 bug 🐛。说是 bug,但是问题真的很小,诸如堆栈溢出(stack overflow)、UFA 非法地址访问(UFA illegal address access)、Python IndexError、空指针(Null pointer)、除 0 错误(divide by 0),大部分 bug 可以被很少的一行或几行代码 fix。

issues

bug 发现了不能不修,怎么修呢?我们把目光放到了开源社区。这是一批极易上手的开发任务,开发者可以在不熟悉框架的情况下完成 bug 修复任务,获得满满成就感;时间上来看,刚好赶上高校学生们放寒假,有大量的空闲时间参与开源活动;研发人力方面,我们协调到 1 个完整人力来支持 code review,保障 bug 修复质量。天时地利人和,我们把这一批 bug 修复任务包装成了一个社区活动 —— 飞桨快乐开源:提 PR 领取新年礼物 🎁。

这个活动一经推出,立马受到了社区开发者的广泛关注和参与,出乎我们意料的是,看到了很多老朋友和新面孔的 PR 提交,有些人(点名 DrRyanHuang)嘴上说着「年后再说」,表情包做了不少,背地里 PR 也提了不少。

nianhouzaishuo

更为经典的是一名社区开发者 RedContritio 在除夕夜连着提了 18 个 PR,因为那个时间点大家都在欢度春节,没有人和他抢,导致他的 PR 编号都是连号的,由于 PR 质量过高,最后也顺利的全部完成了合入 ✅,给了我们一点小小的开源震撼

pullrequests

后来,快乐开源活动就顺理成章的成为了飞桨开源社区长期有效的日常活动,旨在通过简单易上手的开发任务,帮助开发者渐进的了解飞桨、参与开源。我们会按季度更新礼品清单、统计参与活动的开发者信息,并完成礼品邮寄。随着开发者参与热情越来越高,礼品也从游戏键盘、无线耳机升级到了 PS5、iPad、Apple Watch 等。

在 2023 年 Q4,快乐开源活动完成了一次全新升级 🔥,任务范围从 Paddle 框架扩展到科学计算 PaddleScience、大模型套件(PaddleMIX、PaddleNLP)、端到端开发套件(PaddleOCR、PaddleSeg、PaddleClas、PaddleDetection)、动转静孵化项目 PaddleSOT 等更多飞桨生态开源项目,上线「✨ 热身任务」、「🎯 命题任务」与「💡 开放任务」,使用「HappyOpenSource」 标签追踪相关的 issue 与 pr,我们确立了「 Grow Together, and Have Fun!」为口号,快乐开源活动逐渐做大做强~

更多信息可访问活动 issue 了解:https://github.com/PaddlePaddle/Paddle/issues/56689

7. 社区主导项目:Community over Code

Community over Code 是 Apache 软件基金会的项目中最广为人知的理念。尽管在社区的沟通方式上,跟 ASF 所鼓励的用邮件组来沟通不一样,飞桨社区的绝大部分沟通方式是在大家熟悉的微信群里,但从解决 「Good First Issue」 加入进来的社区开发者们, 在熟悉了社区之后,同样可以迸发更大的能量。

再来讲一个故事。

作为源自百度的开源项目,飞桨的运营团队通常可以接触到一些第三方办赛的邀请,这次找到我们的是第六届『中国软件开源创新大赛』,这是一个由中国计算机学会(CCF)主办,西北工业大学、绿色计算产业联盟、CCF 开源发展委员会联合承办的大型赛事,联合百度、清华大学等企业单位以及多所高校共同设置赛题,飞桨参与了『开源任务挑战赛』赛道,发布了 16 道具有一定难度的、需要参赛选手自行拆解与项目管理的开源任务。我们称其为 「HappyOpenSource Pro」 ,快乐开源进阶版。任务详情:飞桨框架任务挑战赛(上)飞桨框架任务挑战赛(下)

让我们惊喜的是,这些即使是内部研发团队都觉得棘手的开发任务,被一批高水平的开发者完美的解决了。以飞桨赛道一等奖项目:赛题五:将 xdoctest 引入到飞桨框架工作流中 为例,项目涉及修改 1400+ API,数十万行代码,24 位开发者近 3 个月协同工作,队长 megemini 成长为 Reviewer,800 万飞桨用户从中受益。

xdoctest-project

更多顺师傅的专访可以查看往期 blog:https://pfcc.blog/posts/shun-story

这件事情让我们愈发相信开源的力量,即使是如此历史包袱重、项目管理难、工程量巨大的开源任务,在找到合适的 owner,提供足够资源支持的情况下,都是有可能被社区开发者们联合解决的。

正在进行中的第五期飞桨黑客马拉松 PaddlePaddle Hackathon 5th,是飞桨开源社区一年两度的大型编程活动。

第五期活动发布三大赛道:开源贡献个人挑战赛、大模型应用与创意赛、飞桨护航计划集训营,上线当天即获得了开发者的广泛报名和参与,目前总体任务认领率 100%,核心框架任务提交率接近 90%,许多开发者直呼「卷出新高度」。

paddlepaddle-hackathon

由社区开发者 Tomoko-hjf 开发黑客松小助手,自动更新任务榜单与看板,极大提升了社区活动的自动管理水平。在护航计划集训营中,学员 MarioLulab 兼任助教,搭建开源项目用于管理开发进度与周报提交,欢迎大家前往围观 ➡️ PFCCLab/Camp

与此同时,配套直播课程经过多期打磨,已形成完整的飞桨开源贡献视频资料,并发布在星河社区课程专区 深度学习开发指南——黑客松 5.0 - 飞桨 AI Studio 星河社区-人工智能学习与实训社区,跟着飞桨导师,从这里开始你的黑客松之旅吧 💕

更多黑客松活动情况,可查看 blog:PaddlePaddle Hackathon Episode01PaddlePaddle Hackathon Episode02

8. 飞桨开源社区有哪些玩法

如果你正在寻找一个开源项目做贡献,或有意向加入一个开源组织 or 社区,我们非常欢迎你来飞桨开源社区玩,与我们一起执桨破浪,让深度学习技术的创新与应用更简单

你可以 follow 这样的路径:

社区活动

入门:快乐开源、启航计划

「快乐开源活动」 旨在鼓励更多的开发者参与到飞桨社区的开源建设中,帮助社区修复 bug 或贡献 feature,加入开源、共建飞桨。如果你是刚接触飞桨 or 开源社区的小白,我们十分推荐你从打卡任务开始:

  • 任务一:修改飞桨文档,完成你的第一个 PR,练习 git 操作,熟悉 GitHub 开源协作方式
  • 任务二:拉取 Paddle 代码,完成本地编译,让你对 Paddle 代码有更深入的理解,便于参与后续的框架开发任务
  • 任务三:在 PaddleMIX 中跑通 Stable-Diffusion 训练推理,你会快速掌握飞桨开发套件的使用,便于参与后续的套件开发任务

详情可查看 issue:https://github.com/PaddlePaddle/Paddle/issues/56689

「启航计划」飞桨社区 发起的远程项目,也是「护航计划」的前置活动(不了解护航计划请看这里 ➡️ 护航计划说明)。我们以集训营的形式,鼓励开发者积极参与快乐开源活动,以此提升自己的代码实践能力。你可以把它当做【HACKATHON 预备营】,在这里找到志同道合的小伙伴,一起开发,一起成长。

详情可查看 issue:https://github.com/PaddlePaddle/Paddle/issues/58497

进阶:黑客松、护航计划

「PaddlePaddle Hackathon 飞桨黑客马拉松」 是飞桨社区的大型编程活动,鼓励社区开发者了解与参与飞桨深度学习开源项目与文心大模型开发实践,为飞桨框架、套件、大模型、合作伙伴等生态进行开源贡献。适合具备一定开源贡献基础和代码基础的朋友前来挑战自我~~

第五期黑客松活动火热进行中,详情可查看 issue:

社区组织

技术交流组织:飞桨核心框架贡献者俱乐部 PFCC

PFCC,全称 Paddle Framework Contributor Club,飞桨核心框架贡献者俱乐部,是一个有兴趣、正在、或者已经为飞桨开源框架做开源贡献的贡献者成立的虚拟组织,在这里,飞桨开源框架的贡献者进行讨论、交流和分享,并为飞桨框架做出持续的贡献。

目前,PFCC 已汇聚 100+ Contributor,6 名贡献者成长为 Committer,维持双周一次技术分享会,累计召开 30+ 次,产生上百个议题(详见会议纪要),与飞桨产研团队探讨飞桨框架硬核技术难题,发起联合开发项目。

更多信息可前往社区查看:https://github.com/PaddlePaddle/community/tree/master/pfcc

社区治理组织:飞桨社区开源发展工作组 PPOSDWG

PPOSDWG,全称 PaddlePaddle OpenSource Development Working Group,飞桨社区开源发展工作组,为加强飞桨开源社区的透明治理,提升社区成员的参与感和社区认同,决策飞桨社区的关键事项与治理策略而成立。

2023 年 11 月 16 日,飞桨开源社区举行线上投票选举与成立仪式,39 名合格投票人完成投票,选举产生第一届工作组成员。

更多信息可前往社区查看:https://github.com/PaddlePaddle/community/tree/master/pposdwg

9. 写在最后

我们始终相信,开源社区因为人的汇聚而变得有意义。在这一年中,我们参与和见证了许许多多社区故事,为每一个精彩的 PR 鼓掌喝彩,为每一次「我们 paddle 如何如何」的句式感动,向每一位热爱开源的开发者和研发工程师致敬。

在飞桨开源社区,我们结识了许多有趣可爱的人,程序员不再是一个标签化 🏷 的群体。他们中,有「摸资本主义的鱼,建设社会主义框架」的 Intel 工程师 jinyouzhi,有社区 Committer 手搓框架入职百度的全栈 001 喵喵喵 SigureMo,有「水遍」所有开发任务群强势进入贡献者排行榜的 002 张师傅 Liyulingyue,有获得硬件伙伴高度称赞的 3w+ 部署代码贡献达人 Zheng-Bicheng,...,甚至还有五年级的小朋友 zhiheng-liu 刷新飞桨 Contributor 最小年龄记录。

因此我们萌生了创建这个 blog 网站的想法,由全栈工程师 001 搭建,代码开源在 GitHub,记录飞桨开源社区的故事,欢迎各位开发者投稿呀~~ https://pfcc.blog/

funny-memes

👆一些流传度很广的开发者自制表情包👆

「Shaping PaddlePaddle Future with You,与你一起定义飞桨的未来!」 从来不只是一句口号,就是在这日复一日的平凡生活中,在一行行代码的设计与运行里,在一次次前沿技术的交流与碰撞下,一些改变正在悄然发生。期待飞桨与你共同成长,让我们一起打造易用的深度学习框架与工具组件,在开源的世界走得更远!

+ + + + \ No newline at end of file diff --git a/posts/chengdu-kaiyuanshe.html b/posts/chengdu-kaiyuanshe.html new file mode 100644 index 0000000..86b8b71 --- /dev/null +++ b/posts/chengdu-kaiyuanshe.html @@ -0,0 +1,31 @@ + + + + + + 飞桨社区成都行:开源社活动与开发者线下 Meetup | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

飞桨社区成都行:开源社活动与开发者线下 Meetup

Authors

2023 年 10 月 28 日、29 日参加开源社举办的「第八届中国开源年会」的精彩瞬间,以及与咱 Paddle 社区成都开发者们的线下见面~

第八届中国开源年会

飞桨开源社区受邀参加第八届中国开源年会,梦师傅和我(孙师傅)都贡献了两场精彩的演讲 🎉。

28 日的活动中,梦师傅在青少年开源与开源教育分论坛上,分享了主题为「走进开源社区」的演讲,向祖国的仙人掌们 🌵 宣传咱们充满趣味和活力的飞桨开源社区。

图片1

图片2

梦师傅还鼓励了很多青年开发者加入飞桨开源社区,其中甚至有一名刚年满 15 岁的初中学生,在活动后提交了 PR 并成功合入,成为了 Paddle 的 contributor @BernieHuang2008

29 日的主论坛上,孙师傅进行了闪电演讲,分享了「如何在开源社区摸 🐟」,介绍了孙师傅工作 0.5kun 年🐔 里总结的摸鱼心得。

图片3

演讲的详细内容将在后续的博客中分享,敬请期待~

飞桨社区成都开发者 Meetup

在 29 日,我们还相约飞桨社区成都的开发者们线下面基,以下是痛失真名的成都开发者(网友):

图片4

梦师傅还很贴心的给每位开发者赠送了 PaddlePaddle contributor 专属徽章 🥳。

图片5

期待未来与成都的伙伴们再次见面!

彩蛋 🎊

最后,我们还一起跟随军哥 @jzhang533 观看了一场外国小姐姐的 livehouse,很精彩哟!

图片6

+ + + + \ No newline at end of file diff --git a/posts/chuan-story.html b/posts/chuan-story.html new file mode 100644 index 0000000..2a9eeeb --- /dev/null +++ b/posts/chuan-story.html @@ -0,0 +1,32 @@ + + + + + + 【开源江湖闲聊录】英雄不问出处:川师傅的逆袭之路 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】英雄不问出处:川师傅的逆袭之路

Authors

“桨声川水悠悠过,长路漫漫风光留”,这次我们要采访的是小伙伴们都熟悉的励志富哥儿——川川师傅

一、前言

按川川要求,以下均以 🍢🍢 代称川川。

川川目前是一名平平无奇的大学生🧑‍🎓,也是 Paddle 社区里的一名资深开发者。他精通(🍢🍢: 我没有,不是,别瞎说🐶)Java、Python、C++ 等多门编程语言,还掌握 Flutter、Android、Vue 等工具,可谓多才多艺!

川川加入 Paddle 社区后,从最简单的文档修改任务开始,到参与快乐开源、熟悉 paddle 框架,到参与充满难度和挑战的护航计划,到最终自己能够独立的拆解问题、发起社区项目(ruff 升级),我们亲眼见证了他一步步的成长 (怎么有种养成系的感觉)

chuan-01

在提升自我外,川师傅也多次热心地帮助新伙伴们解决 bug、回答问题。(所以大家如果有问题,可以随时在群里骚扰他哦

chuan-02

然而当抛开“Paddle 社区开发者”“学生”等形象标签后,单独地看川师傅自身的人生经历,可谓是非常的励志。你敢相信,川师傅是从中专、大专一路读上来的吗?川师傅的经历像是一本精彩绝伦的探险故事集。接下来让我们来读读他的探险之旅吧!

chuan-03

!!!注意!!!上图为川川师傅の帅照,小伙伴们可以截图保存哦!😝😝😝😝

二、采访内容

  1. 介绍一下自己吧,川川师傅 o(_ ̄3 ̄)o !

    🍢🍢: 我的 AI Studio 账号是 gouzi,GitHub 的账号是 gouzil!o( ̄ε ̄_)o

  2. 作为一个 21 岁青春男大,平时有什么兴趣爱好?听说你喜欢出去玩,你在福建有什么推荐给大家打卡的景点么?哈哈~

    🍢🍢: 爱好当然是出去走走玩玩,感受一下人间烟火气。打卡的话当然是福建的省会厦门啦🐶,在十里长堤跟着男女朋友看看夕阳,鼓浪屿的小巷子。平潭岛也挺不错的(🍢🍢没去过但是朋友圈已经发爆了,图中为蓝眼泪时期,需要特定的季节,且肉眼看不出来这种效果,需要相机长曝光,大家别跑空咯)。

    厦门杏林大桥(来源: 川川相册)
    厦门杏林大桥(来源: 川川相册)
    十里长堤(来源: 川川相册)
    十里长堤(来源: 川川相册)
    鼓浪屿(来源:厦门文旅公众号)
    鼓浪屿(来源:厦门文旅公众号)
    平潭(来源: 新华社 2023/04/29 )
    平潭(来源: 新华社 2023/04/29 )
  3. 据我了解,你在初中时就用易语言写了个安卓 APP 给奶奶使用,你能详细讲讲这个 APP 的设计目的和功能么?你当时学习了些什么技术才把这个 APP 做成?那又是通过哪种方式(看书?上网学习?视频?)学习的呢?

    🍢🍢: 1️⃣ 其实设计这个 APP 是因为奶奶不识字,但是又需要使用手机(而正常手机打电话都是看人的名字进行拨打)。这个 APP 可以理解为一个默认桌面,手机解锁后 APP 就打开,打开后是像下图一样的手机联系人的照片,其实就是把联系人名字变成对应的他们的图片,这样尽管奶奶不识字,也可以看照片进行操作了!🐶 2️⃣ 当时学了啥技术: 其实也没具体的学,因为易语言是中文,有一定的思维逻辑就能实现啦。3️⃣ 通过哪种方式: 翻翻编译器自带的易语言说明(那时候 bilibili 还没有那么火,也没有啥书,只有一台能跑安卓模拟器的电脑)。

    chuan-08
  4. 在 16 岁左右,你就陆陆续续自学了 Python、Java、C,后来又自学了 Go、Android 等等,在这个自学过程中你遇到了那些困难,又有想过放弃么?

    🍢🍢: 遇到困难当然是有的,很难想象 C 我看了半年视频才学会的(有部分原因是我比较拖, 学习一门新的语言时长最好不要超过两周, 因为后续的项目会慢慢的补上来的)。每次接触一门新的语言都会对计算机有更深的理解,理解不同语言为什么要这么做,这么做的优缺点,这也是不断学习的动力吧。想过放弃么: 没有,我还挺感兴趣的,兴趣是最好的老师。

  5. 能简单聊聊你的这几年的学习经历么?

    🍢🍢: 下图最右侧那一列就是学习的顺序啦(学那么多真没啥用,学好一个精通它就行)。也没啥经验,顺其自然就好啦,等学完技术应该也更新了。最快的方式就是跟着项目走,不断的优化它 (最后就会发现:我写的什么玩意,要不要重构🐶) 。不过倒是有几个提升比较大的时间段,一个是去参加了云计算比赛,让我会了 linux 和 docker 这些。一个是实习的那一年,让我整明白了网站这一套(B/S,C/S)。

    chuan-09

  6. 现在社区开发者都认为你的编程能力很强,和学历形成了很大反差,能透露一下当时是为什么会上中专呢?是因为偏科吗?

    🍢🍢: 不是偏科啦,我差的很平均🐶。顺带说一下厦门的初升高录取率为 45%,现在好些了 50%,卷不动卷不动,当然更多是因为我比较菜。

  7. 事实上在目前的舆论环境里,“专科生”是一个很遭受非议的标签😮‍💨,而作为一个亲历者,你内心的是怎么面对的呢?你当时又做了哪些方面的努力?

    🍢🍢: 关于这个标签的话,我只想说:你说的对。没啥必要在乎别人的看法,做自己热爱的事情就好啦。

  8. 作为目前考上本科的计算机应用技术专业的学生,你对未来的职业发展有怎样的规划和期望✊✊✊?

    🍢🍢: 我更喜欢做一些底层的工作,不太喜欢做应用层。规划:入职百度,重构 paddle

  9. 作为厦门领航团的一员,你当时是什么契机接触 Paddle 社区的?在 Paddle 社区做的第一个开源项目是什么?

    🍢🍢: 说到这个契机啊,非常简单,你的上司是厦门领航团团长就行。第一个开源项目当然是我们孙师傅(@sunzhongkai588)的 docs 啦,当然非常感谢佳维姐姐(@dingjiaweiww)和梦师傅(@Ligoml)的鼓励和协助我完成了在 paddle 的第一个 pr。

  10. 在社区里如何和其他开发者进行互动的?有没有什么特别有意思的经历或故事?

    🍢🍢: 我一般有碰上问题就出来回答啦,或者一些技术讨论。特别的故事:五年级的小朋友叫我叔叔算嘛

    chuan-10

  11. 对于 Paddle 框架护航计划,可以分享一下你的面试经历和感受吗?你觉得到达什么水平可以通过护航计划的面试?

    🍢🍢: 经历的话,放心研发大哥不会难为你的,真诚就行。感受 emmm,大家一定要提前准备啊,刷刷算法什么的。什么水平 emmm,我也不太清楚,但是最好是熟悉 padlle,或者你的能力超级无敌强。

    编者注✍️:「护航计划」可以简单理解为飞桨的远程实习项目,可参考 护航计划集训营说明

  12. 参与护航计划时,有什么不一样的感受吗?实际开发过程有没有遇到困难,是怎么解决的?

    🍢🍢: 最大的感受就是,终于从应用层转向了框架层。困难是肯定有的,也有非常多不会的,但是这没关系,问研发大哥就行。就像昆昆(@2742195759)说的: 你尽管问,我就是你的文档。

  13. 在 Paddle 社区中,你参与的哪个项目(或活动)你印象最深刻,能简单描述一下这个项目么?这个项目让你收获了什么?

    🍢🍢: 印象最深的项目是下一个项目,下一个项目可以把之前项目的经验集结起来,也可以学到一些新的知识。当然 PaddleSOT 印象也挺深的,这也是我护航计划的项目。收获更多的是技术的进步吧。有时候看看喵喵(@SigureMo)的修改会发现,噢原来还能这么写。

    chuan-11

  14. 对于深度学习领域,你有哪些想法和研究方向?目前有没有感兴趣的方向?

    🍢🍢: 我其实更多的还是喜欢框架层,怎样才能让整个框架跑的更快,占用更低,更加的易用化。

  15. 发挥一下想象力,如果将深度学习比作一种食物,你觉得它会是什么?为什么?

    🍢🍢: 可能是米饭吧,喂的越多越有力气,跑的越快,力大砖飞。

  16. 听说你使用飞桨解决过很多企业实际问题时,你遇到过最有趣的案例是什么?那么你是如何应用深度学习技术解决这个问题的?

    🍢🍢: 我实习这个企业吧,他刚尝试深度学习,所以一般调调 API 就行了,更多的是怎样去分配资源,做到效率最大化 (我司全是 1050 的卡,我能咋办,我也很绝望啊)

  17. 除了深度学习,你还对其他领域感兴趣吗?有没有想过将深度学习与其他领域结合,创造出一些令人惊喜的应用?

    🍢🍢: 其他领域其实有的,比如摄影和游戏,结合的话有想过,但是还没新建文件夹就不说了🐶

  18. 如果你有机会和 Paddle 社区 or 深度学习领域 or 计算机领域 的一位顶级专家进行合作,你希望和他/她一起研究什么问题?为什么?

    🍢🍢: 这可就太多了,比如:不同语言的通信,怎么做到程序的相对安全,怎样去减少硬件之间的瓶颈。为什么 emmm,可能是因为自己对这方面感兴趣吧。

  19. 如果让你形容一下你和 Paddle 社区的关系,你会怎么说?

    🍢🍢: 相互促进,互相成就(更多还是 paddle 社区的大佬单方面带着我)

  20. 最后,作为一个热情、励志的年轻人,你想对 Paddle 社区里的开源者们说些什么呢?

    🍢🍢: 放开那道题,让我来🐶

三、“鲁迅之我确实说过这话”专区

同样我们也邀请了一些和川川很熟悉的、有过合作经历的朋友们,贡献一下和川师傅相关的故事,或者他们对川师傅的评价~以下均为真心话,请放心看!

chuan-12

by 散步(sanbuphy

  • author image
    散佬
    和川川交流还算比较多,川川基本上有空都会帮你解决任何疑问,甚至是看代码。虽然是年轻的富哥,但很努力上进,甚至比孙师傅还努力🐶;总体来说算很善良的小哥,教过我很多东西。希望能和他一起学习成长,向他多学习请教一些代码之道,早日都一起为中国开源社区多做一些更有价值的事情。 在我无数个老师中,他肯定是我印象深刻的老师之一。

by 卢师傅(AndSonder

  • author image
    卢畅
    有幸在今年暑期上海 meetup 上认识了川师傅,很低调的技术大佬。在川师傅身上能看到对开源活动的热情,各大活动上都能看到川师傅的身影。希望以后还有机会和川师傅线下面基,迪迪小组再次出发!

编者注✍️:迪迪小组是上海 meetup 期间,相约去迪士尼玩的小分队

by 一师傅(SigureMo

  • author image
    喵喵
    自川子参与第一期护航计划开始已经马上就要 6 个月了,我和川子也算是深度交流了 6 个月。从护航计划来看,川子始终保持十足的热情,在 PaddleSOT 那时候还是以开源任务的形式发放,但每次有任务川子都会第一时间认领。之后到现在动转静单测推全,我的 review 速度都赶不上川子提 PR 的速度了……此外川子涉猎甚广,在交流的过程中我也学到了很多东西,川子也会参加各种开源任务,你基本上可以在任何「角落」里看到川子的身影~
    川子这 6 个月也是成长了很多,从早期每个任务都需要细致沟通到现在发完任务基本就心照不宣了,也能独立完成很多任务了。比如 Ruff 的升级优化,目前川子对 Ruff 的了解程度已经仅次于我了,再比如 OpResult 方法的 patch 补全,以及动转静单测机制,基本都是川子独立完成的。对于大多数任务,现在我已经能放心地说:「川子,这个就交给你了」
    另外,「提前」说一下,川子贼有钱~

by 花花(Tulip-hua

  • author image
    花花
    我愿称川川为飞桨开源社区小天使

四、特别栏目——爱在何方之川川相亲帖

接下来,有请男嘉宾——小富哥儿川川来进行一段自我介绍✨。

  • author image
    🍢🍢
    报菜名环节,身高179cm,体重65kg(±5kg),来自福建厦门,2002年出生,目前在福州读书,不抽烟,不喝酒。性格有点太温柔了,不太凶得起来。对陌生人有点社恐,熟悉了之后就好很多。有一点点宅,但不会非常宅,还是会出去走走(不然咋拍照片🐶)。有一点点强迫症,比如下面这张798的照片好像有点歪了。喔对了川川不会做饭。期望伴侣,可以稍微e一点,拉着我出去玩🐶。(🍢🍢: 咱就是说还有几个月才到22,也不至于这么着急吧🐶)

有意者,请扫码加入快乐开源群,联系川川师傅(找头像即可)。

chuan-13

彩蛋 🥚

最后让我们欣赏一下川大摄影师的大作吧 📷

北京 798 艺术区
北京 798 艺术区
福州三江口大桥
福州三江口大桥
福州烟台山
福州烟台山
厦门中医院附近
厦门中医院附近

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


+ + + + \ No newline at end of file diff --git a/posts/first-post.html b/posts/first-post.html new file mode 100644 index 0000000..4d8b345 --- /dev/null +++ b/posts/first-post.html @@ -0,0 +1,32 @@ + + + + + + 在这里,记录有趣的飞桨开源社区故事! | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

在这里,记录有趣的飞桨开源社区故事!

Authors

这是一个半官方的飞桨开源社区博客,由社区成员自发维护,记录社区的有趣的故事,欢迎大家投稿。投稿方式:在 blog 代码仓库里提交 PullRequest 即可,Pull Request 会自动触发 CI,CI 通过后,你的文章就会被自动发布到这里。

感谢 001 @SigureMo 帮忙搭建了这个博客。

first-blog

+ + + + \ No newline at end of file diff --git a/posts/hackathon-5th-episode01.html b/posts/hackathon-5th-episode01.html new file mode 100644 index 0000000..7ae1d9e --- /dev/null +++ b/posts/hackathon-5th-episode01.html @@ -0,0 +1,31 @@ + + + + + + PaddlePaddle Hackathon Episode 01 | 第五期活动上线 4 周,直播圆满收官,三大赛道进展顺利 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

PaddlePaddle Hackathon Episode 01 | 第五期活动上线 4 周,直播圆满收官,三大赛道进展顺利

Authors

向大家快速介绍飞桨黑客松第五期活动上线以来的进展(9.25-11.3)

为了吸引社区开发者了解与参与飞桨深度学习开源项目与文心大模型开发实践,为飞桨框架、套件、大模型、合作伙伴等生态进行开源贡献,进一步扩大飞桨开源生态与文心大模型应用生态,我们组织了 PaddlePaddle Hackathon 飞桨黑客松第五期活动。活动开展 4 周的进展速览如下:

  • 开源贡献个人挑战赛:发布 111 个开源贡献任务,包括框架、科学计算、套件和合作伙伴方向,与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品,109 个任务完成认领,60 个任务提交作品,13 个任务已经完成,感谢各位开发者的积极参与,感谢各位导师的及时 review。
  • 大模型应用与创意赛:作为飞桨星河社区五周年预热活动,目标挖掘优质文心一言应用,共发布趣味创意与生产力工具 2 个方向的任务,已有 12 名开发者产出基于 EB SDK 的应用 18 个,均已部署至飞桨星河社区
  • 飞桨护航计划集训营:发布 18 个框架与套件开发项目,1 对 1 带教形式,已完成 18 名学员招募,并提交第一期周报,是飞桨开源社区首次 Code Camp 形式的开源活动,由开发者担任助教

赛道一:开源贡献个人挑战赛

进度看板

任务方向任务数量提交作品 / 任务认领提交率完成完成率
热身赛117 / 1163.64%218.18%
框架 API 开发任务3122 / 3170.97%13.23%
框架其他开发任务1614 / 1687.5%637.5%
科学计算模型复现117 / 1163.64%19.09%
套件开发任务245 / 2320.83%28.33%
合作伙伴任务185 / 1727.78%15.56%

赛道亮点

  • 社区开发者参与热情高,活动发布 1 周认领率接近 100%,提交率 50%+;
  • Tomoko-hjf 开发黑客松小助手,自动更新任务榜单与看板,提升社区活动自动化水平;
  • 直播活动圆满收官,已形成完整的飞桨开源贡献视频资料,详见 issues#58125
  • 本次活动英特尔作为赞助方,并与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品。

参与提示

  • 在上面的看板中能看出来,套件开发任务和合作伙伴开发任务,提交率相对较低,欢迎社区的开发者选择这些任务来挑战~~

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57262

赛道二: 大模型应用与创意赛

我们收到了 127 人报名,提交了 18 个应用,加精项目 10 个。

赛道亮点

  • 全新赛道,作为飞桨星河社区五周年预热活动,推广重点产品星河社区 ERNIE Bot SDK;
  • 完成情况符合预期,上线 4 周即提交 18 个 EB SDK 应用,作品种类多样,涵盖游戏娱乐、办公助手、知识科普等多领域,符合赛道初衷;
  • 社群气氛活跃,新老选手积极交流,且建立了沟通产研的 EB SDK 反馈文档。

参与提示

  • 欢迎大家继续发挥创意,提交更多有趣的应用。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57585

赛道三:飞桨护航计划集训营

18 个任务已全部完成招募,名单公示如下:

项目编号开源贡献 repo项目标题&介绍(点击链接跳转)导师学员
1Paddle算子规范和 ProgramTranslator 功能优化@kangguangli@xingmingyyj
2Paddle新 IR Pass 建设和依赖的核心组件完善@zyfncg@zhangyuqin1998
3Paddle新 IR API + 自动微分推全和核心组件完善@Aurelius84@MarioLulab
4Paddle组合机制前反向架构统一@cyber-pioneer@kevincheng2
5Paddle算子支持复数计算专项@GGBond8488@zyt1024
6Paddle量化算子集成@RichardWooSJTU@Wanglongzhi2001
7Paddle开源模型加速复现@xiaoxiaohehe001@DanGuge
8PaddleCPU 融合算子 / GPU 算子融合 pass@yuanlehome@Xinyu302
9Paddle动态图半自动并行架构研发@LiYuRio@HermitSun
10Paddle静态图半自动并行执行架构升级@From00@AndSonder
11Paddle分布式能力矩阵建设@zhangting2020@SecretXV
12Paddle全自动并行架构升级@Caozhou1995@Corle-hyz
13PaddleScience科学计算领域拓展专项@HydrogenSulfate@xusuyong
14PaddleClasClas 套件全流程建设@cuicheng01@psky1111
15Paddle3D3D 方向模型全流程建设@juncaipeng@kongdebug
16PaddleOCRNougat 复现及优化@tink2123@Frida-a
17PaddleNLPNLP 大模型复现@w5688414@rampage0303
18PaddleSlim套件压缩能力建设@shiyutang@ranchongzhi

集训营亮点

  • 飞桨社区首次以 Code Camp 的形式招募远程开发者,吸引到很多新人,2 周时间迅速完成学员招募与开营仪式;
  • 学员 MarioLulab 兼任助教,搭建开源项目 PFCCLab/Camp 管理开发进度与周报提交,已完成第一期,周报详见 [WeeklyReports] 2023.10.10~2023.10.24
  • 搭建技术分享平台:每周一次源码解读,顺利完成第一期,分享人 DrRyanHuang

参与提示

  • 欢迎大家到代码仓库: Camp 里围观集训营的同学们的工作。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57264

活动运营与推广

联合宣传

与开源中国、启智、OpenVINO、思否、开源社、示说、InfoQ、白玉兰开源、开源之夏等合作伙伴以及海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目联合宣传。

直播

多平台同步直播,10 场直播共计约 1.4 万人次观看,直播信息与学习资料已发布在开源社区,并整理成 AI Studio 专题课程: 深度学习开发指南——黑客松 5.0 - 飞桨 AI Studio 星河社区-人工智能学习与实训社区

日期主题观看总人次
10.16(周一)第五期飞桨黑客松来啦!1956
10.17(周二)新 IR Python API 适配升级967
10.18(周三)模型复现和贡献指南975
10.19(周四)OpenVINO 开源生态建设与贡献任务解析884
10.20(周五)动转静全套件适配任务989
10.23(周一)Arm 虚拟硬件助力边缘人工智能软件开发1887
10.27(周五)跨平台推理框架 InfiniTensor2049
10.30(周一)拓展 LLM 边界:使用向量数据库构建知识库2193
10.31(周二)Paddle 框架在昇腾平台上的推理优化分享1097
11.1(周三)飞桨硬件生态伙伴任务介绍420
+ + + + \ No newline at end of file diff --git a/posts/hackathon-5th-episode02.html b/posts/hackathon-5th-episode02.html new file mode 100644 index 0000000..09b7897 --- /dev/null +++ b/posts/hackathon-5th-episode02.html @@ -0,0 +1,31 @@ + + + + + + PaddlePaddle Hackathon Episode 02 | 第五期活动上线 8 周,框架赛道提交率近 90% | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

PaddlePaddle Hackathon Episode 02 | 第五期活动上线 8 周,框架赛道提交率近 90%

Authors

向大家快速介绍飞桨黑客松第五期开展以来的进展(11.4-12.1)

为了吸引社区开发者了解与参与飞桨深度学习开源项目与文心大模型开发实践,为飞桨框架、套件、大模型、合作伙伴等生态进行开源贡献,进一步扩大飞桨开源生态与文心大模型应用生态,我们组织了 PaddlePaddle Hackathon 飞桨黑客松第五期活动。活动开展 8 周的进展速览如下:

  • 开源贡献个人挑战赛:发布 110 个开源贡献任务,包括框架、科学计算、套件和合作伙伴方向,与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品,全部任务完成认领,72 个任务提交作品,32 个任务已经完成,框架方向提交率近 90%,科学计算方向提交率 70%+,进展超出预期,感谢各位开发者的积极参与,感谢各位导师的及时 review。
  • 大模型应用与创意赛:作为飞桨星河社区五周年预热活动,目标挖掘优质文心一言应用,共发布趣味创意与生产力工具 2 个方向的任务,已有 22 名开发者产出基于 EB SDK 的应用 34 个,均已部署至应用中心
  • 飞桨护航计划集训营:共有 22 名社区开源开发者在社区导师的指导下,进行飞桨开源项目开发。 按期完成了两期双周报提交,完成了 3 期技术分享,成果全部沉淀到开源社区

赛道一:开源贡献个人挑战赛

进度看板

任务方向任务数量提交作品 / 任务认领提交率完成完成率
热身赛1110 / 1190.91%436.36%
框架 API 开发任务3128 / 3190.32%619.35%
框架其他开发任务1615 / 1693.75%1381.25%
科学计算模型复现118 / 1172.73%436.36%
套件开发任务246 / 2425.0%312.5%
合作伙伴任务175 / 1729.41%211.76%

赛道亮点

  • 尽管本期黑客松整体难度较往期提升,但社区开发者表现出了极大的专业能力和热情,任务已经 100% 被大家认领;
  • 框架方向提交率近 90%,科学计算方向提交率 70%+,均高于往期黑客松。

参与提示

  • 在上面的看板中能看出来,套件开发任务和合作伙伴开发任务,提交率依然较低,欢迎社区的开发者选择这些任务来挑战。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57262

赛道二: 大模型应用与创意赛

部分应用展示

我们收到了 270 人报名,提交了 34 个应用,在这里节选部分有趣的应用,欢迎大家在线体验。

赛道亮点

  • 社区开发者们基于文心大模型的 SDK: ERNIE Bot SDK,提交了种类多样,涵盖多领域作品,充分探索了使用文心大模型能做到的创意和创新。

参与提示

  • 欢迎大家继续发挥创意,提交更多有趣的应用。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57585

赛道三:飞桨护航计划集训营

活动进展

集训营的同学已经完成了两次开源开发的双周报: WeeklyReports 2023.10.25~2023.11.07WeeklyReports 2023.11.08~2023.11.21 和三次技术分享

集训营亮点

  • 集训营将整个过程以开源的方式公开和协作,学员和导师在线研讨和互相促进。
  • 社区开发者展现了极高的专业性和热情,详见导师点评:@Aurelius84@From00@RichardWooSJTU@Caozhou1995

参与提示

  • 欢迎大家到代码仓库: Camp 里围观集训营的同学们的工作。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57264

彩蛋 🎊: 欢迎大家线下来见面

本周六(12 月 2 日)14:00 - 17:00 在 北京 798 举行飞桨开源社区 meetup,报名问卷:https://paddle.wjx.cn/vm/m1OLk4E.aspx# ,欢迎大家来聊天,飞桨定制咖啡等你打卡,梦师傅和花花在咖啡厅等着大家~

hackathon-5th-pp-coffee

+ + + + \ No newline at end of file diff --git a/posts/hackathon-5th-episode03.html b/posts/hackathon-5th-episode03.html new file mode 100644 index 0000000..39cc68d --- /dev/null +++ b/posts/hackathon-5th-episode03.html @@ -0,0 +1,31 @@ + + + + + + PaddlePaddle Hackathon Episode 03 | 创新碰撞,技术狂欢,飞桨黑客马拉松第五期活动圆满收官! | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

PaddlePaddle Hackathon Episode 03 | 创新碰撞,技术狂欢,飞桨黑客马拉松第五期活动圆满收官!

Authors

让我们看看哪些最强“Hacker”脱颖而出!

这是一次好奇心的远航,也是一场创作激情与团队协作的较量。

你懂技术,有想法,在这里可以尽情发挥!

我们希望你,不只埋头创造,一起享受不确定的乐趣,才能涌现意想不到的灵感和收获。

在这里,不止精益求精的竞技,去结识志同道合的小伙伴,去和研发导师 1V1 深度交流。

在飞桨黑客松的舞台上,创造力释放,“码”上见真章!

经过激烈的角逐,让我们看看哪些最强“Hacker”脱颖而出!

01 - 高手云集的飞桨黑客松活动

PaddlePaddle Hackathon 飞桨黑客马拉松(以下简称为“飞桨黑客松”)第五期活动自 2023 年 9 月中旬发布后,开发者热情响应,比赛历经三个月完美收官!

本次活动任务难度持续升级,飞桨联合 OpenVINO™ 等生态伙伴发布 100+ 开源贡献任务。赛制全新升级,本期黑客松活动在延续开源贡献个人挑战赛的基础上,首次探索以 Code Camp 形式组织开源活动,1 对 1 带教形式,并由开发者担任助教。并发布全新赛道——大模型应用与创意赛,基于文心大模型,创意无限,打开想象力,开发 AI 原生应用。

共有 800+ 位社区开发者参与到飞桨黑客松中,160+ 支队伍进行任务认领,本期黑客松活动在任务完成数量、参与团队规模、项目类型丰富度等方面均有提升,足可见开发者们建设飞桨和文心生态的热情。 我们期待这些开发者团队持续在飞桨开源生态中迸发出光彩和力量,与飞桨一路同行,一起建设更优雅的飞桨开源社区。

02 - 三大赛道 开源贡献

飞桨与生态伙伴携手,发布了三大赛道共计 26 个方向的开源贡献任务,从框架开发、模型套件开发、论文复现、硬件部署到产业应用任务应有尽有。开发者们结合自己的兴趣与能力在不同方向为飞桨做出重要贡献,感谢你们!

开源贡献个人挑战赛

发布 124 个开源贡献任务,包括框架、科学计算、套件和合作伙伴方向,与 OpenVINO™、海光、Arm、高通、Zilliz、开放麒麟社区、9#AISoft 等合作项目共同出品,120 个任务完成认领,96 个任务提交作品,85 个任务顺利完成,完成率 70%,感谢各位开发者的积极参与,致敬每一个开源贡献!

在第五期飞桨黑客松个人挑战赛中,开发者们码力全开,共计为飞桨新增 50+ API,增加 6 组共计 120+ API 转换规则,15 个 PHI 算子迁移、4 个分布式切分推导规则和 3 个转换函数,完成 9 篇 AI4S 领域论文代码复现,为大模型套件 PaddleMIX、PaddleNLP 及计算机视觉套件 PaddleSeg、PaddleClas、PaddleDetection 新增 10 个重要模型或新功能,为全套件模型接入动转静训练功能,为飞桨开源社区伙伴 OpenVINO™、Arm、InfiniTensor 新增 12 个新功能。

注:部分任务还有细节需要沟通,暂未完成 PR 合入,请锁定任务的开发者尽快完成 PR 合入哦~

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57262

大模型应用与创意赛

作为飞桨星河社区五周年预热活动,共发布趣味创意与生产力工具 2 个方向的任务,鼓励开发者发挥想象力和创新精神,构思基于文心大模型的创意方案,开发创新应用,从技术创新到应用实践,共有 37 名开发者产出基于 EB SDK 的应用 60+ 个,作品种类多样,涵盖多领域,欢迎大家进入飞桨星河社区应用中心体验。

趣味创意赛道一等奖作品:AI 数字人 | 数字诗人&数字发言人&数字人聊天

生产力工具赛道一等奖作品:【Hackathon 5th】基于文心一言的日报系统

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57585

飞桨护航计划集训营

发布 18 个框架与套件开发项目,1 对 1 带教形式,完成 18 名学员招募,共计提交 4 期周报,组织 5 期技术分享会,9 名学员进行技术分享,15 名学员通过考核。这是飞桨开源社区首次 Code Camp 形式的开源活动,所有学习笔记与周报记录留存在开源项目 PFCCLab/Camp 中,欢迎大家围观交流

集训营开源项目地址:https://github.com/PFCCLab/Camp

本期飞桨护航计划集训营开发项目内容硬核,既包括自动微分、新 IR Pass、自动混合精度、组合机制前反向统一、量化推理、算子类型扩展到复数、分布式能力建设与架构升级等核心组件开发工作,还有科学计算领域拓展专项、套件压缩能力建设、多模态大模型全流程建设等重要套件能力建设工作,营员们的开发能力、开源热情与丰富成果不仅得到了各位导师的高度认可,也获得了研发经理的肯定,3 名同学获得百度正式实习生 Offer。

更多详情请查看 issue:https://github.com/PaddlePaddle/Paddle/issues/57264

03 - 飞桨黑客松完成榜单

2023 PaddlePaddle Hackathon 飞桨黑客马拉松第五期由深度学习技术及应用国家工程研究中心主办,飞桨承办,英特尔作为顶级赞助方,OpenVINO™、华为、海光、Arm、高通、Zilliz、开放麒麟社区等共同出品,以线上认领任务的形式进行。 本次共有三大赛道:开源贡献个人挑战赛、大模型应用与创意赛、飞桨护航计划集训营。根据开发难度分为基础任务和进阶任务,为大家提供丰富的深度学习开发体验。对飞桨黑客松第五期公示榜单如有异议,请于 2023 年 12 月 25 日 24 点前反馈至 paddle-hack@baidu.com ,我们将在 12 月 26 日前对您的异议进行复核反馈。

hackathon-5th-track-1

hackathon-5th-track-2

hackathon-5th-track-3

恭喜完成开发任务的团队,将获得任务对应奖金以及飞桨黑客松结项证书,同时也可以获得百度招聘绿色通道。

04 - 新的身份等你点亮

在参与飞桨黑客松活动时,部分开发者们向飞桨框架提交 PR(Pull Request)参与开源贡献,成为飞桨框架的贡献者,并且有意愿为飞桨框架做出持续的贡献。他们接受了来自 PFCC 的邀请,正在用自己的方式参与飞桨框架建设,与飞桨共同成长。如果你也热爱开源、如果你有意愿成为飞桨开源社区的 Contributor,就快加入 PFCC 吧!

关于 PFCC

PFCC 全称 Paddle Framework Contributor Club ,意为飞桨框架贡献者俱乐部,是一个有兴趣、正在或者已经为飞桨开源框架做开源贡献的贡献者成立的虚拟组织。在这里,飞桨开源框架的贡献者进行讨论、交流和分享,并为飞桨框架做出持续的贡献。如果你有意愿加入我们,请发邮件到 ext_paddle_oss@baidu.com,在邮件中附上自己的 GitHub ID、贡献详情与联系方式,会有工作人员邀请你加入。

加入 PFCC,与我们一起参与到飞桨框架的开发中吧!

戳这里看飞桨开源社区故事 ➡️ https://pfcc.blog/

原文链接:https://mp.weixin.qq.com/s/Yjvwj8br84sPard1lLoNOQ

+ + + + \ No newline at end of file diff --git a/posts/huanggua-story.html b/posts/huanggua-story.html new file mode 100644 index 0000000..151b33f --- /dev/null +++ b/posts/huanggua-story.html @@ -0,0 +1,32 @@ + + + + + + 【开源江湖闲聊录】初中生也能当开发者❓少年黄瓜的开源奇遇记 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】初中生也能当开发者❓少年黄瓜的开源奇遇记

Authors

他来了,他来了,他带着满满的故事,迈着自信的步伐向我们走来了!虽然刚满 15 岁,但小小黄瓜的开源史却已有好几年!学校趣事?开源经历?迷人帅照?成山作业?你都能在本篇博客看到!

一、前言

Berniehuang2008(人送外号:黄瓜),是深圳一位 15 岁的初中生,同时也是 OpenTeens(全国甚至全世界第一个青少年开源社区)创始人之一。黄瓜曾贡献过开源项目 SearXNG 和 GestureX 等,是一位优秀的青少年开发者。他在 10 月加入 Paddle 社区,并且以迅雷不及掩耳之势合入 PR,成为 Paddle 社区的 contributor。现在,他正在准备参加 Paddle 黑客松,让我们一起看看他的故事吧😀~

二、采访内容

  1. 简单介绍一下自己吧!

    • author image
      黄瓜🥒
      我叫黄锦源,外号黄瓜,是深圳的一个初三学生。
  2. 现在是一名初三学生,课程学习忙么?有什么喜欢的科目没有?😁😁

    • author image
      黄瓜🥒
      忙啊,当然忙。每天周考,从四点半考到六点,放学回家一堆卷子烦的要死。最喜欢的是数学,没有原因,就是喜欢😳。
  3. 学校最近有什么有趣的事情可以和大家分享一下!

    • author image
      黄瓜🥒
      emmm,有趣的事情?没啥,天天考试有啥有趣的。。。不过昨天我还骑车来着,扫了一辆小黄车就一路骑到深圳湾,14 公里,挺开心的。我们几个朋友还去烧纸,哇塞,烧数学书真解气!(黄瓜自注:我们数学课从来不用书)
  4. 当初你是如何被编程和开源世界吸引的?是什么驱使你成为了一名青少年开发者和开源社区创始人呢?

    • author image
      黄瓜🥒
      我是从 Scratch 学起的,一开始就感觉 Scratch 这玩意很有意思,想让他干啥他就干啥,有一种掌控世界的感觉。后来,Scratch 写了一百多个游戏之后玩无聊了,转行 Python,才发现这玩意比 Scratch 好玩 10086 倍!
      初一的时候,被我们学校信竞老师征召入伍,但我对竞赛类的东西不感冒,学了一年就退坑了。
  5. 之前看你的 GitHub 主页里,有对 SearXNG 提交过 PR,这是一个怎样的项目?你在 SearXNG 项目中的具体贡献是什么?你最喜欢的部分是什么?这个经历让你有什么样的收获?

    • author image
      黄瓜🥒
      SearXNG 是一个开源的搜索引擎,我当时对搜索引擎算法特别着迷,就找了一个,最后发现这玩意就是从 Google、Bing 上面爬数据然后整理!
      不过既然点进去了,索性就帮他们修个 bug 吧,结果这就成为了我第一个参与的开源项目。现在越做越深入,跟 Maintainer 已经算得上认识了 hhh

    编者注✍️:现在初中生都已经开始接触算法了吗!

  6. 除了在 SearXNG 项目中的贡献,我发现你还设计了一些开源小程序(eg:Dairy APP),能否分享一下你最引以为傲的作品是什么?你觉得这个作品的意义是什么?

    • author image
      黄瓜🥒
      addd,Diary app 确实是我前几周的重点。我比较喜欢创新新功能,比如说一打开就弹出一篇以往的日记,配上符合当时心情的音乐,让你朝花夕拾一下。
      现在嘛,我写了一个 Python 库,叫做 MercurySQLite,提供了一个高级的接口,能不用写 SQL 语句就能操作数据库,贼方便告诉你。
APP
Dairy APP 部分截图
  1. 你如何了解到 Paddle 社区的,是什么吸引你加入这个社区并开始贡献?可以分享一下你和 Paddle 社区的小故事么?

    • author image
      黄瓜🥒
      我也忘了第一次看 Paddle 是哪年了。。。不过当时我应该处于“AI 发烧友”阶段。后来,一年前?文心不是火了吗?我就想再看看 AI,就算是对 Paddle 有了一个大概的了解吧。
      直到今年的中国开源年会,我不是办青少年分论坛吗?我们接下来就是教育分论坛,然后我听了梦老师的演讲,觉得“快乐开源”这档子活动挺有意思的。
      其实我几个月前看过黑客松,那玩意儿实在是太难了做不来,但是快乐开源就挺好的啊,又不难,改文档也能学到很多,比如说文档的语法之类的,我的那个 SQL 项目文档就是受到了这个的启发。。
  2. 加入 Paddle 社区后的第一次合并 PR 经历如何?有没有什么有趣的插曲或者教训🤓🤓🤓🤓?

    • author image
      黄瓜🥒
      哈哈哈,第一次我故意挑了一个最简单的任务做,只有几行代码,属于是投机取巧摸鱼了。。不过第二次——也就是现在正在进行的 PR——没那么轻松了。原文档的格式超级乱,我都不理解他是什么意思。然后又是 CI 的报错看不懂。。。现在差不多改完了,还有亿点点小问题,也快了

    编者注✍️:文档任务很适合刚接触 Paddle 的开发者们,而相关的 PR 也很可能是大家在 Paddle 的第一个 PR。感兴趣可查看 ➡️文档 Docathon 系列任务

  3. 你觉得今后 Paddle 社区对你的个人成长和技术发展有何影响?

    • author image
      黄瓜🥒
      Paddle 社区的技术实力肯定是没得说的。能跟这么多大佬在一起,我觉得不管是现在还是未来,都会对我有很大的影响。就比如说吧,虽然我现在还没有深入地接触到 Paddle 的技术层面,但是我只是在 PFCC 那个群里面苟着,就能学到很多东西,比如说 Paddle 的 CI 啊、代码规范啊之类的。
      然后我准备试着,只是试着哈,参加下一次的黑客松,或者是黑客松简单版。我相信,只需要一次任务,就可以把那一块的相关知识掌握熟练,然后社交技能也可以上来,这绝对是一举两得。
  4. 作为一名青少年开发者,你一般是如何学习技术的,听说你曾经以 AI 学 AI?哈哈哈~~

    • author image
      黄瓜🥒
      以 AI 学 AI?试过,但是效果真的不咋地。那时候 GPT3.5 才刚出来,我问他啥都是乱答的。所以我还是觉得以前的学习方式比较好。我喜欢那种“在实际应用里学习”。也就是说,给我一个应用场景,或者是项目,然后我先想该怎么实现,遇到哪里有不懂的技术问题,再去搜,再去问别人(当然,嫌麻烦的话就问 AI /doge)
      我觉得这样的学习效率是最高的。
  5. 在你的同龄人中,有多少人对编程和开发感兴趣?你是如何看待青少年参与开源的?

    • author image
      黄瓜🥒
      我的同龄人。。。如果你指的是我们学校的话。。。那么应该不多,应该不超过五个。所有学计算机的,基本上都是为了信竞。剩下的为数不多的四五个人,也只是用 GitHub 找找东西,玩玩游戏而已。
  6. 你对于即将参加 Paddle 黑客松有什么样的期待和目标?你希望在黑客松中取得什么样的成绩?

    • author image
      黄瓜🥒
      我的目标就是试一下,看看自己的水平在哪,然后顺便学一些知识。所以?只能期待题目不要太难了 hhh
      至于成绩嘛,我也不奢求,能得一颗星就算是重大成就了,如果我是“有技术的”,也许可以尝试 may be 多弄一点星???
  7. 那么在整个开源学习中,对你影响最深的是谁?为什么?(🤔🤔🤔)

    • author image
      黄瓜🥒
      这个问题很难答啊 hhh,说谁都不太好。
      但是如果要说真话,这就必须提到 SearXNG 那个搜索引擎的 Maintainer。他特别有耐心,还跟我闲聊,那段时间我初出茅庐啥也不懂,要不是他,我到现在还没入门呢!
      当然啦,我必须希望以后能有更多影响我的人,超越他,对吧?
  8. 对于其他年轻开发者来说,你有什么建议?或者你想鼓励他们参与到开源社区,特别是 Paddle 社区中么?

    • author image
      黄瓜🥒
      我觉得开源社区的一大魅力就在于“社区”——你永远可以找到帮助,永远可以与志同道合的人一起 coding,Paddle 社区更是一个典型。
      在 Paddle,如果你有什么问题——无论白痴问题还是神级难度——都会有人来看,都会有人来帮助你解决。
      我觉得 Paddle 的一大优点就是他是任务式的这种贡献机制。你可以选择各种不同难度的任务,循序渐进,慢慢提升自己。任务式贡献也可以让你有一个明确的目标,甚至是一个明确的思路,该怎么解决这个问题。

三、生活中的点点滴滴——黄瓜篇

life
黄锦源同学的日常
homework
黄瓜的作业
cat
黄瓜的猫🐱
+ + + + \ No newline at end of file diff --git a/posts/huangjiyi-story.html b/posts/huangjiyi-story.html new file mode 100644 index 0000000..1ac9095 --- /dev/null +++ b/posts/huangjiyi-story.html @@ -0,0 +1,32 @@ + + + + + + 【开源江湖闲聊录】从入门到入职(入土):黄师傅的校招 offer 指南! | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】从入门到入职(入土):黄师傅的校招 offer 指南!

Authors

从积极参与社区开源任务,到加入飞桨成为 (练习生) 实习生,到最终正式成为飞桨研发团队的一员。以兴趣为起点, 黄济懿师傅 将我们展示了一条通往职业的道路,希望他的故事能够激励所有对开源充满热情的开发者们。接下来,原神启动 🚀!

一、前言

黄师傅是一个地地道道的江西人,喜欢吃辣🌶️🌶️🌶️。他本科研究生都就读于广州的华南理工大学,现为电子信息专业,即将毕业前往 Paddle 工作。作为一名研究僧,他在空余时间喜欢吃吃美食或者玩玩游戏,像是原神/LOL/金铲铲之战(各位要是也在玩,可以找黄师傅哦~黄师傅求大佬带带!!)。

偷偷告诉你们:黄师傅最近的主线任务就是毕设,请务必多找他打游戏让他延毕(不是)

去年 11 月,他出于对深度学习框架的底层实现的兴趣,联系花花加入了快乐开源群。在这一年里,他陆续完成社区里各项开源任务以熟悉 Paddle 框架,期间他也把握住了来飞桨实习的机会,他不断积累开发经验,不断加深对 Paddle 的理解,最终,他通过了飞桨团队的面试,成功拿下了飞桨校招 offer!

黄师傅曾说:"我将继续在飞桨开源活动完成一些任务,希望能够学到更多的同时也能为飞桨的建设做出小小的贡献"。事实上,黄师傅曾分别参与了 PHI 算子库独立编译算子定义自动生成Fluid Kernel 函数式改造等多个快乐开源活动项目以及飞桨框架护航计划,到目前为 Paddle 贡献了 100 多个 PR。抛开实习生和正式员工的身份,黄师傅自身也是飞桨社区的自发贡献者和推动者。接下来,就让我们来瞅瞅黄师傅的精彩 Paddle 之旅吧!!

原神,启动!!(请读者自行脑补 BGM)

huangjiyi-01

二、采访内容

  1. 介绍一下自己吧,黄师傅!(●'◡'●)

    黄师傅: 我的 AI Studio 和 GitHub 的账号是 huangjiyi,也是我名字的全拼(黄济懿)。

  2. 可以简单和大家分享一下你生活中有什么兴趣爱好吗⊙o⊙(游戏、旅游、运动等等)?

    黄师傅: 我就是个死宅,平时就是打打游戏,刷刷 B 站,出门也就是找点好吃的。

  3. 听说你本科研究生都在华南理工大学,你们学校周围有什么好吃的啊?🍔🍟🍿🥯🥪🥗🎂🍬🍹🍉

    黄师傅: 因为在华工太久学校食堂已经吃腻了,我会经常出校找点吃的,但活动范围有限,学校周边我吃过比较好吃的不多,就川菜小炒、麻辣香锅、鸡公煲、螺狮粉、泰国菜这些。

  4. 我了解到你平时有在玩 LOL,那么如果把 Paddle 比作一个英雄🦸,你觉得它最像谁?为什么嘞?

    黄师傅: 我的答案是维克托,我的想象力有限,我只是觉得维克托的技能是会进化的,而 Paddle 也是在不断进化(更新)和扩展的,另外在维克托的背景故事里,他发明了很多具有智能的机械,比如蒸汽机器人,这和我们用 Paddle 来做的事比较相关,我只能想到这么多了。

维克托形象
维克托
  1. 你在加入飞桨开源群之前对 Paddle 的了解是什么样的?有没有听说过一些关于 Paddle 的传闻或者故事?

    黄师傅: 我在加入飞桨开源社区之前,我主要是一个用 PyTorch 跑深度学习实验的研究牲,对 Paddle 的了解也是和 PyTorch 类似的深度学习框架。关于 Paddle 的传闻的话像是国内最早开源的深度学习框架,以及国内最好的深度学习框架。

  2. 你第一个在 GitHub 上完成的 PR 是关于什么的呢?在 PR 的过程中你遇到了什么难题吗?

    黄师傅: 我第一个在 GitHub 上完成的 PR 是 PHI 算子库独立编译开源活动的一个子任务,只需要进行简单的代码替换,没有遇到什么难题,只是第一次改这么大项目的代码有点担心会不会改出什么问题。

    编者注✍️:【PHI 算子库独立编译】是飞桨开源社区的快乐开源活动之一~我们社区有很多类似的、名字听起来很高大上但实际上难度不大的开源活动

  3. 你觉得 Paddle 相比其他深度学习框架有什么优势?可以举个例子么?

    黄师傅: 其他深度学习框架我主要使用过 PyTorch,从用户的视角来比较的话,Paddle 具有丰富的中文文档,包括一些 API 文档和框架开发的技术文档,同时在 AI Studio 上有很多开发者分享的基于 Paddle 实现的项目和以及开发心得可以参考,这些对于国内用户十分友好。另外 Paddle 还有很多开源的套件,用户能够使用这些套件更快地完成一些深度学习应用任务。

  4. 飞桨的开源活动中,你完成的任务中有没有什么特别有趣或者有挑战性的项目?有没有什么技术难题让你觉得很兴奋或者很有成就感?

    黄师傅: 我参加过的很多关于框架开发的开源活动都比较有挑战性,期间遇到的一些困难主要是一些编译问题,然后在通过调试定位问题所在代码、弄清楚问题原因、最后解决问题的时候会比较有成就感。

  5. 据了解,你接触 Paddle 已经有一年多,那么你最欣赏 Paddle 团队中的哪些特点或价值观?为什么?

    黄师傅: 我比较欣赏的一点是 Paddle 团队非常重视开源社区生态,这一点从丰富的社区活动可以看出来,社区开发者可以从中学习到很多东西同时能够获得丰厚的奖励。

  6. 我记得你说过花花和涛姐给了你很多帮助,你觉得他们是怎样的人呢(分别说说🫶🫶)?为什么?

    黄师傅: 花花:飞桨最美运营,关键人家还很努力。 涛姐:为了让开发者能一直有新鲜热乎的开源任务做操碎了心。

    编者注✍️:花花是飞桨社区顶尖运营,涛姐是飞桨社区顶尖研发。

  7. 你是怎么获得去 Paddle 实习的机会的呢?

    黄师傅: 关于我如何获得去 Paddle 实习的机会,当时我刚开始做了一些开源任务,然后在和花花交流的时候以一种半开玩笑的语气问花花能不能去实习,结果没想到花花真的和涛姐提了,然后涛姐真的申请了,飞桨真的给我面试了,然后我面试也真的通过了,然后我就去实习了,一切都是这么突然。

    编者注✍️:其实目前已经有相当多的社区开发者,通过参与开源活动接触到 Paddle,并最终获得实习机会。另外,对于不方便线下实习的同学,我们也提供了远程实习的方案,可以了解往期【护航计划】。

  8. 在 Paddle 实习的时候,你是否参与了某个具体项目的开发?可以分享一下你在项目中的具体角色和贡献吗?

    黄师傅: 我在实习期间刚开始是接着之前在社区参加的 PHI 算子库独立编译开源项目,完成剩下的一些比较困难的任务,花了一个多月的时间完成,剩下的大部分时间参与了结构体 Kernel 注册统一这个项目,期间也会接到一些其他小任务,一共实习了 3 个月吧,基本状态是要我干啥干啥,不会的就问。

  9. 你认为实习那段时间你最大的收获是什么?你认为这段实习经历对你以后的职业生涯规划有起到什么影响?

    黄师傅: 收获很多,体验到了与在学校实验室不同的工作氛围,认识了一些研发大佬,深入了解了 Paddle 的一些机制,积累了一些编译调试和解决问题的经验。在 Paddle 的开源经历和实习经历让我找工作的目标从算法工程师转向了开发工程师,相比于具有不确定性同时很多时候凭借直觉的深度学习算法研究或者应用工作,我发现我更喜欢逻辑性更强且大多数问题都能找到原因的开发工作。

  10. 最后也恭喜你拿到 Paddle 的 offer 🎉,对于同样有志加入 Paddle 团队的学生党,你可以分享一些建议议、经验或者成功路径吗?

    黄师傅: 我感觉我能拿到飞桨 offer 很大一部分原因是我在飞桨的实习经历和参加了一些开源活动,所以我的建议是在学习技术的同时多参加飞桨的开源活动,或者有机会去飞桨实习。

offer
黄师傅的校招 offer 部分截图

三、“著名平台——虎扑评论”专区

这次,我们邀请了一些和黄师傅有过合作经历的朋友们(以及实习期间的导师🐶),贡献一下和黄师傅相关的故事,或者他们对黄师傅的评价~以下均为真心话,请放心看!

编者注✍️:黄师傅有些社恐,所以认识的社区朋友不多,大家正好可以借此机会认识一下。

by 涛姐(luotao1

  • author image
    骆涛
    我觉得黄师傅是运气真好,类似张无忌,各种捡到宝,当然实力也是重要的。他刚来的时候其实对深度学习框架基本上不了解,然后我们快乐开源刚好放了第一个大任务-phi算子库(解决 CMake 依赖不需要懂深度学习框架)。然后他做啊做,问我们有没有机会来实习,当时 hc 太太太少了,但我们刚做起来,就给他申请,然后他就开挂了

by 日升(YuanRisheng

  • author image
    元日升
    这位同学的工程素养很高,学习能力很强,经常超预期推进项目,最近独立完成高难度项目:飞桨 Flags 工具库建设,开源成果丰硕。另外也是原神大佬,工作累了还能带你打游戏,梦幻队友。

by 花花(Tulip-hua

  • author image
    花花
    原神60级大佬!还欠我一次开源社区分享,请记得!
花花的证据
黄师傅欠花花一次分享的证据(花花强烈要求贴上来的)

四、生活中的点点滴滴——黄师傅篇

  • author image
    黄师傅
    一张螺狮粉照片,一张游戏截图,这两张图片就代表我大部分的生活了,我也就是个喜欢吃点美食、打打游戏、敲敲代码的普通人。
螺狮粉
黄师傅力荐的他认为广州最好吃的《周成芝螺蛳粉》!
原神抽卡
谁懂十连双黄的概念?黄师傅玩几年原神了就这一次

写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


+ + + + \ No newline at end of file diff --git a/posts/limin-story.html b/posts/limin-story.html new file mode 100644 index 0000000..89ccff4 --- /dev/null +++ b/posts/limin-story.html @@ -0,0 +1,32 @@ + + + + + + 【开源江湖闲聊录】躺平健身搞开源:敏师傅的三十而立 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】躺平健身搞开源:敏师傅的三十而立

Authors

从对 Git 一窍不通到如今能够丝滑完成黑客松赛题,从曾经历鬼门关的生死挣扎到现在能够轻松跑几公里不喘气,从毕业于武大国软学的有志青年到佛系养生的新时代躺平中年,敏师傅 的人生经历就像是那瓶经年陈酿的老酒,醇厚细腻、回味无穷。

一、前言

是谁,天天说自己是 “老咸鱼” ?是谁,戏称自己是 “快奔 4️⃣的老头子”?又是谁,自诩为 “摸🐟王者“?是他、是他、就是他~我们的朋友——敏师傅!!!

limin-01

匿名回复: 我没有,假的,都是假的

敏师傅毕业于武汉大学,目前在珠海某甲方企业工作。作为新时代中年人,敏师傅和许多开源者一样,喜欢躺平、宅家、吃吃吃!但敏师傅不仅喜欢吃,还喜欢做。不仅喜欢做,还擅长烹饪各式各样的美味佳肴,堪称“当代好男人”(敏:“相对的,比群里其他大佬差距还很大!”)、“顶级家庭煮夫”、“万千少女的理想老公🫰❤️(敏:“不是不是,我有主的,理想厨子是真!”)连米国五星上将麦克阿瑟见了都评价道:“不是米其林大厨请不起,而是李敏更具性价比!”

后文有敏师傅的厨艺展示哦~

在健身养身方面,李敏师傅也颇有经验。给他一根杠铃杆,他能撬动整个亚欧大陆!给他一套跑步装备,他能漫步宇宙!著名物理学家阿基米德曾说:“李敏所创造出来的物理奇迹足以改写人类此前所有的力学研究!”无论是极限深蹲、恐怖硬拉还是痛苦卧推,在李敏的面前都不过是老八进厕所手到擒来!

匿名回复: 没有没有,都是瞎说的,手无缚鸡之力!

而在开源方面,作为一个非专业的开源开发者,敏师傅从学习如何提交 PR 做起,到加入 Paddle 的 API 文档修改组,再到后面又积极参加一系列快乐开源活动和更具挑战性的黑客松。正如敏师傅所说:“自己在 Paddle 就像打怪升级一样做各种任务”。在这段 Paddle 的这段旅程中,他一点点精进了自己的技术,也结识了许多热爱开源的小伙伴。接下来让我们去瞧瞧这位多才多艺的“摸🐟老头子”(just kidding😉😉😉)!

左图:李敏师傅
左图:李敏师傅
右图:水群摸鱼日常
右图:水群摸鱼日常

二、采访内容

  1. 介绍一下自己吧,敏师傅!

    敏师傅: 各位大佬好,专业摸鱼,日常躺平晒太阳的咸鱼就是我了。身高 183,体重 170。老胖鱼一条。

  2. 敏师傅说个人爱好之一是宅,那么平时宅在家干什么呢?

    敏师傅: 宅家追剧,鉴于囊中羞涩,又秉持开源,所以都是看免费的(大家不要学我,要支持正版,知识产权法在头顶)。有时会神经质发现地脏,就做个简单的扫除;有时就去公园跑跑步、做做拉伸,尽量让自己活的久点,要不然养老金白交了;要么小主想逛苍蝇馆子,就祭出地图精准定位去吃,吃完回家。

  3. 你曾经有提到在机器学习的过程中自己差点 “见了太祖”,请给大家分享一下这次惊险的经历😮

    匿名回复:不是学习中,是那会刚好在学基础,我出事跟学习无关啊~

    敏师傅: 某年,我在工作中,可能因为淋雨作业、感冒,加上伙食里有沙吧...多种原因叠加在一起,一天上午在办公室突然感到头昏。一开始估摸自己是低血压了,就去卫生队让值班人员量了个血压,结果 40/20。我估计自己身体出了大问题,赶忙让他们打了针 NE,然后喊队长把我送医院。

    到了医院迷迷糊糊的,不敢让自己睡着。一天下了 3 张病危,好像是急性胆囊炎合并肺炎,附加胸腔积液。指标各种超标,医生也不敢手术,一直发烧,让医生给打了丙球续命,中间因为升压药泵注射漏了,整个胳膊肿得不像样,让护士帮忙买土豆切片敷那吸收了才完事,同为三甲,简直了。

    过了 5 天医生估计受不了了,让转广州医院,还好领导派了个人跟着,就整了个车把我送到广总。那边直接说割胆囊,我怕,就说保守治疗,主任也同意了,就在广总住了一个多月。抽血都抽了三四十管,也没查出来病因,多科会诊好几次,像实验体一样躺着被几十人围观好几次。最后我看化验单,连非洲的传染病都查了,结果全是阴性。也就不了了之保守治疗了。先住传染科,然后呼吸内科,然后心内科。反正躺床上被推来推去,哈哈哈。

    那一个多月禁食,每天就是打营养针。就记得那脂肪乳,一瓶能打几个小时,每天从上午 8 点打到晚上 8 点。最后几天,医生才让吃流食,粥都不能喝,只能喝粥上面的米汤,唉。然后回到单位吃了半年的过汤菜(就是把所有菜都放水里洗洗尽量没有油),肚子上的肉都没了,皮都耷拉下来了😂

    编者注✍️:真・大难不死,必有后福啊。不过咱们社区开发者怎么什么离奇的经历都有...?

  4. 听说敏师傅的工作经历也非常曲折有趣,能具体说说么?

    敏师傅: 这个,也没啥。毕业稀里糊涂进了某集团,一开始说干计算机的事,结果一点不沾边,各种其他技能点点了个遍。架设卫星锅,招待上级,液压系统维修,汽车机油液压油更换,气路维修,强电弱电架设,挖坑种树等各种。

    全国各地的沙漠,森林,海岛跑了大半,格尔木睡沙漠,半夜帐篷被吹飞去追帐篷,靖宇睡森林,半夜下暴雨水淹帐篷急忙转移,跟着护林工逛森林,吃野果,挖人参,烧松子,反正东北比西北好玩的多。海岛就懵了,坐船就吐的昏天暗地,然后各种晒脱皮,最难受的地儿。

    后面几年总算是接触计算机,做了个仿真训练系统,抄了一堆网站,各种借调打黑工。然后就想着赶紧滚蛋啥都不想干了,躺平。后面就是学机器学习,接着住院,接着佛系养生。

  5. 你最早接触开源是在什么时候?

    敏师傅: 大学吧,那会为了看越狱、迷失、危机边缘那些。好用的播放器不多,关键是字幕。射手网开源了个播放器,就 SVN 拿下来看了看,支持各种制式视频,最大的特点是可以在线搜索字幕源并选择,在那个 RealPlayer 的年代,真的是非常的优秀。

  6. 那你又是怎么加入到 Paddle 社区的?您对于开源社区的价值和意义是怎样理解的?你认为这些价值和意义在 Paddle 社区又是如何体现的?

    敏师傅: 好像是查飞桨文档学习时,梦师傅的文档修改任务,然后就上了大船。 我觉得在国内做开源真的挺不容易,毕竟开源在绝大部分人认为就是免费,其实也就是免费,而且大家都信奉拿来主义,开源协议那块也不关心。开源需要投入的人力物力财力都是不小的,投入少了,社区和维护不够,BUG 就多了。但绝大多数软件,都是从开源起家的,操作系统、中间件、数据库、应用软件等等,所有层面都有开源的身影,是开源让计算机发展的更迅速,微软都不得不妥协进行开源,可想开源的力量。

    价值和意义的话,就用我接触的几个大佬概括下吧:

    • 涛姐,我所接触到飞桨负责开源的最高级别人物。涛姐从研发那割下来的开源任务,要考虑到我们的能力,不能太难,适众面又要广泛,对应负责的研发还要 Review,都是增加飞桨内部的工作量。然后做黑客松题目时发现,题目所需的,可以把开源题目串起来。这时才发现涛姐选题的前瞻性、系统性、大局观。对整体框架的全局把握才能轻车熟路深入浅出的发布出我们能做的题目。可想而知涛姐的能力有多强 👍。

    • 梦师傅花花,运营的核心 CP,原文档负责人,从任务发布、统计信息、数据到对接第三方,做过统计上报的都能懂,那就是个磨人想砸键盘的活,我们一堆人是一个个点,她们那是一整个面,但凡报上去的信息不对,就是反复的核实修改,线下的活动也组织的有声有色,从历次活动照片能看出参与者欢快的笑容,也反映出组织者的能力有多强。

    • 孙师傅,现 Docathon 发起人和文档总负责任。虽然他总是潜水,而且使用者总说文档有错误。但反过来看,那还不是因为 API 更新快,参数修复多。孙师傅负责的是很庞大的费眼睛的项目,代码嘛,能跑就行,有的使用者只关心 API 怎么用。但文档,是所有人必须要看的,严谨系数其实比代码要高的多,孙师傅劳心劳力确实不容易。

    编者注✍️:梦师傅是产品经理,不是运营哈哈哈。另外,我潜水是因为沉迷工作

  7. 作为一个非专业的开发者,一开始接触 Paddle 的时候你遇了过什么困难或者问题,是怎么解决的?

    敏师傅: 刚开始,对流行的开发是一窍不通。对于 Git,只会把代码下下来自己用,从来没有提过 PR。那会在群里啥也不懂,连 PR 是啥也不知道,Git 其他命令也不会,只会 clone,后来在梦师傅和张师傅的帮助下,看教程。但是那会儿,前面几个 PR 只会在 GitHub 打开单文件修改提交,CI 流程过不去。后来看了张师傅的 PR 教程,才学会了命令提交。

  8. 你有提到最初是看教程学习 Paddle 的,你觉得飞桨的文档和教程怎么样?

    敏师傅: 飞桨文档和教程,在主线这块是维护的很及时的,就是对于分支一些,教程和代码的不同步还是很明显的,记得有个给黑白视频上色的教程,怎么都跑不下来,最后才知道,得用老的仓库代码才行。但教程里的代码,clone 下来必然是最新的。

  9. 你参加过哪些飞桨的开源项目?你最喜欢哪个项目,为什么?

    敏师傅: 参加的挺多,都是摸鱼做做边缘任务,最喜欢的应该是 001 带的任务,因为他基本 724 在线,改 PR 的速度赶不上他 Comment 的速度,哈哈哈哈哈哈。

    编者注✍️:001 (SigureMo)是 Paddle 社区出了名的劳模,望周知。由于是第一位社区 commiter 而被大家称为 001。

  10. 听说你还参加了黑客松,那段经历一定很精彩,能否分享一下你在那期间遇到的有趣事情或者特别人呢?

    敏师傅: 在婷姐带领下做了点 FP16 的任务,在花花带领下写了个 API,跟其他大佬比起来,我这基本就是小学生水平,就记得那会 CI 各种拥挤(当然,责任在我,因为我没环境,只能靠 CI,哈哈哈哈)。

  11. 你觉得 Paddle 社区在吸引和培养新的开发者方面做得如何?是否有一些改进的建议或者想法?

    敏师傅: 我觉得一直都很吸引人,梦师傅、花花、酥酥、孙师傅各种活动都能面面俱到(虽然没实地参加,但看照片能看得出)。 建议想法啥的,我这四肢不发达头脑简单的脑子就算了,跟着大家学就好。🙂

  12. 除了 Paddle 之外,您还参与过其他开源项目吗?如果有的话,您觉得 PaddlePaddle 与其他项目相比有哪些独特之处?

    敏师傅: 其他的么,好像真没,MMEngine 算么,当时要找框架,所以提了 1 个还是 2 个 PR 吧,后面就放弃了,因为没有免费算力可以用😀,还是咱飞桨好用。

  13. 在与花花、孙师傅、梦师傅、涛姐和其他 Paddle 大佬的交流中,您学到了哪些知识和经验?对您的技术有哪些影响呢

    敏师傅: 平时怕他们忙,基本不主动找各位大佬。我们这都是点,她(他)们那是面,所以她们的工作量肯定是非常大的,能不打扰就不打扰。

  14. 对于在某甲方公司工作,敏师傅有没有一些摸鱼小技巧可以分享一下呢?你是如何平衡工作和生活的?

    敏师傅: 摸鱼技巧?开会带本书,看看会议就过去了,反正路人甲一个,一般就用“三不”回答:不会、不懂、不知道。领导的决定都是对的,领导的决策都不会错,错了那也是我们马仔理解不够深,执行不彻底,落实不到位。

    平衡工作生活的话,下了班就 不干活,遵守 995,除了大值班,这都得参加,没啥说的。

    编者注✍️:学到了。

  15. 对于那些想要成为开源贡献者的人,您有什么鼓励和建议?

    敏师傅: 不管是不是科班出身,大项目里开源一般有利无害的吧。我毕业太久,现在的应聘肯定卷出了天际,啥力扣 ACM 估计都是基操,能用开源项目加分的话,先进大厂实习再氪肝留大厂也是条路吧。说的不一定对,请客观看待。

  16. 最后,敏师傅还有什么想和大家说的么?

    敏师傅: 有新手怪的话,大佬们给我留点。我还是砍砍史莱姆和稻草人就好😀。

三、著名大型评论平台——虎扑评论专区

敏师傅和太多的人打过交道了。由于篇幅的原因,我们邀请了部分和敏师傅有过合作经历的朋友们,贡献一下他们和敏师傅发生的故事,或者对敏师傅的评价~以下均为真心话,请放心食用!

limin-04

by 孙师傅(sunzhongkai588

  • author image
    孙钟恺
    一开始对敏哥印象深刻,是因为敏哥的微信昵称拼音——讷言敏行(nè yán mǐn xíng),总共 4 个,有位前同事能把其中 2 个读错成 nà ... ... háng。🤣
    之后,从提文档修复的 PR 开始,就能明显感觉到敏哥的进步,再到后来敏哥能一口气把好多快乐开源任务都认领完成了,真的非常厉害。

by 婷姐(zhangting2020

  • author image
    张婷
    敏师傅领题目、push 研发超积极。最厉害的是自己不做测试的,都是一把改完 push 上去看 CI 结果,也不需要 GPU 算力(手动狗头),以充分利用婷姐的脑力资源为主。

by 汪师傅(GreatV

  • author image
    汪昕
    敏师傅,当然是实力超强的摸鱼仙人

by 花花(Tulip-hua

  • author image
    花花
    众所周知,飞桨开源社区分为两股势力:以敏师傅为首的好人阵营,以 002 为首的时好时坏阵营。

编者注✍️:下面这位就是花师傅说的时好时坏的 002 ⬇️

by 张师傅(liyulingyue

  • author image
    张一乔
    敏师傅简直是吾辈楷模,能愉快的摸鱼提 PR,还有老婆,真让人羡慕。

by 独师傅(longranger2

  • author image
    张伟鸿
    敏师傅给我的感觉就如同金庸武侠小说里的扫地僧,活跃在飞桨各大大小小的社区当中,神秘而且武功深不可测,有极高技艺却又深藏不露。嘴上说着摸鱼,但上班的时候提起 PR 毫不手软(敏师傅,咱贵公司还招人吗[可怜])。敏师傅也是一部行走的百科全书,上知天文,下知地理,尤其对吃的颇有造诣,如果你想知道不同地方的美食,问敏师傅就对了。
    不过我也得来吐槽下敏师傅,平时我认领的任务还没开始做的时候,张师傅都是口嗨说要背刺我,但只有敏师傅是来真的,直接把我认领的任务做了,希望敏师傅下次能给我留口汤喝,ball ball you 了😭

by 陈沧夜(mrcangye

  • author image
    陈龙
    敏师傅是我人生重要的领路人之一,每次抉择迷茫时候,敏师傅总会用他经验满满的信息差对我的迷茫分叉口进行降维打击!最后让我拨云见月,酣畅淋漓!

by 梦师傅(Ligoml

  • author image
    梦柳
    敏哥人超好!职场导师+1
梦的证据
敏哥安慰梦师傅的聊天截图

四、敏师傅的佛系养身 TIME~🏃‍♀️🏋️‍♀️⛹️‍♀️🚴‍♀️🤸‍♀️👯‍♂️💪

经历

先设定个小目标,就减肥吧,然后开始了漫长的减肥计划。 一开始 3 公里都难跑及格,啥也不管,先开跑,同时补充氨糖和维生素,免得关节废了。好像从 95 跑到 85 后,各种体测也没问题了。前几个月体重掉的快,后来基本一个月一公斤,逐渐五公里到十公里,最后跑了个半马试试自己的耐力。然后体重就到了瓶颈期,跑步成了热身,体重不减,体脂不减,请教专业人士,开始上力量,原始三件套:深蹲,硬拉,卧推。先慢跑 3 公里,然后负重训练。后来逐渐加上 HIIT,体重最轻的时候到了 70 公斤。

过来人的小 tips💡

总结一下大概如下:热身是必要的,体重大先用有氧减脂,一开始不用太在意体重,练就完了,碳水和蛋白质要保证,氨糖和维生素也是必备,到了某天会发现衣服大了,体重下来了。到了瓶颈期就可以上力量,没有条件就用 HIIT 代替,比如斯巴达 500,虽然痛苦,但是非常有效,提升新陈代谢率,提高心肺功能。在上力量时,如果有体检,会发现尿酸升高,这个是力量训练中常有的,可以暂停一周再复测,正常值后就说明是力量训练导致,就不用担心了。

五、彩蛋 🥚

1. 十项全能的家庭煮夫敏敏子在线狂秀厨艺

  • author image
    敏师傅
    自我宣言:本人手艺还行,刀工一般,之前在某集团时没事跑去炊事班练练手,打打牙祭。煎、炒、烹、炸、焖、炖、溜、熬、蒸、烩、煮、烙、汆、酿、扒、烧都会烧点。
左图:李敏师傅
敏哥做的菜-1
右图:水群摸鱼日常
敏哥做的菜-2

2. 敏哥个人自述

敏哥在采访前也精心写了一份【个人自述】,篇幅过长就不贴在正文了,好奇的话可以读一下哦~

编者注✍️:留个彩蛋!我把它放在了博客 GitHub repo 下的 src/eggs/limin-story/ 文件夹下哦~


写在最后 💡

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。


+ + + + \ No newline at end of file diff --git a/posts/loaf-sharing.html b/posts/loaf-sharing.html new file mode 100644 index 0000000..5b7708b --- /dev/null +++ b/posts/loaf-sharing.html @@ -0,0 +1,31 @@ + + + + + + 如何在开源社区摸 🐟? | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

如何在开源社区摸 🐟?

Authors

本篇博客文章的内容,来源于作者在「第八届中国开源年会」上分享的一次主题为 「如何在开源社区摸 🐟」 的闪电演讲,以下的部分为演讲的具体内容。

loaf-01

01-个人简介

大家好,今天我想分享的主题是 「如何在开源社区摸 🐟」。在演讲开始前先自我介绍一下,我叫孙钟恺,社区里的开发者都称呼我为 孙师傅,下图为我的 Github ID、头像和贡献热力图。

loaf-02

从上面的职业标签可以看出,我是入职百度一年半(0.5🐔年)、目前负责 Paddle 开源社区以及官网文档的飞桨校招产品经理。作为一名新人,我也没有什么特长,唯一擅长的就是摸 🐟 吧~所以在这里也和大家分享一下我的摸 🐟 经验。

02-摸 🐟 经验

我的摸鱼经验其实从这幅图就可以说明白,就是工作上三思而后行

  • 第一,这工作能不能不做
  • 第二,这工作能不能晚点做
  • 第三,这工作能不能交给别人做

loaf-03

但是,理想是丰满的,现实是骨感的。老板的回复也很直接:

  • 第一,你能不能滚蛋;
  • 第二,你能不能早点滚蛋。

不过对于第三点呢,老板似乎不太抗拒(反正不是交给他做🐶)。于是我就在思考,也许可以通过“把工作转交给别人”的方式,来简单摸个 🐟。

那么问题来了,具体交给谁做呢?我看向了我的同事和研发大爷们。经过几百回的试探和心理博弈后,研发大爷们均以“人力不够”、“优先级低”等借口来拒绝我。而且咱们研发工作日做牛做马,一到周末直接原地消失了,一看 GitHub 热力图,周六、周日都是空的。

补充:不过这也说明百度还算是一个遵守劳动法的公司,周末都是双休的~

然后,我把我的目光转向了社区开发者们。哎,发现他们的开源热情似乎还是很高涨的,有的开发者甚至把开源视为人生价值(“工作就是图一乐”、“人生价值实现还得靠开源”)我又翻了翻一些社区开发者的 GitHub 热力图,一看吓一跳 😮,绿油油的一片,7*24 小时全职开源。

loaf-04

至此之后呢,我就把 “把活儿交给社区开发者”,作为我摸 🐟 的核心思想。

loaf-05

但是,怎么“把活儿交给社区开发者”,也是需要讲点基本法的,所以我总结了两条方法~

03-「把活儿交给社区开发者」初级版

首先,我先介绍一下初级版,即把一些 明确的轻量级任务 交给社区开发者做。

怎么理解呢?其实很多问题已经由社区开发者和内部研发进行多轮讨论了,并经过 任务拆解 后,形成了可以直接去上手做的轻量级任务。这些轻量级任务最终会公布到社区,并以 tracking issue 的形式进行发布和追踪,下图右方就是部分的这类任务。

loaf-06

因为这些任务相对简单、好上手,社区开发者反馈其实非常好,有些人可能周末会去做,有些人甚至上班摸鱼的时候也在做。

发布这类任务的优点在于——因为任务比较简单,“啪”的一下做的很快,完成率又特别高。更重要的是,开发者也会很愉悦,比如花一个小时提一个 PR 上来,就能把任务做完了,很容易带来满足感~(而且也会有小礼品)

不过这类任务也有一些缺点——这些任务需要花精力进行任务的拆解、详细的描述,甚至还可能需要指导和大量的 Review。所以这 🐟 虽然摸了,但只摸了一半。

loaf-07

03-「把活儿交给社区开发者」终极摸鱼版

基于上述,我之后又总结了终极摸鱼版的方法,就是 把问题交由社区开发者来主导

怎么理解呢?就是我们飞桨只提供大概的题目和方向,由社区开发者根据问题 自行进行拆解,然后在我们的指导下开展任务。比较典型的是 将 xdoctest 引入飞桨工作流,这个题目是由社区开发者顺师傅(@megemini)来完成的。

xdoctest 是一个文档示例代码的检查工具。

从下面右半边可以看到,顺师傅按自己的理解对任务进行拆解,分为不同的阶段,并有条不紊的完成。并且还衍生出了一些批量的社区任务,比如全量的修改了飞桨一千多个 API 的示例代码。这是一个人完成不了的,需要号召更多的社区开发者来参与,因此这个项目也极大调动了整个社区的氛围和活力。

loaf-08

所以说,其实把问题交给社区开发者主导,会有很多积极的方面~一方面能够帮我们分担了很大的研发精力(帮我们摸 🐟),另一方面也会不经意间对整个社区有正向的影响力。

04-摸 🐟 的前提条件

最后也提一下,其实摸鱼也有很多前提条件,需要有良好的社区氛围丝滑的社区交流研发的大力支持运营的宣传推广...这些条件都是缺一不可的~所以虽然是摸鱼,但也需要遵循很多客观规律。

loaf-09


以上是我演讲的全部内容,感谢大家的观看~

loaf-10

+ + + + \ No newline at end of file diff --git a/posts/pku-course.html b/posts/pku-course.html new file mode 100644 index 0000000..3fc00e2 --- /dev/null +++ b/posts/pku-course.html @@ -0,0 +1,31 @@ + + + + + + 飞桨开源社区走进北京大学课堂 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

飞桨开源社区走进北京大学课堂

Authors

飞桨开源社区走进北京大学课堂

10 月 11 日,飞桨开源社区应北京大学计算机学院周明辉副院长邀请,在周老师的开源软件开发课程的第四次课上,为北大的同学们介绍了飞桨开源社区和飞桨新一代 IR 设计。

Jun 给同学们介绍了飞桨开源社区的基本情况 jun-present

杰师傅给同学们深入浅出的介绍了飞桨新一代 IR 设计。 jie-present

课程材料在线观看

这次课程的 Slides,可以在这里在线浏览:飞桨-北大讲课-2023-10-11

彩蛋 🎊

飞桨开源社区曾经在 Apollo Park 接待过北大的国际留学生,梦师傅曾经全英文给参加北京大学夏季夏令营的牛校的神兽们讲解过飞桨。 apollo-park-allapollo-park-meng-present

+ + + + \ No newline at end of file diff --git a/posts/shun-story.html b/posts/shun-story.html new file mode 100644 index 0000000..aabc74a --- /dev/null +++ b/posts/shun-story.html @@ -0,0 +1,31 @@ + + + + + + 【开源江湖闲聊录】社区掌舵人:顺师傅的 Paddle 之旅 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

【开源江湖闲聊录】社区掌舵人:顺师傅的 Paddle 之旅

Authors

【开源江湖闲聊录】 是一项专门为 Paddle 社区的开发者打造的特色访谈栏目📚。在这里,我们邀请到每一位别具一格且富有热情的开发者,通过文字或语音的方式进行深入采访 🎙️,探索并展现他们背后独一无二的故事,将他们的经历、见解和创意整理成精彩内容,呈现给整个社区。

一、前言

是谁,能让最摸 🐟 的开发者禁不住 PR 的诱惑,疯狂求 review?又是谁,让向来严于待人、宽以律己的 Paddle 开发者忍不住夸夸?接下来,有请我们的大佬——顺师傅

shun-01

顺师傅是一名 Paddle 的社区开发者,但在社区里,顺师傅不仅仅是一个称呼,更是一股推动力。他主导的项目 【将 xdoctest 引入飞桨工作流】 是 Paddle 社区迄今为止最大的开源活动 🎊。该项目规模极其庞大,涉及超过一千多个 API 示例的整合和数十万行代码的优化,由超过 20 名社区开发者共同完成。顺师傅的领导力不仅显著提升了 API 示例代码的规范性,还极大地促进了整个开源生态的发展和繁荣 🎉。

而顺师傅本身,作为一位经验丰富的资深开发者,也拥有着深厚的技术背景和广泛的知识储备。我们怀着对他的好奇(膜拜)🤩,通过文字采访的形式来深入了解顺师傅的故事,以下是我们与顺师傅的采访内容 📄。

二、采访内容

  1. 可以介绍一下自己吗?平时有什么兴趣爱好?

    顺师傅: 我的 AI Studio 和 GitHub 的账号是 megemini,平时喜欢看看书爬爬山跑跑步~

  2. 作为一名技术佬,你的一天是如何度过的呢? 可以分享一下你的日常生活么?

    顺师傅: 每天都会做的事情,比如写代码、跑步、看书之外,由于最近需要用到 C++,而上一次用 C++ 都是十多年前的事情了,所以近期看一些 C++ 新特性相关的书和视频教程会比较多 ~

  3. 可以简单向大家展示一下你一天的生活作息嘛?

    顺师傅: 家里情况比较特殊,没有什么可参考性~ 不过现在不会熬夜写代码了,晚上一般七八点钟也会出去跑跑~

  4. “上一次用 C++ 都是十多年前的事情了”这句话太有年代感了,是在学生时代用的吗?

    顺师傅: 嗯,工作之后 Java、Python 用的比较多 ~

  5. 你是如何成为 Paddle 社区的开发者的?

    顺师傅: 毫不避讳的说,当初是因为 AI Studio 有比较多的免费算力才接触到 Paddle 社区并真正的开始使用 PaddlePaddle 框架,慢慢的后面才接触到黑客松、快乐开源之类的活动 ~

  6. Paddle 社区开发者都称呼你为“顺师傅”,这个称呼是怎么来的?是谁第一个开始这么称呼你的(笑)?

    顺师傅: 微信的昵称就是「顺」,好像是涛姐还是 001 开始这么叫的 ... ... 惭愧 ... ...

  7. 外界对开发者的固有印象(社恐,直男),你周围的开发者形象是怎样的?你对 Paddle 哪位社区开发者印象最深?

    顺师傅: 开发者都比较坦诚,由于平时基本都是跟技术打交道,所以不管是话多也好、话少也罢,交流起来都是比较简单、热心的感觉~001 对于开源的那种热爱对我印象最为深刻~

    SigureMo 是 Paddle 社区的资深开发者,由于是第一位社区 commiter 而被大家称为 001。

  8. 为什么 001 会给你带来这样深刻的印象?可以分享一下其中的小故事嘛?

    顺师傅: 记得当时为了修改示例代码写了一个小工具,本来还只是想发出来试一下,结果好像第二天 001 的 PR 就来了~技术能力和执行力都太强了,惭愧 ... ...

  9. 你可以谈谈你对开源社区的理解和认识吗?

    顺师傅: 抛开自由、开放不谈,开源项目的参与门槛其实是比较高的,这里主要是针对正规的、规模较大的开源项目、代码类的贡献来说~因此,飞桨能够组织快乐开源、黑客松之类的活动,并且是由中文社区主导,个人感觉是非常有意义的一件事情~

  10. “将 xdoctest 引入飞桨工作流”这个项目是如何诞生的?你可以谈谈这个项目的初衷和目标吗?

    顺师傅: 这个项目是第六届中国软件开源创新大赛 Paddle 挑战赛的一个赛题,主要目标是使用 xdoctest 替换掉 CI 流水线中的不怎么好用的示例代码检查工具~

  11. 你是如何组织和号召其他社区开发者参与这个项目的?在这个过程中遇到了哪些挑战,又是如何克服的?

    顺师傅: 嗯 ... ... 这里应该主要感谢涛姐帮忙摇人吧~~~我所做的只是把事情讲清楚,仅此而已 ~

  12. 这个项目涉及到一千多个 API 示例、数十万行代码的修改,你是如何管理和协调这么大规模的项目的?

    顺师傅: 飞桨开源社区的参与者能力都很强,所以,只要把事情讲清楚,做什么、怎么做,大家自然会把事情做好~期间,001、涛姐、孙师傅、军哥等等很多人,都帮助一起分析如何把这个事情讲清楚,大家目标一致,水到渠成吧~

  13. 这个项目的完成对 Paddle 社区的开源生态有何影响?你认为它在推动开源生态繁荣方面的作用体现在哪里?

    顺师傅: 提升代码质量、对齐主流 Python 解决方案~能够引导更多 “新人” 参与到开源项目中来~

  14. 在你看来,这个项目的最大贡献是什么?为什么?

    顺师傅: 丢掉历史包袱,以后大家都是在统一的 Python 标准下参与贡献,未来的技术选择灵活性都大很多~

  15. 回顾这个项目,有哪些时刻让你印象深刻?为什么?

    顺师傅: 印象最深刻的是当时 RFC 讨论的时候~参与之前本来是抱着试一试、捡漏的心态来的,结果 RFC 一番讨论下来,有种骑虎难下的感觉 ... ... 另外,在发起示例代码修改这个快乐开源活动之后,看到能有这么多开发者参与进来,并且最终把这个项目做了下来,飞桨开源社区号召力之大,属实给了我一次小小的震撼~

  16. 对于未来,你对 Paddle 社区有哪些期待和建议?

    顺师傅: 希望能够引导更多中文社区的开发者参与进来,能够有更多在校的学生参与进来~另外,提一点小小的建议,虽然已经参与飞桨开源社区快一年了,但是,仍然对 Paddle 本身的框架技术路线、技术规划以及一些细节考量非常模糊,希望能有这方面较为系统的文档、视频教程吧~

  17. 作为一名经验丰富的老开发,对于想要参与开源社区,特别是 Paddle 社区的年轻人,你有什么建议或者寄语?

    顺师傅: 只有让更多年轻的开发者不断接过手中的桨,才能将开源社区一直行驶下去,直至星辰大海~

三、“五星评论家麦克阿瑟”专区

我们也邀请了一些和顺师傅很熟悉的、有过合作经历的朋友们,贡献一下和顺师傅相关的故事,或者他们对顺师傅的评价~以下均为真心话,请放心看! shun-05

001(SigureMo

就 Xdoctest 这个任务而言,最开始其实我自己都是没有多少信心的,毕竟是整个框架级别的,光是任务量想想就头疼,而且历史遗留问题特别多,怎么想都做不来吧?当初想着在 RFC 阶段就尽可能抛出我已知的各种坑,让开发者知难而退,这样我也能省心些,要是啥也不懂的我也带不动。

但是顺师傅的出现打破了我的摸鱼计划,顺师傅上千行的 RFC 调研地比我了解的还清楚,对于我提出的各种「劝退」问题也逐一回复了合理的解决方案,这时候我突然觉得,也许真的能成?

RFC 合入后顺师傅有条不紊地推进着整个任务,每一次遇到疑难问题时,顺师傅总能选出合适的解决方案。比如 Paddle Tensor 打印时候 Place 不对齐的问题、输出精度问题、运行环境隔离问题等等,这些都是 Xdoctest 本身存在的诸多问题,经过顺师傅的调整和优化,Xdoctest 已经基本能够完美适配我们 Paddle 了。

此外大家可能比较熟悉顺师傅发放的两个开源任务,也是整个任务耗时最久的部分,顺师傅在开源任务中从开发者转变为了 reviewer,帮助我们 review 了很大一部分的 PR,并且 review 地十分细致且专业。

然后就如大家所见到的,真的成了。

顺师傅太强了~期待下次合作~

涛姐(luotao1

本任务难点在于工程量大、历史包袱重,感谢顺师傅带着所有队员(24 位)用强大的耐心、细心完成了这一旷日持久的推进,你们的工匠精神值得全体同学学习!众人拾柴火焰高,感谢项目的所有参与的同学!

编者注✍️: 涛姐的话太官方了,所以我挑了句重点,希望涛姐能原谅我 🤪

敏师傅(enkilee

有幸通过软件开源创新大赛,结识了顺师傅,他的大赛课题是将 xdoctest 引入到飞桨框架工作流中,为了提升效率,减少错误,还不辞辛苦做了一个简单的转换工具 convert_doctest,极大的节省了修改的工作量,减少了出错成本。

此任务工作量巨大,而且很多 API 历史遗留问题繁杂,顺师傅在工作中展现出的极高的职业素养和敬业精神令我们为之侧目。他对待每一个细节都非常用心,力求做到尽善尽美。在面对复杂的问题时,他总是能够迅速找到解决办法,充分体现了他的专业能力和经验。

此外,顺师傅还具有很强的团队协作能力,他乐于与大家分享经验和技巧,共同提高整个团队的工作效率。在工作中,他总是能够主动承担责任,为团队的发展贡献自己的力量。

川川(gouzil

顺师傅好强,带带弟弟 shun-02 顺师傅的分析能力和组织能力都超强 shun-03

孙师傅(sunzhongkai588

在参与顺师傅的项目过程中,我甚至感觉顺师傅像我的 mentor,因为从他身上切切实实学到了很多东西,比如问题的拆解、项目的组织、技术的交流等...

尤其是看到顺师傅逻辑非常清晰的 RFC 文档后,仅从文档写作方面都让我受益匪浅(因为文档的编写需要非常多的逻辑推理和思考,而像顺师傅一样把事情讲清楚的研发,真的不多,大家感兴趣也可以去看看)功利地说,顺师傅对我的职业发展有非常大的提升,希望顺师傅能够继续加油,影响更多人!

四、结尾

在探索顺师傅的旅程中,我们不仅发现了一个技术上的资深开发者,也见证了一个开源社区领路人的成长和影响力。他的故事和成就展示了开源社区不仅是技术的聚集地,更是所有开发者开源热情的熔炉 🔥。

期待顺师傅在未来的旅程中继续发光发热,为 Paddle 或是其他开源社区带来更多的创新和启示 💡。

最后,应顺师傅要求,就不附照片了,以一棵柳树作为结尾 🌲

shun-04

彩蛋 🥚

往期 blog 有顺师傅真容哦~大家可以去探索一下!

+ + + + \ No newline at end of file diff --git a/posts/xian-event.html b/posts/xian-event.html new file mode 100644 index 0000000..0253cb3 --- /dev/null +++ b/posts/xian-event.html @@ -0,0 +1,31 @@ + + + + + + 飞桨开源社区参加中国开源软件创新大赛剪影 | 飞桨开源社区博客 + + + + + + + + + + + + + + + + + + + + +
Published on

飞桨开源社区参加中国开源软件创新大赛剪影

Authors

在中国计算机学会组织的中国软件开源创新大赛上,飞桨开源社区的全部比赛已经完成。恭喜以下获奖的同学:

飞桨开源社区有四名同学参加了中国计算机学会组织的中国软件开源创新大赛决赛,这里记录一下在西安参加活动时候的一些照片。大赛的决赛的结果在这里:第六届 CCF 开源创新大赛决赛结果通知

活动签到处

xian-event-01

@megemini 在做《将 xdoctest 引入到飞桨框架工作流中》的项目答辩。

xian-event-02

@qiuwenbogdut在做《实现飞桨框架动态图反向图的可视化》的项目答辩。 xian-event-03

@co63oc在做《PaddleScience 领域前沿论文复现》的项目答辩(远程接入,遗憾没见到真人)。 xian-event-04

@zrr1999在做《实现飞桨框架的 python level jit compiler》的项目答辩。 xian-event-05

梦师傅在跟顺师傅和詹师傅交流。

xian-event-06

+ + + + \ No newline at end of file diff --git a/sw.js b/sw.js new file mode 100644 index 0000000..bf62669 --- /dev/null +++ b/sw.js @@ -0,0 +1 @@ +if(!self.define){let s,e={};const l=(l,n)=>(l=new URL(l+".js",n).href,e[l]||new Promise((e=>{if("document"in self){const s=document.createElement("script");s.src=l,s.onload=e,document.head.appendChild(s)}else s=l,importScripts(l),e()})).then((()=>{let s=e[l];if(!s)throw new Error(`Module ${l} didn’t register its module`);return s})));self.define=(n,i)=>{const o=s||("document"in self?document.currentScript.src:"")||location.href;if(e[o])return;let r={};const t=s=>l(s,o),a={module:{uri:o},exports:r,require:t};e[o]=Promise.all(n.map((s=>a[s]||t(s)))).then((s=>(i(...s),r)))}}define(["./workbox-f3e6b16a"],(function(s){"use strict";self.skipWaiting(),s.clientsClaim(),s.precacheAndRoute([{url:"404.html",revision:"abc5f9b70c87b3b22802529de11e5ddf"},{url:"about.html",revision:"e7c368f210a9ee3921b52328c0f3fc8c"},{url:"assets/about.md.h4__TlQ2.js",revision:null},{url:"assets/about.md.h4__TlQ2.lean.js",revision:null},{url:"assets/app.cemPYfGD.js",revision:null},{url:"assets/chunks/first-post.B_qpWiqd.js",revision:null},{url:"assets/chunks/framework.-K2UgQQN.js",revision:null},{url:"assets/chunks/MessageBox.Gn3asJyB.js",revision:null},{url:"assets/chunks/virtual_pwa-register.AUg9w1EU.js",revision:null},{url:"assets/chunks/workbox-window.prod.es5.prqDwDSL.js",revision:null},{url:"assets/index.md.D6q36Xo0.js",revision:null},{url:"assets/index.md.D6q36Xo0.lean.js",revision:null},{url:"assets/pages_1.md.2741IVj7.js",revision:null},{url:"assets/pages_1.md.2741IVj7.lean.js",revision:null},{url:"assets/pages_2.md.X931t6v5.js",revision:null},{url:"assets/pages_2.md.X931t6v5.lean.js",revision:null},{url:"assets/posts_2023-os-report.md.Pmo8QKJO.js",revision:null},{url:"assets/posts_2023-os-report.md.Pmo8QKJO.lean.js",revision:null},{url:"assets/posts_chengdu-kaiyuanshe.md.H7ofFX8l.js",revision:null},{url:"assets/posts_chengdu-kaiyuanshe.md.H7ofFX8l.lean.js",revision:null},{url:"assets/posts_chuan-story.md.HU9Msoba.js",revision:null},{url:"assets/posts_chuan-story.md.HU9Msoba.lean.js",revision:null},{url:"assets/posts_first-post.md.-jvuBI1_.js",revision:null},{url:"assets/posts_first-post.md.-jvuBI1_.lean.js",revision:null},{url:"assets/posts_hackathon-5th-episode01.md.m4EkiTMR.js",revision:null},{url:"assets/posts_hackathon-5th-episode01.md.m4EkiTMR.lean.js",revision:null},{url:"assets/posts_hackathon-5th-episode02.md.chHv1KWn.js",revision:null},{url:"assets/posts_hackathon-5th-episode02.md.chHv1KWn.lean.js",revision:null},{url:"assets/posts_hackathon-5th-episode03.md.CRF5SbW0.js",revision:null},{url:"assets/posts_hackathon-5th-episode03.md.CRF5SbW0.lean.js",revision:null},{url:"assets/posts_huanggua-story.md.rXgMLZKS.js",revision:null},{url:"assets/posts_huanggua-story.md.rXgMLZKS.lean.js",revision:null},{url:"assets/posts_huangjiyi-story.md.x5lxcZ8g.js",revision:null},{url:"assets/posts_huangjiyi-story.md.x5lxcZ8g.lean.js",revision:null},{url:"assets/posts_limin-story.md.gVro2_B8.js",revision:null},{url:"assets/posts_limin-story.md.gVro2_B8.lean.js",revision:null},{url:"assets/posts_loaf-sharing.md.sT6p5rBR.js",revision:null},{url:"assets/posts_loaf-sharing.md.sT6p5rBR.lean.js",revision:null},{url:"assets/posts_pku-course.md.vgA8_dn2.js",revision:null},{url:"assets/posts_pku-course.md.vgA8_dn2.lean.js",revision:null},{url:"assets/posts_shun-story.md.pNwDx0qR.js",revision:null},{url:"assets/posts_shun-story.md.pNwDx0qR.lean.js",revision:null},{url:"assets/posts_xian-event.md.6a_wLK8y.js",revision:null},{url:"assets/posts_xian-event.md.6a_wLK8y.lean.js",revision:null},{url:"assets/style.TM1zjq9v.css",revision:null},{url:"index.html",revision:"4600a3dcbf483df949cf03f0ff3a2a25"},{url:"pages/1.html",revision:"30fbeb18162b0e38b334b7a70505e2b3"},{url:"pages/2.html",revision:"e097b4d2b3aeeacb3ee7d25097375ee8"},{url:"posts/2023-os-report.html",revision:"08c740b760ca0c1c983ea4d42f0efa97"},{url:"posts/chengdu-kaiyuanshe.html",revision:"8d2875a524b6bff48711798e818c26c3"},{url:"posts/chuan-story.html",revision:"f7c2b65df7d7edbd4202d219a0b0cb7d"},{url:"posts/first-post.html",revision:"15b3519af59db37c9499f8e182d1a6b6"},{url:"posts/hackathon-5th-episode01.html",revision:"865ff07e97b4a3e4578154bb4da65fed"},{url:"posts/hackathon-5th-episode02.html",revision:"6d1d6b0f3aca00de521640d72f0eece4"},{url:"posts/hackathon-5th-episode03.html",revision:"440adde6f1261c2b656e95b735479ee8"},{url:"posts/huanggua-story.html",revision:"c642b86d53172e2d1c6e07dd2f863717"},{url:"posts/huangjiyi-story.html",revision:"46b0796997d9bbac8660cb29fbcd01de"},{url:"posts/limin-story.html",revision:"907e82829cf7e7e5518c4a6ca20c182c"},{url:"posts/loaf-sharing.html",revision:"ed7eb172d9c1ea33a203f8dffef161ef"},{url:"posts/pku-course.html",revision:"63c9128f5e97d008ec3c324a3dbd71b9"},{url:"posts/shun-story.html",revision:"4714ef798ac6a11af6265088b029bd9c"},{url:"posts/xian-event.html",revision:"48d871baebe30ff5f00753eece3ce097"},{url:"icons/pwa-64x64.png",revision:"d7568fb849f66efbee8f28a7763667fb"},{url:"icons/pwa-192x192.png",revision:"0fb4e162b2a9b5f5925621f526b8a96b"},{url:"icons/pwa-512x512.png",revision:"a7081bf54878f8b558d2306aa8ca3832"},{url:"icons/maskable-icon-512x512.png",revision:"b540c6d9f398cb87b3baf56342570ba5"},{url:"manifest.webmanifest",revision:"d6116e4c85c1d87a0e9dd3eefa90def3"}],{}),s.cleanupOutdatedCaches(),s.registerRoute(new s.NavigationRoute(s.createHandlerBoundToURL("index.html")))})); diff --git a/workbox-f3e6b16a.js b/workbox-f3e6b16a.js new file mode 100644 index 0000000..8c012bc --- /dev/null +++ b/workbox-f3e6b16a.js @@ -0,0 +1 @@ +define(["exports"],(function(t){"use strict";try{self["workbox:core:7.0.0"]&&_()}catch(t){}const e=(t,...e)=>{let s=t;return e.length>0&&(s+=` :: ${JSON.stringify(e)}`),s};class s extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}try{self["workbox:routing:7.0.0"]&&_()}catch(t){}const n=t=>t&&"object"==typeof t?t:{handle:t};class i{constructor(t,e,s="GET"){this.handler=n(e),this.match=t,this.method=s}setCatchHandler(t){this.catchHandler=n(t)}}class r extends i{constructor(t,e,s){super((({url:e})=>{const s=t.exec(e.href);if(s&&(e.origin===location.origin||0===s.index))return s.slice(1)}),e,s)}}class o{constructor(){this.t=new Map,this.i=new Map}get routes(){return this.t}addFetchListener(){self.addEventListener("fetch",(t=>{const{request:e}=t,s=this.handleRequest({request:e,event:t});s&&t.respondWith(s)}))}addCacheListener(){self.addEventListener("message",(t=>{if(t.data&&"CACHE_URLS"===t.data.type){const{payload:e}=t.data,s=Promise.all(e.urlsToCache.map((e=>{"string"==typeof e&&(e=[e]);const s=new Request(...e);return this.handleRequest({request:s,event:t})})));t.waitUntil(s),t.ports&&t.ports[0]&&s.then((()=>t.ports[0].postMessage(!0)))}}))}handleRequest({request:t,event:e}){const s=new URL(t.url,location.href);if(!s.protocol.startsWith("http"))return;const n=s.origin===location.origin,{params:i,route:r}=this.findMatchingRoute({event:e,request:t,sameOrigin:n,url:s});let o=r&&r.handler;const c=t.method;if(!o&&this.i.has(c)&&(o=this.i.get(c)),!o)return;let a;try{a=o.handle({url:s,request:t,event:e,params:i})}catch(t){a=Promise.reject(t)}const h=r&&r.catchHandler;return a instanceof Promise&&(this.o||h)&&(a=a.catch((async n=>{if(h)try{return await h.handle({url:s,request:t,event:e,params:i})}catch(t){t instanceof Error&&(n=t)}if(this.o)return this.o.handle({url:s,request:t,event:e});throw n}))),a}findMatchingRoute({url:t,sameOrigin:e,request:s,event:n}){const i=this.t.get(s.method)||[];for(const r of i){let i;const o=r.match({url:t,sameOrigin:e,request:s,event:n});if(o)return i=o,(Array.isArray(i)&&0===i.length||o.constructor===Object&&0===Object.keys(o).length||"boolean"==typeof o)&&(i=void 0),{route:r,params:i}}return{}}setDefaultHandler(t,e="GET"){this.i.set(e,n(t))}setCatchHandler(t){this.o=n(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(t){if(!this.t.has(t.method))throw new s("unregister-route-but-not-found-with-method",{method:t.method});const e=this.t.get(t.method).indexOf(t);if(!(e>-1))throw new s("unregister-route-route-not-registered");this.t.get(t.method).splice(e,1)}}let c;const a=()=>(c||(c=new o,c.addFetchListener(),c.addCacheListener()),c);function h(t,e,n){let o;if("string"==typeof t){const s=new URL(t,location.href);o=new i((({url:t})=>t.href===s.href),e,n)}else if(t instanceof RegExp)o=new r(t,e,n);else if("function"==typeof t)o=new i(t,e,n);else{if(!(t instanceof i))throw new s("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});o=t}return a().registerRoute(o),o}const u={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},l=t=>[u.prefix,t,u.suffix].filter((t=>t&&t.length>0)).join("-"),f=t=>t||l(u.precache),w=t=>t||l(u.runtime);function d(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:7.0.0"]&&_()}catch(t){}function p(t){if(!t)throw new s("add-to-cache-list-unexpected-type",{entry:t});if("string"==typeof t){const e=new URL(t,location.href);return{cacheKey:e.href,url:e.href}}const{revision:e,url:n}=t;if(!n)throw new s("add-to-cache-list-unexpected-type",{entry:t});if(!e){const t=new URL(n,location.href);return{cacheKey:t.href,url:t.href}}const i=new URL(n,location.href),r=new URL(n,location.href);return i.searchParams.set("__WB_REVISION__",e),{cacheKey:i.href,url:r.href}}class y{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:t,state:e})=>{e&&(e.originalRequest=t)},this.cachedResponseWillBeUsed=async({event:t,state:e,cachedResponse:s})=>{if("install"===t.type&&e&&e.originalRequest&&e.originalRequest instanceof Request){const t=e.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}}class g{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=(null==e?void 0:e.cacheKey)||this.h.getCacheKeyForURL(t.url);return s?new Request(s,{headers:t.headers}):t},this.h=t}}let R;async function m(t,e){let n=null;if(t.url){n=new URL(t.url).origin}if(n!==self.location.origin)throw new s("cross-origin-copy-response",{origin:n});const i=t.clone(),r={headers:new Headers(i.headers),status:i.status,statusText:i.statusText},o=e?e(r):r,c=function(){if(void 0===R){const t=new Response("");if("body"in t)try{new Response(t.body),R=!0}catch(t){R=!1}R=!1}return R}()?i.body:await i.blob();return new Response(c,o)}function v(t,e){const s=new URL(t);for(const t of e)s.searchParams.delete(t);return s.href}class q{constructor(){this.promise=new Promise(((t,e)=>{this.resolve=t,this.reject=e}))}}const U=new Set;try{self["workbox:strategies:7.0.0"]&&_()}catch(t){}function L(t){return"string"==typeof t?new Request(t):t}class b{constructor(t,e){this.u={},Object.assign(this,e),this.event=e.event,this.l=t,this.p=new q,this.R=[],this.m=[...t.plugins],this.v=new Map;for(const t of this.m)this.v.set(t,{});this.event.waitUntil(this.p.promise)}async fetch(t){const{event:e}=this;let n=L(t);if("navigate"===n.mode&&e instanceof FetchEvent&&e.preloadResponse){const t=await e.preloadResponse;if(t)return t}const i=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const t of this.iterateCallbacks("requestWillFetch"))n=await t({request:n.clone(),event:e})}catch(t){if(t instanceof Error)throw new s("plugin-error-request-will-fetch",{thrownErrorMessage:t.message})}const r=n.clone();try{let t;t=await fetch(n,"navigate"===n.mode?void 0:this.l.fetchOptions);for(const s of this.iterateCallbacks("fetchDidSucceed"))t=await s({event:e,request:r,response:t});return t}catch(t){throw i&&await this.runCallbacks("fetchDidFail",{error:t,event:e,originalRequest:i.clone(),request:r.clone()}),t}}async fetchAndCachePut(t){const e=await this.fetch(t),s=e.clone();return this.waitUntil(this.cachePut(t,s)),e}async cacheMatch(t){const e=L(t);let s;const{cacheName:n,matchOptions:i}=this.l,r=await this.getCacheKey(e,"read"),o=Object.assign(Object.assign({},i),{cacheName:n});s=await caches.match(r,o);for(const t of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await t({cacheName:n,matchOptions:i,cachedResponse:s,request:r,event:this.event})||void 0;return s}async cachePut(t,e){const n=L(t);var i;await(i=0,new Promise((t=>setTimeout(t,i))));const r=await this.getCacheKey(n,"write");if(!e)throw new s("cache-put-with-no-response",{url:(o=r.url,new URL(String(o),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var o;const c=await this.q(e);if(!c)return!1;const{cacheName:a,matchOptions:h}=this.l,u=await self.caches.open(a),l=this.hasCallback("cacheDidUpdate"),f=l?await async function(t,e,s,n){const i=v(e.url,s);if(e.url===i)return t.match(e,n);const r=Object.assign(Object.assign({},n),{ignoreSearch:!0}),o=await t.keys(e,r);for(const e of o)if(i===v(e.url,s))return t.match(e,n)}(u,r.clone(),["__WB_REVISION__"],h):null;try{await u.put(r,l?c.clone():c)}catch(t){if(t instanceof Error)throw"QuotaExceededError"===t.name&&await async function(){for(const t of U)await t()}(),t}for(const t of this.iterateCallbacks("cacheDidUpdate"))await t({cacheName:a,oldResponse:f,newResponse:c.clone(),request:r,event:this.event});return!0}async getCacheKey(t,e){const s=`${t.url} | ${e}`;if(!this.u[s]){let n=t;for(const t of this.iterateCallbacks("cacheKeyWillBeUsed"))n=L(await t({mode:e,request:n,event:this.event,params:this.params}));this.u[s]=n}return this.u[s]}hasCallback(t){for(const e of this.l.plugins)if(t in e)return!0;return!1}async runCallbacks(t,e){for(const s of this.iterateCallbacks(t))await s(e)}*iterateCallbacks(t){for(const e of this.l.plugins)if("function"==typeof e[t]){const s=this.v.get(e),n=n=>{const i=Object.assign(Object.assign({},n),{state:s});return e[t](i)};yield n}}waitUntil(t){return this.R.push(t),t}async doneWaiting(){let t;for(;t=this.R.shift();)await t}destroy(){this.p.resolve(null)}async q(t){let e=t,s=!1;for(const t of this.iterateCallbacks("cacheWillUpdate"))if(e=await t({request:this.request,response:e,event:this.event})||void 0,s=!0,!e)break;return s||e&&200!==e.status&&(e=void 0),e}}class C{constructor(t={}){this.cacheName=w(t.cacheName),this.plugins=t.plugins||[],this.fetchOptions=t.fetchOptions,this.matchOptions=t.matchOptions}handle(t){const[e]=this.handleAll(t);return e}handleAll(t){t instanceof FetchEvent&&(t={event:t,request:t.request});const e=t.event,s="string"==typeof t.request?new Request(t.request):t.request,n="params"in t?t.params:void 0,i=new b(this,{event:e,request:s,params:n}),r=this.U(i,s,e);return[r,this.L(r,i,s,e)]}async U(t,e,n){let i;await t.runCallbacks("handlerWillStart",{event:n,request:e});try{if(i=await this._(e,t),!i||"error"===i.type)throw new s("no-response",{url:e.url})}catch(s){if(s instanceof Error)for(const r of t.iterateCallbacks("handlerDidError"))if(i=await r({error:s,event:n,request:e}),i)break;if(!i)throw s}for(const s of t.iterateCallbacks("handlerWillRespond"))i=await s({event:n,request:e,response:i});return i}async L(t,e,s,n){let i,r;try{i=await t}catch(r){}try{await e.runCallbacks("handlerDidRespond",{event:n,request:s,response:i}),await e.doneWaiting()}catch(t){t instanceof Error&&(r=t)}if(await e.runCallbacks("handlerDidComplete",{event:n,request:s,response:i,error:r}),e.destroy(),r)throw r}}class E extends C{constructor(t={}){t.cacheName=f(t.cacheName),super(t),this.C=!1!==t.fallbackToNetwork,this.plugins.push(E.copyRedirectedCacheableResponsesPlugin)}async _(t,e){const s=await e.cacheMatch(t);return s||(e.event&&"install"===e.event.type?await this.O(t,e):await this.N(t,e))}async N(t,e){let n;const i=e.params||{};if(!this.C)throw new s("missing-precache-entry",{cacheName:this.cacheName,url:t.url});{const s=i.integrity,r=t.integrity,o=!r||r===s;n=await e.fetch(new Request(t,{integrity:"no-cors"!==t.mode?r||s:void 0})),s&&o&&"no-cors"!==t.mode&&(this.k(),await e.cachePut(t,n.clone()))}return n}async O(t,e){this.k();const n=await e.fetch(t);if(!await e.cachePut(t,n.clone()))throw new s("bad-precaching-response",{url:t.url,status:n.status});return n}k(){let t=null,e=0;for(const[s,n]of this.plugins.entries())n!==E.copyRedirectedCacheableResponsesPlugin&&(n===E.defaultPrecacheCacheabilityPlugin&&(t=s),n.cacheWillUpdate&&e++);0===e?this.plugins.push(E.defaultPrecacheCacheabilityPlugin):e>1&&null!==t&&this.plugins.splice(t,1)}}E.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:t})=>!t||t.status>=400?null:t},E.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:t})=>t.redirected?await m(t):t};class O{constructor({cacheName:t,plugins:e=[],fallbackToNetwork:s=!0}={}){this.K=new Map,this.P=new Map,this.T=new Map,this.l=new E({cacheName:f(t),plugins:[...e,new g({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this.l}precache(t){this.addToCacheList(t),this.W||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this.W=!0)}addToCacheList(t){const e=[];for(const n of t){"string"==typeof n?e.push(n):n&&void 0===n.revision&&e.push(n.url);const{cacheKey:t,url:i}=p(n),r="string"!=typeof n&&n.revision?"reload":"default";if(this.K.has(i)&&this.K.get(i)!==t)throw new s("add-to-cache-list-conflicting-entries",{firstEntry:this.K.get(i),secondEntry:t});if("string"!=typeof n&&n.integrity){if(this.T.has(t)&&this.T.get(t)!==n.integrity)throw new s("add-to-cache-list-conflicting-integrities",{url:i});this.T.set(t,n.integrity)}if(this.K.set(i,t),this.P.set(i,r),e.length>0){const t=`Workbox is precaching URLs without revision info: ${e.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(t)}}}install(t){return d(t,(async()=>{const e=new y;this.strategy.plugins.push(e);for(const[e,s]of this.K){const n=this.T.get(s),i=this.P.get(e),r=new Request(e,{integrity:n,cache:i,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:r,event:t}))}const{updatedURLs:s,notUpdatedURLs:n}=e;return{updatedURLs:s,notUpdatedURLs:n}}))}activate(t){return d(t,(async()=>{const t=await self.caches.open(this.strategy.cacheName),e=await t.keys(),s=new Set(this.K.values()),n=[];for(const i of e)s.has(i.url)||(await t.delete(i),n.push(i.url));return{deletedURLs:n}}))}getURLsToCacheKeys(){return this.K}getCachedURLs(){return[...this.K.keys()]}getCacheKeyForURL(t){const e=new URL(t,location.href);return this.K.get(e.href)}getIntegrityForCacheKey(t){return this.T.get(t)}async matchPrecache(t){const e=t instanceof Request?t.url:t,s=this.getCacheKeyForURL(e);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(t){const e=this.getCacheKeyForURL(t);if(!e)throw new s("non-precached-url",{url:t});return s=>(s.request=new Request(t),s.params=Object.assign({cacheKey:e},s.params),this.strategy.handle(s))}}let x;const N=()=>(x||(x=new O),x);class k extends i{constructor(t,e){super((({request:s})=>{const n=t.getURLsToCacheKeys();for(const i of function*(t,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:n=!0,urlManipulation:i}={}){const r=new URL(t,location.href);r.hash="",yield r.href;const o=function(t,e=[]){for(const s of[...t.searchParams.keys()])e.some((t=>t.test(s)))&&t.searchParams.delete(s);return t}(r,e);if(yield o.href,s&&o.pathname.endsWith("/")){const t=new URL(o.href);t.pathname+=s,yield t.href}if(n){const t=new URL(o.href);t.pathname+=".html",yield t.href}if(i){const t=i({url:r});for(const e of t)yield e.href}}(s.url,e)){const e=n.get(i);if(e){return{cacheKey:e,integrity:t.getIntegrityForCacheKey(e)}}}}),t.strategy)}}t.NavigationRoute=class extends i{constructor(t,{allowlist:e=[/./],denylist:s=[]}={}){super((t=>this.j(t)),t),this.M=e,this.S=s}j({url:t,request:e}){if(e&&"navigate"!==e.mode)return!1;const s=t.pathname+t.search;for(const t of this.S)if(t.test(s))return!1;return!!this.M.some((t=>t.test(s)))}},t.cleanupOutdatedCaches=function(){self.addEventListener("activate",(t=>{const e=f();t.waitUntil((async(t,e="-precache-")=>{const s=(await self.caches.keys()).filter((s=>s.includes(e)&&s.includes(self.registration.scope)&&s!==t));return await Promise.all(s.map((t=>self.caches.delete(t)))),s})(e).then((t=>{})))}))},t.clientsClaim=function(){self.addEventListener("activate",(()=>self.clients.claim()))},t.createHandlerBoundToURL=function(t){return N().createHandlerBoundToURL(t)},t.precacheAndRoute=function(t,e){!function(t){N().precache(t)}(t),function(t){const e=N();h(new k(e,t))}(e)},t.registerRoute=h}));