<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>开源 &#8211; 李辉 / Grey Li</title>
	<atom:link href="https://greyli.com/tag/%E5%BC%80%E6%BA%90/feed/" rel="self" type="application/rss+xml" />
	<link>https://greyli.com</link>
	<description>一个编程和写作爱好者的在线记事本</description>
	<lastBuildDate>Thu, 06 Nov 2025 11:36:11 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.26</generator>

<image>
	<url>https://greyli.com/wp-content/uploads/2025/03/avatar-500-compressed-144x144.jpg</url>
	<title>开源 &#8211; 李辉 / Grey Li</title>
	<link>https://greyli.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PyCon China 2023：濒危 Flask 扩展拯救计划</title>
		<link>https://greyli.com/pycon-china-2023-talk/</link>
		<comments>https://greyli.com/pycon-china-2023-talk/#comments</comments>
		<pubDate>Sun, 10 Dec 2023 15:17:28 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[计算机与编程]]></category>
		<category><![CDATA[Flask]]></category>
		<category><![CDATA[PyCon]]></category>
		<category><![CDATA[PyCon China]]></category>
		<category><![CDATA[PyCon China 2023]]></category>
		<category><![CDATA[开源]]></category>

		<guid isPermaLink="false">https://greyli.com/?p=5283</guid>
		<description><![CDATA[月初参加了 PyCon China 2023， 做了一个关于 Flask 扩展生态的演讲。不太算是技术分享，讲 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>月初参加了 <a href="https://cn.pycon.org/2023/">PyCon China 2023</a>， 做了一个关于 Flask 扩展生态的演讲。不太算是技术分享，讲故事为主。主要的契机是最近尝试把几个失去维护的 Flask 扩展通过各种方式「救」了回来，所以借此机会分享一下经验，也号召大家多多参与开源项目。</p>
<h2>演讲介绍</h2>
<p>看着一个又一个 Flask 扩展失去维护，不再兼容新版本的 Python 和 Flask，我们能做些什么？在这个演讲里，我会介绍最近我和一些被遗弃的 Flask 扩展打交道的经历，包括如何更新一个古老的 Python 开源项目，以及正在实施中的一个拯救计划。如果你来自其他开源社区，那么这里介绍的经验或许也会帮到你。</p>
<h2>录像和幻灯片</h2>
<ul>
<li>录像：<a href="https://www.youtube.com/watch?v=lkw9Rhjf6C8">YouTube</a> | <a href="https://www.bilibili.com/video/BV1Ac411q7qY">bilibili</a></li>
<li>幻灯片：<a href="https://greyli.com/slides/pyconchina2023">https://greyli.com/slides/pyconchina2023</a></li>
<li>演讲中提到的 Flask 扩展健康监控项目：<a href="https://github.com/greyli/flask-extension-status">https://github.com/greyli/flask-extension-status</a></li>
</ul>
<p>P.S. bilibili 认定金正恩的照片是违禁图片，留半秒都不行，最后只好贴了一只马在上面。浪费二十分钟。</p>
<h2>照片</h2>
<p><a href="https://greyli.com/wp-content/uploads/2023/12/flask-talk.jpg"><img class="aligncenter size-large wp-image-5284" src="https://greyli.com/wp-content/uploads/2023/12/flask-talk-1024x683.jpg" alt="" width="625" height="417" srcset="https://greyli.com/wp-content/uploads/2023/12/flask-talk-1024x683.jpg 1024w, https://greyli.com/wp-content/uploads/2023/12/flask-talk-150x100.jpg 150w, https://greyli.com/wp-content/uploads/2023/12/flask-talk-300x200.jpg 300w, https://greyli.com/wp-content/uploads/2023/12/flask-talk-624x416.jpg 624w" sizes="(max-width: 625px) 100vw, 625px" /></a> <a href="https://greyli.com/wp-content/uploads/2023/12/flask-talk2.jpg"><img class="aligncenter size-large wp-image-5285" src="https://greyli.com/wp-content/uploads/2023/12/flask-talk2-1024x683.jpg" alt="" width="625" height="417" srcset="https://greyli.com/wp-content/uploads/2023/12/flask-talk2-1024x683.jpg 1024w, https://greyli.com/wp-content/uploads/2023/12/flask-talk2-150x100.jpg 150w, https://greyli.com/wp-content/uploads/2023/12/flask-talk2-300x200.jpg 300w, https://greyli.com/wp-content/uploads/2023/12/flask-talk2-624x416.jpg 624w" sizes="(max-width: 625px) 100vw, 625px" /></a></p>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/pycon-china-2023-talk/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>代码厨房社区欢迎你</title>
		<link>https://greyli.com/codekitchen/</link>
		<comments>https://greyli.com/codekitchen/#respond</comments>
		<pubDate>Sat, 28 Oct 2023 15:14:46 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[计算机与编程]]></category>
		<category><![CDATA[代码厨房]]></category>
		<category><![CDATA[开源]]></category>
		<category><![CDATA[社区]]></category>
		<category><![CDATA[编程]]></category>

		<guid isPermaLink="false">https://greyli.com/?p=5225</guid>
		<description><![CDATA[代码厨房是一个面向编程和开源爱好者的社区。社区的主体是坐落在 codekitchen.community 的论 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://codekitchen.community">代码厨房</a>是一个面向编程和开源爱好者的社区。社区的主体是坐落在 <a href="http://codekitchen.community">codekitchen.community</a> 的论坛。这个论坛的前身是创建于 2019 年 1 月 11 日的 <a href="https://greyli.com/helloflask-forum/">HelloFlask 论坛</a>（HelloFlask discuss!），因为论坛服务器一直在海外颠沛流离，所以访问起来并不是很顺利。最近把论坛以及 628 位 <a href="https://codekitchen.community/badges/107/-">HelloFlask 原住民</a>一起搬家到了香港，改头换面变成代码厨房社区。</p>
<p>「代码厨房」最早是我创建的公众号的名字。同一时间注册了 daimachufang.com，想要在这个网站上放些什么已经不得而知。后来公众号一再改名，代码厨房已经不见。再一次想起来是在去年 10 月， 29 日心血来潮去参加中国开源年会的开源集市。作为现场唯一一个个人展位，我带去了两个项目。一个是方学园，另一个便是<a href="https://www.bilibili.com/video/BV1Me41197Cx/">代码厨房俱乐部</a>。</p>
<p><a href="https://greyli.com/wp-content/uploads/2023/10/helloflask.jpg"><img class="aligncenter size-large wp-image-5239" src="https://greyli.com/wp-content/uploads/2023/10/helloflask-1024x767.jpg" alt="" width="625" height="468" srcset="https://greyli.com/wp-content/uploads/2023/10/helloflask-1024x767.jpg 1024w, https://greyli.com/wp-content/uploads/2023/10/helloflask-150x112.jpg 150w, https://greyli.com/wp-content/uploads/2023/10/helloflask-300x225.jpg 300w, https://greyli.com/wp-content/uploads/2023/10/helloflask-624x467.jpg 624w" sizes="(max-width: 625px) 100vw, 625px" /></a></p>
<p>出发前一天为代码厨房俱乐部更新了 daimachufang.com（<a href="https://daimachufang.greyli.com/">存档页面</a>），也就是下面的样子：</p>
<p><a href="https://greyli.com/wp-content/uploads/2023/10/daimachufang.png"><img class="aligncenter size-large wp-image-5235" src="https://greyli.com/wp-content/uploads/2023/10/daimachufang-1024x479.png" alt="" width="625" height="292" srcset="https://greyli.com/wp-content/uploads/2023/10/daimachufang-1024x479.png 1024w, https://greyli.com/wp-content/uploads/2023/10/daimachufang-150x70.png 150w, https://greyli.com/wp-content/uploads/2023/10/daimachufang-300x140.png 300w, https://greyli.com/wp-content/uploads/2023/10/daimachufang-624x292.png 624w" sizes="(max-width: 625px) 100vw, 625px" /></a></p>
<p>俱乐部现场成立，现场报名。报名单上收集了十个人，最后筛选到五个。算上我自己，六个人在一年内完成了四次聚会。大家互相带来很多新想法和思考，也玩得很开心，但逐渐有点忘记最初想要做什么。于是，在 2023 年的 10 月 22 号，最后一次聚会，大家回到了报名的地方——微软 Reactor。我在那里重新介绍了<a href="https://www.bilibili.com/video/BV1cM41197s1">代码厨房社区的构想</a>。</p>
<p>代码厨房的核心构想是「一个让人快乐和放松的编程社区」，主要的板块是：</p>
<ul>
<li><a href="https://codekitchen.community/c/steak-overcooked/33">Steak Overcooked</a>：牛排煎糊了？把菜谱贴上来问问大家怎么办才好</li>
<li><a href="https://codekitchen.community/c/events/29">活动</a>：以爱好而不是商业目的出发的线上或线下活动</li>
<li><a href="https://codekitchen.community/c/song/l/latest?board=default">开源松</a>：大家一起来做开源项目，推动一些项目的发展</li>
</ul>
<p><a href="https://greyli.com/wp-content/uploads/2023/10/cokekitchen.png"><img class="aligncenter wp-image-5227 size-large" src="https://greyli.com/wp-content/uploads/2023/10/cokekitchen-1024x610.png" alt="" width="625" height="372" srcset="https://greyli.com/wp-content/uploads/2023/10/cokekitchen-1024x610.png 1024w, https://greyli.com/wp-content/uploads/2023/10/cokekitchen-150x89.png 150w, https://greyli.com/wp-content/uploads/2023/10/cokekitchen-300x179.png 300w, https://greyli.com/wp-content/uploads/2023/10/cokekitchen-624x371.png 624w" sizes="(max-width: 625px) 100vw, 625px" /></a></p>
<p>不论你是当下、曾经还是未来的编程爱好者，都可以加入我们。<a href="https://codekitchen.community/">代码厨房</a>欢迎你！</p>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/codekitchen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>来 COSCon 2022 开源集市一起开发元宇宙</title>
		<link>https://greyli.com/coscon-2022-metaverse/</link>
		<comments>https://greyli.com/coscon-2022-metaverse/#respond</comments>
		<pubDate>Wed, 26 Oct 2022 15:49:20 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[活动与游记]]></category>
		<category><![CDATA[计算机与编程]]></category>
		<category><![CDATA[COSCon]]></category>
		<category><![CDATA[COSCon 2022]]></category>
		<category><![CDATA[HelloFlask]]></category>
		<category><![CDATA[中国开源年会]]></category>
		<category><![CDATA[元宇宙]]></category>
		<category><![CDATA[开源]]></category>
		<category><![CDATA[开源集市]]></category>

		<guid isPermaLink="false">https://greyli.com/?p=4602</guid>
		<description><![CDATA[今年的 COSCon 2022 上海线下会场（10/29）有很多开源相关的活动，其中开源集市会有很多开源社区/ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>今年的 COSCon 2022 上海线下会场（10/29）有很多开源相关的活动，其中开源集市会有很多开源社区/公司的摊位，每个摊位都可以做任务拿奖品（放心，不是点 star 送周边那种）。看到现场有好几个元宇宙相关的活动，我就想，要不用 Flask 开发一个元宇宙程序吧……所以，在 HelloFlask 摊位，我们会一起开发一个叫做<a href="https://github.com/greyli/fangschool">方学园</a>的程序。这是一个虚拟校园，每个人都是一个方块，可以为自己设置不同的颜色和边框圆角。学校里的建筑也都是方块，类似这样：</p>
<p><a href="https://greyli.com/wp-content/uploads/2022/10/fangschool.png"><img class="aligncenter size-large wp-image-4607" src="https://greyli.com/wp-content/uploads/2022/10/fangschool-1024x540.png" alt="" width="625" height="330" srcset="https://greyli.com/wp-content/uploads/2022/10/fangschool-1024x540.png 1024w, https://greyli.com/wp-content/uploads/2022/10/fangschool-150x79.png 150w, https://greyli.com/wp-content/uploads/2022/10/fangschool-300x158.png 300w, https://greyli.com/wp-content/uploads/2022/10/fangschool-624x329.png 624w" sizes="(max-width: 625px) 100vw, 625px" /></a></p>
<p>虽然这个项目还在很早期的阶段（突然心血来潮，然后刚买了域名的那个阶段），但我想这大概就是元宇宙，对吧？</p>
<p>我准备的奖品有几本书和一些 Flask 贴纸。趁 Flask 还没换上新 logo（嘘，内部机密），这次要把剩下的所有贴纸都送掉。</p>
<p>如果你有自己的开源项目，也可以来这里做分享，或是放到 HelloFlask 摊位来吸引别人参与。</p>
<p>感兴趣的话，用下面的链接报名活动吧（免费）：</p>
<ul>
<li>活动报名：<a href="https://www.bagevent.com/event/8322865">https://www.bagevent.com/event/8322865</a></li>
<li>详细活动介绍：<a href="https://mp.weixin.qq.com/s/S1UL9TkVd_BwH8ZoypoRpQ">https://mp.weixin.qq.com/s/S1UL9TkVd_BwH8ZoypoRpQ</a></li>
</ul>
<p>下面是一个 HelloFlask x COSCon 2022 微信群聊，欢迎想来参会的朋友加入：</p>
<p><a href="https://greyli.com/wp-content/uploads/2022/10/coscon-wechat-group.png"><img class="wp-image-4608  aligncenter" src="https://greyli.com/wp-content/uploads/2022/10/coscon-wechat-group-297x300.png" alt="" width="235" height="237" srcset="https://greyli.com/wp-content/uploads/2022/10/coscon-wechat-group-297x300.png 297w, https://greyli.com/wp-content/uploads/2022/10/coscon-wechat-group-150x150.png 150w, https://greyli.com/wp-content/uploads/2022/10/coscon-wechat-group-1014x1024.png 1014w, https://greyli.com/wp-content/uploads/2022/10/coscon-wechat-group-144x144.png 144w, https://greyli.com/wp-content/uploads/2022/10/coscon-wechat-group-624x630.png 624w, https://greyli.com/wp-content/uploads/2022/10/coscon-wechat-group.png 1246w" sizes="(max-width: 235px) 100vw, 235px" /></a>周六见！</p>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/coscon-2022-metaverse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>和捕蛇者说聊聊 Flask 2.0</title>
		<link>https://greyli.com/flask-talk/</link>
		<comments>https://greyli.com/flask-talk/#respond</comments>
		<pubDate>Fri, 16 Jul 2021 13:47:40 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[计算机与编程]]></category>
		<category><![CDATA[Flask]]></category>
		<category><![CDATA[开源]]></category>
		<category><![CDATA[捕蛇者说播客]]></category>
		<category><![CDATA[播客]]></category>

		<guid isPermaLink="false">https://greyli.com/?p=3847</guid>
		<description><![CDATA[六月初，应 laike9m 邀请做客捕蛇者说录了一期播客。今天中午发布了上半部分：Ep 30. 和李辉聊聊 F [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>六月初，应 <a href="https://laike9m.com/">laike9m</a> 邀请做客<a href="https://pythonhunter.org/">捕蛇者说</a>录了一期播客。今天中午发布了上半部分：<a href="https://pythonhunter.org/episodes/ep30">Ep 30. 和李辉聊聊 Flask 2.0</a>，关于自由职业的下半部分正在剪辑中，预计八月初发布。</p>
<p>这是我第一次录播客。录制那一天，房间里还没有装空调，而开风扇会导致风声录进去，我只能用静静降温法；为了防止录进邻居打骂孩子的声音，我又把门窗闭紧，所以录到临近中午，感觉越来越热。一开始还有点紧张和兴奋，但是我从来没有和别人聊过两小时那么久，录到后面，我就像漏气的气球一样，慢慢瘪了下去。</p>
<p>七月初拿到剪好的第一期，觉得可以再优化一下，所以就自告奋勇再剪一遍。花了接近十个小时，剪掉了很多「呃」、「嗯」、「对」、「然后」、「所以」……在这个过程里也发现不少自己说话上的毛病。</p>
<p>这一期上半部分聊了我从学习 Flask 到成为维护者的经历，这些在 <a href="http://greyli.com/my-talk-at-coscup-2019/">19 年的 COSCUP 演讲</a>简单介绍过。下半部分关于自由职业本来有不少内容想聊，但是因为说太多话有点累，所以有一些漏掉的话题就没有再提出来。录完的这些天有时会突然想到一些很有趣但忘记说的事情，偶尔还会想要不要再约着录一个补丁，也计划着写文章作补充。另外这一期虽然聊到了 FastAPI，但我对它了解并不多，如果有机会的话，以后还想再录一期详细聊聊 FastAPI 和 APIFlask，或是再聊一聊技术写作、翻译和演讲。</p>
<p>最后，如果你用过 Flask，欢迎来填写这个 <a href="https://jinshuju.net/f/UY6Rd8">Flask 用户调查问卷</a>。关于捕蛇者说播客的更多信息，可以访问它的<a href="https://pythonhunter.org/">主页</a>和 <a href="https://twitter.com/pythonhunter__">Twitter</a> 了解。</p>
<p>下期：<a href="https://greyli.com/freelance-talk/">和捕蛇者说聊聊自由职业</a></p>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/flask-talk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>超链接跳转费</title>
		<link>https://greyli.com/hyperlink-fee/</link>
		<comments>https://greyli.com/hyperlink-fee/#comments</comments>
		<pubDate>Tue, 28 Jul 2020 03:52:58 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[思考与随感]]></category>
		<category><![CDATA[审查]]></category>
		<category><![CDATA[开源]]></category>
		<category><![CDATA[微信公众号]]></category>
		<category><![CDATA[新浪微博]]></category>
		<category><![CDATA[超链接]]></category>

		<guid isPermaLink="false">https://greyli.com/?p=3308</guid>
		<description><![CDATA[昨天有人给《Flask 入门教程》书稿源码提交了一个 PR，主要的修改是在书中的链接前后添加了空格。比如： 首 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>昨天有人给《<a href="http://helloflask.com/tutorial/" target="_blank" rel="noopener">Flask 入门教程</a>》书稿源码提交了一个 <a href="https://github.com/greyli/flask-tutorial/pull/11" target="_blank" rel="noopener">PR</a>，主要的修改是在书中的链接前后添加了空格。比如：</p>
<ul>
<li>首先要注册一个 GitHub 账户，点击访问<span class="pl-e"><a href="https://github.com/join" target="_blank" rel="noopener">注册页面</a>并</span>根据指示完成注册流程。登录备用。</li>
</ul>
<p>改成了：</p>
<ul>
<li>首先要注册一个 GitHub 账户，点击访问 <span class="pl-e"><a href="https://github.com/join" target="_blank" rel="noopener">注册页面</a> 并</span>根据指示完成注册流程。登录备用。</li>
</ul>
<p>我一直对这个排版风格持观望态度。如果合并的话，那就要在以后的书稿更新甚至所有网络写作中保持这个习惯，再三考虑之下，我还是决定暂不这样做。最主要的考虑是添加空格会影响阅读体验，好像本来平淡无奇的超链接突然自带聚光灯。一来在观感上突兀，二来会影响阅读的流畅感（大多数情况下链接文字本身也是句子的一部分）。</p>
<p>不过话说回来，超链接也该被拎出来亮一亮了，因为超链接在国内的网络环境里一直处于被打压和控制的状态：微信公众号不允许插入超链接，<a href="https://www.weibo.com/1934183965/JaeVFpZpt" target="_blank" rel="noopener">新浪微博</a>从下个月起要停止把 URL 解析成超链接（只为白名单内的政府、公司等网站提供链接渲染服务），而知乎也曾<a href="https://zhuanlan.zhihu.com/p/59345700" target="_blank" rel="noopener">悄悄停止</a>把用户主页一句话介绍里的 URL 解析成超链接。在网络世界里，<a href="https://en.wikipedia.org/wiki/Hyperlink">超链接</a>是再平常不过的东西。但这些公司却把互联网的基础设施垄断、控制起来进行牟利、打压竞争对手以及用来把用户尽可能的圈在平台内。</p>
<p>我在想，新浪微博之类的平台在以后也许可以尝试收超链接费或是超链接跳转费（比如推出一个超链接套餐，100 块钱可以发 50 个链接），然后再按照点击量收取超链接点击费或是超链接流量费。听起来就像是政府要征收空气税和重力税……</p>
<p>除了不被渲染为超链接，有时在手机上访问超链接也要跨过千难万险。如果你在微信上打开一个超链接，你首先要跟 GFW 打声招呼，接着或许还会被网络运营商搜身，最后才会经过微信的审查。如果微信发现你要打开的是淘宝之类竞争对手的网址，或是它「自己认为」危险的不适合访问的网址，你就只能通过长按复制网址的方式用浏览器打开。如果你很不幸安装的是国产浏览器的话，那恭喜你还要再面临一层国产浏览器厂商的审查。</p>
<p>想让你的网站被渲染成超链接并且可以被正常访问？好，那就申报，登记，填表，备案吧。</p>
<p>也许未来会有很多人忘记为什么网页上一段文字里某些文字会是蓝色和下划线样式。</p>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/hyperlink-fee/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>比修 Typo 还简单的开源贡献方式</title>
		<link>https://greyli.com/better-than-typo-fix/</link>
		<comments>https://greyli.com/better-than-typo-fix/#comments</comments>
		<pubDate>Sun, 21 Jun 2020 12:25:45 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[思考与随感]]></category>
		<category><![CDATA[Flask]]></category>
		<category><![CDATA[WTForms]]></category>
		<category><![CDATA[开源]]></category>
		<category><![CDATA[开源贡献]]></category>
		<category><![CDATA[开源项目]]></category>

		<guid isPermaLink="false">https://greyli.com/?p=3124</guid>
		<description><![CDATA[最近给 WTForms 提交了一个 PR，这个 PR 向源码、测试和本地化文件里添加了 537 个句号。听起来 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="md-end-block md-p md-focus"><span class="md-plain">最近给 WTForms 提交了一个 <a href="https://github.com/wtforms/wtforms/pull/620">PR</a>，这个 PR 向源码、测试和本地化文件里添加了 537 个句号。听起来似乎很奇怪，为什么 WTForms 会需要增加 537 个句号？别着急，下面会慢慢解释（事实上我只完成了一部分的工作，还有大概 500 个句号需要添加）。我发现我似乎很喜欢提交这种 PR，这类开源贡献没有太多技术含量（基本就是体力活），但是能有效提高项目的整体完美度，让用户获得更一致和舒服的体验。下面是一些可以归到这一类开源贡献的 PR。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><strong><span class="md-plain">1. 给 WTForms 添加 537 个句号</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-link md-pair-s" spellcheck="false"><a href="https://github.com/wtforms/wtforms/pull/620">https://github.com/wtforms/wtforms/pull/620</a></span></p>
<p class="md-end-block md-p"><span class="md-plain">WTForms 从添加 CSRF 保护功能作为分界，之前定义的验证错误消息都包含结尾的句号，之后的错误消息都漏掉了句号。这会导致错误消息不一致（想象同一个表单显示两个输入框的错误消息，一个有句号，一个没有句号）。这个 PR 补齐了源码、测试、本地化文本（POT 和部分 PO 文件）中错误消息的句号，包括 506 个英文句号和 31 个中文句号。</span></p>
<p class="md-end-block md-p"><span class="md-plain">本地化文件在翻译时大都按照源文本决定是否添加句号，所以也存在错误消息不一致的问题。因为精力有限，在 32 个本地化文件里，我只更新了简体中文、繁体中文、日文、德文和俄文。大概还有</span><span class="md-meta-i-c md-link"><a spellcheck="false" href="https://github.com/wtforms/wtforms/tree/master/src/wtforms/locale"><span class="md-plain">二十几个本地化文件</span></a></span><span class="md-plain">需要进行确认和更新，如果感兴趣的话，你可以考虑去做这件事。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><strong><span class="md-plain">2. 给 Flask 添加 96 个美元符号</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-link md-pair-s" spellcheck="false"><a href="https://github.com/pallets/flask/pull/2877">https://github.com/pallets/flask/pull/2877</a></span></p>
<p class="md-end-block md-p"><span class="md-plain">Flask 文档、和各类 README.md 文件里对于命令行命令的标识很混乱，有时没有命令提示符，有时用「&gt;」，有时用「$」，有时用「#」。这个 PR 统一了所有命令行命令，统一添加美元符号作为提示符，仅在需要明确区分 Windows 命令的几处使用「&gt;」。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><strong><span class="md-plain">3. 给 Flask 更换 13 个 URL</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-link md-pair-s" spellcheck="false"><a href="https://github.com/pallets/flask/pull/3427">https://github.com/pallets/flask/pull/3427</a></span></p>
<p class="md-end-block md-p"><span class="md-plain">Flask 去年陆续把文档迁移到了 palletsprojects.com 域名下， 访问旧的 pocoo.org 会进行跳转，这个 PR 更新了所有文档和源码里的旧 URL。</span></p>
<p><span class="md-pair-s"><strong><span class="md-plain">4. 给 <span class="md-meta-i-c md-link">PyCon China</span> 和 <span class="md-meta-i-c md-link">FlaskCon</span> 压缩 119 张图片</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">除此之外，勉强能沾上边的还有给 </span><span class="md-meta-i-c md-link"><a spellcheck="false" href="https://cn.pycon.org"><span class="md-plain">PyCon China</span></a></span><span class="md-plain"> 和 </span><span class="md-meta-i-c md-link"><a spellcheck="false" href="https://flaskcon.com"><span class="md-plain">FlaskCon</span></a></span><span class="md-plain"> 的网站分别压缩了 105 和 14 张图片。因为缺乏规范，有些技术大会的网站图片在上传之前没有经过压缩和裁剪，这会让页面加载变得非常慢。这两个 PR（</span><span class="md-meta-i-c md-link"><a spellcheck="false" href="https://github.com/PyConChina/PyConChina2019/pull/3"><span class="md-plain">PyConChina #3</span></a></span><span class="md-plain">，</span><span class="md-meta-i-c md-link"><a spellcheck="false" href="https://github.com/FlaskCon/website/pull/7"><span class="md-plain">FlaskCon #7</span></a></span><span class="md-plain">）分别让两个网站的图片总大小从 25M 和 4M 降低到 5M 和 967KB。</span></p>
<p class="md-end-block md-p"><span class="md-plain">给文档修 typo 是很常见的开源贡献类型，这也是很多人一开始参与开源的方式。有人甚至会走火入魔最后变成专业的「开源 typo 修复专家」，不停的用英文语法检查工具去检查每一个流行的开源项目文档……相比之下，上面这一类 PR 要比修 typo 更简单（在智力上），有时也更有价值。</span></p>
<p class="md-end-block md-p"><span class="md-plain">我发现相对于技术实现，我其实更关注 API 设计和用户体验，总想要尽可能的追求设计的一致和美观。这也导致我会在写作和编程时花费大量时间在命名、文件组织、措辞、章节安排、排版、文案和彩蛋这些事情上。这大概就是我编程水平进步缓慢、写作速度缓慢的原因。</span></p>
<p class="md-end-block md-p"><span class="md-plain">P.S. 文中的数字都是估算，大概会有 1~5 左右的偏差。精确的数字是为了让措辞看起来更一致和美观瞎编的。</span></p>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/better-than-typo-fix/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>COSCon 2019：一个野生程序员的开源故事</title>
		<link>https://greyli.com/coscon-2019-talk/</link>
		<comments>https://greyli.com/coscon-2019-talk/#comments</comments>
		<pubDate>Mon, 28 Oct 2019 05:15:19 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[演讲和教程]]></category>
		<category><![CDATA[COSCon]]></category>
		<category><![CDATA[中国开源年会]]></category>
		<category><![CDATA[开源]]></category>
		<category><![CDATA[演讲]]></category>

		<guid isPermaLink="false">http://greyli.com/?p=2588</guid>
		<description><![CDATA[演讲录像： 幻灯片： 幻灯片源码： 开源英语手册：https://github.com/greyli/osen [&#8230;]]]></description>
				<content:encoded><![CDATA[<ul>
<li>演讲录像：</li>
<li>幻灯片：</li>
<li>幻灯片源码：</li>
<li>开源英语手册：<a href="https://github.com/greyli/osenglish">https://github.com/greyli/osenglish</a></li>
<li>准备时长：23h 49m</li>
<li>Note：</li>
</ul>
<p>这是在 <a href="https://kaiyuanshe.cn/activity/summit/coscon-2019/">COSCon</a>（中国开源年会）2019 上海 11 月 2 号分会场 1（开源社区与项目） 下午 2:20 开始的演讲《一个野生程序员的开源故事》的介绍和相关信息。</p>
<p>和标题透露的信息一样，这不是一个严肃的演讲（虽然 COSCon 看起来是一个很严肃的大会）。这是今年的最后一个演讲，明年不会弄那么多了，太累了……</p>
<p>购票和日程：<a href="https://www.bagevent.com/event/5744455">https://www.bagevent.com/event/5744455</a></p>
<p><img class="alignnone size-large wp-image-2596" src="http://greyli.com/wp-content/uploads/2019/10/coscon-change-mini-1024x965.jpg" alt="" width="625" height="589" srcset="https://greyli.com/wp-content/uploads/2019/10/coscon-change-mini-1024x965.jpg 1024w, https://greyli.com/wp-content/uploads/2019/10/coscon-change-mini-150x141.jpg 150w, https://greyli.com/wp-content/uploads/2019/10/coscon-change-mini-300x283.jpg 300w, https://greyli.com/wp-content/uploads/2019/10/coscon-change-mini-624x588.jpg 624w" sizes="(max-width: 625px) 100vw, 625px" /></p>
<h2>标题</h2>
<p>一个野生程序员的开源故事</p>
<h2>介绍</h2>
<p>介绍其实可以忽略，因为根据前几次的演讲经验，演讲内容通常都会和简介有很多出入（跑题）。下面是简介：</p>
<p>2016 年，李辉开始学习 Flask。两年后，他加入了 Flask 开发团队。这中间发生了什么？其中大量的开源贡献起到了什么样的作用？参与开源对编程能力提高、个人品牌建设甚至是求职有哪些帮助？在本议题中，这些问题将会一一得到解答，你还会了解到如何踏出开源贡献的第一步，并且学到一些小技巧，比如参与开源涉及的英语和 Git 问题。</p>
<p>面向的听众：编程初学者，编程爱好者，程序员等想要参与开源的人。</p>
<h2>总结</h2>
<p>待补充</p>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/coscon-2019-talk/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>写作一本技术书，能给一个社区带来哪些改变？</title>
		<link>https://greyli.com/what-flask-book-bring-to-the-community/</link>
		<comments>https://greyli.com/what-flask-book-bring-to-the-community/#respond</comments>
		<pubDate>Tue, 23 Oct 2018 03:13:20 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[思考与随感]]></category>
		<category><![CDATA[计算机与编程]]></category>
		<category><![CDATA[Flask Web开发实战]]></category>
		<category><![CDATA[开源]]></category>

		<guid isPermaLink="false">http://greyli.com/?p=1964</guid>
		<description><![CDATA[写作《Flask Web开发实战》花费了一年多的时间，在这期间，除了编写5个项目实例和写作外，我还花了一部分时 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p data-offset-key="9pao3-0-0">写作<a href="https://zhuanlan.zhihu.com/p/29907260" data-za-detail-view-id="1043">《Flask Web开发实战》</a>花费了一年多的时间，在这期间，除了编写5个项目实例和写作外，我还花了一部分时间来和书中涉及的Python库（主要是Flask扩展）打交道。这篇文章总结了这本书的写作给整个Flask社区带来的一些改变。</p>
<h2>国内第一本Flask书</h2>
<p>虽然国内已经有几本书介绍过Flask，但都是顺便介绍，而不是真正意义上的Flask书。因此，这本书可以说是国内第一本Flask书，很高兴能为国内的Flask社区带来这样一本书。希望这本书能够推动更多人了解和使用Flask，进而为社区贡献更多的力量。</p>
<h2>完善多个开源项目</h2>
<p>在实际介绍和使用某个库时，总会遇到各种各样的问题，主要有两类：</p>
<ul>
<li>Bug</li>
<li>不完善的用法或实现</li>
</ul>
<p>Bug不用多说，肯定要处理。对于不完善的用法和实现，如果沿用原来的代码，一来不容易读者理解，二来还需要在书中加进很多不必要的内容。所以，我更倾向于让这些代码变得更好一点。</p>
<p>如果把不完善的实现写到书里，我会觉得非常不舒服。比如说，WTForms本身是支持设置内置的错误消息的语言的，我们可以设为中文，而不用手动写错误消息。但是在Flask-WTF中，因为内部重写了相关方法，导致没法在不使用Flask-Babel的情况下使用内置的翻译。问题来了：如果在第4章介绍Flask-Babel和i18n等相关概念的话，这显然需要占据大量篇幅，并不合适，而且这部分内容已经计划加入到第10章。</p>
<p>为此，书的安排没法改动，那么只好调整Flask-WTF的内部实现，所以就有了<a href="https://link.zhihu.com/?target=https%3A//github.com/lepture/flask-wtf/pull/316" target="_blank" rel="nofollow noopener noreferrer" data-za-detail-view-id="1043">这个PR</a>。类似的情况还有很多，比如Firefox支持headless模式后，Selenium中却没有提供和Chrome相同的导入接口；Flask-OAuthlib中，传入access令牌只能使用元组或字典类型，而不能使用更直观的字符串变量传入……</p>
<p>下面是一些写作期间提交的开源贡献：</p>
<ul data-offset-key="f2pan-0-0">
<li data-block="true" data-editor="8vna5" data-offset-key="f2pan-0-0">
<div data-offset-key="f2pan-0-0">GitHub-Flask: <a href="https://github.com/cenkalti/github-flask/pull/45" target="_blank" rel="noopener" data-offset-key="f2pan-1-0" data-editable="true">Support API endpoint with a leading slash</a></div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="8n6kl-0-0">
<div data-offset-key="8n6kl-0-0">Flask-OAuthlib: <a href="https://github.com/lepture/flask-oauthlib/pull/358" target="_blank" rel="noopener" data-offset-key="8n6kl-1-0" data-editable="true">Add support for string type token</a></div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="2874o-0-0">
<div data-offset-key="2874o-0-0">Selenium: <a href="https://github.com/SeleniumHQ/selenium/pull/5120" target="_blank" rel="noopener" data-offset-key="2874o-1-0" data-editable="true">Add import statement for FirefoxOptions</a></div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="6mjhd-0-0">
<div data-offset-key="6mjhd-0-0">Authlib: <a href="https://github.com/lepture/authlib/pull/3" target="_blank" rel="noopener" data-offset-key="6mjhd-1-0" data-editable="true">add google_fetch_user function</a></div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="53qeu-0-0">
<div data-offset-key="53qeu-0-0">Flask-SocketIO: <a href="https://github.com/miguelgrinberg/Flask-SocketIO/pull/587" target="_blank" rel="noopener" data-offset-key="53qeu-1-0" data-editable="true">Add missing json argument in send() function</a></div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="5am68-0-0">
<div data-offset-key="5am68-0-0">Flask-OAuthlib：<a href="https://github.com/lepture/flask-oauthlib/pull/358" target="_blank" rel="noopener" data-offset-key="5am68-1-0" data-editable="true">Add support for string type token</a></div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="3ttdq-0-0">
<div data-offset-key="3ttdq-0-0">OAuthlib: <a href="https://github.com/oauthlib/oauthlib/pull/500" target="_blank" rel="noopener" data-offset-key="3ttdq-1-0" data-editable="true">Check access token in self.token dict</a></div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="7s3q2-0-0">
<div data-offset-key="7s3q2-0-0">Flask-Moment: <a href="https://github.com/miguelgrinberg/Flask-Moment/pull/33" target="_blank" rel="noopener" data-offset-key="7s3q2-1-0" data-editable="true">Add auto-detect locale support</a></div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="99aq9-0-0">
<div data-offset-key="99aq9-0-0">Flask-Whooshee：<a href="https://github.com/bkabrda/flask-whooshee/pull/45" target="_blank" rel="noopener" data-offset-key="99aq9-1-0" data-editable="true">Fix unicode decode error on Python2</a></div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="bp8c0-0-0">
<div data-offset-key="bp8c0-0-0">Pipenv: <a href="https://github.com/pypa/pipenv/pull/2215" target="_blank" rel="noopener" data-offset-key="bp8c0-1-0" data-editable="true">Add tips for Supervisor user</a></div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="bn96i-0-0">
<div data-offset-key="bn96i-0-0">Flask-WTF: <a href="https://github.com/lepture/flask-wtf/pull/316" target="_blank" rel="noopener" data-offset-key="bn96i-1-0" data-editable="true">Add support to change message language</a></div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="6imj6-0-0">
<div data-offset-key="6imj6-0-0">Werkzeug：<a href="https://github.com/pallets/werkzeug/pull/1320" target="_blank" rel="noopener" data-offset-key="6imj6-1-0" data-editable="true">Reloader: Force the key of environment variable into string type</a></div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="8bnlf-0-0">
<div data-offset-key="8bnlf-0-0">Flask: <a href="https://github.com/pallets/flask/pulls?q=is%3Apr+author%3Agreyli+is%3Aclosed" target="_blank" rel="noopener" data-offset-key="8bnlf-1-0" data-editable="true">19 merged PRs, mostly are documentation fix</a></div>
</li>
</ul>
<div data-block="true" data-editor="8vna5" data-offset-key="27h7k-0-0">
<div data-offset-key="27h7k-0-0">当然，如果加上其他没有太大意义的文档更新，这个列表还可以更长。</div>
<div data-offset-key="27h7k-0-0"> </div>
</div>
<div data-block="true" data-editor="8vna5" data-offset-key="1at9u-0-0">
<div data-offset-key="1at9u-0-0">值得特别说明的是Werkzeug的这个PR，这个PR对应的bug困扰了我很长一段时间。一开始我把问题归咎到python-dotenv身上，还创建了一个PR（<a href="https://github.com/theskumar/python-dotenv/pull/101" target="_blank" rel="noopener" data-offset-key="1at9u-1-0" data-editable="true">#101</a>），但是维护者迟迟没有回复。后来再次研究，发现可以直接在Werkzeug内部解决，于是创建了<a href="https://github.com/pallets/werkzeug/pull/1320" target="_blank" rel="noopener" data-offset-key="1at9u-3-0" data-editable="true">#1320</a>，然后被lepture用更好的实现取代了（<a href="https://github.com/pallets/werkzeug/pull/1321" target="_blank" rel="noopener" data-offset-key="1at9u-5-0" data-editable="true">#1321</a>）。不过，在python-dotenv创建的那个PR倒是促成了Pipenv的这个PR（<a href="https://github.com/pypa/pipenv/pull/2386" target="_blank" rel="noopener" data-offset-key="1at9u-7-0" data-editable="true">#2386</a>）。</div>
</div>
<h2>推动发布新的版本</h2>
<p>除了让PR被合并，还要让这些项目发布新的release，这样才能在项目源码公开后，让读者可以正常使用。在我的推动下，Flask-OAuthlib、Flask-Whooshee和Flask-Moment都发布了新的版本。</p>
<p>其他的项目，除了Werkzeug以外，大部分都在整个写作的时间跨度发布了新的版本。尤其重要的是Flask的1.0版本。从书一开始写作，我就直接采用了主分支的代码，书中我直接将版本号写为0.13。如果Flask迟迟不发布新版本，那我会陷入一个很尴尬的境地：要么大胆采用主分支代码，但是可能会出现变动，导致书中的内容不可靠；要么采用旧版本，那书出版后可能会很快面临过时的危险。还好，在写作接近尾声的4月末，新版本1.0发布了。</p>
<h2>4个Flask扩展</h2>
<p>用于集成Bootstrap的扩展Flask-Bootstrap目前的维护状态很糟糕：上一次release是17年1月，上一次合并commit是17年3月，而且已经很长时间不再处理PR和Issue。</p>
<p>原项目还存在很多问题：Jinja语法不标准、内置基模板引入不必要的复杂度、分页宏不支持传入URL片段值。除此之外，让我决定写新的扩展替代它的最主要原因是因为它不支持Bootstrap 4，而我不能接受在书中引入一个这样过时的项目。</p>
<p>为了解决这些问题，只好写了<a href="https://github.com/greyli/bootstrap-flask" target="_blank" rel="nofollow noopener noreferrer" data-za-detail-view-id="1043">Bootstrap-Flask</a>。最终决定写替代扩展的时候，书已经完成了三分之二，大量旧的内容和源码都要改写。把书稿和源码从Flask-Bootstrap和Bootstrap3迁移到Bootstrap-Flask和Bootstrap4是一个非常痛苦的过程，到现在还记忆犹新……</p>
<p>对于某些空白的领域，我写了三个扩展来简化集成操作：</p>
<ul data-offset-key="8o4a-0-0">
<li data-block="true" data-editor="8vna5" data-offset-key="8o4a-0-0">
<div data-offset-key="8o4a-0-0"><a href="https://github.com/greyli/flask-avatars" target="_blank" rel="noopener" data-offset-key="8o4a-0-0" data-editable="true">Flask-Avatars</a>：头像处理</div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="1i43i-0-0">
<div data-offset-key="1i43i-0-0"><a href="https://github.com/greyli/flask-dropzone" target="_blank" rel="noopener" data-offset-key="1i43i-0-0" data-editable="true">Flask-Dropzone</a>：集成Dropzone.js，提供文件上传的客户端处理</div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="65kth-0-0">
<div data-offset-key="65kth-0-0"><a href="https://github.com/greyli/flask-ckeditor" target="_blank" rel="noopener" data-offset-key="65kth-0-0" data-editable="true">Flask-CKEditor</a>：集成富文本编辑器CKEditor</div>
</li>
</ul>
<h2>5个Flask开源项目</h2>
<p>在此之前，完善的Flask开源项目屈指可数，除了Flask官方提供的两个示例程序外，就只有Miguel Grinberg的两个程序。而这本书带来了5个相对比较完善、所有依赖都基于最新版本的开源项目（严格来说，第1个程序比较简单，可以排除在外）：</p>
<ul data-offset-key="1s9kf-0-0">
<li data-block="true" data-editor="8vna5" data-offset-key="1s9kf-0-0">
<div data-offset-key="1s9kf-0-0"><a href="https://github.com/greyli/sayhello" target="_blank" rel="noopener" data-offset-key="1s9kf-0-0" data-editable="true">SayHello</a>：留言板</div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="9o699-0-0">
<div data-offset-key="9o699-0-0"><a href="https://github.com/greyli/bluelog" target="_blank" rel="noopener" data-offset-key="9o699-0-0" data-editable="true">Bluelog</a>：个人博客</div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="2fc2v-0-0">
<div data-offset-key="2fc2v-0-0"><a href="https://github.com/greyli/albumy" target="_blank" rel="noopener" data-offset-key="2fc2v-0-0" data-editable="true">Albumy</a>：图片社交程序</div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="cac19-0-0">
<div data-offset-key="cac19-0-0"><a href="https://github.com/greyli/todoism" target="_blank" rel="noopener" data-offset-key="cac19-0-0" data-editable="true">Todoism</a>：待办事项</div>
</li>
<li data-block="true" data-editor="8vna5" data-offset-key="3ptu6-0-0">
<div data-offset-key="3ptu6-0-0"><a href="https://github.com/greyli/catchat" target="_blank" rel="noopener" data-offset-key="3ptu6-0-0" data-editable="true">CatChat</a>：聊天室</div>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/what-flask-book-bring-to-the-community/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>我加入了Pallets Projects开发团队</title>
		<link>https://greyli.com/i-joined-the-pallets-projects/</link>
		<comments>https://greyli.com/i-joined-the-pallets-projects/#comments</comments>
		<pubDate>Wed, 20 Jun 2018 02:32:53 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[思考与随感]]></category>
		<category><![CDATA[Pallets Project]]></category>
		<category><![CDATA[开源]]></category>

		<guid isPermaLink="false">http://greyli.com/?p=1478</guid>
		<description><![CDATA[今天早晨起来检查收件箱，收到了David Lord（Flask核心维护者）的邮件，他同意了我的申请——前段时间 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>今天早晨起来检查收件箱，收到了<a href="http://davidism.com">David Lord</a>（Flask核心维护者）的邮件，他同意了我的申请——前段时间邀请他为我的新书<a href="http://greyli.com/flask-web-development/">《Flask Web开发实战》</a>写推荐语，同时申请加入<a href="http://palletsprojects.com">Pallets Projects</a>开发团队（Pallets Team）。</p>
<h2>Pallets Projects是什么？</h2>
<p>简单来说，Pallets Projects就是“Flask项目集合”，为了更好的管理Flask相关项目而由Pocoo分化而来。它同时也是一个<a href="https://github.com/pallets">GitHub Organization</a>，包括了所有Flask相关的项目，比如Flask、Werkzeug、Jinja、Click等等。</p>
<h2>这意味着什么？</h2>
<p>这意味着我对于Flask项目拥有更多的操作权限，可以更好的向Flask贡献代码，并且可以帮助处理Issue和Pull Request。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/i-joined-the-pallets-projects/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
