Ervin

真正的强者是认清了生活的本质,并且去热爱他的人。


  • 首页

  • 标签

  • 分类

  • 归档

  • 搜索

杂记(3)

发表于 2023-05-11 | 分类于 读书
字数统计: 1k | 阅读时长 ≈ 3

如何做一个“内核稳”的人

  1. 不急着反应,别人肯定你,不欣喜若狂;别人批评你,不盲目自卑内耗。这都是别人的看法,和本来的你关系不大。

  2. 多内观自己的坏情绪。会因为什么事情焦虑、恐惧、内耗,把这些事情从头到尾梳理一遍,以第三者角度看待事情,就会理智很多。

  3. 提高自己的经济能力。这个重要,但不是最重要。所以如果自己的经济能力暂时不会有太大的改 善,先从心态开始练起。

  4. 不要有过多的解释欲。不是所有人都值得你解释,只对自己在乎的几个人说自己的事,必要的时候甚至可以不说。

  5. 接受别人可以是任何样子。可以是聪明的,也可以是傻逼的。可以是漂亮的,也可以是丑陋的。可以是善良的,也可以是阴狠的。

  6. 存在即合理。世界上很多东西不符合自己的三观,但它必然有存在的理由,抱着平和的心态多去看世界,了解多样性,就能更有包容心。

阅读全文 »

杂记(2)

发表于 2023-03-20 | 分类于 读书
字数统计: 348 | 阅读时长 ≈ 1
  • 思维其实是有维度的,点,线,面,体。

  • 丛林法则,弱肉强食,雪豹捕猎羚羊,本质上他们都是为了活下去。

  • LLM最重要的三个元素,数据,算法,算力。其中算力和硬件(半导体)有关,也就是门槛。预计各大巨头公司都会发展自己的LLM,只是目前微软领先了一个身位。国内由于算力就被卡死,不能用最先进的H100,导致始终会比国外要慢一拍,所以可能的机会是换个赛道,基于有缺陷的模型深度构建应用层,丰富基于模型的生态,继续卷。所以,我预测是未来几年在国内做应用的会有一波新的机会。

  • 类似chatGPT这类的大模型,参数达到了175B(1750亿)个,还有一些小型的模型(典型的是Anthropic, PBC开发的Claude,参数是170万),其实普通用户在使用上区分不出他们有什么区别。下面是我问他和chatGPT有什么区别,挺有意思的。

claude.jpg

  • 目前能想到使用这类语言模型干得活有:翻译,查询,知识普及,文章创作或润色,codepilot等等(想象力匮乏),后续陆续如果加上图片,声音甚至是视频,那想象空间就无限大了,基本就实现了AIGC。

杂记

发表于 2023-03-16 | 分类于 读书
字数统计: 602 | 阅读时长 ≈ 2
  • 一天中最幸运的事情:
  1. 碰到一首可以单曲循环的歌
  2. 解决了一个难题
  3. 突然冒出一个令自己兴奋的想法,想立马去实施
  4. 完成了一项让自己满意的工作
  5. 消除了和另一个在意的人之间的矛盾
  6. 1,2,3,4,5都来一遍
  7. 。。。
  • 天下无不散的宴席。人生是一场旅途,有人同行是一种缘分,珍惜同行时光,等到分别之时,挥手告别,微笑离开。

  • 成年人能够依赖的只有自己,能够救自己的也只有自己。

  • 永远不要去试探人性,人性通常都禁不起推敲。

  • 不作恶,保持善良。

  • 不以物喜,不以己悲。平静对待赞赏,坦然接受批评。持续反思,保持好奇心,多琢磨,多折腾。

  • AI的可怕之处在于,他永远在反思,在对未知事物保持敬畏。他的回答已经很完美了,最后还会来一句他有局限性。相比而言,作为人类认知不及AI万分之一,还经常飘。人类和AI共存的日子马上就要来临了。

  • 美好的东西,站在远处观赏就好。靠的太近也许是另一番景象。

  • 剖析自己,找到自己的缺点,就算改不掉也要时刻提醒自己。

  • 不要看他说什么,看他做什么,他做什么代表他相信什么。

  • 每个人只相信自己相信的东西。

  • 多元的信息输入源很重要,信息茧房的产生其实就是常年接受一种信息源,不断强化你的既有认知。特别是目前的社交网络,信息流很多都是同质化,信息量密度低的内容,接触多了之后会让你不愿意或者没有耐心去思考稍微复杂的问题,让人变得无知且固执。

  • 顿悟是什么感觉?王阳明砍竹子和牛顿被苹果砸都让他们顿悟了,外界的扰动触发了内心认知的一次升级。

  • 命运和人定胜天可能是人生的两个不同纬度,后天的努力通过因果关系可以改变命运。

  • 出了问题,有时候向内去找答案比向外求助更有用。

  • 越来越相信平行宇宙的理论。

深度学习之环境搭建

发表于 2023-03-10 | 分类于 技术
字数统计: 592 | 阅读时长 ≈ 2

背景

团队内部要做一些分享,最近ChatGPT正火,而且正好也在研究深度学习在移动设备上的相关东西,所以就想就深度学习这个方向去沉淀一些东西供参考。

深度学习目前是两大框架,神仙打架。Google的Tensorflow和Meta的Pytorch,本文基于Tensorflow来讲。由于本人使用的是Mac M1版本,在折腾过程中遇到了很多问题,最终还是解决了。这里做个记录。

阅读全文 »

mmap的简单原理解析

发表于 2023-02-07 | 分类于 技术
字数统计: 1.2k | 阅读时长 ≈ 4

mmap很早就知道一些,但是只是简单知道这个可以减少内存消耗,并不知道它的实现原理是怎么样的,所以也不知道它到底是怎么去减少内存消耗的,然后找了相关资料看了下,发现和android的bundle机制还有点相似,这里做个记录和总结

一些概念

我们都知道linux进程分为用户空间和内核空间,后来在零拷贝原理中知道对于32位操作系统来说系统会给每个应用进程分配4G的虚拟内存空间,其中0-3G的内存地址属于用户空间,3-4G的内存地址属于内核空间。其中用户空间是不能共享的,而内核空间是运行操作系统的,它独立于普通的应用程序,是被所有应用程序共享的。所以对一个应用来说,只有3G的用户空间是属于应用本身的。参考:内核空间与用户空间。由于用户空间是隔离的,所以这里当一个进程想访问另外一个进程的用户数据时就涉及到进程之间的通讯了(RPC),Android使用bundle来更好的解决这个问题,后面单独写Android的bundle机制。

阅读全文 »

随想(一)

发表于 2023-01-18 | 分类于 读书
字数统计: 840 | 阅读时长 ≈ 2

1. 最近在学习一些管理方面的知识,从思想层面对管理者有了新的认识。执行者和管理者的思维模式是完全不一样的,而大部分走上管理岗位的又往往是那些业务骨干,业务骨干其实就是优秀的执行者,能够很完美的完成领导交付的任务,他们也是领导重点考察和培养的对象。但是,由于执行者和管理者存在的最大不同点在于:思维模式,所以刚进入到管理岗位的执行者会很不适应,有很强的执行者思维惯性。这个时候如果有人可以点拨你,或者自己学习是可以少走很多弯路的。那么,执行者和管理者思维的区别是什么呢?

  • 执行者:依靠自己,索取资源,局部最优,靠自己的个人能力达成个人目标
  • 执行者:教练他人,整合资源,全局最优,依靠团队(他人)的能力来达成团队目标

这里本质不同的是一个是依靠单打独斗达成目标,一个是带领团队依靠别人优秀的能力来达成目标。

2. 人际交往的本质其实是价值交换。这个价值可以是有形的也可能是无形的,比如权利,钱,能力或者品质等。你能融入某个圈子说明你具备了这个圈子需要的价值,反之,你融入不了某个圈子就证明你缺少某些价值。人际交往建立后其实就是信任的问题,信任是一个很抽象的概念,这里有个公式可以把信任拆解成几个纬度,让抽象的信任可以被稍微具象化一些:

信任 = (专业性 + 可靠性 + 同频性)/ 自我意识

这里专业性和可靠性都好理解,同频性是指你们具有相似的思维方式,爱好,信仰之类的东西;而自我意识则是你的主观意识存在。这里我认为比较重要的是自我意识,当自我意识很小,信任就可以无限大;当自我意识很大,信任就可以无限小。这里的自我意识其实是说你的思想认识,价值观,看问题视角,认知,感受,调整等。自我意识小,说明你会依附权威,不太会提出反对意见或者都没有反对的意识,这时候你会无限信任比你强的人所提出的观点。那是不是自我意识强就好呢,我觉得也不是,自我意识强是要建立在知识,能力,情感,判断,地位等等具有充足储备的前提下,是需要强大的能力来保障的,盲目的自我意识强是毫无意义的。所以,信任其实就是在合理自我意识下的价值交换。合理自我意识还隐藏一个重要的点就是平等,平等的关系才会带来合理的自我意识(自我意识是可以被自我去调整的),信任才有可能被达成,否则我为什么要降低我的自我意识来和你交换?

视频编码基础

发表于 2022-11-01 | 分类于 技术
字数统计: 1.5k | 阅读时长 ≈ 5

视频传输基本原理

视频是利用人眼的视觉暂留的原理,通过播放一系列的图片,使人眼产生运动的感觉。单纯传输视频画面,视频量非常大,对现有的网络和存储来说很不友好。为了能够使视频便于传输和存储,人们发现有视频有大量重复的信息,如果将重复信息在发送端去掉,在接收端回复回来,这样就大大减少了视频数据的文件,因此有了H.264视频压缩标准。

视频里面最常用的编码格式就说H.264,基于这个编码格式还有H.265(后续研究),音频采样数据会采用AAC编码格式进行压缩。视频内容经过编码压缩后,确实有利于存储和传输。不过当要观看播放视频时,相应也需要解码过程,将压缩的视频还原。所以,编解码之间显然需要约定一种协议,这种协议大概的流程是:编码器将多张图像进行编码后产生一段一段的GOP(Group of picture),解码器则在播放时读取一段一段的GOP进行解码后读取画面再渲染显示。

1.png

GOP是一组连续的画面,由一张I帧和数张B帧和P帧组成,它是视频图像编码器和解码器存取的基本单位,它的排列顺序将会一直重复到影像结束。I帧是内部编码帧(也称为关键帧),P帧是前向预测帧(前向参考帧),B帧是双向内插帧(双向参考帧)。简单说,I帧是一个完整的画面,而P帧和B帧记录的是相对于I帧的变化。如果没有I帧,P和B是无法解码的。

在H.264编码中I帧,P帧,B帧传输的视频画面

阅读全文 »

线程池的一些知识点回顾

发表于 2022-09-10 | 分类于 技术
字数统计: 985 | 阅读时长 ≈ 3

对线程池的一些理解

  1. 线程池是对线程的管理和调度,我们自己当然也可以去新建线程去处理并发操作,但是线程池提供了很好的解决线程之间调度,管理的能力,这些能力可能比我们自己去实现更优。
  2. 创建线程池有两种方式(本质上是一种),如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //通过Executors封装好的线程池创建方法去创建
    Executors.newSingleThreadExecutor();
    Executors.newFixedThreadPool(10);

    //使用ThreadPoolExecutor来创建,其实上一种本质上也是调用这个来创建线程池的(阿里规范推荐)
    ExecutorService executors = new ThreadPoolExecutor(1,
    1,
    0L,
    TimeUnit.MILLISECONDS,
    new ArrayBlockingQueue<>(1),
    new ThreadPoolExecutor.DiscardPolicy());
    //其中参数1,为核心线程数;2,最大线程数;3,线程存活时间;4,线程的阻塞队列;5,线程(任务)熔断机制
  3. 基于第二点解释这些参数的意义

  • a, 核心线程数是线程池初始化就会创建的线程,并且该线程不会被回收;
  • b, 最大线程数是线程池中允许存在的最大线程数量;
  • c, 线程存活时间指的是当非核心线程在处理完任务不再使用后多久被线程池回收;
  • d, 线程阻塞队列是任务队列,线程处理的任务会按照队列的特点存在队列中;
  • e, 线程熔断机制是当线程处理不过来任务时,应该做一些什么策略。
  1. 线程池运行的流程
  • 线程池刚创建的时候,里面没有一个线程,任务队列是做为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。
  • 当调用execute()方法添加一个一个任务时,线程池会做几个判断
    • a,如果正在运行的线程数量小于核心线程数,则马上创建线程执行这个任务
    • b,如果正在运行的线程数量大于或等于最大线程数,则把任务放入队列中
    • c,如果这时候队列满了,运行的线程数小于最大线程数,则创建线程立马执行这个任务
    • d,如果队列满了,运行的线程数大于等于最大线程数,则执行线程熔断机制
  • 当一个线程完成任务时,它会从队列中取下一个任务来执行
  • 当一个线程没有任务执行,超过线程存活时间时,线程池会判断,如果当前运行线程大于核心线程数,那么这个线程就会被回收。所以最终线程池的线程数量会维持为核心线程的数量。

这样的过程说明,并不是先加入任务就一定先执行,看下面的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ExecutorService executors = new ThreadPoolExecutor(3,
6,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(10),
new ThreadPoolExecutor.DiscardPolicy());
//ThreadTest01 test01 = new ThreadTest01();
for (int i = 1; i < 21; i++) {
int taskId = i;
Runnable task = () -> {
try {
System.out.println("thread-" + Thread.currentThread().getName() + " is saving data:" + taskId);
/*模拟存储数据耗时*/
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
executors.execute(task);
}
/*运行结果:首先核心线程为3所以立马执行任务1,2,3;然后任务4到13被放入到队列中,14,15,16又会被新创建的3个线程(最大为6)执行,
再增加任务17到20时由于当前已经有6个线程在处理任务了,所以17到20的任务由于ThreadPoolExecutor.DiscardPolicy()策略会被丢弃。
然后6个线程又会依次从队列冲取出4到13任务去执行。*/

阅读全文 »

跨平台技术Flutter技术规划

发表于 2022-06-29 | 分类于 技术
字数统计: 9 | 阅读时长 ≈ 1
私有文章, 请输入密码查看。
阅读全文 »

Java反射机制

发表于 2022-06-28 | 分类于 技术
字数统计: 207 | 阅读时长 ≈ 1

什么叫反射

Java中我们创建对象一般都是用“new”这个关键字的,例如

1
2
Person p = new Person();
p.setName("Ervin");

反射则是一开始不知道要初始化的对象是什么,所以没办法new出一个对象,这时候就需要用到反射,例如我们使用第三方SDK的时候有可能没有提供api,只能通过反射去获取类中的方法等。按照上面生成对象的例子,使用反射是这样的

1
2
3
4
5
6
Class cls = Class.forName("com.ervin.entity.Person");
Method method = cls.getMethod("setName", String.class);
//Object person = cls.newInstance();
Constructor constructor = cls.getConstructor();
Object person = constructor.newInstance();
method.invoke(person, "Ervin");

直接new对象是静态模式,在代码编译前就知道需要生成什么对象;反射是在运行时才知道要生成什么类,是动态的

123…8
Ervin Zhang

Ervin Zhang

stay hungry, stay foolish

74 日志
3 分类
47 标签
RSS
GitHub E-Mail Twitter
© 2025 Ervin Zhang | Site words total count: 93.5k
本站访客数:次 |
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4