使用 Django debug toolbar 分析 ORM Query(含 Ajax)
背景
环境:
- Django 1.11.9
- Python 2.7.13
- djangorestframework 3.7.7
- MySQL 5.7.17
信条:
过早优化是万恶之源
原由:
使用 Django 这么久,慢慢形成了一个习惯,写 Model 的时候会考虑业务的查询条件,给相应的字段做索引,写 ORM query 的时候会考虑到这个 query 在编译成 SQL 语句时会产生几次查询或者 Join 情况是怎样的,这些是自己的经验和直觉,要验证是否正确就需要使用 django-debug-toolbar 了。
我的 2017
我的 2017
一转眼 2017 年就这样过了,年龄越大,对时间的流逝就越敏感,总想写点什么来记录我关于 2017 的思考,也顺便总结这几年工作的感想。
一切源自 30 岁之前必做的事
2016 年的某段时间,我习惯每天下班看 Quora,看到了这篇文章,What are 10 things that you should definitely do before turning 30? 30岁之前必做的 10 件事,其中一个答案一条对我触动很深,/Live alone for at least a year/,至少独自在外居住一年,于是我便开始自己 租房子,开始一个人生活。
使用 Python 和 Phantomjs 对网页截图
背景
最近在做的一个 Web App,有个需要对 url 截图的需求,Google 了一番找到了使用 Python 和 Phantomjs 的方案,这里记录了如何使用以及遇到坑的解决方案。
一些坑
- 中文字体展示。
- Phantomjs 进程无法正常退出,导致服务器卡死。
安装
- 使用这个 Gist 安装 phantomjs。
- 使用
pip install selenium
,Selenium 文档。 - 安装中文字体:
apt-get install xfonts-wqy ttf-wqy-microhei
扩展 Docker 官方镜像(以 Elasticsearch 添加 ik 分词为例)
需求
最近做的一个应用使用 Elasticsearch 做全文搜索引擎,由于是中文的全文搜索,需要 Elasticsearch 的中文分词插件对内容进行分词,经过调研决定使用 Elasticsearch 5.1.1 版本(现已更新成 5.2.0 版本)和 elasticsearch-analysis-ik 中文分词插件。
使用 Docker 搭建环境
我主要使用 Docker 来搭建一切开发环境,所以便想到了使用 Elastisearch 的官方 Docker 镜像扩展安装 ik 分词插件的方案。
方案一:使用 docker commit 的方式扩展
先说结果,这种方式扩展官方镜像无法启动,具体原因不明,读者如果知道,请告诉我。
之所以一开始使用这种方案是因为我自己 Django 开发环境的镜像都是这样扩展的,但是经过我的测试用这种方式扩展 PostgreSQL 和 Elasticsearch 的官方 Docker 镜像就会导致扩展后的镜像无法启动,虽然不能使用,我还是把这个方案的操作流程分享出来。
PostgresSQL 同步数据到 Elasticsearch 方案调研总结
需求
最近在做一个 Web App,需要使用 Elasticsearch 用作全文搜索,Web App 的业务数据库使用的是 PostgreSQL,为了同步 PostgreSQL 的表数据到 Elasticsearch 于是便开始了方案调研。
Web App 的技术栈介绍
- Django、Django REST framework 作为 Web 开发框架。
- Redis 作为缓存和消息队列。
- PostgreSQL 作为业务数据库。
- Celery 作为异步消息任务框架。
- Elasticsearch 用作全文搜索。
方案一:通过 PostgreSQL 的 FDW 功能同步
方案的来源:PostgreSQL内核扩展之 - Elasticsearch同步插件
架构图:
关键技术点:通过 PostgreSQL 的 FDW(Foreign data wrappers)特性,在 PostgreSQL 层面使用数据库触发器的方式将相应的表数据同步到 Elasticsearch 中, 在要同步的表上添加新建、更新、删除的同步触发器。
我用 5 天写了一个 OSX Menu Bar App(第五天)
第五天(设计 Logo 和总结)
前面的工作做完这个应用就基本成型了,接下来就是重构代码,迭代新 Feature,设计一下 Logo,写写总结了。
重构和迭代是一个持续的过程,这个没什么好说的,就是不断的改进代码,设计 Logo 的过程倒是可以说说。
我用 5 天写了一个 OSX Menu Bar App(第四天)
第四天(UI 细节调整)
拖动上传多个文件已经实现,前面的工作解决了上传的问题,接下来要解决的是上传完成后如何使用的问题,经过一番需求分析,总结如下:
- UI 需要展示出上传后文件的缩略图和文件名,方便获取到文件的信息。
- 我要在 org 格式和 Markdown 格式的文档中插入图片,因此要提供复制链接和复制 Markdown 的操作。
- 将七牛 AccessKey、SecretKey、Bucket 和回调 Domain 做成设置 UI,提供给其他人使用。
最终的 UI
上传成功的 UI
设置的 UI
下面开始折腾。
我用 5 天写了一个 OSX Menu Bar App(第三天)
第三天(拖动上传和上传多张图片)
前面上传流程已经跑通了,不过也仅仅是功能跑通了,要达到可以使用至少需要实现从 文件夹拖动文件上传,并且可以同时上传多张图片。
拖动上传方案调研
使用 Google 先查找方案:
根据 Google 搜到文章的更新时间查看了一下相关资料,其中这篇 File drag & drop for OS-X 让
我对 OSX 的 Drag & Drop
编程有了个大概的了解,进而查找到了NSDraggingDestination 协议,
查看官方文档确定这个是我想要的东西。
NSDraaingDestination 的使用总结:
- DragAppController 扩展 NSDraggingDestination 协议。
- window 对象使用
registerForDraggedTypes
方法注册 Drag 操作。 - 重写
draggingEntered
方法,实现文件拖动标识。 - 重写
performDragOperation
方法,实现上传操作。
下面开始写代码。
我用 5 天写了一个 OSX Menu Bar App(第二天)
第二天(快速原型跑通流程)
前面把框架搭好了,我个人喜欢的开发方式是快速原型先做 MVP(最小可行性产品), 然后基于 MVP 迭代新功能,而我想做的东西的 MVP 就是能上传图片。
调研如何使用七牛
七牛推荐的模型
参考文档:七牛安全机制
重要的概念:
- 密钥(AccessKey/SecretKey),作用:生成上传凭证。
- 上传凭证(UploadToken),作用:上传文件时用作七牛服务器认证。
七牛上传的流程:
- 使用密钥构造上传凭证。
- 使用七牛 SDK 将上传凭证和文件一并提交实现上传。
七牛推荐的方式是客户端在上传时先请求服务端生成上传策略,客户端获取到上传策略后才能上传文件。
这个应用只有客户端,上传凭证只能在客户端构造,构造的算法参考:上传凭证
经过分析,我需要如下 Swift 库:
我用 5 天写了一个 OSX Menu Bar App(第一天)
第一天(方案调研和框架搭建)
起源
我在尝试写一本初学者的编程书《如何教妹子学 Python》,书中的图片是上传到七牛云上的,每次上传图片的流程让我觉得很难受,保存图片到桌面,打开浏览器,进入七牛后台,选择图片,上传成功,复制链接,写成 Markdown,放到书里……
在 App Store 里找了一圈,有个叫 iPic 的工具,感觉是我想要的东西,但是我接受不了每年要交 20 元的收费模式,又不是什么很难的东西,打算自己实现,实现的过程中学到了很多东西,便有了将实现过程分享出来的想法,
试着帮助那些遇到同样问题的人,上传工具早在国庆期间就写完了,现在才写文章完全是自己的拖延症导致的。
需求
- 实现一个 Menubar App。
- 图片和文件上传到七牛。
- 支持多文件拖动上传。
- 支持剪贴板上传。
- 可以方便的复制文件上传后的 url 和 markdown 格式的 url。
技术可行性
- 使用Swift 可以实现 Menubar App。
- 七牛有相应的 SDK 可以实现上传图片。
准备工作
- 会使用 Swift 语言。
- 会使用 cocopods 安装 Swift 库。
- 安装了 Dash 工具可以随时查看 cocoa 的 API 文档。
- 可以使用 Google 找解决方案。
最终效果