plainify

【译】在Android上实现Google Inbox样式的动画

作为一个 Android 用户和开发人员, 我总是被精美的应用程序所吸引, 这些应用程序具有漂亮而有意义的动画。 对我来说, 这样的应用程序不仅拥有了强大的功能, 使用户的生活更便捷, 同时还表现出他们背后的团队为了将用户体验提升一个层次所投入的精力和热情。 我经常享受体验这些动画, 然后花费数小时时间去试图复制它们。 其中一个应用程序是 Google Inbox, 它提供了一个漂亮的电子邮件打开/关闭动画, 如下所示(如果你不熟悉它)。 在本文中, 我将带您体验在 Android 上复制动画的旅程。 ...

plainify

【译】在几秒钟内为你的开发环境创建一个私有 PostgreSQL 数据库

很多开发者在开始一个新项目的时候,通常会使用 JSON,CSV 或者其他 Flat File 来模拟真实存放在数据库中的数据。这是因为他们总是在没有真实的数据库环境限制和是否需要自己创建模拟数据库之间左右为难。既然这样,为什么不使用 Docker Compose 定义一个可以在几秒钟内创建、销毁和重新创建的 PostgreSQL 数据库和监视工具? 正确创建配置两个容器的 Docker 命令过于冗长。而使用 Docker Compose,你只需要记住 up 命令和 down 命令! Up 命令将创建指定版本的 PostgreSQL 数据库和一个 GUI 管理工具。Down 命令会将其关闭并删除。 基于私有容器的数据库的好处 不同版本的 PostgreSQL 在行为和功能上存在差异,因此开发人员应针对一个数据库版本进行长期开发。你可以选择的一个版本是 9.6.12,另一个可以是 12.4。 大多数程序员都不是数据库管理员或 SQL 专家。可视化工具可以让他们直观地验证其代码的运行效果并支持手动修改数据。 项目的不同阶段需要不同类型的存储方案。在项目早期,非持久型数据库可以最大程度地减少麻烦。在项目的后期阶段,持久型数据库提供了更实际的方案。 建立开发堆栈 下面所展示的这份 docker-compose.yml 文件定义了一个运行特定版本 PostgreSQL 和 pgAdmin 4(Postgres 最常用的管理工具)的 PostgreSQL 容器。该文件的内容值得我们详细的探讨。 version: "3.8" services: postgres: image: postgres:9.6.12-alpine container_name: some-postgres volumes: - "~/Documents/docker_pgsql_init:/docker-entrypoint-initdb.d" - "~/Documents/docker_pgsql_volume:/var/lib/postgresql/data" ports: - 5432:5432 environment: - POSTGRES_PASSWORD=mysecret deploy: restart_policy: condition: on-failure max_attempts: 3 pgadmin: image: dpage/pgadmin4 container_name: some-pgadmin volumes: - ${PWD}/servers.json:/pgadmin4/servers.json ports: - 8080:80 environment: - PGADMIN_DEFAULT_EMAIL=user@domain.com - PGADMIN_DEFAULT_PASSWORD=admin deploy: restart_policy: condition: on-failure max_attempts: 3 Docker Compose 的文件结构 该文件定义了两个要创建的“服务”:Postgres 和 pgAdmin。每个服务都包含一个从 Docker Hub 拉取的容器。Postgres 和 pgAdmin 将分别开放 5432 端口和 8080 端口。将你写的任何程序指向主机名“localhost”,然后用浏览器访问 http://localhost:8080 即可访问 pgAdmin。 ...

plainify

【译】如何使用 Python 构建 GUI(Graphical User Interface)程序

原文地址:How to Build a GUI Program with Python 本教程使用一个名为 Tkinter 的 Python 库去构建一个应用程序,该应用可以基于最近的经期时间来推测即将到来的受孕期。 我最近在学习 GUI 编程,突然想到,如果可以将我所学内容实践到上述项目中会让整个过程变得有趣。该项目是要实现一个 GUI(图形用户界面)程序,当用户输入末次月经的时间(LMP)时计算出他们的预产期(EDD)。我使用 Tkinter 模块构建了这个程序。 Tkinter 即 “TK interface”,是 Python 的 GUI 库之一。GUI 通过在计算机中显示图标(icons)和一些小组件(widgets)以实现用户交互。TKinter 提供了多种组件,如标签组件(labels),按钮组件(buttons),文本框组件(text boxes),复选框组件(chechboxes)等,具有各种功能。 本文,我将会采用增量开发的方式分阶段构建程序,不断地为应用添加代码,然后对其进行测试。这几个阶段分别是: 在纸上设计用户界面 创建一个涵盖多种组件的框架结构 以适当的大小和位置持续地添加组件 在程序中添加回调函数,以便在用户交互时响应用户的操作 绘制用户界面 我设想出该应用的模样并绘制了两张简易的草图。我选择使用了第二版草图,左侧是受孕照片,右侧是经期照片。 创建页面的基本框架 我使用 frame 组件为该程序实现了一个简单的框架。我创建了两个相同尺寸的 frame。并在这里指定了尺寸,因为此时整个程序还没有组件(因此通常需要事先手动指定)。我还为每个 frame 赋予了不同的颜色,以区分它们覆盖的窗口。请参阅此处的代码。 向左侧 frame 添加组件 我使用 label 组件来显示照片,并将其置于左侧的 frame 中。这个组件可用于显示文本或图像。图像源。此时我删除了对框架尺寸限制的代码 ,因为当前框架里的小组件已经可以决定他的尺寸了。 ...

【译】模型优化

在将机器学习模型部署到移动设备时, 推理效率是一个关键问题。 当训练的计算需求随着在不同体系结构上训练的模型的数量而增长时, 推理的计算需求与用户的数量正比增长。 Tensorflow模型优化工具包最大限度地降低了推理的复杂性 - 模型大小, 延迟和功耗。 用例 模型优化适用于: 将模型部署到算力, 内存和功耗受限的边缘设备上。 例如, 移动设备和物联网(IoT)设备。 减少无线模型更新的有效负载大小。 在由定点操作约束的硬件上执行。 优化专用硬件加速器的模型。 ...

plainify

【译】通过 Redis 构建一个响应式架构

Redis 是我遇到过的最强大、最通用的技术之一。遗憾的是,大多数人都只是将其作为一个优秀的缓存解决方案来使用。 为此,我们需要去改变这个现状。 我特别想通过本文告诉你,如何构建一个以 Redis 为核心的响应式架构。尤其是当你因为一些其它的需求(比如高性能的缓存)已经将 Redis 作为你整个应用基础设施的一部分时,这会是一个巨大的优势。 我在本文所描述的内容,你可以按照自己的想法采取各种手段来实现,说实话,在这一点上任何选择都是有效的。出于个人观点,我更倾向于使用 Node.js,但这也只是我自己的想法,你可以选择最适合你的方案。 构建一个响应式架构 首先要了解的问题是什么是响应式架构,以及为什么我们要构建一个响应式架构而不是采用其他更传统的方案? 简单来说,一个响应式架构就是让每一个逻辑都在满足所有预设条件的情况下被执行 —— 我想我应该给 “简单” 这个词加一个引号。 换个其他的说法:为了让你的逻辑在某个特定事件发生后被触发,通常会有两种实现方案: 定期检查某种标志,直到它被打开,这意味着事件发生。 停下来等待,直到某个东西通知你的服务,事件被触发。 第二个是面向对象编程中观察者模式的关键。被观察的对象让所有订阅其内部状态的人知道它更新了。 我们在这里要做的是,将这种来源于面向对象(OOP)的设计模式推导到架构级的设计中。因此,这里我所谈及的不是程序内的一些逻辑,而是架构级别的,一旦触发响应条件,就运行某项服务。 这是分配和扩展平台最有效的方式,原因在于: 你不必浪费时间和流量去轮询一个特定数据源的标志(或任何你觉得应该轮询的东西)。此外,如果你使用的基础设施是按流量付费的,不必要的轮询可能会产生额外的费用,在目标服务上增加不需要的工作,如果在你的代码等待轮询的时间里发生了多个事件,你最终可能还需要聚合这些事件。 你可以通过增加新的服务,并行工作,并以尽可能快的速度捕捉事件,来增强服务的处理能力。 平台更加稳定。通过响应式工作,你可以确保你的服务以最佳速度运行,而不必担心由于客户的数据过载而崩溃。 响应式架构本质上是异步的,所以任何试图与之交流的客户端应用,也需要适应相同的响应范式。你可以通过 HTTP 得到一个来自外部的 REST API,但是你得到的响应结果可能并不是你想要的答案。例如,你可能会得到一个 ”200 OK“ 的响应,意味着你的请求已经收到。为了让你的应用程序得到实际的结果,它必须订阅包含这种响应的特定事件。 请记住这一点,否则,你可能会花很长时间来调试为什么没有得到你想要的响应结果。 接下来我们需要什么? 既然如此,我们需要什么来使我们的平台/架构成为一个响应式的平台/架构呢?可以肯定的是,这不是 ReactJS。我们需要一个消息代理,一个能在多个服务之间集中分配消息的东西。 对于可以充当代理的东西,我们需要确保我们的代码知道它在哪里,以及他所需要的事件类型,以此来确保订阅到某些事件。 在此之后,一个通知将被发送到我们的服务,同时触发我们的业务逻辑。 听起来是不是很容易?那是因为它本就如此! 那么 Redis 是如何发挥作用的呢? Redis 不仅仅是一个存储在内存上的键值对存储引擎,事实上,它有三个我喜欢的特性,也正因如此,我才愿意使用 Redis 来搭建基于不同预期行为的响应式架构。 这三个特点分别是: 发布/订阅。Redis 内部维护着一个消息队列,它允许我们发送消息,并将它们分发到每个订阅的进程。这是一种“发后即忘”类型的约定,这意味着如果没有在线的监听器,那么消息就会丢失。所以在使用时要考虑到这一点。 键空间通知。这可能是 Redis 中我最喜欢的功能。他们是由 Redis 自己创建的事件,并分发给每个决定订阅它们的进程。这个功能和键空间的变化有关,也即存储在 Redis 里面的数据发生的任何变化。例如,当你删除或更新一个键时,或者当它的 TTL 计数器达到 0 自动删除时。这使你能够设定有时间限制的事件。比如说,你是否曾经需要在 “某事 “发生 3 天后触发一点逻辑?通过这种方法就可以实现。 Redis 流。这是 Redis 数据类型的混合物,混合了键空间通知和发布/订阅,所有这些都放在一起,工作得很好。Redis 流试图模仿 tail -f 命令在你的终端上的行为。如果你从来没有见过这个命令,说明这是一个*nix 命令,它向你显示一个文件的最后一行,并保持监听该文件的变化,每新增一行时,终端会立即显示。Redis 流也是同样的道理。如果使用得当,那么将会是一个强有力的工具。你可以阅读此处了解更多。 所有这些特性都使得你可以以各种方式与你的业务逻辑进行适配,根据你所期望的行为类型,解决其中的一个或全部。 ...

plainify

【译】防止 Git 泄漏的 5 种最佳做法

之前看过几个新闻,说是因为程序员的疏忽,将公司服务器的密钥上传到 GitHub 上,导致公司数据丢失,造成了很严重的影响,恰巧最近看到一篇英文博客有介绍如何防止 Git 泄露,下面是我的翻译内容,原文来自于 5 Best Practices To Prevent Git Leaks,如果有翻译不当的地方欢迎指正,希望能对你有所帮助。 无数的开发人员正在使用 Git 进行版本控制,但是许多开发人员对 Git 的工作方式并没有足够的了解。有些人甚至将 Git 和 Github 用作备份文件的工具。这些做法导致 Git 仓库中的信息遭到泄露。每天都有数千个新的 API 或加密密钥从 GitHub 泄漏出去。 我在信息安全领域工作了三年。 大约在两年前,我们公司发生了一起非常严重的安全问题,是由于 Git 仓库发生了信息泄露导致的。 一名员工意外地在 Github 上泄露了 AWS 的密钥。攻击者使用此密钥从我们的服务器下载很多敏感的数据。我们花了很多时间来解决这个问题,我们试图统计出泄漏了多少数据,并分析了受影响的系统和相关用户,最后替换了系统中所有泄漏的密钥。 这是一个任何公司和开发人员都不愿经历的悲惨故事。 关于整件事情的细节我就不多写了。事实上,我希望更多的人知道如何去避免 Git 的信息泄露。以下是我提出的一些建议。 建立安全意识 大多数新人开发者没有足够的安全意识。有些公司会培训新员工,但有些公司没有系统的培训。 作为开发人员,我们需要知道哪些数据可能会带来安全问题。千万记住,下面这些数据不要上传到 Git 仓库中: 任何配置数据,包括密码,API 密钥,AWS 密钥和私钥等。 个人身份信息(PII)。根据 GDPR 的说法,如果公司泄露了用户的 PII,则该公司需要通知用户和有关部门,否则会带来更多的法律麻烦。 如果你在公司工作,未经允许,请勿共享任何与公司相关的源代码或数据。 攻击者可以在 GitHub 上轻松地找到某些具有公司版权的代码,而这些代码都是被员工无意中泄露到 Github 上的。 我的建议是,应该将公司项目和个人项目严格区分。 使用 Git 忽略(Git ignore) 当我们使用 Git 创建一个新项目时,我们必须正确地设置一个 .gitignore 文件。.gitignore 是一个 Git 配置文件,它列出了不会被存入 Git 仓库的文件或目录。 ...

plainify

2020年,我在编程时遇见的几个好物

年年都写年终总结,确实没什么新意,虽然今年也做了总结,但写完之后总觉得过于悲观,只是到了年底应该要有些什么表示,想着今年是该换个花样了,于是便有了这篇《2020 年,我在编程时遇到的几个好物》。 这篇文章介绍的,有框架,有工具,有软件,都是自己在编程时遇到的有用的,而且自己比较喜欢的,这里分享给大家。正所谓相遇即是缘,若是你有幸读到这篇文章并且觉得还不错,不妨点赞关注支持一波。 Hutool 第一个要介绍的便是 Hutool,Hutool 是一个 Java 工具包,对文件、流、加密解密、转码、正则、线程、XML 等 JDK 方法进行封装,组成各种 Util 工具类。他的作用就是帮助我们简化代码,让程序员将更多的经历放在业务上而非一些无关紧要的工作上。 举个例子,近期我有一个很小的需求,一个大文件夹里有很多小文件夹,每个小文件夹里有一些我需要整理出来的 word 文档,如果通过界面点击的话,我可能需要点击 100 多个文件夹,所以很自然的就会想到用程序去实现这个需求,第一想法肯定是 shell 脚本或者 python 脚本,但其实借助 hutool 和 Java8 里的 lambda 表达式,同样可以很方便的实现这么一个小需求,如下所示: public class Main { public static void main(String[] args) { List<File> files = FileUtil.loopFiles("xxxPath", file -> FileUtil.extName(file).equalsIgnoreCase("docx") || FileUtil.extName(file).equalsIgnoreCase("doc") ); files.forEach(file -> FileUtil.copyFile(file.getAbsolutePath(), "xxxxxPath", StandardCopyOption.REPLACE_EXISTING)); } } 使用FileUtil.loopFiles就可以直接获取该路径下的所有文件,如要筛选,只需要在后面追加参数即可。 这样的工具类还有很多,例如发邮件,直接使用 MailUtil.send 即可。 MailUtil.send("yueyong1030@outlook.com", "新年快乐", "赶紧关注「01二进制」,现在关注以后就是老粉了", false); 安装方法也非常简单,Maven 安装 ...

plainify

2022的取舍与得失

每年双十二结束都意味着新年降至,回想这一年发生了太多太多的事情,总觉得需要写些什么,但又不知从何下笔。提笔前翻了一下待办,里面收集了很多自己想写的文章,比如之前一直想写一篇文章来聊一聊内卷的,又或者聊一聊自己工作这一年的总结感悟,但总是由于这样或那样的原因耽搁了,如今正好趁着🐑了在家隔离的这段时间把这些想写的东西收一下。这篇不算年终总结的文章,也没什么脉络,就是想到什么就说什么了。 如今疫情终于放开,报复性消费没有看见,反而是越来越多的小🐑人涌现出来。很不幸的,笔者近期也中招了,本想着分享一些自己的新冠自愈过程,但也不知是杭州的毒株较为温和还是我的抵抗力较强,除了第一天晚上有轻微的发热外,其他时候的感觉甚至不如普通感冒让我难受。而网上所传的喉咙刀片的感觉、食欲不振等情况也都没有经历过,这点看来还是较为幸运的,而且事后为了奖励我的免疫系统,我的食欲也随之提升,这么看来明年的减肥又变得艰巨起来了。 先说说内卷,提到阿里,除了996、福报这些词之外,更多的就是“卷”这个词了,卷王、奋斗逼这一系列名词应运而生。而且由于国内这种“形同虚设”的劳动法以及中国人骨子里“艰苦奋斗”的精神又让这一切变得那么正常与合理。仿佛你从小一路成绩优异、名校毕业后就该在这岗位上累死累活。说了这么多,接下来举几个例子来说说什么是内卷。 抢火车票,一个人先用抢票软件,逼得其他人也用抢票软件,因为票没有变多,最后大家都回到了起跑线,但是开发抢票软件的赚了。 孩子上学,一个孩子上辅导班,逼得大家都去上辅导班,最后排名还是没变,但开辅导班的赚了。 本来大家都是工作8小时,有人开始加班,最后逼得所有人都加班,所有人挣得还是那点钱,但是老板的3系换5系了。 内卷是啥,内卷就是大家都损失了,只有一小撮人赚了。 内卷是无法带来质变的量变。 至于怎么摆脱内卷,无非两条路,要么多一点,要么均一点。 “华盛顿不是一个生活的地方。这里房租高,这里吃的差,这里的灰尘令人作呕,这里的道德令人厌恶。去西部吧,年轻人。去西部,并和国家一起成长。”——纽约论坛报,1865年。 “好在苦惯了,而且什么人都是一样苦,从军长到伙夫,除粮食外一律吃五分钱的伙食。发零用钱,两角即一律两角,四角即一律四角。因此士兵也不怨恨什么人。”——毛选《井冈山的斗争》 掐指一算,从去年7月毕业入职到现在工作也有一年半了,期间经历过业务方向调整、团队成员变更、好友离职等等,当时实习时一起留下来的小伙伴们如今也是走的走,散的散,没留下多少人了。近来也时常会思考,要不要看看外面的机会,留在这里的意义又是什么?思来想去仍然没有一个明确的答案,一来因为业务确实还行,内容化本来就是每个大厂在做的事情,相对来说还是有些前景的。二来团队氛围确实很棒,自从前段时间换了leader之后,团队氛围有了质的提升,轻松的氛围确实有助于工作效率的提升。 试想一下,如果长时间处在一个被挤压、高强度push的环境下,员工的心理是否健康都需要划一个问号,更别说静心工作了。个人看来,不仅仅是阿里,现在的大厂里有很多leader是极其不称职的,这个不称职不仅仅体现在专业能力上,更多的是个人素养,说的难听点就是**“早生几年吃到时代红利而趾高气昂的油腻中年人”**。这些人个人能力并不突出,却要通过不断的否定下属以此获取所谓优越感。这里也不好多说什么,总之还是很庆幸脱离苦海了。 这一年,因为疫情的原因,各家效益都很差,裁员的裁员,倒闭的倒闭的。之前看过一个观点,当一个行业走下坡路时,大家如果都还在希望自己拿到裁员补贴的话,这个行业还有救。当大家都开始希望自己不被裁的时候,这个行业才是真的危机了。所以这么看来的话,现在应该还远没到最差的时候。只是随着获客成本的不断增加,以及其他同行的步步紧逼,留给淘宝的时间又有多少呢?只是这个问题就不该是我操心的了。 说说失与得吧。 因为一开始选择的是业务部门,导致自己与技术偏离的越来越远,这一年多全在做业务需求,哪怕是技术沉淀也没什么好说的,无非是各种架构的设计、各种方案的选型,各种漏洞的治理。真正沉下心做技术的时间太短太短了。做业务or做技术一直是一个两难的话题,有一个段子是说所有的后台需求最终都会归结到excel上,侧面也反映了业务需求的难度其实大抵如此。除了对所用的中间件越来越熟之外,底层原理却也不像读书时一样能钻研进去了,这是下一年需要好好改进的地方。 这一年有没有其他什么明显的成长呢?我想还是有的。看待问题的角度确实相较以前更加多元化了,也越来越明白了个人的力量在一个庞大的组织面前是那么的无力。有的时候哪怕你发现了团队中的一些问题,初出茅庐的你指出了这个问题,可后来发现其实大家早就知道这个问题,但就是无能为力。我不清楚是只有阿里是这样自上而下的,还是说其他公司也大多如此,如果真是这样,那恐怕希望自己媳妇熬成婆的那天仍然能一直年轻吧。 总的来说这一年因为疫情过的相对平淡很多,出行不方便以至于除了团建没别的外出游玩的机会了。另一方面也由于工作的原因,公众号的更新也基本维持在一个月一篇,而且也从技术科普类的转向架构设计,算是对平时工作的一个梳理与总结。而且马上新的一年就要来了,对于flag啥的没什么想法,就是希望能顺利晋升,快乐一些。 最后,2022年要恭喜梅老板手捧大力神杯。

plainify

AI换脸——汝怎饰品如面

事先说明,该篇文章中的代码是我无意中发现的,这里仅做一个分享,文末会给出参考文章,不喜勿喷。 完整源码和预训练模型可在公众号:「01 二进制」后台回复:「AI 换脸」获取 前言 作为一个经常逛 b 站的肥宅,前段时间无意中看到了一个名为"换脸哥"做的换脸视频,让杨幂“穿越”到了 1994 年版的《射雕英雄传》里,“代替”了朱茵,“出演”了黄蓉这个角色。视频如下(b 站视频已经被删了,只能转载知乎的视频了,原地址是杨幂“换脸”,AI 换脸究竟有多可怕 - 科技富能量的文章 - 知乎): 看完我便虎躯一震,这也太厉害了吧,这种技术一旦流行起来,ab 不用去片场就能拍戏了啊,真的是躺着赚钱啊。这要是运用到 H 片上,岂不是 😅😅😅 言归正传,作为一个 coder,在看到这个视频之后我就很想知道这究竟是怎么做出来的,在查阅了一些资料后,我才发现最悲伤的事情莫过于,好不容易把源码找到了,数据集下载好了,结果显卡带不起来… Tips:这里给出我之前找到的两个有关视频换脸的仓库,有兴趣的自己去了解下: deepfakes_faceswap FaceIt 既然条件不允许,那我们只能降低成本,既然视频里的脸不好换,那就退而求其次,换一下图片里面的脸,果然在我的苦苦寻觅后,我找到了一个低配版的 Python 换脸大法: 《Switching Eds: Face swapping with Python, dlib, and OpenCV》 以下内容均参考上述所标注的文章,在这感谢原作者。 接下来我将会介绍如何通过一段简短的 Python 脚本(200 行左右)将一张图片中面部特征自动替换为另外一张图片中的面部特征。 具体过程分为四个步骤: 检测面部标志; 旋转、缩放和平移图 2 以适应图 1; 调整图 2 的白平衡以匹配图 1; 将图 2 的特征融合到图 1 中; 实验环境 MacOS 10.14.3 Python 3.7 PyCharm 用到的库有: numpy dlib opencv-python 工具说明 numpy 大家应该都很熟悉了,这里我简单介绍下 dlib 和 opencv。 ...

plainify

AI画家第三弹——毕业设计大杀器之Flask

上一篇介绍了图像风格迁移的一个最基本实现,虽然在控制台实现了功能,但是想要实际使用,应用到一个app或者网页上光靠上一节的内容肯定是不行的。那怎么样才可以将风格迁移这个功能变成一个可以实际使用的小程序呢?不着急,在实现上述功能前,我们先来介绍一个小东西,也就是这篇文章的主角,我把他称为"毕业设计大杀器“的Flask框架。 前后端分离 在介绍Flask之前,我们先介绍下什么是前后端分离。因为如果不介绍前后端分离就不会理解为啥要选择Flask了。前后端分离是目前互联网项目开发的标准使用方式,其核心思想简单理解为是前端页面(或者app等多端)通过ajax(或者其他请求方式)调用后端的restuful api接口并使用json数据进行交互。其目的是为了将项目解耦合,达到**“术业有专攻”**的效果。因为在以往的web项目中,后端人员的工作量非常大,用过jsp的人都知道,那真的是又当爹又当妈,既要会写后台逻辑还要会弄样式。但是采用了前后端分离的架构之后,前后端人员就可以各司其职了。 前端人的追求 前端追求的是:页面表现,速度流畅,兼容性,用户体验等等。 把精力放在html5,css3,jquery,angularjs,bootstrap,reactjs,vuejs,webpack,less/sass,gulp,nodejs,Google V8引擎,javascript多线程,模块化,设计模式,浏览器兼容性,性能优化等等。 后端人的追求 后端追求的是:三高(高并发,高可用,高性能),安全,存储,业务等等。 把精力放在语言基础,设计模式,底层原理,linux,mysql事务隔离与锁机制,mongodb,http/tcp,多线程,分布式架构,弹性计算架构,微服务架构,性能优化,以及相关的项目管理等等。 应用服务器、Web服务器、Restful 应用服务器:一般指像tomcat,jetty这类的服务器可以解析动态资源也可以解析静态资源,但解析静态资源的能力没有web服务器好。 Web服务器:一般指像nginx,apache这类的服务器,他们一般只能解析静态资源。 静态资源就是类似于html、js、图片这些多次访问也不会变化的资源 一般都是只有web服务器才能被外网访问,应用服务器只能内网访问。 RESTful REST的全称是representational state transfer,即表征状态转移。在理解这个名词之前我们先来看几个名词(感觉需要知道的前置知识好多啊)。 资源(resources) 所谓的资源就是网络上的一个实体,它可以使一个图片,一个文本,一个服务,你可以用一个URI指向它,每种资源对应一个特定的URI,要获取这个资源访问它的URI就行了,所谓的上网,其实就是与网络上的资源进行一系列的互动就是了。 表征(representation) 怎么把资源表现出来就是表征的意义,比如一段文本是txt、html还是json,图片是jpg还是png,以http协议为例,就是Accept和content-type中的内容,说明了资源的类型。 状态转移(state tranfer) 访问一个网站,就是客户端和服务端的一个交互过程,客户端想要操作服务端,就必须通过某种手段让服务端的状态发生变化,具体到http协议中就是http的几种方法:GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源。 理解RESTful 使用URI来表示每一个资源 为每一个资源确定它的表现形式 使用4个方法来操作这些资源 什么是Flask? 介绍完前后端分离后,我们就开始介绍下Flask是什么吧。 Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2。Flask也被称为 “microframework” ,即**“微框架”**,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。 理解下"微” “微"框架中的“微”(micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以 ),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握。默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用。 什么是wsgi? 全名Web Server Gateway Interface,即服务器网关接口,是应用程序和Web服务器之间的一种接口。可以理解为是服务器程序和应用程序的一个约定,规定了各自使用的接口和功能,以便二和互相配合。 ...