自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(110)
  • 资源 (1)
  • 收藏
  • 关注

原创 大语言模型中一个调皮的EOS token

看到这原因的就很明显了,因为这个EOS添加的是字符,而不是token_id,所以tokenizer有时候会把当成了分开的token,比如,模型就把这3它当成了三个token,而不是一个token,所以在推理的时候,遇到结尾,有时候就会输出。如果以为例,一般模型在推理的时候,觉得可以结束一句话了,就会输出,但是模型的脑子里肯定没有的概念呀,它只能输出数字,所以我们需要把转换成数字,这个数字就是EOS token ID。模型选择得自然是现在中文做的比较好的ChatGLM2-6B。

2023-07-15 15:13:30 2486

原创 如何定制一个智能洒水装置(养狗/养花人士请进)

我在搜索资料的过程中,知道了自动感应水龙头的原理,没错就是你想的那样,它就是用电磁阀来控制出水的。不管是养狗,还是养花的同学都可以考虑自己动手搭建一套这样的方案了哈,这套方案绝对比成套的方案好多了,而且如果电磁阀坏了,换个新的成本也不高,但是如果是一整套的那种方案,人家给不给保修都要另说。说到洒水工具,之前买的那个浇花的工具附带的管子和出水喷头都太差了:管子软软的没法固定,喷头是塑料的,要么就是360度喷雾,要么就是出一大道水,没法做到集中喷雾。但是,人的懒惰是上限的,现在我开始嫌冲狗厕所太麻烦了。

2023-02-25 18:21:44 641

原创 如何用智能地教狗狗上厕所

这让我们想当场奖励,或当场训斥都没法做到。由于我有一台服务器,一台普通电脑(带GPU),服务器是7x24开机的,而电脑不是,所以模型就得放在服务器上,用cpu来做serving,这个时候,serving的性能就不是很够了,一个图片需要100ms才能识别完,相当于10FPS。这里我并没有针对模型的性能进行优化,而且取了个巧,先通过进行两帧图片的对比,识别出变化,在有变化产生后再进行模型的确认,所以模型serving的压力只有在崽崽或者我们进厕所的时候才会产生,而一旦厕所没有任何动静,模型自己慢慢就处理完了。

2023-01-08 17:06:51 708 1

原创 端到端智能音箱

背景前段时间买了个小米的空调伴侣,想用来查看空调的功率,以确认空调到底会用掉多少电。买的时候发现空调伴侣也支持红外控制,这就得好好利用一下了。但是有个尴尬的问题,就是空调插座在很偏的地方,导致了无法控制空调,也没法控制投影仪。当一个东西你拥有了以后又失去的时候,你会很难受,所以我就想着要再买它一个红外控制设备来做这个事,看了一圈发现,小米万能遥控没得买了,变成了理财产品,所以就找了一款替代产品。欧瑞博的一款万能遥控。买完之后才发现,虽然能控制空调和投影仪了,但是有两个很严重的问题:是没法使用小爱来

2022-05-25 09:32:12 328

原创 再看Lambda架构

博客原文地址最近看了一本《大数据系统构建》的书,发现之前对于Lambda架构的理解还是不够深入和清晰。之前对Lambda架构的理解Azure文档上有一张Lambda架构的图,同时也配有对Lambda架构最基本的理解:批处理层(冷路径)以原始形式存储所有传入数据,对数据进行批处理。 该处理的结果作为 批处理视图 存储。速度层(热路径)可实时分析数据。 设计此层是为了降低延迟,但代价是准确性也会降低。当初看Lambda架构的时候,更在意的点其实是将数据处理分成批处理层 和速度层 两个部分,批

2021-07-11 19:25:52 156 1

原创 如何写一个好的测试

博客原文地址背景在上一个项目上,由于项目成员大部分是新入职的同事,所以对于测试不是很熟悉,这就导致了在项目前期,项目上的很多测试都不太make sense,虽然没有什么定量的东西来描述,但是总结起来就2个点:测试的名字比较模糊。测试代码不易读。深入剖析测试名字比较模糊对于这一个问题,是因为很多刚开始写测试的开发脑子里不会快就想到given、when、then这三个词,一般我...

2020-03-01 23:59:13 657

原创 Kafka源码研究--Comsumer获取partition下标

背景由于项目上Flink在设置parallel多于1的情况下,job没法正确地获取watermark,所以周末来研究一下一部分,大概已经锁定了原因:虽然我们的topic只设置了1的partition,但是Kafka的Comsumer还是起了好几个subtask去读索引是2、3的partition,然后这几个subtask的watermark一直不更新,导致我们job整体的watermark一直...

2019-10-27 17:07:59 433

原创 用Python和Pandas以及爬虫技术统计历史天气

这里写自定义目录标题背景爬取数据用Pandas显示数据太多雨天多个月的数据画图功能扩展遇到的坑背景最近在计划明年从北京rebase到深圳去,所以最近在看深圳的各个方面。去年在深圳呆过一段时间,印象最深的是,深圳总是突然就下雨,还下好大的雨。对于我这种从小在南方长大但是后面又在北京呆了2年多的人来说,熟悉而又无奈。今天早上本来想随便浏览浏览一个天气网站,看看深圳的历史天气如何的,但是,一不小心...

2019-07-20 16:23:16 634 1

原创 看直播到底能得到什么

博客已经迁移到这里啦背景我是一个很喜欢看直播的人,平时下班回来吃晚饭的时候觉得没事干就会打开直播,边吃边看,然后就一发不可收拾。一个晚上就都用来看直播了。 我也是一个很喜欢在洗澡的时候想问题的人,今天洗澡的时候我就在考虑,我看了这么久的直播我到底得到了什么?第一反应就是快乐,或者说是“一时的快乐”?因为对于现在的我来说,我已经完全记不得我1个月或者说一星期前看直播得到的快乐了?我顶多就能记住刚刚看

2017-05-31 10:37:59 1169 2

翻译 Item 27: 明白什么时候选择重载,什么时候选择universal引用

博客已经迁移到这里啦Item 26已经解释了,不管是对全局函数还是成员函数(尤其是构造函数)而言,对universal引用的重载会导致一系列的问题。到目前为止,我也已经给出了好几个例子,如果它能表现得和我们期待的一样,这种重载也能很实用。此Item会探索如何让这种重载能实现我们所需求的行为。我们可以设计出避免对universal引用进行重载的实现,也可以通过限制参数的类型,来使得它们能够匹配。我们的

2017-05-17 23:35:47 864

原创 对于大学4年的反思(续),记我的ThoughtWorks面试

之前我写了一篇对于大学四年的反思,时隔一个月,为什么我这么快就要来写这篇续章呢?主要有两个原因,第一是感谢静子姐姐,记得知乎上有个回答里面说过人生需要有贵人的帮助,遇到贵人是一件很幸运的事情。我想,静子姐姐就是我人生中的第一个贵人吧(或者说第二个?感觉动漫是我的第一个贵人,不管你信不信,我的很多人生观都是从动漫中获取的,它教会了我诚实,教会了我正直,教会了我友谊,教会了我情亲,教会了我爱情,教会了我

2016-04-09 09:13:41 2727

翻译 Item 26: 避免对universal引用进行重载

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!如果你需要写一个以名字作为参数,并记录下当前日期和时间的函数,在函数中还要把名字添加到全局的数据结构中去的话。你可能会想出看起来像这样的一个函数:std::multiset<std::string> name; // 全局数据结构void logAndAdd(co

2016-03-27 13:03:21 1604

原创 你还在兜圈吗?

在写完上一篇大学四年总结之后,结合大家的一些评论,我在睡觉的时候想了很多,也收获了些东西,就把它分享给大家吧:可能在我们每个人的人生路途中,一开始都是在兜圈,每次过完一年后只是单纯地回到了起点。只有在领悟到这一点后,才知道要找到一条离开的路,然后不管是笔直地还是弯弯曲曲地向着目标前进,这样的人生才是有意义的。也许每个人最大的不同就是领悟的早晚,可能有的人一开始就悟到了,比你早出发了几年,十几年。也可

2016-03-13 09:03:33 895

翻译 Item 25: 对右值引用使用std::move,对universal引用则使用std::forward

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!右值引用只能绑定那些有资格被move的对象上去。如果你有一个右值引用类型的参数,你就知道这个被绑定的对象可以被move:class Wdiget{ Widget(Widget&& rhs); // rhs肯定指向一个有资格被move的对象 ...};在这种情况下

2016-03-12 14:28:57 1393

原创 对于大学4年的反思

写博客也一年多了,还没有写过什么总结方面的东西,前天在V2EX上面发了一个关于C++应届毕业生的疑惑的帖子,然后昨天晚上想了很多,所以突然想写写大学4年来的种种情况。自高中起就对编程很感兴趣了,当时很“天真无邪”,想学编程就是为了写一手外挂来帮自己玩dnf,所以高考报专业的时候就冲着计算机来了。当然,由于高中沉迷小说和游戏,所以只考了个二本学校。如果你以为我会讲一个喜欢编程的学生在大学里苦学编程的励

2016-03-12 11:03:30 1377

翻译 Item 24: 区分右值引用和universal引用

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!古人曾说事情的真相会让你觉得很自在,但是在适当的情况下,一个良好的谎言同样能解放你。这个Item就是这样一个谎言。但是,因为我们在和软件打交道,所以让我们避开“谎言”这个词,换句话来说:本Item是由“抽象”组成的。为了声明一个指向T类型的右值引用,你会写T&&。因此我们可以“合理”地

2016-03-07 20:33:21 1419

翻译 item 23: 理解std::move和std::forward

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!根据std::move和std::forward不能做什么来熟悉它们是一个好办法。std::move没有move任何东西,std::forward没有转发任何东西。在运行期,它们没有做任何事情。它们没有产生需要执行的代码,一byte都没有。std::move和std::forward只

2016-03-07 20:32:31 8903

翻译 Item 22: 当使用Pimpl机制时,在实现文件中给出特殊成员函数的实现

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!如果你曾经同过久的编译时间斗争过,那么你肯定对Pimpl(”point to implementation”,指向实现)机制很熟悉了。这种技术让你把类的数据成员替换成指向一个实现类(或结构)的指针,把曾经放在主类中的数据成员放到实现类中去,然后通过指针间接地访问那些数据成员。举个例子,

2016-02-05 10:56:07 865

翻译 Item 21: 比起直接使用new优先使用std::make_unique和std::make_shared

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!让我们先从std::make_unique和std::make_shared的对比开始吧。std::make_shared是C++11的部分,但是,不幸的是,std::make_unique不是。它是在C++14中才被加入到标准库的。如果你使用的是C++11,不要怕,因为一个std::

2016-02-05 10:55:33 1062

翻译 Item 20: 使用std::weak_ptr替换会造成指针悬挂的类std::shared_ptr指针

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!矛盾的是,我们很容易就能创造出一个和std::shared_ptr类似的智能指针,但是,它们不参加被指向资源的共享所有权管理。换句话说,这是一个行为像std::shared_ptr,但却不影响对象引用计数的指针。这样的智能指针需要与一个对std::shared_ptr来说不存在的问题做

2016-02-05 10:55:00 1084 2

翻译 Item 19: 使用srd::shared_ptr来管理共享所有权的资源

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!使用带垃圾回收机制语言的程序员指出并嘲笑C++程序员需要遭受防止资源泄漏的痛苦。“多么原始啊”他们嘲笑道,“20世纪60年代的Lisp留下的备忘录你还不记得了吗?机器(而不是人类)应该管理资源的生命周期”。C++开发人员转了转他们的眼睛,“你所说的备忘录是指,那些资源只有内存以及资源的

2016-02-05 10:54:34 1357

翻译 Item 18: 使用srd::unique_ptr来管理独占所有权的资源

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!当你需要一个智能指针的时候,std::unique_ptr通常是最接近你需求的那一个。默认情况下,这么假设是很合理的:std::unique_ptr和原始指针的大小是一样的,并且很多操作(包括解引用),它们执行的是完全相同的指令。这意味着你甚至能把它们用在对内存和时间都很紧的地方。如果

2016-02-05 10:53:43 1019

翻译 Item 17: 理解特殊成员函数的生成规则

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!C++的官方说法中,特殊成员函数是C++愿意去主动生成的。C++98有4个这样的函数:默认构造函数,析构函数,拷贝构造函数,拷贝operator=。当然,这里有些细则。这些函数只在需要的时候产生,也就是,在类中如果一些代码没有清楚地声明它们就使用了它们。一个默认构造函数只有在类中没有声

2016-02-05 10:53:08 864

翻译 Item 16: 让const成员函数做到线程安全

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!如果我们在数学领域里工作,我们可能会发现用一个类来表示多项式会很方便。在这个类中,如果有一个函数能计算多选式的根(也就是,多项式等于0时,各个未知量的值)将变得很方便。这个函数不会改变多项式,所以很自然就想到把它声明为const:class Polynomial{public:

2016-02-05 10:52:34 864

翻译 Item 15: 只要有可能,就使用constexpr

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!如果说C++11中有什么新东西能拿“最佳困惑奖”的话,那肯定是constexpr了。当把它用在对象上时,它本质上是const的加强版,但是把它用在函数上时,它将拥有不同的意义。切开“迷雾”(解开困惑)是值得的,因为当constexpr符合你想表达的情况时,你肯定会想要使用它的。从概念上

2016-02-05 10:51:22 2129

翻译 Item 14: 如果函数不会抛出异常就把它们声明为noexcept

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!在C++98中,异常规范(exception specifications)是一个不稳定因素。你必须总结出一个函数可能会抛出的异常类型,所以如果函数的实现被修改了,异常规范可能也需要被修正。改变异常规范则又可能影响到客户代码,因为调用者可能依赖于原先的异常规范。编译器通常不会提供帮助来

2016-02-05 10:50:51 2855

翻译 Item 13: 比起iterator优先使用const_iterator

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!STL中的const_iterator等价于pointers-to-const(指向const值的指针)。它们指向的值不能被修改。使用const的标准做法是,每当你不需要修改iterator指向的值的时候,你都应该使用const_iterator。这对C++98和C++11来说都是对的

2016-02-05 10:50:03 1209

翻译 Item 12: 把重写函数声明为“override”的

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!C++中的面向对象编程总是围绕着类,继承,以及虚函数。这个世界中,最基础的概念就是,对于一个虚函数,用派生类中的实现来重写在基类中的实现。但是,这是令人沮丧的,你要认识到重写虚函数有多么容易出错。这就好像这部分语言,是用这样的概念(墨菲定律不仅仅要被遵守,更需要被尊敬)来设计的。(it

2016-02-05 10:49:27 3815

翻译 Item 11: 比起private undefined function优先使用deleted function

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!如果你为其他开发者提供代码,并且你想阻止他们调用一个特定的函数,你通常不会声明这个函数。函数不声明,函数就不会被调用。太简单了!但是有时候C++会帮你声明函数,并且如果你想要阻止客户调用这些函数,简单的事情就不再简单了。这种情况只发生在“特殊的成员函数”身上,也就是,当你需要这些成员函

2016-02-05 10:47:39 670

翻译 Item 10: 比起unscoped enum更偏爱scoped enum

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!一般情况下,在花括号中声明一个name(包括变量名,函数名),这个name的可见性会被限制在花括号的作用域内。对于在C++98风格的enum中声明的enum成员却不是这样。这些enum成员的name属于的作用域是enum所在作用域,这意味着在这个作用域中,不能拥有相同的name:enu

2016-02-05 10:46:53 801

翻译 Item 9: 比起typedef更偏爱别名声明(alias declaration)

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!我确信我们都同意使用STL容器是一个好主意,并且我希望在Item 18中能让你相信使用std::unique_ptr也是一个好主意,但是我猜想,我们中没有任何一个人想多次写这样的类型:“std::unique_ptr            你要记住的事typedef不支持模板化,但是

2016-02-05 10:45:29 864

翻译 Item 8: 比起0和NULL更偏爱nullptr

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!先让我们看一些概念:字面上的0是一个int,不是一个指针。如果C++发现0在上下文中只能被用作指针,它会勉强把0解释为一个null指针,但这只是一个应变的方案。C++的主要规则还是把0视为int,而不是一个指针。实际上,NULL也是这样的。NULL的情况,在细节方面有一些不确定性,因为

2016-02-05 10:43:03 812

翻译 Item 7:当创建对象的时候,区分()和{}的使用

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!从不同的角度来看,在C++11中,对象初始化拥有多种语法选择,这体现了语法丰富造成的尴尬或者烂摊子。一般情况下,初始化的值可以用圆括号,等号,花括号来确定:int x(0); //用圆括号初始化int y = 0; //用"="初始化int z{ 0 }; //用花括号初始化在

2016-02-05 10:38:44 882

翻译 Item 6: 当auto推导出一个不想要的类型时,使用显式类型初始化的语法

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!Item 5解释了比起显式指定类型,使用auto来声明变量提供了大量技术上的优点,但是有时候auto的类型推导出zigs(这个类型),但是你想要的是zag(另外一个类型)。举个例子,假设我有一个函数以Widget为参数并且返回一个std::vector,每个bool指示Widget是否

2016-02-05 10:35:11 678

翻译 Item 5: 比起显式的类型声明,更偏爱auto

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!啊,简单愉快的代码:inr x;等等,讨厌!我忘了初始化x,所以它的值是不确定的。可能,它可能被初始化成了0,这取决于你的编译环境。哎。不要紧,让我们简单并愉快地声明一个局部变量,通过解引用一个iterator来初始化它:template<typename It>void dwim

2016-02-05 10:30:37 728

翻译 Item 4: 知道怎么去看推导的类型

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!对于推导类型结果的查看,根据不同的软件开发阶段,你想知道的信息的不同,可以选择不同的工具。我们将探讨三种可能性:在你编辑代码时获得类型推导信息,在编译期获得信息,在运行期获得信息。IDE 编辑器在IDE中编辑代码常常能显示程序实体(比如,变量,参数,函数等)的类型,只需要你做一些像把光

2016-02-05 10:25:55 713

翻译 Item 3: 理解decltype

本文翻译自effective modern C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!decltype是一个奇怪的东西。给出一个名字或者一个表达式,decltype可以告诉你名字或表达式的类型。大多情况下,他告诉你的就是确实你想的那样。但是偶尔,他会提供一个脱离你想象的结果,这导致了你必须去找一本参考书或者去在线Q&A网站寻求答案。我们从一般情况(没有意外的结果)开始。对比

2016-02-05 10:15:03 1288

翻译 item 2:理解auto类型的推导

item 2: 理解auto类型的推导如果你已经读过item 1的模板类型推导,你已经知道大部分关于auto类型推导的知识了,因为,除了一种奇怪的情况外,auto类型推导和template类型推导是一样的。但是为什么会这样?template类型推导涉及模板和函数以及参数,但是auto没有处理这些东西。是这样的,但是这没关系。从template类型推导到auto类型推导有一个直接的映射关系。这里有一个

2015-11-05 16:09:18 1969 1

原创 item 1: 对于模板类型的推导

为了提升自己的英语水平,强行翻译了effective modern c++ 虽然翻译的不是很好,但是好歹能看看。接下来会陆续把所有的条款都翻译了的,希望各位看官不要嫌弃我的英语水平。一些用户对复杂的系统会忽略它怎么工作,怎么设计的,但是很高兴去知道它完成的一些事。通过这样的方式,c++中的模板类型的推导取得了巨大的成功。数以万计的程序员曾传过参数给模板函数,并得到了满意的结果。尽管很多那些程序员很

2015-11-04 17:45:39 2044 2

原创 c++多继承布局

1:多重继承对于一个继承了多个base class 的对象,将其地址指定给最左端(也就是第一个)base class的指针, 情况将和单一继承时相同,因为两者都指向相同的其实地址。至于第二个或者更后面的base class的 地址指定操作(把derived class对象地址 赋给 第二个base class类型的指针),则需要将地址修改 加上,介于中间的base class subobjec

2015-09-16 20:05:47 624

迷宫(创建型实践)

为了实践设计模式的创建型的设计模式,所以编写了的一个小小框架。可以使用其中的组件来创建一个迷宫

2015-04-11

空空如也

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

TA关注的人

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