自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(246)
  • 资源 (5)
  • 收藏
  • 关注

原创 nextjs上的DDD架构

nextjs的同仓开发能带来非常好的领域/限界上下文代码共享能力。再利用好factory和typedef,可以以领域为维度组织起一整套不论是DDD还是ts视角都很合理的架构。

2024-03-09 22:47:49 1051

原创 面向LLM的App架构——技术维度

LLM对于开发来说,当前情况下最大的贡献点在于非代码部分和最细节的代码部分。为了适配LLM的能力水平,流程需要识别出适合LLM的点,并且规范化输入输出,尽可能交给LLM;代码需要极限的拆解,让每一块代码都更聚焦;人需要增强cr能力和表达能力,充分利用好工具;IDE需要更好的集成和基于prompt的协作支持。

2023-12-23 11:37:44 1651

原创 面向LLM的App架构——业务维度

我认为的业务两个突出变化:LLM作为中心大脑来完成一个任务,成为流量分发核心,所有其他作为agent;UGL的真实落地,下一代互联网的真正到来。for LLM:LUI、端智能、动态化、特殊的编辑器for 分发:三方业务容器、微服务化for UGL:低码/流程编排。

2023-12-06 17:57:06 1306

原创 Stable Diffusion 预置提示词优化过程

对于这些预置词,是可以充分利用ChatGPT来辅助炼丹的。因为我比较老土,并没有图片质量自动评估的手段,所以不能完全自动化。这里会充分利用ChatGPT的知识和扩展能力。还有另一个套路是让用户的提示词过一遍LLM,把好SD prompt的规则填入到LLM中,让LLM补充内容。

2023-06-20 18:36:24 1991

原创 利用ChatGPT做Prompt自动优化

让普通人直接与ChatGPT对话以期得到良好结果是过分乐观到大可不必的。Prompt炼丹这件事是需要很好的自动化的。

2023-04-28 11:48:59 3620

原创 AutoGPT源码的17个收获

阅读完AutoGPT源码后,对openai的api有17个新的认知:

2023-04-20 09:54:45 652

原创 Android打包加速新知(2023-3)

对于一般性能的设备,官方的建议很多是反作用的。最新版的AGP 7 + Gradle 7 + jdk 11性能实际上是比 4 + 6 + 11 差的,主要是内存消耗明显增加,scan里的GC时间明显高JavaCompile.options.fork = true是负向的,主要体现在GC时间上,应该是fork后整体内存更吃紧了,预计IPC也有消耗JavaCompile.options.incremental = true是负向的(大模块改一行代码),原因未知。

2023-03-03 18:20:05 649

原创 sonar与指标解读

ios/android/flutter sonar配置填坑

2022-11-16 10:20:11 1422

原创 怎么保证一个传承几十年的项目可维护

面试有人问这个问题,并没有很系统化的回答了,越来越发现是个有意思的问题,来整理一下。

2021-12-31 12:45:21 278

原创 Object.wait和Thread.sleep源码

面试被问到了wait和sleep区别,才知道这种使用场景完全不同的东西还能问区别…不过,确实没看过这俩的源码,来看一下。解释器映射op的过程我这里看的是art源码,而非jvm源码。本人对bytecode到真正执行代码的映射暂无认知,经高人指点是所有的解释器实现是在interpreter目录中。入口是interpreter.cpp#EnterInterpreterFromInvoke -> Execute -> ExecuteSwitch -> interpreter_switch_i

2021-12-08 17:49:03 259

原创 跨语言通信——rn TurboModule

这是rn新架构下的通信方式,基于0.64代码梳理。整体看,仍然是基于跨语言interop能力额外搭建了一套通信方式。方法定义和绑定信道建立由于用到了jsi,信道建立过程是跨语言统一的。仍然是+method和TurboModuleRegistryturboModuleProxy->(jsi)TurboModuleBinding.cpp#jsProxy->TurboModuleBinding#getModule->TurboModuleManager#installJSIBind

2021-11-19 14:48:42 2254

原创 跨语言通信——rn BatchedBridge

这是rn最传统的通信方式,基于0.64代码梳理。整体看,仍然是基于跨语言interop能力额外搭建了一套通信方式。方法定义和绑定信道建立双端的接口定义是割裂的,并没有一个地方做唯一类型验证。js侧用了一个很奇怪(不熟悉js语法,别的语言没见过这个写法)的+method的方式定义方法,并传给TurboModuleRegistryTurboModuleRegistry#getEnforcing->requireModule->NativeModules.js->根方法,初始化N

2021-11-18 18:29:20 1903

原创 跨语言通信——dart::ffi

ffi是一个比一般通信更底层的机制,接近于jni或者jsi。主要用来做dart和c++的interop。方法定义和绑定dart call c++官方demo是:import 'dart:ffi'; // For FFIimport 'dart:io'; // For Platform.isXfinal DynamicLibrary nativeAddLib = Platform.isAndroid ? DynamicLibrary.open("libnative_add.so")

2021-11-16 18:11:43 1679

原创 跨语言通信——flutter channel

flutter是啥就不介绍了。。。这篇主要针对flutter channel,不涉及dart::ffi。主要是dart<->c++<->java的通信。核心概念BinaryMessenger:真正的信道,用来传输数据的MethodCall:传输的数据内容,event和method都被认为是MethodCallMessageCodec:用来序列化/反序列化数据方法定义和绑定所有的绑定都是在BinaryMessenger中,由于跨语言,所以实际代码是c++的。注意,只有

2021-11-16 10:39:53 1373

原创 跨语言通信——GC

GC与native指针在gc的时候释放native指针。有几个方案,基本是finalize和PhantomReference。Bitmap在8.0以后,Bitmap的真实数据是存在native的,所以要有一个绑定到java对象,监听gc并释放native内存的操作。这里采用的是sun.misc中提供的一个PhantomReference的方式。代码路径如下:Bitmap.java#createBitmapBitmap.cpp#Bitmap_creatorBitmap.cpp#createBi

2021-08-16 11:49:04 141

原创 跨语言通信——luascriptcore

luascriptcoreluascriptcore是一个用来绑定lua、java、oc的跨语言通信开源框架。被引入到了公司的项目中。方法定义和绑定lua call java注册使用的是带方法名的回调,即LuaContext#registerMethod(String, Callable)。LuaContext持有了Java侧的Callable通过LuaNativeUtil向LuaContext.cpp注册了该方法名和LuaJavaEnv#luaMethodHandler通过LuaSess

2021-08-14 12:10:28 177

原创 跨语言通信——起点

现代app一定会涉及到大量的跨语言通信。常见的包括JNI、js bridge等,不常见的有flutter channel、lua binding、python binding等。框架要素更泛化一些看,网络请求也是一种跨语言通信,gRPC可以作为一个中立的跨语言通信模板来拆解要素。通信主要是方法调用,方法调用可以分解成方法定义/绑定(gRPC部分)和参数传递(pb部分),做的好的体系会有签名校验,可能是运行时、编译时甚至生成(gRPC)。方法定义需要在两个语言定义出相同的方法签名,并且告知框架将二者绑

2021-08-14 10:55:50 199

原创 kt的协程是咋回事

kt的协程是咋回事背景跟协程啥关系几十行的轮子背景偶然遇到一个需求,把串行的大任务拆分成更小颗粒度的小任务依次串行执行。听起来没啥用,但是在现实场景中,是个很有效改善TTR的工作。因为主线程中的任务是不能被打断的,而所有用户操作都需要插入到队列中处理,一旦一个计算任务又大又长还在主线程,用户一定很难受。由此react提出了fiber,官宣也挺有用的。跟协程啥关系其实最舒服的接口就是协程类的接口,通过套嵌或顺序发起任务进行大任务拆分,以语义化dsl的方式减少阅读和理解成本,以闭包在任务间传递参数。而且

2021-06-11 11:10:19 233 1

原创 技术栈评价体系

现在越来越多的新技术栈出现,时不时要做调研,做评价,慢慢摸到了一些思路。维度常见的评价维度其实都集中在技术上,然而作为业务承载的根基,技术栈的评价维度完全不应该只有技术向评价,而且技术向评价根本不是重点。目前看,应该有三个方向:产品向、技术向和开发向。产品向产品同学通常对技术栈本身其实没有特别的要求,但是落到他们的利益上,技术栈需要满足快速迭代这个核心需求。快速迭代主要是,写得快、发版快。所以评价要关注:动态化,最高需求其实是动态化。就是发板快,细微的改动不需要跟随发板。这个对于强数据驱动公司

2020-07-29 16:16:47 347

原创 内容消费随想

今天跟业务产品聊内容消费相关的内容,一个相对完备的分类突然闪现。抽象来看,内容消费主要是内容源+触达方式+反馈方式。编辑最原始的内容分发形式,以书报起门户网站终止。内容源自雇佣的编辑/专业作者;以购买或者标题列表触达;基本无反馈。特点:内容质量有保障内容量级极小千人一面无交流用户完全被动获取信息分类当编辑类内容量级达到一定阈值了,完全平铺已经不能阅读了,遂进行分类。仍然是门户网站时代的模式。内容仍然源自编辑/作者,但因为提供内容成本降低,人数有所增加;以结构化的分类的形式进行细化的

2020-07-13 21:16:39 135

原创 推广新技术的心得

最近被安排在公司推广 flutter,搞了几个月算是摸到了一些推广技术的门道。私以为,一个框架级别的技术想在比较大规模的团队中推广应该是要经过下面几个 milestone:可行性调研,单人开发可用,多人协作可用,防劣化机制建立,开发质效提升。涉及到的功能点主要有:文件&库管理,分支模型,语言&平台能力补强,基础通用组件,基础业务组件,代码规范,业务结构规范,CI,复杂组件。具...

2019-10-25 10:23:33 258

原创 Flutter aar 发布

我司引入了 flutter 到主 App 中,这个大概是大部分公司的节奏。引入一个新技术,一定要搞定集成问题。不定制化且切到最新版本的前提下:在 1.9 版本,flutter build aar 即可。所以如果是 1.9 版本,请关掉这个文章。用闲鱼的 FBI,应该是一键化的事情。如果用 FBI,请关掉这个文章。问题一键将 flutter 工程集成到主工程,且支持远程发布和本地发布。...

2019-09-25 16:48:09 636

原创 怎样初始化才好

问题每个 App 都会在启动时初始化一坨东西,这个点有两个问题:代码的依赖关系应该是有向无环图,但是初始化是线性的,所以相当于手动进行了一次拓扑排序,而且这个排序是写死的。这里把耦合以一种文档的形式写到了一起,一方面引发了维护文档的问题;另一方面导致所有人需要同时修改一个文件某些初始化本身是一个耗时的操作,启动初始化会严重拖慢 App 启动想法解决这些问题的核心点就是懒加载。让所有功...

2019-07-17 15:20:42 197

原创 不要过分解耦了

最近一年半时间在高强度、集中性的做客户端所谓架构方面的工作。这些比代码更抽象的东西很少有人聊到,也很难搜索和交流,会陆陆续续写一些思考。关于耦合每一个程序员在接受中等甚至初级培训的时候都会被不停的灌输一个概念:耦合是坏的。但是,耦合的来源是什么?解耦的目标是什么?什么样的耦合是不好的?这些似乎没有人提过。耦合的来源是什么耦合通常来自两个方面:代码写挫了。主要包括:耦合边界不合理,导...

2019-07-10 11:56:56 414

原创 [LintDsl] Uast 声明类结构

Uastuast 是 jetbrains 用来表示 java 和 kotlin 的 ast 库。没有文档,有的内容诡异。作为 Android lint 的基础库,是写 lint 绕不过去的神坑。粗犷的说,uast 分为两大簇类:声明类和指令类。声明类主要是描述 OOP 相关的语法树,指令类主要是描述过程相关的语法树。声明类结构所有元素,包括:UElement,基类,约等于 ASTNo...

2019-07-08 21:08:58 1198

原创 [LintDsl] 开篇

[LintDsl] 开篇起因Github计划起因在我司做了一年多所谓架构之后,发现设计一个框架很简单,做出足够多的工具也很简单,但是,怎么去规范使用,怎么传达工具背后的思考是个大问题,这个东西可能在大部分中大型 APP 中都会成为阻碍技术演进的关键问题。过去的一段时间经常遇到 lint,发现这个是限制行为推广理念的好东西。但是,(Android 语境下)lint 写起来非常麻烦,拜 uast...

2019-06-24 20:51:19 127

原创 App 分层思考

为什么要分层主要是为了维持分工体系,提高生产效率。为什么分层能提高生产效率需要理解的范围从实现转向接口(面向接口编程),减少思考复杂性减少依赖,加速打包快速合理的下沉通用代码,减少重复开发建立起合理的边界,权责分明,减少撕逼常见层次业务层:通常是最上层,面向用户、面向产品开发的代码。如直播SDK 层:有一定的专职业务,向业务层提供能力封装。如 push工具库:非常通用的逻...

2019-01-30 14:07:57 457

原创 一种用 Proxy 解决继承依赖的方法

一种用 Proxy 解决继承依赖的方法问题思路解决遗留问题问题在项目拆分的过程中,一定会遇到依赖问题。有一些代码非常细节,不适合作为对外接口暴露给上层,而上层很可能需要继承自这些类。例如,App 级别的 WebViewClient 的封装。作为业务 common 层的代码,包含了极多的业务逻辑,并不应该放到 api 包中。但是,一定存在某些特殊页面需要创建一个有特殊逻辑的 WebViewCl...

2018-10-10 18:59:28 441

原创 快手组件化之术——IoC自注册

自己在公司简书上的文章,转一发:https://www.jianshu.com/p/ea944773cbd5道势术,以势养道,以术谋势。 —— 《道德经》阅读本文需要对 Java 组件化、Annotation processing 和 Javassist 有一定了解。  当一个 App 发展到多业务组合的阶段,组件化都是必经之路,此为道。实践中组件之间的通信,方案大多是接口 +...

2018-07-10 10:18:15 811 1

原创 ButterKnife 是怎么解决 library 的 R 问题的

问题Annotation 中必须引用 final 的值(编译期已经有最终值),而 ButterKnife 中引用的 R (在 library 工程中)是非 final 的。ButterKnife 的 tricks生成 R2既然 R 不是 final 的,生成一个呗。所以 butterknife 实现了一个 plugin,把 R 拷贝出了一个 final 版本: R2。这个非常直接有...

2018-07-03 17:10:31 2347

原创 怎样发布同一个库到多个repo中

问题在开发过程中,有时需要同时发布一份aar/jar到远程和本地的repo,这样可以保证在没有网的情况下编译成功。解决不可能在uploadArchive任务中设置多个repo,因为源码里明显写的只有单个repository对象。所以需要手写一个Upload task的子类。 里面有的坑是configuration需要手动设置成project的archives,否则打包不过。 推荐在...

2018-05-23 18:24:08 531

原创 [脑洞]使用annotation生成反射常量池

问题反射是每个Java开发都躲不开的工具,很多时候可以用反射把代码写的非常整洁,但会付出两个代价:性能问题反射用字面量和对应的类需要维护,容易出现bug前者是不可避免的,而后者可以通过apt来维护。以前都是用apt/javassist减少反射,后面做首个dex减肥发现,有的反射是必须的。突然发现,apt不仅能干掉反射,也能让反射更好维护。 因为所有需要被反射调用的类都不能被...

2018-05-07 16:13:14 431

原创 [源码]Meepo路由

之前设计框架、面试、调研等等的时候,一直觉得ARouter这种完全靠字符串 + 野性Builder的模式太随性。后面YY出来两个可行的方案:为每个页面/Uri生成一个Builder类,用专有Builder进行编译期校验。现存的是https://github.com/joyrun/ActivityRouter为每个页面/Uri构造一个interface方法,用Retrofit的套路做跳转。现...

2018-04-23 11:54:46 170

原创 我用过的代码生成方式综述

这段时间,做了很多开发效率相关的事情,涉及到了不少代码生成的方法和思路,总结如下。生成代码分两部分:代码分析生成工具和代码模板工具按编写难度排序live template这个是intellij的一个简单工具,看起来就是对freemarker或者正则替换做了一些封装。代表方案当然就是内置的那些了。 创建很简单:https://www.jetbrains.org/intellij...

2018-03-22 14:57:07 671

原创 [脑洞]复杂页面构建方法

问题每个App都不可避免有一两个复杂的页面,首页啦、主要功能的detail页啦都跑不掉又臭又长。而当海外成为理所应当拓展的市场时,解耦复杂页面、在页面中按需加入功能就是一个刚需了。 具体来说,解耦有几个方面:接口/功能的解耦、View层面(特别是id)的解耦、生命周期传递。通用解决对于接口和功能,使用IOC或者Event方式。每个业务有自己的api module(声明接口和Ev...

2018-03-02 18:05:47 266

原创 [源码]从CoordinatorLayout到集合中通信

CoordinatorLayout是个挺古老的东西了,然而我才听说,愧为程序员。看一下源码,缓解一下。 一个ViewGroup,也没啥设计思路可说的,无非是:使用Mediator模式解决了集合中子元素的随意通信问题(DependOn),用Decor模式解决了无谓继承的问题(代理给出了不少View的onXXX方法)。这种高层次的思路了。合理设计做依赖,一定都形成DAG,有一个Dire...

2018-02-24 19:11:06 192

原创 [造轮子]一个关于IOC初始化的失败脑洞

问题所有IOC系统,都不可避免的要进行实现的注册,包括很多初始化相关的事情。在Android上,随便一个多module的App,多多少少都有相同的问题。 Android冷启动App,IOC系统启动时,基本都要反射来突破Module间依赖的限制(如果这个能解决,也就不需要IOC了)。此时,性能一定会有一些问题,而且理解上不太容易描述清楚。解决方法提高性能的方法有不少种:每个M...

2018-02-13 18:28:38 280

原创 [源码]TextView源码

提起TextView,脑子里想着用起来应该是很简单的,然而作为显示文字的所有控件的基类,想要完全挖掘出TextView的能力,还是很复杂的。最近做一个需求,要在限制长度的输入框里识别粘贴的淘口令,因为对TextView了解太肤浅,bug无数,特意看一下源码学习一下(听iOS同学说,各个平台的对外接口都比较接近,这也是一个认知文字系统的好方法)。 主要关注TextView对外暴露的set接口,以及

2018-01-18 16:24:25 939

原创 [java-design-patterns]Enum和Factory模式的替换

设计模式合集git笔记系列。abstract factory模式的介绍中创建了KingdomFactory的接口分别实现了ElfKingdomFactory和OrcKingdomFactory为每个KingdomFactory声明了相应的enum声明了KingdomFactory的Factory,根据enum返回对应的KingdomFactory这个流程,诞生自Java还是弱

2018-01-10 11:01:43 434

原创 AOP Observable

在公司重构的过程中,希望用KVO的方式传递数据变化的事件。然而,在传统Android的写法中,Bean是没有setter的,就没有时机来notifyObservers了。 值得庆幸的是AspectJ能够切入Field access事件,用AOP就是一个非常好的解决方法了。项目](https://github.com/pouloghost/AOPObservable),使用方法见README.md,

2017-11-10 15:03:21 213

基于fjtask jsp的 并行解决数独问题的实现 超炫html5前台

并行解决数独问题 使用java7内置的fjtask框架 使用html5作为前台 jsp后台运算 提供五个解决方法 可自行组合

2012-08-07

fork/join作者论文

fork/join作者论文 解释了FJTask框架的思想和实现

2012-05-09

轻公司 完整版 一章不差

轻公司1-9章加后记 完整 绝对不是缺一部分的那种 网上首发的!!!!太不容易了

2010-04-10

erlang 参考手册 模块部分--自己翻译的中文版

自己逐字翻译的,有些不顺当,比英文版适应初学

2009-11-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除