我的35岁
我的35岁
35岁是一道坎,因为很多文章说程序员过了35岁就很容易失业了。
35岁真的是人生的一道坎,不只事业,其他方方面面也是。
有个词语叫三十而立,大家都说30岁是人生的一道坎,一个分界线。其实我认为35才是,特别是对于现代的我们。
三十岁确实也是一个分界线,很多事情都开始变得不一样,但是这个时候的人往往还没开始准备好的,或者还并未真正意识到它的不同。随着后面几年的经历,会慢慢变得不同,人的想法也慢慢经历一些转变,一些之前不会想的事情慢慢开始考虑了,一些从没经历的事情也都开始经历,各种压力随之而来,各种焦虑而不止。
我32,33岁第一次经历深夜无法入睡的焦虑,那是因为买房。时时刻刻的焦虑,有时候无法入睡。后来当我确定来买这套房子,叫了首付之后,我彻底睡了个安稳觉。
可是没有过一年我又开始焦虑,焦虑公司会倒闭我找不到好的工作。也开始焦虑自己的未来。后来我换到了这家公司后,才没那么焦虑了。但是未来仍然不算稳当。
所以,35岁思考的更多,家庭,事业,生活,健康。我现在觉得健康是如此之重要,什么叫中年人不敢生病。而且,我还有不少操心放不下的。最近一年来我经常半夜醒来睡不着。
35的我考虑了更多将来的事情,因为你现在不想 ...
comments
Read More
移动端文档边缘检测AI方案
移动端文档边缘检测AI方案
需求
先说一下我们的需求:
我们需要用户拿手机扫描自己的体检单,然后我们识别体检单的内容,结构化数据后存起来用。
这里面解决方案一般都是手机客户端拍一张照片上传到服务器识别。而这张照片的好处直接影响了服务器的识别准确率。如果照片里有掺杂这别的内容就更不好了,最好照片里只有文档内容。这里就使用到了边缘检测技术。
传统的边缘检测技术
在传统的边缘检测方案中,大部分都是采用OpenCV里的边缘检测算法。OpenCV库在图像处理和识别方面真是鼎鼎大名,运用十分广泛。OpenCV库里的用到的叫cany和findContours算法,而且cany还有好几个版本。但是这个算法也不完美,很容易识别错,因为现实的场景也很复杂。
HED算法方案
现在哪里都流行用AI算法来优化。我在网上找到了fengjian大神的文章。原来我很早的时候就看到他写的这篇文章。然后就按照他的方案来开干。我运行了他的demo,大致能得到满意的效果。但是他的文章很旧了,用到的TensorFlow还是很老版本,而且只开源了iOS版本。
经过我们的摸索,还有参考了别的一些demo,我终于把它移植到了TensorFlowLite,而且我还做了安卓的版本。这样两端的解决方案一致,可以运用到正式项目中。
当然,我们自己也做了很多优化,还有自己重新收集了一些我们场景的照片来训练新的模型。最终达到了不错的效果。
我把最初移植做的demo放到github上,给有需要的人参考。这里最大优势就是安卓和iOS的方案都有。
安卓版本
iOS版本
如果你觉得这篇文章有用,请打赏小钱喝杯咖啡 ...
comments
Read More
APP推送和APP换起技术方案探讨
APP推送和APP换起技术方案探讨
目标:
尽量将APP两端设计成统一的方案,减少服务器适配工作量,最好可扩展,能复用。
方案说明:
我们知道APP推送目的是将对用户有用的信息,主动推给APP,作为通知信息展示,用户通过点击通知进入APP相关页面。
这里只要涉及服务器端和APP端两个技术点:服务器推送什么样的信息过来,APP这边如何解析接收到的信息,打开相应的界面和解析数据。
服务器只有一个,所以尽量让服务器发送给两端的数据较为一致,这需要一开始就应该想好整个系统的设计方案。
安卓和iOS是两个完全不同的平台,相关技术栈也不一样。不过基本都要依赖厂商的通讯通道来个APP发通知:苹果有自己的APN通道,Google也有自己的通道,当然在中国,各个厂商有自己的通道。有很多第三方SDK都整合多家厂商的通道。我们使用了信鸽(腾讯云移动推送)的SDK。之所以选他家,主要是他们集成了主流的厂商,文档也还可以(以前他们有免费版)。
为了能拉起APP不同的界面,我们需要定义一套规则。iOS的方案比较固定,只能通过json参数,这是它系统框架决定的。而安卓就不太一样,不同的厂商支持不同的方式,APP存活状态和未启动状态也不太一样。不过有一个方案是所有情形都适用的:就是通过定义Activity的scheme方式。
scheme方式是一种URI,我们经常用的URL地址也是一种URI。URI在iOS或者安卓都经常使用来拉起页面。例如我们的APP主页可以定义URI为: wegene://com.wegene ...
comments
Read More
我的十年
我的十年
明天就是我工作十年时间了,真没想到时间过得这么快,完全不等你也不管你怎样。
工作轨迹
2010年5月底,我终于做完了毕业答辩。只休息了几天,我就拿着我的毕业答辩去公司报道。我第一家公司是叫国民技术,一家做芯片的公司。我去做芯片验证工程师。做了差不多一年,我觉得我还是做回我的老本行--软件开发。先是去了一家小公司工作学习,后来是去了迅雷,做了一年多想去创业就加入了一个初创公司。在初创公司待了差不多一年又回到迅雷。在迅雷又工作了3年半,后来被老领导挖去了一家人工智能创业公司。本想着抱大腿的,谁知公司风云突变,一年时间大家又各奔东西。我自己加入了现在的这家公司,一直到现在。十年时间,除了迅雷和现在这家公司待的时间长一些,其他的公司都只待了一年左右,也是挺感慨的。
得与失
回想这十年,我不算成功,也不算失败吧。除了第一年是做偏底层的东西,九年时间我都是做移动开发,在iOS和安卓端也算积累了算丰富的经验,也还算专注。刚开始的时候我自己还做了很多小应用,在移动手机爆发时代也通过广告赚了点零用钱。后来工作忙和谈恋爱就没怎么继续了。在管理方面有点小经验,在迅雷的时候短暂带过团队,在这个公司从零开始建立小团队和项目,也算开可以吧。
比较遗憾的是我没有做过后端开发。移动端局限还是太多,要想深入技术,还是后端开发比较好。希望以后能在这方面改善。
十年来也让我更认清了自己 ...
comments
Read More
《深度学习入门》读后感
《深度学习入门:基于Python的理论与实现》读后感
最近因为做一个功能要用到深度学习相关知识和TensorFlowLite,我决定认真的学一下深度学习的知识。以前总觉得AI太高大上,怕自己看不懂。但是这次做这个功能让我意识到,如果自己再不学习,过几年可能就太晚了。我估计三五年之后,AI会渗透到各行各业,连APP开发也需要掌握一些深度学习的知识。
先说一下我们APP做的这个功能:用相机扫描检验单(体检单),将检验单截图上传到服务器,服务器进行OCR识别,并将数据结构化,用于生成用户的基因报告。这里涉及到APP开发的部分是将相机中的检验单检测并裁剪出来,上传到服务器识别。这里识别和裁剪部分很重要。将检验单准确的裁剪出来,可以提升OCR准确率。如果随意拍了一张图片,除了检验单部分,可能还包含了其他杂乱的背景,甚至其他不相关的文字内容。所以只将检验单部分裁剪出来是很重要的。
如果采用传统的OpenCV边缘检测方法来在图片中来找检验单,效果不尽人意。但是如果采用深度学习的方式来找检验单,那就可以得到很好的效果。当然这也是我们从fengjian大神博客学到的。我们采用他的方法,自己准备了一批数据训练,得到一个模型。而我们APP的任务就是在手机上采用TensorFlowLite运行我们的模型来推断得到相关结果。
因为做这个功能,我了解了下TensorFlowlite,但是我们深度学习却是了解不多。所以我决定找本书来学习一下。网上查了下,《深度学习入门:基于Python的理论与实现》这本书挺受好评,问了下我同事,他也看过这书,说写得不错 ...
comments
Read More
探讨从H5页面拉起APP的技术方案和问题
探讨从H5页面拉起APP的技术方案和问题
从H5页面里拉起或叫唤起APP(APP需已经安装在手机上),有两种技术方案,一种通过HTTP链接(iOS叫 Universal Link,安卓叫APP Links技术)拉起技术,一种是通过自定义scheme拉起技术(也有叫深度链接deeplink的)。这两个技术适用不同的场景,也有不同的局限性。
一、通过HTTP链接拉起
要想通过HTTP(s)链接直接拉起APP,需要APP本身做一些配置和写一些代码实现,还需要在你网站服务器配置相关的json文件。例如配置服务器host,能打开页面的path等。有些了这些配置,苹果服务器或者谷歌的服务器验证了这些配置,就可以通过相关的HTTP链接来打开APP了
这里不管是iOS叫 Universal Link,还是安卓的APP Links,他们的技术方案是基本一样的,只是不同的平台稍微有些不一样的而已。基本规则是:
- 先按照要求生成一个配置文件,json格式的,里面包括了一些必要的信息,例如安卓的包名,apk签名等,iOS的appID,匹配URL的path
- 将配置文件放到你的网站根目录下的.wellknown目录下,让苹果或谷歌的服务器能从这里下载这个配置文件。这个文件是关键,因为苹果或谷歌要从你网站里拉取到这个配置文件。由于你的网站只有你自己有权限上传配置文件,从而保证了安全性。
- 在你的APP里配置相关网站host ...
comments
Read More
上传应用到苹果一直卡住验证中(authentication with the app store)问题解决
上传应用到苹果一直卡住验证中(authentication with the app store)问题解决
虽然最近因为新型冠状病毒导致的疫情一直在持续,我们都被迫在家办公。我们由于有一些紧急的改动需要发版,5号那天我们改好之后就准备上传APP审核。安卓APP上传到各个商店都还挺顺利,但是iOS的却遇到难题了,卡住了,卡在 正在验证APP - 正在通过App Store进行认证。
自从升级了xcode11后,我一般都用transporter来上传IPA。因为xcode上传有时候也很慢,但是transporter却是很快。但是这次transporter卡住了,一直在正在验证APP - 正在通过App Store进行认证状态。过了很久都不动,平时几分钟就搞定了。后面我尝试了各种方法,试过xcode上传,命令行xcrun上传,搭梯子上传,通过手机热点上传,让同事他们上传,各种方法。搞了两三天,才最终搞定,真的是太悲催。感觉苹果在这块做得真是太傻逼了。
- 方法一:transporter,xcode上传都是卡住,xcrun上传报错
- 方法二:搭梯子上传,transporter报错 ...
comments
Read More
2019年总结与2020年展望
2019年总结与2020年展望
2019年已经成为过去,而2020年刚开始就发生了不少事。。。。
2019年总结
工作
2019年我们团队做了不少事,上半年把所有PC版的功能都移植到了手机APP上,然后还采用了Flutter技术做了个POS机版本的APP。下半年我们做了很多新功能,下半年时间稍微充足了,没有怎么加过班,这是是好事。
一整年我们发了26个版本,平均不到半个月一个版本,迭代速度可以说是比较快了。
生活
下半年收房了,出现了一些意外的事。没想到小区旁边的地铁(地面的)没有做封闭处理,地铁经过时噪声非常大。当初我们买房子的时候,销售说地铁一定会封的。。。所以大家都进行维权,然后装修就被推迟了。维权最终没有结果,变成一个长期的事情。装修还得继续,拖了两个月后才开始装修。而且因为维权的事情,到时我老婆情绪波动很大,还过于劳累,本来已经怀孕了,但是最终没有保住。。。
生活就是这样,忽然来给你一个猛头一击,把你的计划全打乱。
我们下半年都是忙于装修。第一次装修总算体会到了“装修就是各种坑”。各种波折,终于也在2020年1月中把装修事情基本搞定了,只剩下几个电器未买。
初略总结一些坑吧:
- 要留足充分的时候来看合同,不管是装修合同还是买主材的一些合同。装修合同一般的套路就是故意漏掉一些边角的事情,到施工的后面增加,这是给他们增加收入的途径 ...
comments
Read More
AOP在移动开发中的应用
AOP在移动开发中的应用
下面是我在我们团队上的技术分享内容,从PPT里摘抄出来的,所有很多都是个提纲摘要
AOP简介
- AOP,Aspect Oriented Programming,面向切面编程
- 面向切面编程是一种通过横切关注点(Cross-cutting Concerns)分离来增强代码模块性的方法,它能够在不修改业务主体代码的情况下,对它添加额外的行为。
- 是对OOP的一种补充,是一种解耦的重要手段
AOP常用概念
- Join point:程序执行期间的一个点,表示方法的执行
- Pointcut: 切入点实际上也是从所有的连接点(Join point)挑选自己感兴趣的连接点的过程
- Aspect: 程序横向切割成若干的面,即Aspect.每个面被称为切面
- Advice: 某个特定连接点的某个方面采取的行动。不同类型的建议包括“周围(Around)”,“之前(Before)”和“之后(After)”建议
AOP实现原理
-
编译期间的静态织入,又称为编译时增强
-
运行期间的动态代理,又称为运行时增强
运行时AOP
comments
Read More
记一次WebView填坑过程--由换行符引发的血案
记一次WebView填坑过程--由换行符引发的血案
最近使用WebView掉坑了,然后艰难爬坑经历感触很深,写出来大家借鉴一下。
需求
我们有个网页需要用到很多js库,这些库比较大,而且基本上是不变的。为了提高性能,将这些网页和JS库放到本地,进行加载。变的数据从服务器获取,然后跟本地的HTML组装后显示。这种需求还是挺普遍的。
实现方式
由web的同事调试好HTML文件,他们把所有的HTML,js,css,image和资源一起打包给我们
我们把这些资源放到assets目录下(也可以专门在assets再建一个子目录来放)
采用Android自带的WebView来加载和显示这些网页。有两个方法loadUrl和loadDataWithBaseUrl方法。
1.loadUrl("file:///android_asset/xxxxxx.html")这种方式适合HTML不需要改变的情况,直接加载展示,省时省力
2.loadDataWithBaseUrl方式需要先把HTML内容现在到内存,然后再展示。这种方式可以随意修改HTML里的内容,修改好再交由WebView展示,灵活性强。
遇到的坑
测试的时候,我们遇到同一个HTML文件,通过loadUrl方式加载展示,没有任何问题。但是通过loadDataWithBaseUrl加载展示,HTML的内容死活展示不出来 ...
comments
Read More