每周分享第4期

Docker 终端UI: https://github.com/jesseduffield/lazydocker 宝数据库内核月报:http://mysql.taobao.org/monthly/ 比较深入的数据库源码分析 手机号码归属地查询:https://apis-mp.gusibi.mobi/mobile/location?mobile=18512345678 使用serverless部署,无需服务器。源码地址:https://github.com/gusibi/oneplus/tree/master/mobile-attribution 手绘风格CSS:https://www.getpapercss.com/ Image-to-Image Demo: https://affinelayer.com/pixsrv/ 学霸用左边,学渣用右边:https://www.plainlanguage.gov/guidelines/words/use-simple-words-phrases/ 美国政府的一个网页,有几百条单词建议,指导你怎么写出简单的文章,不要用复杂的单词。 比如说,“a和b可以同时使用,也可以单独使用”,不要用 a and/or b,而要用 a or b or both。 微软上线了一套 Python 教程《Develop with Python on Windows》 微软上线了一套 Python 教程《Develop with Python on Windows》。 百度网盘下载器:https://github.com/b3log/baidu-netdisk-downloaderx 一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac。 参考链接 [1] 《Develop with Python on Windows》: https://docs.microsoft.com/zh-cn/windows/python/ 最后,感谢女朋友支持和包容,比❤️ 也可以在公号输入以下关键字获取历史文章:公号&小程序 | 设计模式 | 并发&协程 内推时间

2019-08-04 · 1 min · 56 words

每周分享第3期-史上最全的编程学习资料合集

【资料】史上最全的编程学习资料合集(持续更新) 【资料】一周 GitHub 开源项目推荐:阿里、腾讯、陌陌、bilibili…… 【资料】常用的 Go 框架、库和软件中文收录大全 【教程】高性能 Go 代码工坊(英文) 【文章】我用了10年 从深圳流水线厂妹做到纽约高薪程序员 【文章】2009年最热门的 iPhone 应用程序(英文) 苹果公司的应用商店即将满十周年,本文回顾了2009年最热门的付费应用和免费应用 【语言】v语言-语法综合了python和go 【工具】weixin python sdk 支持小程序云开发 【工具】网站收录了估值达到 10 亿美元的创业公司,实时更新 【工具】简洁的 Mac 图床客户端 uPic References [1] 【资料】史上最全的编程学习资料合集(持续更新): https://github.com/toutiaoio/weekly.manong.io [2] 【资料】常用的 Go 框架、库和软件中文收录大全: https://juejin.im/post/5d14a319e51d4577407b1d77 [3] 【教程】高性能 Go 代码工坊: https://dave.cheney.net/high-performance-go-workshop/gopherchina-2019.html [4] 【文章】2009年最热门的 iPhone 应用程序: https://www.fastcompany.com/90356079/whatever-happened-to-the-hottest-iphone-apps-of-2009 [5] 【语言】v语言-语法综合了python和go: https://github.com/vlang/v [6] 【工具】weixin python sdk 支持小程序云开发: https://github.com/gusibi/python-weixin [7] 【工具】网站收录了估值达到 10 亿美元的创业公司,实时更新: https://dujiaoshou.io/ [8] 【工具】简洁的 Mac 图床客户端 uPic: https://github.com/gee1k/uPic 最后,感谢女朋友支持和包容,比❤️ 也可以在公号输入以下关键字获取历史文章:公号&小程序 | 设计模式 | 并发&协程 内推时间

2019-06-29 · 1 min · 74 words

每周分享第2期-宇宙模拟器

1 宇宙模拟器 :http://spaceengine.org 2 APIJSON:https://github.com/APIJSON/APIJSON APIJSON是一种为API而生的 JSON网络传输协议 以及 基于这套协议实现的ORM库。 后端接口和文档自动化,前端(客户端) 定制返回JSON的数据和结构 3 【文章】小火箭对SpaceX星链计划低轨巨型星座的分析:https://mp.weixin.qq.com/s/NNmI_cqwo4ba0ViJ9O7f3Q 这篇对SpaceX 星链计划 可行性进行了详细的分析,共11575字,101图。预计阅读时间:1小时15分钟 4 微软与 Google 共同开设的量子算法课程:https://brilliant.org/courses/quantum-computing/ 通过浏览器模拟的量子计算环境,学习量子算法 5 一个VPS搜索工具: https://anothervps.com/vps/ 可怜我linode 都用不了了 6 一些有趣的网站: https://www.ctolib.com Github开源项目收集网站 http://www.nicetool.net 实用工具比较多 http://www.mvyxws.com/ 以视频方式分享医学知识的网站 https://www.tikitiki.cn 自由的音乐,能够试听并下载全网音乐 https://showmore.com/zh/ 在线录制屏幕的工具 https://weibomiaopai.com 视频下载 7 PySnooper:https://github.com/cool-RR/PySnooper python DeBug工具 8 pyecharts:https://github.com/pyecharts/pyecharts Echarts 是一个由百度开源的数据可视化,pycharts 是Echarts 的python版。 9 LeetCodeAnimation:https://github.com/MisterBooo/LeetCodeAnimation 用动画的形式呈现解LeetCode题目的思路 10 ColorUI:https://www.color-ui.com/ 鲜亮的高饱和色彩,专注视觉的小程序组件库 iPhone X怎么强制关机? iPhone X强制关机有三步: 按下音量+键然后松开; 按下音量-键然后松开; 之后按住侧边按钮(即电源键)直到iPhone X黑屏。 升级了iOS13,打电话的时候就停留在了通话界面,再也退不出去了。。只能用强制关机的方式。 才知道是这么个方式 最后,感谢女朋友支持和包容,比❤️ 也可以在公号输入以下关键字获取历史文章:公号&小程序 | 设计模式 | 并发&协程 ...

2019-06-22 · 1 min · 73 words

markdown中code生成图片的实现

前几天写了《markdown 生成头条文章的一个思路》,周末就试了试。 先回顾一下思路,大致流程如下: 这里的三个关键点是: 提取code 把code 转换为html 把html 生成图片 code 替换成图片 第一个很简单,只有用正则表达式就可以解决: _fenced_code_block_re = re.compile(r''' (?:\n+|\A\n?) ^```\s*?([\w+-]+)?\s*?\n # opening fence, $1 = optional lang (.*?) # $2 = code block content ^```[ \t]*\n # closing fence ''', re.M | re.X | re.S) 这个正则来自 python-markdown2: https://github.com/trentm/python-markdown2 这个正则只匹配了 ``` 样式的代码,对于前边有四个空格的并没有做处理(也不想做处理,还是严格一点好)。 第二个也不麻烦,只需要把提取出的code 放到html 中,下面是一个html模板: <html> <head> <link rel="stylesheet" href="http://media.gusibi.mobi/highlight/static/styles/atom-one-dark.css"> <script src="http://media.gusibi.mobi/highlight/static/highlight.site.pack.js"></script> <script>hljs.initHighlightingOnLoad();</script> </head> <body style="width: 640px;"> <pre> <code class="{{.Language}}">{{.Code}}</code> </pre> </body> </html>` 这里有一个点是渲染html 页面的时候, 由于加载html 页面的工具都是get请求,这里我们需要先把code 数据保存起来。所以请求code 的html 页面分成了两步。 ...

2019-06-15 · 2 min · 260 words

markdown中code生成图片的思路

最近在头条上写东西,遇到了一个比较烦的事情—编辑器不支持代码。这对于一个像我这样使用代码凑字数的人来说实在不是一个好的消息。但是等头条改进编辑器太遥远了,只能自己自足实现一个替代方案了–把代码替换成图片。 一段代码的时候,我随手截图,简单完成了; 两段代码的时候,我随手随手截图,也完成了; 三段代码的时候,我随手随手随手截图,强忍着完成了; 等我发现代码越来越多的时候,不能忍了。 懒惰是程序员的美德,不能再花费时间干这些事情了。我觉得要写个程序,把markdown 中的代码自动生成图片。 考虑了一下,大概需要做的工作是: 把markdown 中 “ ” 包换的代码提取出来(也可以使用工具先把markdown 转换成html 再解析html 取出code 把每一段code 分别生成图片 把图片对应的代码替换掉 想想还是很简单的。那就开始吧。 但是到第二步的时候遇到了问题,code 如何生成图片,生成什么样的图片? 首先code 需要保持原有的样式,如果能高亮那就更好了(嗯,高亮 生成图片的时候是把code 作为文字使用PIL(我使用python)写在背景上么,图片大小是多少,高亮怎么实现 算了,还是先把code 生成html,然后截取html页面吧。(这样html 还能使用 highlight.js 来实现高亮) 如何动态生成包含code 的html 页面呢? 如何把截取html 页面呢? 动态生成包含code 的html 页面有两个思路: 使用post 请求,把code 写入数据库(或者文件),然后返回id,再使用id GET 请求获取页面(需要存储,两次请求) 压缩code,把code 作为url参数,使用GET请求获取页面(可能会造成url太长的错误) 那如何截取html呢? 如果是python,可以使用pyqt,渲染html页面,截取webview。 如果使用node,可以使用 html2canvas。 大致流程如下: 哎,这一篇没有代码,就凑不了多少字。 最后,感谢女朋友支持和包容,比❤️ 也可以在公号输入以下关键字获取历史文章:公号&小程序 | 设计模式 | 并发&协程 内推时间

2019-06-13 · 1 min · 59 words

每周分享第1期-常用表情包收录

每周分享,分享看到的一些有意思的文章和项目 1 中国表情包大集合 https://zhaoolee.github.io/ChineseBQB/ 表情包目录(共收录2298张表情包)Emoticon package directory (commonly included 2298 emoticon pack) 2 谷歌产品替代品 一批谷歌产品的替代方案 https://nomoregoogle.com/ 3 Redis作者:开源维护者的挣扎和无奈 英文作者是著名开源项目 Redis 的开发者 antirez。截至 2019-06-04 为止,Redis 项目在 GitHub 将近有 37,000 Star,Fork 数达 14000。 https://mp.weixin.qq.com/s/6C7-4Fp46rxfn0J34ebKyg 4 一个分享 GitHub 上 有趣、入门级的开源项目网站 https://hellogithub.com 5 Saber - 新一代静态网站生成系统 https://saber.land 6 star-history: 帮助用户查看 github 项目 star 数目的历史 star-history 帮助用户查看 github 项目 star 数目的历史, 判断项目发展情况,项目地址:https://github.com/timqian/star-history 7 一个分类收集 GitHub 开源项目的网站,并对项目的热度和活跃度进行分析 项目地址:https://www.ctolib.com/ 8 git 提交信息规范检测工具 git-commit-msg-linter 项目地址:https://www.npmjs.com/package/git-commit-msg-linter 9 编码一时爽,重写火葬场?这些公司都重写了软件,结局却不同。 生存,还是死亡,这是一个问题。重写,还是不重写,这是导致生存或死亡的另一个问题。 https://mp.weixin.qq.com/s/SqxPoIDPuvKlrlqZmubpXA ...

2019-06-07 · 1 min · 78 words

并发模型:线程与锁

并发&并行 并发程序含有多个逻辑上的独立执行块,他们可以独立的并行执行,也可以串行执行。 并行程序解决问题的速度比串行程序快的多,因为其可以同时执行整个任务的多个部分。并行程序可能有多个独立执行块,也可能只有一个。 引用Rob Pike的经典描述就是: 并发是同一时间应对多件事情的能力; 并行是同一时间动手做多件事情的能力。 常见的并发模型有: 线程与锁 函数式编程 actor模型和通信顺序是进行(Communicating Sequential Processes, CSP) 数据级并行 lambda 架构 分离标识与状态模型 这篇主要介绍线程与锁模型 线程与锁模型 线程与锁模型是对底层硬件运行过程的形式化,非常简单直接,几乎所有的编程语言都对其提供了支持,且不对其使用方法加以限制(易出错)。 这篇文章主要使用python语言来演示线程与锁模型。文章结构来自《七周七并发模型》 互斥和内存模型 创建线程 from threading import Thread def hello_world(): print("Hello from new thread") def main(): my_thread = Thread(target=hello_world) my_thread.start() print("Hello from main thread") my_thread.join() main() 这段代码创建并启动了一个Thread实例,首先从start() 开始,my_thread.start() main()函数的余下部分一起并发执行。最后调用join() 来等待my_thread线程结束。 运行这段代码输出结果有几种: Hello from new thread Hello from main thread 或者 Hello from main thread Hello from new thread 或者 ...

2019-05-19 · 6 min · 1178 words

python设计模式-状态模式

问题:有一个糖果公司需要设计一个糖果售卖机,控制流程如下图,需要怎么实现? 这是一个状态图,每个圆圈都是一种状态。很明显,有有25分钱、 没有25分钱、 售出糖果、 糖果售罄四个状态,同时也对应四个动作:投入25分钱,退回25分钱,转动曲柄和发放糖果。 那如何从状态图得到真正的代码呢? 简单代码实现如下: #! -*- coding: utf-8 -*- class GumballMachine: # 找出所有状态,并创建实例变量来持有当前状态,然后定义状态的值 STATE_SOLD_OUT = 0 STATE_NO_QUARTER = 1 STATE_HAS_QUARTER = 2 STATE_SOLD = 3 state = STATE_SOLD_OUT def __init__(self, count=0): self.count = count if count > 0: self.state = self.STATE_NO_QUARTER def __str__(self): return "Gumball machine current state: %s" % self.state def insert_quarter(self): # 投入25分钱 if self.state == self.STATE_HAS_QUARTER: # 如果已经投过 print("You can't insert another quarter") elif self.state == self.STATE_NO_QUARTER: # 如果没有投过 self.state = self.STATE_HAS_QUARTER print("You inserted a quarter") elif self.state == self.STATE_SOLD_OUT: # 如果已经售罄 print("You can't insert a quarter, the machine is sold out") elif self.state == self.STATE_SOLD: # 如果刚刚买了糖果 print("Please wait, we're already giving you a gumball") def eject_quarter(self): # 退回25分 if self.state == self.STATE_HAS_QUARTER: print("Quarter returned") self.state = self.STATE_NO_QUARTER elif self.state == self.STATE_NO_QUARTER: print("You haven't inserted a quarter") elif self.state == self.STATE_SOLD: print("Sorry, you alread turned the crank") elif self.state == self.SOLD_OUT: print("You can't eject, you haven't inserted") def turn_crank(self): # 转动曲柄 if self.state == self.STATE_SOLD: print("Turning twice doesn't get you another gumball") elif self.state == self.STATE_NO_QUARTER: print("You turned but there's no quarter") elif self.state == self.STATE_SOLD_OUT: print("You turned, but there are no gumballs") elif self.state == self.STATE_HAS_QUARTER: print("You turned...") self.state = self.STATE_SOLD self.dispense() def dispense(self): # 发放糖果 if self.state == self.STATE_SOLD: print("A gumball comes rolling out the slot") self.count -= 1 if self.count == 0: self.state = self.STATE_SOLD_OUT else: self.state = self.STATE_NO_QUARTER elif self.state == self.STATE_NO_QUARTER: print("You need to pay first") elif self.state == self.STATE_SOLD_OUT: print("No gumball dispensed") elif self.state == self.STATE_HAS_QUARTER: print("No gumball dispensed") if __name__ == "__main__": # 以下是代码测试 gumball_machine = GumballMachine(5) # 装入5 个糖果 print(gumball_machine) gumball_machine.insert_quarter() # 投入25分钱 gumball_machine.turn_crank() # 转动曲柄 print(gumball_machine) gumball_machine.insert_quarter() #投入25分钱 gumball_machine.eject_quarter() # 退钱 gumball_machine.turn_crank() # 转动曲柄 print(gumball_machine) gumball_machine.insert_quarter() # 投入25分钱 gumball_machine.turn_crank() # 转动曲柄 gumball_machine.insert_quarter() # 投入25分钱 gumball_machine.turn_crank() # 转动曲柄 gumball_machine.eject_quarter() # 退钱 print(gumball_machine) 这段代码有几个问题: ...

2018-12-31 · 4 min · 802 words

python设计模式-模板方法模式

首先先介绍一下咖啡和茶的冲泡方法: 茶 1. 把水煮沸 2. 用沸水浸泡茶叶 3. 把茶放到杯子里 咖啡 1. 把水煮沸 2. 用沸水冲泡咖啡 3. 把咖啡倒进杯子 4. 加糖和牛奶 用python代码实现冲泡方法大概是这个样子: # 茶的制作方法 class Tea: def prepare_recipe(self): # 在下边实现具体步骤 self.boil_water() self.brew_tea_bag() self.pour_in_cup() def boil_water(self): print("Boiling water") def brew_tea_bag(self): print("Steeping the tea") def pour_in_cup(self): print("Pouring into cup") # 咖啡的制作方法 class Coffee: def prepare_recipe(self): # 在下边实现具体步骤 self.boil_water() self.brew_coffee_grinds() self.pour_in_cup() self.add_sugar_and_milk() def boil_water(self): print("Boiling water") def brew_coffee_grinds(self): print("Dripping Coffee through filter") def pour_in_cup(self): print("Pouring into cup") def add_sugar_and_milk(self): print("Adding Sugar and Milk") 仔细看上边两端代码会发现,茶和咖啡的实现方式基本类似,都有prepare_recipe,boil_water,pour_in_cup 这三个方法。 ...

2018-12-02 · 2 min · 261 words

python设计模式-外观模式

上一篇《python设计模式-适配器模式》介绍了如何将一个类的接口转换成另一个符合期望的接口。这一篇将要介绍需要一个为了简化接口而改变接口的新模式-外观模式(Facade-Pattern)。 问题 问题:如果你组装了一套家庭影院,内含播放器、投影机、自动屏幕、立体声音响、爆米花机等。如何设计一个遥控器,可以简单的操作这个系统中的各个组件呢? 首先来看一下最笨方式观赏电影的步骤: 打开爆米花机 开始爆米花 将灯光调暗 放下屏幕 打开投影仪 将投影机的输入切换到播放器 将投影及设置在宽屏模式 打开功放 将功放的输入设置为播放器 将攻防设置为环绕立体声 将攻防音量调到适中 打开播放器 播放电影 写成类和方法的调用大概是以下的样子: # 打开爆米花机,开始爆米花 poper.on() poper.pop() # 灯光调暗 lights.dim(10) # 放下屏幕 screen.down() # 打开投影仪,设置为宽屏模式 projector.on() projector.setInput(dvd) projector.wideScreenMode() # 打开功放 设置为DVD 调整成环绕立体声模式,音量调到5 amp.on() amp.setDvd(dvd) amp.setSurroundSound() amp.setVolume(5) # 打开dvd 播放器 dvd.on() dvd.play(movie) 可以看到代码中涉及到6个不同的类,而且电影看完后还需要回退,一切都要再反着重来一遍。怎样简化一下操作呢? 现在,外观模式就可以大展身手了。 使用外观模式,可以通过实现一个提供更合理的接口的外观类,将子系统变得更容易使用。当然,原来的接口还在。 解决方法 先来看一下外观模式如何运作 这里为家庭影院系统创建了一个新的外观类HomeTheaterFacade,这个类暴露出来几个简单的方法,比如watchMovie,endMovie。 这个外观类将家庭影院的多个组件看作一个子系统,通过调用这个子系统来实现watchMovie方法。 外观只提供了一个更直接的操作方式,并没有将原来的子系统隔离,子系统的功能还可以使用 注意: 可以有多个外观 外观提供简化的接口,但不隔离子系统 外观将实现从子系统中解耦,比如:现在有个子系统的组件需要升级换代,只需要把外观代码做相应的修改就可以实现 外观和适配器都可以包装多个类,但是外观的意图时简化接口的调用,而适配器的意图是将接口转换成不同的接口。 示例 class HomeTheaterFacade(object): #先声明需要用的子组件 amp = Amplifier() tuner = Tuner() dvd = DvdPlayer() cd = CdPlayer() projector = Projector() lights = TheaterLights() screen = Screen() popper = PopcornPopper() def watchMovie(self, movie): # watchMovie 将之前需要手动处理的任务批量处理 print("Get ready to watch a movie...") # 打开爆米花机,开始爆米花 self.poper.on() self.poper.pop() # 灯光调暗 self.lights.dim(10) # 放下屏幕 self.screen.down() # 打开投影仪,设置为宽屏模式 self.projector.on() self.projector.setInput(dvd) self.projector.wideScreenMode() # 打开功放 设置为DVD 调整成环绕立体声模式,音量调到5 self.amp.on() self.amp.setDvd(dvd) self.amp.setSurroundSound() self.amp.setVolume(5) # 打开dvd 播放器 self.dvd.on() self.dvd.play(movie) def endMovie(self): # endMovie 负责关闭一切,由子系统中的组件完成 print("Shutting movie theater down...") self.popper.off() self.lights.on() self.screen.up() self.projector.off() self.amp.off() self.dvd.stop() self.dvd.eject() self.dvd.off() 代码使用 def main(): home_theater = HomeTheaterFacade() # 实例化外观 home_theater.watchMovice() # 使用简化方法开启 关闭电影ß home_theater.endMovice() 定义 定义:外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。 ...

2018-11-25 · 1 min · 196 words