《Flask Web 开发》笔记

《Flask Web 开发》第二版 豆瓣地址:https://book.douban.com/subject/30293851/ 第 1 章 - 安装 Flask 哲学 Flask 自开发伊始就被设计为可扩展的框架,它具有一个包含基本服务的强健核心,其他功能则可通过扩展实现。 Flask 有 3 个主要依赖: 路由、调试和 Web 服务器网关接口(WSGI,Web server gateway interface)子系统由 Werkzeug 提供; 模板系统由 Jinja2 提供; 命令行集成由 Click 提供。 开发者可以任意挑选符合项目需求的扩展,甚至可以自行开发。这和大型框架的做法相反,大型框架往往已经替你做出了大多数决定,难以(有时甚至不允许)使用替代方案。 venv 在 Python 3 中由标准库 venv 创建虚拟环境: $ python3 -m venv virtual-environment-name 激活虚拟环境: $ source venv/bin/activate 取消: $ deactivate 另一种使用虚拟环境的方法: 在终端中执行 $ venv/bin/python 直接激活虚拟环境中的交互模式,退出时直接按下 ctrl + D。 第 2 章 - 应用的基本结构 初始化 所有 Flask 应用都必须创建一个应用实例,通常由下述代码创建: from flask import Flask app = Flask(__name__) Web 服务器使用 WSGI 协议,把接受自客户端的所有请求转发给这个对象处理。 ...

2020-02-22

用 sleepwatcher 让 Mac 在睡眠及唤醒时自动执行一些脚本

macOS 自带的 Automator.app 并没有给出睡眠及唤醒时的条件变量,不过可以通过 sleepwatcher 来监测并执行一些脚本。 sleepwatcher 安装: brew install sleepwatcher 安装完成后有使用提示,sleepwatcher 会在睡眠和唤醒时自动运行 ~/.sleep 和 ~/.wakeup。 服务由 brew services 管理: brew services -h 创建文件并给予运行权限: touch ~/.sleep && chmod +x ~/.sleep touch ~/.wakeup && chmod +x ~/.wakeup 由于系统限制,睡眠时的操作不能运行超过 15 秒。 可以在 ~/.sleep 写入一个创建文件夹的操作作为测试: #!/bin/zsh mkdir ~/Desktop/test 盒盖、打开,桌面应该就有一个 test/ 目录了。 睡眠时关闭 QQ QQ for Mac 多年以来一直会在合盖状态下不知何时突然响起登录声,真的是让人无语,经常是合盖睡觉了,躺床上刚要睡着的时候 QQ 突然响了。 一个 python 脚本,关闭 QQ 的进程: #!/usr/local/bin/python3 import psutil for pid in psutil.pids(): name = psutil.Process(pid).name() if name == 'QQ jietu plugin' or name == 'QQ': psutil.Process(pid).terminate() 给予脚本权限并在 ~/.sleep 中执行脚本就可以了。 ...

2020-02-20 · (updated: 2023-04-07)

解决 pyenv 导致的 brew warning

brew doctor 的错误提示: Please note that these warnings are just used to help the Homebrew maintainers with debugging if you file an issue. If everything you use Homebrew for is working fine: please don't worry or file an issue; just ignore this. Thanks! Warning: "config" scripts exist outside your system or Homebrew directories. `./configure` scripts often look for *-config scripts to determine if software packages are installed, and which additional flags to use when compiling and linking. Having additional scripts in your path can confuse software installed via Homebrew if the config script overrides a system or Homebrew-provided script of the same name. We found the following "config" scripts: /Users/username/.pyenv/shims/python2-config /Users/username/.pyenv/shims/python2.7-config /Users/username/.pyenv/shims/python-config /Users/username/.pyenv/shims/python3-config /Users/username/.pyenv/shims/python3.8-config 解决方法:https://github.com/pyenv/pyenv/issues/106 randy3k commented on 22 Apr 2015 ...

2020-01-31

《SQL 必知必会》笔记

《SQL 必知必会》第 4 版 豆瓣:https://book.douban.com/subject/24250054/ SQL 文件下载地址:https://forta.com/books/0672336073/ 1 - 了解 SQL 数据库 保存有组织的数据的容器(通常是一个文件或多个文件)。 数据库软件应称为数据库管理系统(DBMS). 表 某种特定类型数据的结构化清单。 列 表中的一个子段。所有表都是由一个或多个列组成的。 主键: 表中的任何列都可以作为主键,只要它满足以下条件: 任意两行都不具备有相同的主键值; 每一行都必须具有一个主键值(主键列不允许 NULL 值); 主键列中的值不允许修改或更新; 主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)。 2 - 检索数据 查询语句 SELECT 检索一个或多个列。 SELECT 列名 FROM 表名; SELECT * FROM 表名; 注释 在大多数数据库软件中,支持 # -- /**/ 等单行和多行注释。 结果集去重 DISTINCT SELECT DISTINCT 列名 FROM 表名; DISTINCT 关键字限制所有的列,如果后接多列,除非两列内容完全相同,否则都会被纳入结果集。 限制结果 LIMIT 大多用于分页显示: -- 从第 0 行开始,显示 5 个。第一页: SELECT * FROM 表名 LIMIT 5 OFFSET 0; -- 从第 5 行开始,现实 5 个。第二页: SELECT * FROM 表名 LIMIT 5 OFFSET 5; MySQL、MariaDB、SQLite 简化语法: ...

2020-01-29

Git 自总结

虽然用了很久的 Git 了,但基本上只是 add、commit、push、pull,这次系统性的学习了一遍。 整体是按照 Github 官方教程,由牛客网翻译的视频 的顺序排下来的。 内容上外加网上的各种博文总结和补充了一些。 Setup $ brew install git Config Git 希望知道每次提交的作者信息,来说明是谁进行的本次提交,这会随着版本迭代永久纳入历史记录中。 $ git config --global user.name "my name" $ git config --global user.email xxx@example.com user.email 最好与 github 中的邮件地址相同,否则 push 后在 github 上并不会准确显示出是自己。 配置文件: 在 ~/.gitconfig 中同样可以修改和查看上述配置,或修改 Git 全局忽略的位置信息等。 SSH 配合 SSH Key 在 Github 中可以免去输入密码的环节。 生成密钥: $ ssh-keygen -t rsa -C "youremail@example.com" 在 ~/.ssh/id_rsa.pub 中取得公钥并上传 GitHub。 Init 创建本地仓库: $ git init Github 上创建仓库,可遵循 Github 的提示: create a new repository on the command line: echo "# test" >> README.md git init git add README.md git commit -m "first commit" git remote add origin https://github.com/xxx/test.git git push -u origin master git remote add origin https://github.com/xxx/test.git git push -u origin master status 查看状态: ...

2019-04-07 · (updated: 2021-11-21)

Python 异步 IO 笔记

协程初探 协程 - 廖雪峰 Python 教程 多进程与多线程均由操作系统调度,不过协程由程序员在协程的代码里显式调度。 协程没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。 yield/send() 刚看廖老师协程一章的代码时是一脸懵逼,那么从 0 开始,了解 yield。 10 年前的好文章: 深入理解 yield 看完再回顾廖老师的 [生产者-消费者] 模型: def c(): ... n = yield r ... def p(c): ... r = c.send(n) ... 终于理解 yield 表达式与send() 函数两者皆可发送与反馈,协同工作,相辅相成。 send(n),p 发送了 n 给 c,c 怎么接收,yield 的返回值即是。 yield r,c 反馈了 r 给 p,p 怎么接收,send() 的返回值即是。 @asyncio.coroutine/yield from yield from 语法由 Python 3.3 引进。 附:深入理解Python的yield from语法 ,摘抄部分代码: # 子生成器 def average_gen(): total = 0 count = 0 average = 0 while True: new_num = yield average count += 1 total += new_num average = total/count # 委托生成器 def proxy_gen(): while True: yield from average_gen() # 调用方 def main(): calc_average = proxy_gen() next(calc_average) # 预激下生成器 print(calc_average.send(10)) # 打印:10.0 print(calc_average.send(20)) # 打印:15.0 print(calc_average.send(30)) # 打印:20.0 if __name__ == '__main__': main() asyncio 是 Python 3.4 版本引入的标准库,直接内置了对异步 IO 的支持。 ...

2019-01-03

再见,双点医院!

终于肝完了主题医院的精神续作——双点医院。。。 太肝了。。。 这一代的病人依然没有摒弃「请病人不要死在走廊上」的优良传统,如果你把一个病人治死了,他会坚持换完衣服走出病房,然后再在走廊死掉,再化为鬼魂,为周围的病人启动一个「加速行走」的Buff。。。 因为这个加速行走的Buff,我甚至都不招聘有抓鬼技能的员工了。 游戏进程 入场 接待 诊断 治疗 离场 中途可能包含「愤怒离开」「治疗效果不佳」「死亡」。 在接受治疗前就死亡,是因为排队排太久,健康值降为 0。 愤怒离开的主要原因是心情降为 0。 诊断流程 (妈的智障) → 全科 → 诊断 → 全科 → 诊断 → 全科 → 治疗 如果第一次全科就100%,直接治疗。 即便到诊断室已经100%了,病人也会再次返回全科。(大夫可能是说你去照个X光回来给我看看) 如果已有的诊断室已经用完,仍没到100%,会发出消息,问你是送回家、等待、治疗? 在后期基本只有这两种情况: 进场 → 全科 → 治疗 → 离场或死亡 进场 → 全科 → 某个诊断室 → 全科 → 治疗 → 离场或死亡 全科技能跟上的话,很少有第三次复诊。 科室 设施 护士 医生 接待处 药房 3 x 3 【全科】 3 x 3 休息室 【综合诊断】 3 x 3 【精神病学】 3 x 3 精神学 厕所 【心脏病科】 3 x 3 脱光诊所 3 x 3 培训 注射室 3 x 3 研究 【体液分析】 3 x 3 【DNA实验室】 4 x 3 遗传学 营销学 咖啡厅 【病房】 4 x 3 流行锅实验室 4 x 4 骨科病房 4 x 3 拔头室 4 x 4 色疗室 4 x 3 电疗 4 x 4 木乃伊 4 x 3 分辨率 4 x 4 【X 光】 4 x 4 有害动物 4 x 4 【超级磁力共振】 4 x 4 放射学 小丑诊所 4 x 4 折疗室 5 x 3 手术室(医+护) 4 x 3 外科学 上表【 】中为具有诊断功能的科室。 ...

2018-09-09

用 CloudXNS 解决 CNAME 与 MX 记录冲突

需求 需求是这样的: 我的博客是 dvel.me,已经部署在 Coding Pages 或 Github Pages 上,域名解析用的是 CNAME 记录。 我希望我的域名邮箱是后缀是 @dvel.me,域名解析用的是 MX 记录。 冲突了。。。 @ CNAME - pages.coding.me @ MX 1 aspmx.l.google.com 因为都用了裸域,如果要放弃裸域,采用 www.dvel.me 又觉得强迫症,Coding 又不提供 A 解析。 用 CloudXNS 快速解决 CloudXNS 有一个 LINK 记录: LINK:CloudXNS的私有类型,可将用户配置的CNAME隐藏。 别名链接记录,隐式将解析权委托给目标域名。 官方详解:CloudXNS之详解LINK记录 需要额外使用一个域名,假设这个域名为 another.com。 将裸域的 CNAME 记录改成 LINK,记录值为 @another.com: @ LINK - @another.com @ MX 1 aspmx.l.google.com 进入 another.com 的解析设置页面正常设置: @ CNAME - pages.coding.me 以上,相当于绕了个弯。 我用的是 Coding Pages 与 G Suite,博客访问与邮件收发均无问题。

2018-08-01

你好,Hugo!

曾经升级完 Node 后对 Hexo 一顿折腾,感觉有点麻烦,新 MBP 入手后懒得再折腾一遍,想换到 Hugo 试试。 Quick Start 安装: $ brew install hugo 查看: $ hugo version 建站: $ hugo new site site-name 快速添加主题: (以我正在使用的 Jane 为例) $ cd site-name $ git init $ git clone https://github.com/xianmin/hugo-theme-jane.git --depth=1 themes/jane $ echo 'theme = "jane"' >> config.toml 写博客: 页面: $ hugo new page-name.md 文章: $ hugo new posts/post-name.md 预览、调试: $ hugo server $ hugo server -D # 将标记为 draft: true 的草稿也生成预览 浏览器打开 http://localhost:1313/ 即可预览。 生成: $ hugo 生成速度超级快! ...

2018-07-31

为 Mac 打造 zsh command line 环境

折腾完,做个备忘 样图: iTerm 2 主题 Tomorrow Night - Tomorrow Night Eighties Hotkey Window 我习惯只保留一个窗口,并使用 shift+空格 来从左侧或上侧呼出,在 Profiles - Window - Style 可以设置。 呼出的快捷键在 Profiles → Keys → Hotkey Window 设置。 Natural Text Editing Profiles → Keys → Presets → Natural Text Editing 这个可以让你在输入时使用 command/option + ←/→ 来移动光标 zsh: zsh 有很多优点,比如兼容 !#/bin/bash,更强大的 tab 补全功能,大小写自动更正,丰富的主题,命令智能纠错等等。 现在 macOS 默认就是 zsh 而不是 bash 了,不过我习惯不使用系统自带的东西,可以用 brew 自己装一个。 $ brew install zsh 查看当前已经安装的 shell: ...

2018-07-30 · (updated: 2020-10-23)