- 博客(180)
- 资源 (49)
- 收藏
- 关注
原创 AI 大模型微调实践
这样我们就得到了微调之后的模型了,huggingface 上还有很多模型和数据,可以选择我们需要的数据进行微调就能得到我们所需要的模型了。
2024-12-18 14:30:47
1029
原创 让 AI 帮忙做 code review
我们平时的工作当中合并代码的时候都需要进行 code review,很多工具都能帮助我们自动进行代码审查,但一般都只能够进行代码格式和代码风格的检查,一些简单的逻辑就没有办法了。让 AI 帮助我们检查代码的风格或者逻辑漏洞,并给出建议,最后再让相关的人确认,听起来这似乎是可行的。这里我是用的是 lobe-chat,可以很方便的测试各种 AI 大模型,并且还可以在本地开启一个服务接口,通过 http 的方式和大模型进行交互。top_p:控制采样策略,较高的 top_p 会让模型选择更多样的词语。
2024-11-26 16:14:29
1487
1
原创 利用飞书多维表格自动发布版本
飞书的多维表格有自动化的能力,我们每周只需要设定好版本发布的时间,可以让其自动触发版本发布,并在群里通知所有人。那么假定我们每隔10分钟获取一次,除非在发版前10分钟内修改发版计划,否则都能感知到版本计划的变更,出现上述问题的概率就大大降低,但是一直轮询,大量的网络请求其实都是无效的,而且也没有利用到飞书的自动化能力。我们在飞书表格当中设定好发版车型,版本号,时间等一系列参数之后,可以在内网的服务器开启一个轮询,不断的从飞书表格当中获取这些值,到了设定好的时间之后,就在内网触发流水线进行版本发布。
2024-11-14 17:13:59
1056
原创 愉快的跨进程渲染方式
此外,每个客户端都会创建一个 RemoteCall 对象,在服务绑定之后,将其作为参数传递给服务端,这样服务端就可以通过这个对象主动给客户端发送消息了。可以看到无论是客户端还是服务端,提供的接口都是比较简单的,客户端只需要在创建 RemoteView 之后调用 start 接口,就会触发绑定服务,然后就可以调用 sendMsg 和服务端进行通信了。,这只是个 demo,实际使用过程当中还需要解决服务端和客户端之间的通信问题,因此决定将其封装一下,做成一个独立的模块。在服务端创建一个 view,如下所示。
2024-10-21 15:57:16
990
原创 利用流水线实现版本一键发布
这样我们就可以实现版本一键发布,并让通知更加友好,包打出来之后,测试同学可以直接在群里面看到消息,并开始测试,不需要互相通知。
2024-08-30 17:39:44
864
原创 sdk 动态加载实践
这样我们就实现了 sdk 远程加载的方式进行初始化。每个业务只需要引用一个壳工程,每次只需要服务进程更新即可,避免业务需要频繁更新 sdk 版本的问题和版本不一致的问题。
2024-08-29 17:22:21
989
原创 用git指令别名,解决unity环境问题
unity 项目开发时,由于我本机的配置和项目组其他小伙伴的配置不一样,使用统一的配置打开项目会出现花屏的现象,经过摸索尝试,需要修改 unity 的Project Settings。修改之后,项目文件会有变更,若是提交,其他小伙伴 pull 之后会导致他们的工程不可用。git 指令支持 hook,我只需要每次切换分支前将 ProjectSettings 还原,切换分支后再修改 ProjectSettings 文件,并重新设置本地忽略 ProjectSettings 文件的变更,就可以实现我想要的功能。
2024-08-21 10:45:58
593
原创 Android跨进程渲染
以下是服务端的代码示例,服务端收到客户端传递过来的 displayId,hostToken,width 和 height 之后,创建 SurfaceControlViewHost,然后创建一个 view 给到 SurfaceControlViewHost ,接着将 surfacePackage 传递给客户端。在一些 3d 的应用场景,当多个应用需要显示时,就可以使用跨进程渲染,这样做的好处就是,客户端进程比较轻量,无需每个客户端都引入 3d 引擎,减少包大小,减少内存占用。
2024-01-04 11:37:35
1638
原创 使用docker创建自己的Android编译容器
每次拿到新机器或者系统重装,最麻烦的就是各种环境配置,最近学习了一下docker的知识,用dockerfile创建一个Android编译容器,这样就不用每次都吭哧吭哧的配置各种环境,至少编译可以方便点,开发环境还是得手动配的。需要注意的是,RUN和COPY指令都会增加容器的层级,所以我们尽可能的将可以合并的指令通过 && 连接起来,以此来减少容器的层级,减少容器的大小。再clone一个工程,尝试编译,发现能够编译成功。我们用这个镜像创建一个容器,并进入到这个容器中。发现已经有java的环境变量了。
2023-12-22 10:29:01
1935
1
原创 机器学习入门笔记
其中,sklearn集成了常见的一些机器学习的算法,可以让我们直接调用,https://www.scikitlearn.com.cn/。anaconda可以帮助我们创造虚拟的python环境,并在环境当中安装各种所需要的包,而且每个虚拟环境都是互相独立的,非常方便。其中data就是影响房价的因素,如当地的犯罪率,房屋年龄,房屋间数,和就业中心的距离等等,target就是房价。我们需要将原始的数据集拆分成训练集和测试集,这里是三七分,当然拆分的比例我们可以自定义。最近学习了一些关于机器学习的内容,做个笔记。
2023-12-10 12:59:28
298
原创 MVI的模板代码分享
从 mvc 到 mvp,mvvm 再到 mvi,目的是让代码结构更清晰,更容易维护。我们在进行一些逻辑运算之后,会获取到各种数据,然后将这些数据封装成 uistate。将 view 的一些操作封装各种 Intent。例如,以下是登录界面的各种意图。例如,登录界面的各种状态。
2023-04-20 16:41:02
506
原创 kotlin的一些标准函数
kotlin的标准函数有 run,let,with 等等,平时用的时候没有太在意他们之间的差异,现在来总结对比一下。返回自己,和 apply 标准函数一样返回自己,只不过 apply 提供的是 this 上下文。平时比较常用到的有 map,reduce,filter,flatMap 等。最后一行代码作为返回值,功能和 with 一样,只不过调用方式有差异。输出:[Apple, Tree, Hello, World]输出:[1, 2, 3, 4, 5, 6, 7, 8, 9]包括 let,also。
2023-04-13 16:39:45
596
原创 第三方登录踩坑记录
最近做了注册登录的功能,其中涉及到第三方登录,就是通过 QQ 或微信或 FaceBook 等的账号进行登录。这种通过第三方的账号进行登录的逻辑都差不多,就是通过第三方的 sdk 拿到对应的 token,然后再用 token 向自己的业务后台进行注册,后台可以通过 token 获取到第三方平台的用户信息。
2023-03-26 15:47:34
273
原创 多语言解决方案
多语言是一个比较麻烦的事情,特别是当 App 比较大的时候,还会涉及到多个部门的开发以及翻译人员,这中间可能会存在比较大的沟通成本,而且还可能会阻塞开发的进度。以下是我们在具体开发过程当中使用的一个方案,通过管理端+流水线自动同步的方式来解决。
2023-02-23 11:30:31
1540
原创 效率提升的好物分享
作为一个程序员,平时的工作已经非常的繁忙,加班更是家常便饭,如何提升效率,将有限的精力放在更重要的事情上,让自己少加班,是需要我们持续关注和思考的。以下是博主在平时工作当中总结出,能够帮助我们提升工作效率的好物,希望能够帮助大家早点下班。
2022-08-20 13:41:50
2673
原创 sdk开发经验总结
文章目录1. 降低接入成本1.1 接入简单1.2 文档和 demo1.3 api接口设计1. 接口保持精简,不要提供过多的接口2. 每个接口均应当提供详细的接口说明3. 接口参数不应过多4. 接口方法过多,应当提供默认实现5. 接口尽可能和系统或者业内标准保持一致1.4 向后兼容2.稳定性2.1 plan B2.2 监控2.3 错误指引3.其他3.1 易扩展3.2 关注性能3.3 鉴权3.4 合规3.5 sdk接入标准化4. 总结博主之前做过一些 sdk 的开发,也对接过一些 sdk ,有一些 sdk 设
2022-04-26 23:32:43
9757
1
原创 使用协成将异步转同步
最近学习了一下kotlin的协成,发现使用协成能够帮助我们将异步代码转换成同步代码,能够极大的提高代码的可读性。1.普通的异步写法如下所示,为我们常见的一些异步代码,通常情况下,我们会传递一个callback到方法里面,等到异步代码执行完毕之后回调回来。public fun realRequest(response: Callback) { Thread(Runnable { println("start request:" + address) Thread.
2022-03-31 19:16:23
7320
原创 kotlin的属性代理
今天学习了一下kotlin的属性代理,觉的挺有趣的,借助属性代理我们可以实现一些有意思的功能。基本语法class Student{ var name: String by Delegate()}class Delegate{ operator fun <T> getValue(thisRef: Any?, property: KProperty<*>): T{ ... } operator fun <T> setV
2022-03-01 23:24:37
2836
原创 应对隐私检测的各种姿势
文章目录背景隐私检测的流程流程 1.0流程 2.0流程 3.0应对隐私检测的各种姿势1. 提前获取数据和获取频率2. 权限问题3. sdk问题反编译终极大招总结背景去年11月,我们团队就已经宣布解散,但是由于隐私监管的问题,我们还得维护最后一个版本,满足隐私监管的要求。我们团队的隐私问题主要是由我来负责,回想起这一年,真是被各种隐私问题折腾得死去活来,所幸最后一个版本终于上线了,现针对隐私问题总结一下各种应对的方法。隐私检测的流程流程 1.0在刚开始被要求隐私检测的时候,我们的流程是这样
2022-01-28 11:51:34
4563
原创 Lambda 表达式是否会造成内存泄漏
背景匿名内部类 VS Lambda 表达式匿名内部类Lambda 表达式结论背景匿名内部类会持有外部类的引用,因此有造成内存泄漏的风险;那么Lambda 表达式是否会造成内存泄漏呢?匿名内部类 VS Lambda 表达式我们新建一个类TestInner,其中test方法里面包含一个Lambda表达式,test1方法里面包含一个匿名内部类public class TestInner { public void test(){ new Thread(()->{ .
2022-01-17 10:15:31
6409
原创 徒手撸一个gradle插件
1.准备工作1.1创建一个Android module1.2准备maven环境2.实现插件2.1实现插件类2.2编辑properties文件2.3发布插件3.应用插件3.1引入插件3.2应用插件1.准备工作使用java开发gradle插件,基于gradle7.0版本开发,所以一些gradle的API针对低版本已经发生了变化。1.1创建一个Android module创建Android模块GradlePlugin,删除掉res和androidTest这两个目录,在main目录下创建resource.
2022-01-08 13:08:52
1477
原创 反编译更改jar包代码
背景实现步骤1.新建工程,将jar包引入,打包成apk2.使用apktool,将apk转换成smali文件3.找到对应的位置,修改smali代码4.将修改完成的工程,使用apktool将smali打包成dex5.将dex转换成为jar包6.从jar包当中找到对应的class文件,解压,并存放在对应的目录当中7.使用zip -u命令更新原来的jar包背景在某些特殊的场景,我们需要将jar包反编译然后修改里面的源码来实现我们自己的功能。博主前段时间就遇到了这样的问题。由于隐私监控越来越严格,博主所在的部.
2022-01-08 12:34:49
2814
1
原创 JNI绑定实践
目录背景静态注册1.引入so文件和native方法2.编译生成jni头文件3.实现jni方法4.实现CMakeLists.txt动态注册1.定义对应交互的java方法2.引入c++代码和CMakeLists.txt文件3.编辑c++文件4.实现CMakeLists.txt背景博主之前做的日志组件的结构是java和c++相结合实现。将日志的加密,压缩,文件写入等对性能比较敏感的模块放在c++层实现,而将日志的格式化,日志脱敏等功能放在java层实现。这就会涉及到java和c++的交互,即jni。jni注
2022-01-08 11:35:11
668
原创 活动发布插件化实践
背景开心鼠是一个以内容为主的App,新活动的发布非常频繁。1.活动发布的成本高活动跟版发布,则用户需要频繁的更新App才能够体验最新的活动。App上架,会受到应用市场的制约。2.使用热更新的方式发布活动,风险大热更新的影响范围为整个App。3.App包越来越大随着活动越来越多,如果所有的活动均打包到App里面,那么App的体积会越来越大。根据Cocos的官方文档,从2.4.5版本,Cocos开始支持AssetBundle,能够让我们将某个模块独立出来,以插件的方式加载。所以我们想到,将所
2021-11-25 12:03:40
394
原创 简化Cocos和Native交互利器
背景我们在使用 Cocos 和 Native 进行交互的时候,发现体验并不是特别的友好。如下所示,为我们项目当中的一段代码(代码已脱敏),当检测到发生了 js 异常,我们需要通知 Native 端去做一些处理。jsException: function (scence, msg, stack) { if (cc.sys.isNative && cc.sys.os === cc.sys.OS_ANDROID) { jsb.reflection.callStatic
2021-11-15 11:25:54
1203
原创 Cocos热更新的非官方解决方案
背景Cocos 官方提供了一套热更新的解决方案,但我们认为这套方案在以下方面不能完全适合我们的需求:必须要在 Cocos 引擎启动之后才能够开始热更新流程,而我们有些业务场景需要支持在 Cocos 引擎未启动的时候就能够开始热更新流程;文件下载效率低,官方提供的方案是在客户端本地对比本地的文件 manifest 和服务端的文件 manifest,找出其中的差异,然后再将差异的文件下载下来,并逐个校验,效率较低;没有回退兜底策略,若本地进行热更新之后出现异常导致用户无法使用,无法回退到上一个版本;
2021-11-15 11:05:02
871
原创 安全高效可视化的日志解决方案
背景一条工单引发的日志需求我们的业务收到了一个信息泄漏的工单,漏洞是明文打印日志。我们当时使用的是某网络库自带的日志系统(以下简称 A 系统),会直接将明文写入到了日志文件当中,这样就有信息泄漏的风险。我们搜集了当前使用 A 系统的痛点:明文打印,造成隐私泄漏;关键日志丢失;无法方便的打印当前的堆栈,线程等信息;不支持各种格式化输出。为了解决这个问题,我们设计并实现了 TinyLog。TinyLog 能支持日志的加密和压缩,减少日志文件大小并确保隐私不会泄漏;能够支持各种格式化输出,
2021-11-15 10:44:08
747
原创 一个轻量级的任务执行组件
之前做启动优化的时候,把各种任务单独拎出来,做成一个组建,然后根据任务的优先级以及依赖顺序去执行.源码见:https://github.com/huangbei1990/HDemo整个模块主要分成以下四个部分.1.tasktask设置了四个优先级,具体如下所示,不同优先级的task会有不同的执行逻辑.public enum Priority { Immediately,//放入缓存线程池执行 Normal,//放入线程池执行 Idle,//cpu空闲时执行 Main
2020-12-09 17:26:11
230
原创 mock简单使用
最近楼主在做一个sdk,和后台进行协同开发,依赖于后台实现的接口,在开发之前先和后台约定好了接口,然后在开发的过程中可以先mock这个接口,这样就不会阻塞开发的流程.等后台开发好了之后,再一起联调就可以了.1.引入implementation 'org.mockito:mockito-core:1.10.19'implementation 'com.crittercism.dexmaker:dexmaker:1.4'implementation "com.crittercism.dexmaker:d
2020-12-04 10:47:18
731
原创 Android项目模块化最优配置
随着Android项目越来越大,每个项目都会分成各个小模块方便管理,而每个模块都有各自的编译配置,因此统一配置是需要考虑的一个问题.以下是我比较喜欢的一种配置方式.随着Android项目越来越大,每个项目都会分成各个小模块方便管理,而每个模块都有各自的编译配置,因此统一配置是需要考虑的一个问题.以下是我比较喜欢的一种配置方式.1.在根目录新建config.gradle文件.内容如下,其中ext是gradle提供的一个ExtensionAware类型的属性,本质是一个map.ext.config =
2020-11-08 21:15:26
293
Android虚拟ble设备源码
2017-07-11
threadfactory线程池
2017-06-25
vc++编程资料.chm
2010-04-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人