Docker 第二课 - 部署

部署 目前有两种常见方式可以把你的镜像部署到服务器上 第一种,使用 Docker Hub 从你的 Github 获取代码并依据 Dockerfile 在云端编译镜像,很多云服务商也会有这个服务。 第二种,将镜像保存到本地,手动上传到服务器上并载入。 Docker Hub 进行云端构建 第一种比较简单,登陆 https://hub.docker.com/ 使用 Create -> Create Automated Build 选择你的代码仓库即可,每次

  • Kevin Zhow
    Kevin Zhow
2 min read

Docker 第一课 - 构建你的容器

前置阅读 用 Swift 的框架 Vapor 写服务器这事儿怎么样? 使用 ngrok 将 localhost 发布到网上 使用 Swift 和 Vapor 写一个 Telegram 机器人 什么是 Docker? 让部署 Server 像手机安装 App 一样简单 过去当你写完了 Server 想要部署到服务器上,需要在服务器上配置一套运行环境,一旦服务器上环境配置失败,还可能出现整个服务挂掉的情况。 Docker 正是用

  • Kevin Zhow
    Kevin Zhow
9 min read

使用 Swift 和 Vapor 写一个 Telegram 机器人

前置阅读 用 Swift 的框架 Vapor 写服务器这事儿怎么样? 使用 ngrok 将 localhost 发布到网上 什么是 Telegram Bot? Telegram Bot 通过在聊天界面里交谈来提供服务 如果你只是想提供一个核心服务(或者测试一个产品想法),开发那么 Bot 很适合。 如何创建一个 Bot 因为不需要经过国内复杂的审核备案,创建一个 Telegram Bot 简单的令人发指。 在 Telegram 里添加 @botfather

  • Kevin Zhow
    Kevin Zhow
4 min read

使用 ngrok 将 localhost 发布到网上

在上一篇博文里,用 Swift 的框架 Vapor 写服务器 我们写了个简易的服务器,那么如何才能让别人能够访问到你呢? 传统一点来说,可以在你家里的路由器上设置下端口转发,但这个太麻烦了,ngrok 这项服务可以一条命令这个问题。 安装 ngrok 如果你没有安装 homebrew 你可以按照官网上的指南安装,但如果有 homebrew,这件事就变得超级简单了。 brew cask install ngrok 安装完成后,去 官网 注册个账号,你可以在 Auth 页面找到授权令牌。使用下面的命令,

  • Kevin Zhow
    Kevin Zhow
1 min read

用 Swift 的框架 Vapor 写服务器这事儿怎么样?

基石 就 Swift 写服务器这件事来说,需要一个非常现实的理由为什么用 Swift, 不然 Python Ruby Go 随便抓一个,可能都好上一百倍。 “快”并不是第一因,真的在生产环境跑起来,往往数据库的 IO 才是第一瓶颈。为了解答自己的这个疑惑,我研究了一番 Vapor 的实现方式。 在 HTTP+Server.swift 这个文件里,能看到服务器处理请求的方式 private let queue = DispatchQueue(label:

  • Kevin Zhow
    Kevin Zhow
6 min read

打造一个更流畅的 iOS App (上)

这篇文章应该是欠了很久了,本来应该是……半年前写的文章,不过还好我最终还是找时间写下来了。 在开始聊技术之前,我们可以先探讨一个问题,就是为什么要打造流畅的 App 体验? 流畅的体验意味着优秀的用户体验,技术的本质是为人类服务,脱离了为人类服务,再高超的技术,算法,工程都不具备价值。 因此,我所理解的技术的觉悟有以下三个 技术即服务 将优秀的产品交付给用户,让生活变得更美好 深入技术的细节,获得条理清晰的美感 总之就是让世界充满爱。 下面这张图,列出了最容易遇到性能问题的两部分,第一部分是用户直接打交道的界面层,另外一部分是数据层。 Layout Layout 有一些常见的 Case 和盲点,这个在

  • Kevin Zhow
    Kevin Zhow
7 min read
iOS

使用 CocoaPods 进行团队协作

让程序流畅稳健的运行是开发者们的理想,这个理想时而遥远,时而近在咫尺。而往往那个触手可及的时刻,却正是梦碎的边缘。 在团队协作中,修改别人的代码是一件像扫雷游戏一样的事情,你永远不知道你做的到底是 “优化” 还是 “触雷”。 使用 Cocoapods 将不同的功能进行切割,独立成模块再整合进 App,成为了一个行之有效的方法,本文就来一起研究一下如何使用 CocoaPods 来进行组件模块化。 创建自己的 Pod 以 RichTextView 为例,完成类库的功能后的第一件事就是创建 RichTextView 的 podspec 描述文件 进入项目的根目录 pod spec

  • Kevin Zhow
    Kevin Zhow
3 min read
Design

UI 设计入门视频教程合辑

这一部分整理自 《给女朋友的 iOS 开发视频教程》 里的前三章 Design 在 Design 章节,我们一起通过拯救糟糕的设计,来寻找设计的感觉。 Design An App 在 Design An App 章节,我们一起来研究一下一款 App 是如何被设计出来的。 Design Lolita 这一章我们一起使用 Sketch 来设计 Lolita,一起来探索下 Sketch 的神奇世界吧! 如果你对接下来的内容兴趣盎然,那么不妨查看

  • Kevin Zhow
    Kevin Zhow
1 min read
iOS

15 分钟带你入门 Fuse

Fuse 这个技术令人兴奋,不仅可以用来做交互原型,还可以导出成 iOS 和 Android 的原生 App 供生产使用,重点的重点在于输出的成品品质不错,所以私以为值得学习一下 (官方也表示以后会支持导出 Mac,Linux,Windows App)。 我们来通过一张图了解一下 Fuse 做了什么。 所以 Fuse 是一种和 Qt 类似的技术,通过一个中间层封装系统的 API 来实现 “一次编写,到处调试” 的伟大理想。 但是没有了 Qt

  • Kevin Zhow
    Kevin Zhow
8 min read
iOS

通过 Kingfisher Extension 自定义图片处理

惯例先上源码:GitHub源码 对Kingfisher进行了简单的封装, 好处: 1. 在用`pod`管理依赖的情况下,不需要到处`import Kingfisher`。 2. 代码较为集中,方便管理。若以后需要替换`Kingfisher`也很方便。 还可以很集中地添加默认值,在我自己的项目中,全部图片都是默认 let defaultOptions: KingfisherOptionsInfo = [ .Options([.BackgroundDecode, .LowPriority]), .Transition(ImageTransition.Fade(0.55)) ] 如果需要对Kingfisher下载下来的图片需要作特殊处理,例如作圆角处理,

  • Limon
    Limon
1 min read
iOS

MDHTMLLabel —— 轻量级 HTML 文本的解决方案

对于复杂的文本格式,后端同学给你的往往会是 HTML,而 iOS 除了 WebView 和一个巨卡无比的 TextView 渲染方案,并没有别的选择。 上一期 使用 TextKit 定制全功能的 TextView,我们使用了 TextKit 以及正则匹配的方法实现了对特定格式的文本解析。 MDHTMLLabel 则是基于 CoreText 用正则对 HTML 进行了解析,实现了一个轻量级的方案,项目代码使用 Objective-C 编写,支持 Swift 项目调用。 MDHTMLLabel

  • Kevin Zhow
    Kevin Zhow
1 min read
textview

使用 TextKit 定制全功能的 TextView —— RichTextView

在 iOS 7 之后,苹果提供了 TextKit 方便我们去定制文本的显示方式,虽然不如 CoreText 用起来可控性高(超强方案你可以查看此 YYText 这个类库),但是已经可以完成绝大部分你可能用到的定制。 如果你只是需要某一部分特性,不妨自己动手来完成,RichTextView 有以下特性 Mention HashTag URL Email Image Custom Placeholder Interaction Delegate 支持多种常见类型,自定义类型的检测,插入图像,交互事件和文字样式的定制,那么接下来一起看下基本的实现原理。 自定义

  • Kevin Zhow
    Kevin Zhow
2 min read

优雅地自定义XibView

好习惯,先上源码。 先创建一个UIView文件和一个Xib文件,在Xib文件里设置如下, 在UIView文件中,不是用-awakeFromNib()作为构造器,而是正常的-init(frame: CGRect)。 override init(frame: CGRect) { super.init(frame: frame) xibSetup() } 而-xibSetup()才是关键,具体可看源码。 如果需要UIView和Xib文件建立控件属性关联,是设置Xib文件的File`s Owner,而不是设置View的Custom Class。 设置了File`s Owner就可以像往常一样拖线了。 如果想在Main.storyboard文件中直接使用此Xib,

  • Limon
    Limon
1 min read
iOS

iOS App 的内存释放问题

循环引用 这个是非常常见的一个问题,你可以从这里获取我们的演示 Demo 例如我们创建了一个 BadGuy() 功能只有一个,可以存一个闭包。 class BadGuy: NSObject { var holdAction: (() -> Void)? } 然后我们从外层 ViewController 通过 Push 的方法进入 DetailViewController,DetailViewController 里创建了 10000 个 UIView 来占用些内存,badGuy 通过闭包修改了下 DetailViewController 的 hello

  • Kevin Zhow
    Kevin Zhow
2 min read