Windless
订阅/Feed
稗田千秋(i@wind.moe)

2018 秋季 Python 研发岗面试题目分享

笔者今年刚从软工专业毕业,之前在校期间也有算点实习经验和算法基础,毕业后本着放飞自我的原则,没有去找工作而是去旅游浪了一圈,还全程扎心地看完 ti。最后在家里人的强烈要求下中断考研复习开始自救(X)。九月初开始投简历,投的都是社招一到三年经验的岗位,深圳这边 Python 岗不多,每个岗位投递人数都爆满,开始还是有点慌的。。用了两星期陆续面了一些传统行业、电商、量化交易和AI公司,拿到了[9*13,18*15] 区间中的五六个offer,最后选了一家 AI 创业公司体验一下高大上的算法(才不是因为965,在这里将碰到的部分面试题整理一下供参考。

稗田千秋
Sep.23 2018 code

更好用的依赖管理工具 pipenv

之前写项目时总觉得 python 的依赖管理工具还是过简了,较为常见的写法就是 pip + virtualenv,能较为方便快捷的创建一个虚拟环境用于开发,但是其他语言的依赖管理工具已经有了极大发展,比如 NodeJS 的 yarn,那种方便的感觉不可同语。

requirements.txt 文件是在是太过简陋了,执行 pip freeze > requirements.txt 会把所有的依赖都写入文件,就像安装 a 库需要依赖 b 和 c,执行后 a、b、c 都会写入文件,导致这个文件太过繁琐且不直观,甚至需要手动去修改。同时还有许多弱点,比如无法很好地区分开发环境生产环境所需的依赖。

那么有没有一款...当然有,Kenneth Reitz 的 pipenv 项目就是最好的选择,它结合了 pip 和 virtualenv 两者,借鉴了其他语言包管理工具的特性,给 Python 提供了更为便捷的依赖管理工具。

稗田千秋
Jan.22 2018 code

模板引擎实现 (A Template Engine)

译自 500 Lines or Less -- A Template Engine 当前进度 98%

引言

编程语言对逻辑友好,但是有些情况下,我们需要处理大量的文本数据和少量逻辑,所以需要一个更适合的工具,模板引擎就是一个这样的工具。我们将会在下文构建一个简单的模板引擎。

Web 应用是重文本任务的常见示例。 Web 应用中最重要的一个部分就是生成 HTML 供浏览器解析。只有很少的纯静态 HTML 页面,涉及一点动态数据,如用户名等。通常,一个页面会包含大量动态数据:产品列表,朋友的新动态等。

同时,每个HTML页面都包含大量静态文本,并且页面都很庞大,含有成千上万字节的文本。因此,Web应用开发者面临着一个问题:如何优雅地生成一个包含静态和动态数据的混合文本?除此之外,静态的文本实际上是由团队中的其他成员如前端工程师所编写的 HTML ,他们也希望能够用相近的方式来处理这些混合文本。

稗田千秋
Apr.16 2017 code

Python元编程 元类篇

前文 Python元编程 装饰器篇

这个问题是我重构博客后台时遇到的,在 constant.py 里创建了一个全局变量 CATEGORY,但是由于作用域的问题在引用时屡屡失败,最后便考虑使用单例类来作为存储结构,最先访问时会创建新实例,否则返回该实例。

0x00 什么是元类

首先,先来看看type的用法

> help(type)
Help on class type in module builtins:

class type(object)
 |  type(object_or_name, bases, dict)
 |  type(object) -> the object's type  # type(对象)
 |  type(name, bases, dict) -> a new type # type(类名, 父类元组,方法字典)
稗田千秋
Apr.10 2017 code

Python元编程 装饰器篇

最近在 readthedocs 上阅读 Python3-Cookbook 的中文版,深有收获。因为C++的TMP,一直对元编程有着敬而远之的态度,但是在用Python的过程中,却感到了元编程是一种切实的生产力工具。本文为元编程其一,专门介绍装饰器,类装饰器和元类日后再书。

0x00 装饰器能干什么

个人认为装饰器其实和 Monkey Patch 有异曲同工之妙,都可以给函数执行前后执行额外代码,而不必修改函数本身。

我们先来看一个简单的装饰器

def decorator(func):
    # 定义一个wrapper,对原始函数进行包装
    def wrapper():
        print("明明是我先来的...")
        func()  # 执行原始函数
    return wrapper  # 需要再返回这个wrapper这个包装函数,代码才能执行

@decorator
def wa():
    print("为什么会变成这样呢")

运行结果可以看到在 wa 函数运行前先执行了 wrapper 里在函数前写的的代码,其实装饰器的执行也可以写作

稗田千秋
Nov.28 2016 code

实现简单的OTP Generator

之前曾尝试给博客添加了一个 OTP 认证,不过是引用某第三方认证 API,经常会导致请求超时等不可料错误,于是就尝试寻找着在后端本地实现的方法,发现了 PyOTP 这个库,在浅读了源码以及相关文档之后初步了解了 OTP 实现的原理,所以记下来备份。

OTP

OTP(One Time Password,动态密码),一般用来实现双因子认证,通过特殊的构造和哈希,实现了“动态”的特性,可以有效防止重放攻击(Replay Attacks),大大增加暴力破解成本(虽然在被爆破的时候小站服务器肯定先挂了XD

主要的验证方式有两种,HOTP(HMAC-Based One-Time Password)和 TOTP(Time-Based One-Time Password),像常用的 Google authenticator,开启二步验证之后会给予一个二维码,用对应 APP 扫描一下即可得到六位验证码,当然此时若是使用二维码识别工具的话也能发现这个二维码其实就是一段 URI Scheme,诸如 otpauth://totp/Windless:i%40wind.moe?issuer=chiaki&secret=secretkey&algorithm=SHA256

注意到其中传递了密钥 secret 以及摘要算法类型,这样只要客户端与服务端的实现是一致的,就能保证在同一时间得出的 OTP 是一致的。

稗田千秋
Nov.15 2016 code

使用 Git Hooks 实现自动化部署

秉着御繁以简的原则,在参考了多种部署方式后,在 Windless 上最后选用了 Git Hooks 自动部署,解放了繁琐的操作,不必每一次提交都去服务端执行 git pull,不但慢且费时费力.

Git Hooks 字面上看就是 Git 提供的一种类似挂钩的工具,其实我更愿意称其为触发器(WE 后遗症,在特定的时机执行对应脚本.

下面是 Windless 的配置手札

稗田千秋
Nov.11 2016 code

原生JS拖拽实现

这两天更新了音乐面板,懒得使用@media查询来适配分辨率,于是便想起了拖拽这个方法,鉴于以前实现过,便记下来水一篇(×,记得点击右上的音乐按钮然后随意玩耍哦~(雾

Update 2017-04-05 音乐面板已移动至右下角的菜单按钮中。

基本逻辑

function drag(obj){
    //鼠标按下 开始计算相对位置
    document.onmousedown = function(e){
        var oEvent = e,
        disX = oEvent.clientY - obj.offsetLeft;
        disY = oEvent.clientY - obj.offsetTop;
        //鼠标拖动 计算拖动距离并进行拖拽
        document.onmousemove = function(e) {
            var oEvent = e;
            left = oEvent.clientX - disX,
            top = oEvent.clientY - disY;
            obj.style.left = left + 'px';
            obj.style.top = top + 'px';
        },
        //鼠标松开 结束拖放
        document.onmouseup = function(e) {
            document.onmousemove = null;
            document.onmouseup = null;
        }
    }
}
稗田千秋
Feb.10 2016 code

GnuPG使用笔记

GNU Privacy Guard(GnuPG或GPG)是一个非对称加密软件,常用于个人加密或签名,为了取代商用的PGP软件而遵循GPL协议开发。目前有1.x和2.x两个分支,本文仅介绍2.x分支,二者共通。

非对称加密

非对称加密(Asymmetric Cryptography),也称公开密钥加密(Public-Key Cryptography,公钥加密),是一种密码学类型,解决了"双方如何在不预先交换信息的情况下进行安全通信"的问题。

在这种加密方法中,需要一对密钥,这两个密钥数学相关,公开的密钥称为公钥,不公开的则称为私钥,简单来说就是公钥加密信息,私钥解密信息,比如要对某个人发送加密信息,首先得到对方的公钥对信息进行加密,将密文发给对方,对方再用私钥解密即可得到你要发送的信息。

常见公钥加密算法:RSA / ElGamal / ECC 等

56iX55Sw5Y2D56eL
Feb.01 2016 code
  • play_arrow

About this site

version:1.02 Alpha
博客主题: Lime
联系方式: i@wind.moe
写作语言: zh_CN & en_US
博客遵循 CC BY-NC-SA 4.0许可进行创作

此外,本博客会基于访客的Request Headers记录部分匿名数据用于统计(Logger的源码见Github),包含Referer, User-Agent & IP Address.个人绝不会主动将数据泄露给第三方