微信小程序使用 OpenCV.js 开发
由于微信小程序限制,无法直接使用 OpenCV.js 进行图形识别处理,需要使用 WebAssmbly 技术进行环境搭建。参考网上资料进行尝试。
准备工作更新好微信小程序开发工具,以及下载 OpenCV 官网最新代码,配置 WebAssmbly 需要的使用 emsdk。编译 OpenCV 需要的 python 和 cmake 环境。
编译 OpenCV.js编译工作参考了 https://c4ys.com/archives/2845 这篇 bolg 的方法。可以针对自身需求对 OpenCV 功能进行调整。
修改 opencv_js.config.py/build_js.py 文件为方便单独配置微信小程序所需要 OpenCV 库文件,复制 platforms/js/opencv_js.config.py 文件并更改名称为 opencv_wx_js.config.py。原始文件是包含 OpenCV 所有功能,根据开发需求选择需要的功能方法。修改最后一行配置内容
12# white_list = makeWhiteList([core, imgproc, objdetect, video, ...
《会说的人运气都不会太差》读书笔记
1好好说话。
“照顾对方感受”,“倾听能力”和“表达能力”是言谈的三大基础。
黑苹果 Monterey 安装
为了实现自己安装黑苹果,特意将之前的 AMD 2600x 和 x470 主板换掉,更换了成了 Intel 的 i7-10700 CPU 和 b560m 主板。参考国光的配置和博客,经过一周的学习和尝试,终于成功了安装了 Monterey 系统。在此记录下遇到的问题以及解决办法。
配置我使用的配置如图:
配置
型号
CPU
Intel I7 10700
主板
微星 B560M 迫击炮(无 WiFi)
内存
枭鲸 3200 16G * 2
显卡
蓝宝石 RX 590 8 GB 超白金极光特别版
SSD
三星 970 Evo 500G
网卡
奋威 BCM94360CD 4 天线版本
配置是照着 国光博客 进行的选择,但是由于我想安装 Monterey 系统,所以使用的 OpenCore 的版本是 0.7.6,和博客里的 EFI 版本不同,我直接使用出现了一些问题,所以我单独进行的配置。
我配置的 EFI 地址
概览成功安装 12.1
Hackintool设备读取正常
驱动正常读取
独显核显也成功读取,支持硬件加速
USB 使用的是国光定制过的驱动,由于我 ...
黑苹果 10500 OpenCore 升级
Monterey 出来也已经有一段时间了,这次决定手动升级一下。之前是在淘宝花费 200 元进行安装的 Big Sur,使用的 OpenCore 也是 0.6.3 版本。虽然可以升级到 11.6.1 版本,但是无法继续升级到 Monterey 了,必须要更新 OpenCore 重新安装了。之前的准备工作就不再赘述,准备好了 U 盘以及镜像文件。重点在更新一下 EFI 文件。
配置我使用的配置如图:
配置
型号
CPU
Intel I5 10500
主板
Asrock B460m-ITX/AC
内存
枭鲸 2666 16G * 2
显卡
Radeon RX 580 4 GB
SSD
铠侠 RC10 500G
网卡
奋威 BCM94352Z
之前也是按照黑果小兵的长期维护配置清单中选择的配置进行购买,所以现在这套配置的 EFI 还是有人进行维护的。EFI 参照地址:https://github.com/ansonliao/Asrock-B460m-ITX-AC-OC-EFI
替换过程他的这套配置使用的是核显进行显示,处理了一下 dp 接口会黑屏的问题 ...
2020年末总结
2021 年的第一个日子马上就要过去了,猛然发现自己去年居然一点文字都没有留下。想写下些什么但是又不知从何写起。2020 年也是挺魔幻的一年,就在此记录下。
疫情就是今年最大的记忆点了吧,开年在家办公了一个月,年末的最后一天依旧也是在家办公,也是有始有终。
技术上今年的进步并不明显,OpenCV 的学习使用还是停留在比较基础层面。倒是 xib 的使用有了一些进步,感觉现在已经进入了舒适区,并不愿意学习新东西了,有些懒惰。今天也尝试学习了 AR 相关的内容,但是并不系统,所以效果也并不好。
2020 年买了很多视频课,但是却没有认真的看完。新的一年要努力把之前欠下的补上了。把欠下的书认真读完,买的视频课好好看看,今年要学会滑雪啊!
《亲密关系》读书笔记
“寻找真挚永恒的亲密关系,其实就是寻找自我。” ——克里斯多夫·孟今天开始读一下这本书,做一些思考和记录。
第一章 亲密关系的圣杯 几乎每个人都希望拥有很棒的亲密关系。只有了解到没断亲密关系的开始都是一段伟大的探索旅程时,我们才会明白其中的意义。我们希望从亲密关系中得到身、心、灵三方面渴望的东西。 我们当中很多人想要亲密关系,并且需要的并不是慰藉与陪伴,而是需要能鼓励我们超越自我的伴侣,我们追寻的是能够激发人生意义与方向,并在我们受到考验时,给予我们帮助的人机关系。这也就是“灵魂关系”。
2019年03月24日
第二章 月晕现象 月亮本身并不发光,它只是反射太阳的光。影星的私生活其实也像普通人一样有许多问题,但影迷们被绚丽的光彩所迷惑,把明星当神一样来崇拜。即使无数的丑闻让盲目崇拜的问题暴露出来,也不能改变人们崇拜偶像的问题。这就是“月晕现象”。 亲密关系的过程,一开始是相互吸引,然后一步步发展出浪漫的火花。人一旦坠入情网,难免会有过高的期望,以致最后会掉入幻灭的深渊。恐惧 ...
知乎回答“什么能力很重要,但大多数人却没有?”
什么能力很重要,但大多数人却没有?
用肉体操纵精神的能力;
训练感官的能力;
让自己突然变开心的能力;
用肉体操纵精神的能力“用精神操控肉体”,注定是要失败的。必须要学会,用肉体操控精神。比如读书,不管你多不愿意,有什么借口,你都可以选择让你的身体先坐下来,拿出书,翻开,然后开始读,读了一两分钟你会惊奇地发现,你竟然自己慢慢就读下去了。
其实人的身体和精神之间,往往存在很深入的“互相牵引”,而我们自己却很难意识到。
为什么要学会”用肉体控制/推动精神”,而不是相反?因为你的精神会在你还没行动前,就给你设置了一大堆障碍、想象出一百万种失败的场景把你吓尿。
训练感官的能力人的大脑总是倾向于以一个“整体感觉”来感觉、评价事物长此以往,我们自然很难抛开这些“整体感受”,而深入到事物的细节、构造里面去。训练感官、分解感受。
让自己突然变得开心的能力你需要做的是,回想一下能让你开心的、非常具体的事儿,或者,在你下次开心的时候,把你看到的东西,保留下来、记录下来,下次找一类的就可以。比较通用的,还是养点东西,花花草草、猫猫狗狗,都成;或者培养一个具体的爱好,烦心了就沉到这个爱好里面一会儿。
总之 ...
hexo 指令
记录 hexo 常用指令hexo 安装关于搭建和环境 npm 安装就不做过多说明,可以再官网上查到相内容。
创建文件1$ hexo new [layout] <title>
新建一篇文章。如果没有设置 layout 的话,默认使用 _config.yml 中的 default_layout 参数代替。如果标题包含空格的话,请使用引号括起来。
发布草稿$ hexo server启动服务器。默认情况下,访问网址为: http://localhost:4000/。
选项 描述-p, –port 重设端口-s, –static 只使用静态文件-l, –log 启动日记记录,使用覆盖记录格式
生产1$ hexo generate
生成静态文件。
选项
描述
-d, --deploy
文件生成后立即部署网站
-w, --watch
监视文件变动
该命令可以简写为
1$ hexo g
部署1$ hexo publish [layout] <filename>
该命令可以简写为:
1$ hexo d
git 相关git 校 ...
关于RestKit的使用
最新需要使用 RestKit 框架处理网络请求,查了一下资料发现网上的资料确实不多,但还是有人翻译了一些资料的,趁此机会学习一下吧。
服务器搭建使用 RestKit 框架,需要有一个支持 Restful 的网络接口,为了方便自己测试,我们可以自行搭建一个本地的 Restful 接口。方法不是很复杂可以参考 搭建 Restful 服务器。搭建成功后访问本地 3000 端口,访问 http://localhost:3000/posts/1 可以获得返回 json。
RestKit 文档关于使用 RestKit 的文章,可以参考这里,十分详细我们可以参考这里的介绍来使用。
集成 RestKit还是推荐使用 cocoapods 集成,方便管理。
创建解析 ModelRestKit 非常强大的功能就是能够对返回 json 进行映射处理。所以很多时候需要使用 RKObjectMapping 来管理映射对象。刚才已经成功搭建了自己的服务器,先访问一下看看 json 的格式,如下:
12345{ "id": 1, "title": "j ...
PopMenu提示框实现
在网上看到了一款实现效果不错的提示框,可以自定义提示框样式,设置提示框出现位置。决定看一下别人是如何实现的,了解下别人的实现思路。
实现效果效果如下图所示。使用起来也很简单,文档也有很仔细的说明,这里就无需在多做说明。
代码解读具体化还是看一下 PopMenu 是如何实现的。借鉴一下别人的实现思路。
初始化类型PopMenu 使用了两种方式进行实例化对象。第一种是用 Manager 创建单例对象,第二种是创建 Controller 进行使用。这里我们先研究下第一种实现方式。
1234567final public class PopMenuManager: NSObject { /// 默认的管理对象 public static let `default` = PopMenuManager() /// 放置 Action 数组 public var actions: [PopMenuAction] = [] ··· }
这种方式可以通过直接调用静态属性 default。创建对象,然后添加 actions 中的内容。可以清楚的看到 ac ...
Swift实现可编辑标签页
工作中遇到一个需要自定义的标签页,在网上找到了一个比较合适的 demo,可惜是以 Objective-C 实现的。就正好自己再用 swift 重写一下,也学习一下别人的思路。
SDTagsView这里 是原作者的 demo,他分别采用了 Label 和 CollectionView 两种实现方式。不过作者比较推荐第二种,我也只以 CollectionView 的方式实现。
目录结构因为我们这个 UI 控件可能需要在任意的 UIViewcontroller 中点击出现。所以我采用将这个控件同样以一个 UIViewcontroller 为承载。在需要的时候调用 present 弹出即可。目录结构如下:
实现 HUEditTagsViewControllerTagsViewController 作为一个 Controller,是放置 view 和相关数据的基本控件。我们需要在此定义好数据源和相关的 view。
123456789var myTagsArr: [String] = [] var moreTagsArr: [String] = [] private var data ...
fastlane自动打包脚本
Fastlane是麻省理工学院批准的开源项目,可以将Mac、iOS、android项目的自动打包、发布等一系列繁琐的任务自动化。
使用 fastlane 可以极大的节约打包上架的时间。
准备工作关于 fastlane 的安装初始化,就不做说明了,网上很容易搜索到。当环境搭建完成后,我们可以在自己的项目工程中会看到多出来一个 fastlane 的文件。关于打包的配置在这个文件夹里面都可以进行配置。
首先,我们需要使用 fastlane 来完成我们的打包工作,我们需要弄清楚我们脚本的工作流程,简单整理一下需求。
我们需要执行一个脚本,脚本填写我们的项目路径,输入我们想要修改的版本号。然后用时间戳设置项目的build号。在脚本的当前路径创建一个build文件夹,并且在里面创建一个 archive 文件夹用来放置 .xcarive 文件。在 build 文件夹下将打包出来的 ipa 文件放置在以自己 scheme 名命名的文件夹中。简单总结下:输入: 项目路径、版本号。生成:build 号、xcarchive 文件 和 ipa 文件。上传:自动上传 ipa 文件到 fir。
编写脚本创建 ...
使用 UIPresentationController 实现底部弹出页面
底部弹出框在项目中很常见,之前对此的理解很肤浅,不太明白如何更好的实现自定义的页面。刚好在 GitHub 看到有一中很简单的实现方式,是利用 UIPresentationController 和继承的方式实现。学习一下,自己再通过协议的方式实现下,加深自己的理解。
实现效果
实现 UIPresentationController关于 UIPresentationController 的描述,官网的说法是
An object that manages the transition animations and the presentation of view controllers onscreen.
简单点说就是管理两个 Controller 之间的转场动画。所以可以通过重写这个类来自定义想要的转场动画。首先创建一个类来继承 UIPresentationController,并重写一些必要的方法
1234567891011121314151617181920212223242526272829303132333435363738394041class HUPresentCont ...
Moya 使用
Swift 经常用 Alamofire 来做网络库,而 Moya 在 Alamofire 的基础上又封装了一层。Moya 是你的 app 中缺失的网络层。不用再去想在哪儿(或者如何)安放网络请求,Moya 替你管理。
安装配置由于我在项目使用了 CocoaPods,而且也使用了 RxSwift 这个框架,所以直接在在 Podfile 文件中添加 pod 'Moya/RxSwift' 即可。
创建 APIManagerMoya 官方用例文档讲解的很清晰,使用前我们需要创建一个枚举,作为网络请求的 API 请求分类。先创建一个 APIManager.swift 用来统一处理的网络请求。然后创建 APIManager 枚举,用来区分不同的请求接口。
123enum APIManager { case getNetWorkRegion ///> 判断国内国外 0---国外 1---中国}
实现 TargetType 协议接下来对这个 APIManager 进行拓展,并且让它遵循 TargetType 协议。这个协议是 Moya 为了方便创 ...
RxSwift 实现 UITableview
UITableView 在开发中是最常使用的控件,由于 UITableview 相对来说功能比较多,所以对应的方法也很多,实现操作起来比较繁琐。通过 RxSwift 可以简化实现 UITableview 的方法,让开发者更注重业务逻辑。
简单的实现方式创建一个没有额外 Section 的 Tableview 可以很容易的实现。思路就是通过 Observable 将数据逐个绑定到相应的 Cell 上。
12345var dataArray = Variable<[model]>([])struct Model { let title: String}
接下来就是创建一个将 Model 绑定到 Cell 上的闭包
123let setCell = {(i: Int, e: Model, c: TableViewCell) intruec.setupWithModel(e)}
准备工作都已经做完了,接下来就是最关键的绑定部分,通过 Observeable 的 bind 方法来实现:dataArray.asObservable().b ...
《函数式 Swift》读书笔记
函数在 Swift 中是一等公民,换句话说,函数可以作为参数被传递到其他函数,
也可以作为其他函数的返回值。函数式编程的核心理念就是函数是值。
函数式思想在 Swift 中计算和传递函数的方式与整形或布尔型没有任何不同。假设有一个 struct 包含 x 和 y 坐标:
1234struct Position { let x: Int let y: Int}
此时,定义一个 typealias,表示把 Position 转化为 bool 的函数。typealias Region = (Position) -> Bool。
接下来创建函数的返回值就可以是一个函数(Region)
123func circle(radius: Int) -> Region { return { loc in return loc.x < radius }}
其中
1234{ (参数) -> (返回值) in true(函数具体的操作)truereturn (返回值)&# ...
2017年末总结
忽然之间 2017 年就已经一去不复返了,这一年应该是从毕业以来感觉过的最快的一年了,虽然也才毕业没多久。这一年感觉发生了很多的事情,忽然就已经到了年末。开始试着总结一下今年的事情吧。
17年初,由于上家公司的裁员,便早早休了春节,也算是之前加了那么久的班给我发了一个很长的假,可惜没有工资(笑)。过年后也在成都找了一段时间的工作,不过还是没遇到合适的啊,看来 iOS 的行情还是很严峻啊。一个人在外地还是辛苦些,便有了想回家工作的想法,3月份就从成都回到了沈阳。和一起在成都租住的大学同学们也算正式告别了,再相聚可能就要等谁结婚了吧。
回到沈阳了还是感觉亲切些,毕竟这是我生活了20多年的地方。找工作倒也还算是顺利,虽然沈阳的公司确实挺少的,面试机会并不多,但好在还算找到了一个比较满意的公司。新公司并不是很忙碌,工作量也并不是很大,这正是我希望的。因为这样我就有时间去学习去思考新的技术,今年的收获还是蛮大的,公司因开发的项目可以使用 Swift,正好也学习了一下苹果新推出的开发语言。之前还是对 Swift 比较抵触的,觉得用好了 Objective-C 就可以了,完全没有必要去学习使用 S ...
《Swift 进阶》读书笔记
Swift 既是一门高层级语言,又是一门低层级语言。Swift 是一门多范式语言。
使用 Swift 也有一段时间了,这本书作为一门进阶用书写的十分优秀,翻译也十分浅显易懂。把学到内容作为笔记记录下来,也方便以后查看。
第一章 介绍这一章倒是并没有介绍太过深奥的内容,知识介绍了一些对 Swift 语言的整体印象,以及在使用过程中经常会遇到的术语,这些和其他编程语言都是通用的,就不一一列举出来了。就列出一些平常自己不知道的内容了。
在程序语言的论文里,== 有时候被称为结构相等,而 === 则被称为指针相等或者引用相等。
高阶函数:
如果一个函数接受别的函数作为参数,或者一个函数的返回值是函数,那么这样的函数就叫作高阶函数。
第二章 内建集合类型reduce运算符也是函数所以:let sum = fibs.reduce(0) { totle, num in totle + num}完全等价于let sum = fibs.reduce(0, +)reduce 的具体实现是:
123456789extension Array { func r ...
Swift协议拓展
很多时候都会对 UI 进行自定义设置,之前使用 Objective-C 的时候都是用分类来自定义方法,而 Swift 提供了拓展可以更方便的来处理。看过一篇关于 UI 链式编程的博客,发现实现思路很棒,这里来学习一下。
简单实现方式要对 UI 进行拓展可以直接使用 extension 添加自定的方法。但是这么做的话感觉不够帅气!
1234567891011121314extension UIView: ViewChainable { func adhere(_ toSupView: UIView) -> Self { toSupView.addSubview(self) return self } // 使用 @discardableResult 关键字可以让 XCode 忽略返回值警告 @discardableResult func layout(snapKitMaker: (ConstraintMaker) -> Void) -> Self { sel ...
MVVM 设计模式笔记
很早就听说过 MVVM 系统模式,但是都是一知半解的。这次就借助泊学网视频重新搭建一个查看天气的项目,系统的研究一下 MVVM 设计模式。
概述简易的画了一个 MVVM 设计图。整体流程如下,接下来将根据这个图进行设计。
准备工作搭建好项目 Sky,并准备好图片。准备好需要的数据接口,这里使用了 DarkSky 接口的。
UI搭建 (View)平时的项目很少都不会使用 StroyBoard,所以借着这个机会使用一下。文字不太好描述,这里直接贴图了。View 上的控件记得连接在 Controller 上!
Model创建这里偷懒直接用 CuteBaby 生成了我们需要的 Model 格式。注意处理好 Model 中嵌套的 struct 名称,尽量不要重名,防止将自己弄混。
ViewModel创建ViewModel 更多的是让 Controller 从数据处理中解放出来,所以在 Controller 文件夹中单独创建 ViewModels 文件夹,并且将相关代码文件放入其中。ViewModel 负责处理 Model 中传过来的数据。通过重写 set 方法将 Model 获取,并写好其他属 ...