<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ForeverCjl的专栏]]></title><description><![CDATA[程序员在囧途]]></description><link>https://blog.youkuaiyun.com/ForeverCjl</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ForeverCjl]]></copyright><item><title><![CDATA[Flutter dart_vlc 组件 player.back is not defined in controls.dart 解决方案]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/125073352</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/125073352</guid><author>ForeverCjl</author><pubDate>Tue, 31 May 2022 21:11:18 +0800</pubDate><description><![CDATA[如何解决dart_vlc出现Player.back is not defined in controls.dart的问题]]></description><category></category></item><item><title><![CDATA[点阵笔行业]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/124805828</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/124805828</guid><author>ForeverCjl</author><pubDate>Tue, 24 May 2022 22:43:24 +0800</pubDate><description><![CDATA[什么是点阵笔？

点阵笔在形态上跟普通的笔很像，不同的是其内部增加了很多的元器件，用于点阵码的识别和计算。整体的形态可以参考下面这两张图：





这款是我自己买的印象笔记出品的Everpen，用它搭配已经铺好点阵码的本子可以把本子上书写的内容进行电子化存档。

从笔头的视角可以看到，除了装有普通的笔芯笔头之外，其下方还有一个小孔。这个小孔是留给红外线摄像头用的，内部的红外摄像头会发生红外线来采集点阵码影像，里面具体的技术实现后面会讲到。

上面有提到，笔的内部有一系列的普通笔不具有的元器件，主要是以下这]]></description><category></category></item><item><title><![CDATA[Flutter Widget原理（一）]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/124955932</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/124955932</guid><author>ForeverCjl</author><pubDate>Tue, 24 May 2022 22:09:19 +0800</pubDate><description><![CDATA[前言
使用过Flutter的同学，应该都听过一句话“everything is a widget——在Flutter中万物皆是Widget”。
这句话虽然不能说，Flutter开发所有代码模块都是一个Widget，但足以说明Widget在Flutter中的重要性，本篇文章就重点关于Flutter Widget的原理进行解读。
Widget简介
什么是Widget？我们先看一下官方的描述
“Describes the configuration for an [Element]”
在Flutter中，Widg]]></description><category></category></item><item><title><![CDATA[通过源码排查 python log 在console中重复打印日志问题]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/124887259</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/124887259</guid><author>ForeverCjl</author><pubDate>Fri, 20 May 2022 17:20:03 +0800</pubDate><description><![CDATA[今天一位小伙伴过来问我，他写的程序中log明明只调用了一次，但在console中打印了多次，表示不解。具体现象表现为：
123456

123456
123456

123456
123456
123456

分析了一下他的代码，大致的逻辑是他在for循环中调用了一个静态类的方法，该方法中会初始化logger并打印log，为了方便理解，我把代码进行了简化，代码如下：
"""
test.py
"""
def test(self):
    for i, test_resource in enumerate(t]]></description><category></category></item><item><title><![CDATA[Android性能优化：定性和定位Android图形性能问题——以后台录屏进程为例]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/124748353</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/124748353</guid><author>ForeverCjl</author><pubDate>Fri, 13 May 2022 11:26:13 +0800</pubDate><description><![CDATA[原文链接：https://juejin.cn/post/7096288511053004830
作者github：https://github.com/NasdaqGodzilla


简介
发现、定性与定位

FPS
初步定位问题
定性问题

跟不上旋律节奏的VSYNC
严重异常耗时的dequeueBuffer
VirtualDisplay合成耗时
结论


定位问题

总结




成果展示
参考

简介
本文记录一次Android图形性能问题的分析过程——发现、定性和定位图形性能问题，以及探讨的性能.]]></description><category></category></item><item><title><![CDATA[【转载】RocketMQ是怎么跑起来的？]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/124448574</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/124448574</guid><author>ForeverCjl</author><pubDate>Wed, 27 Apr 2022 13:07:16 +0800</pubDate><description><![CDATA[原文链接：https://juejin.cn/post/7091096519947862023
作者：pinnuli

RocketMQ是怎么跑起来的？
一说到RocketMQ，很多人人都知道其有四大组件，NameServer、Broker、Producer、Consumer，也大概都知道这四个组件分别有什么作用，负责什么功能，但是不知道这四个组件是如何配合的。
今天我们就来聊聊，这四个组件如何配合，通过哪些核心的API或者组件进行通讯配合，让RocketMQ跑起来，完成一条消息的产生和消费。

这里只会.]]></description><category></category></item><item><title><![CDATA[《Electron入门与实战》创作路上的那些事儿]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/124411776</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/124411776</guid><author>ForeverCjl</author><pubDate>Mon, 25 Apr 2022 20:15:24 +0800</pubDate><description><![CDATA[《Electron入门与实战》创作路上的那些事儿前言我为什么要写这本书系统化的整理和输出自己的知识帮助初学者更好的入门机缘巧合创作历程历程概览写书机会怎么来的？正式写书前的流程选题材料主要写啥？写作过程的感受一个人的项目管理写作小技巧知识盲区书的字数是怎么统计的？开始写作后经历的流程写书带来的收获与改变写一本书之前，需要准备些什么？购买链接
前言
我的新书《Electron入门与实战》于3月正式发布了，目前已经上架到了各大电商平台，包括当当、京东以及清华大学出版社的淘宝旗舰店。书的定价锚定在了89.9元，虽]]></description><category></category></item><item><title><![CDATA[Electron v17版本都有哪些值得关注的更新？]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/123147430</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/123147430</guid><author>ForeverCjl</author><pubDate>Sat, 26 Feb 2022 21:38:48 +0800</pubDate><description><![CDATA[背景
2022年1月，Electron团队发布了Electron的第十七个稳定版本。该版本除了升级Chromium和Node.js的版本以外，还对一小部分重要的API的使用方法做了更新。下面我们将重点看看17版本都有哪些值得关注的更新。
更新内容
核心组件升级
Chromium的版本升级到了98.0.4758.74，Node.js的版本升级到了16.13.0，它们共同使用的V8也升级到了9.8版本。
重要的API变更
使用Web技术开发过桌面共享相关功能的同学应该对desktopCapturer.getSo]]></description><category></category></item><item><title><![CDATA[Flutter单指书写实现及优化]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/123067757</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/123067757</guid><author>ForeverCjl</author><pubDate>Tue, 22 Feb 2022 14:36:00 +0800</pubDate><description><![CDATA[其它平台阅读链接：https://juejin.cn/post/7067372570399473701
背景
最近在用Flutter汉字书写板的功能。需求很简单，只需要实现一个书写板，通过手指在书写板书写的过程中，记录书写的轨迹，最终通过汉字AI识别算法，给出汉字书写的评分。
首次实现
用flutter实现书写板并记录书写轨迹的组件实现非常简单，笔者当时也没有多想，很快就实现了第一版的需求，代码如下：
import 'package:flutter/cupertino.dart';

class DrawB]]></description><category></category></item><item><title><![CDATA[AI开放平台能力集合]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/122988366</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/122988366</guid><author>ForeverCjl</author><pubDate>Thu, 17 Feb 2022 17:45:32 +0800</pubDate><description><![CDATA[背景

随着AI技术的兴起及其逐步在各业务领域落地，越来越多的公司将其业务中使用到的底层AI能力开放出来，通过付费的模式提供给不具备建立AI能力的公司使用。

AI技术包含非常多不同的方向，如文档识别、人脸人体识别、NLP语义分析以及大数据挖掘等。市面上不同的厂家提供了不同方向的技术，玲琅满目。

在此对市面上提供AI技术的平台和具体方向进行了一个整理，方便大家需要的时候可以快速的找到对应的平台，并进行相应的评估。






...]]></description><category></category></item><item><title><![CDATA[Webview2 vs 对比 Electron]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/121098390</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/121098390</guid><author>ForeverCjl</author><pubDate>Tue, 02 Nov 2021 22:42:52 +0800</pubDate><description><![CDATA[前不久微软Teams团队宣布他们将放弃使用Electron转而使用基于Edge的Webview2组件来重新实现Teams程序，目的是在于减少软件所占用的内存。对于开发者来说，微软内部团队的这个决策给外界的感觉是Electron的寿命即将到头了，他们后续将重点发展和使用Webview2来进行开发。那究竟是不是这样呢？其实在7月份的时候Electron的官方博客已经对此进行了说明，并在文章中把Electron和Webview2进行了对比。接下来我们来一下原文，看看Electron团队对这个事情的看法。

以下是]]></description><category></category></item><item><title><![CDATA[Wireshark分析DNS]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/121016434</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/121016434</guid><author>ForeverCjl</author><pubDate>Thu, 28 Oct 2021 16:02:38 +0800</pubDate><description><![CDATA[什么是DNS
DNS指的是域名系统，它在内部有一个存储域名和对应IP地址的数据库，用于将网站的域名转换为服务器的具体IP地址。
例如，我们在浏览器打开baidu.com时，浏览器需要先请求DNS服务器获取域名baidu.com对应服务器的IP地址，然后浏览器与该IP建议消息通道来传输数据。
我们可以在系统命令行中通过nslookup命令来查询某个域名的DNS的记录，如下图所示：

这里我们指定使用阿里云的DNS服务器 223.5.5.5 来查询域名baidu.com映射的IP地址。从图中可以看到，查询结果返]]></description><category></category></item><item><title><![CDATA[国外最有价值的教育科技公司 Byju‘s]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/120974431</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/120974431</guid><author>ForeverCjl</author><pubDate>Tue, 26 Oct 2021 18:50:58 +0800</pubDate><description><![CDATA[这里写目录标题简介公司创始人Byju RaveendranDivya Gokulnath公司规模近年营收情况员工情况业内排名发展历史APP下载数据使用评价用户数据商业模式付费数据收购的公司产品主要特点核心技术硬件设备平板支架+反光镜桌面学习终端未来业务布局成功的因素相关资料

简介
公司
Byju’s 是一家总部位于印度班加罗尔的跨国教育科技公司，由“Byju Raveendran 和 Divya Gokulnath”于 2011 年创立，采用免费+增值业务模式。目前它是印度最大的教育科技公司，被公认为印度]]></description><category></category></item><item><title><![CDATA[强制开启Android Webview GPU 加速的方法]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/120283859</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/120283859</guid><author>ForeverCjl</author><pubDate>Tue, 14 Sep 2021 11:25:30 +0800</pubDate><description><![CDATA[强制开启Android Webview GPU 加速的方法
常用方法
浏览器开启GPU加速可以让渲染的性能更好，可以有效的利用硬件的能力来提高页面的绘制帧率。在安卓平台使用webview的场景下，开发人员通常会通过以下两种方法来让webview使用硬件加速能力来渲染页面。
方法一：
在应用的启动配置中，添加 android:hardwareAccelerated="true"配置，如下图所示：

方法二：
通过在webview初始化的方法中使用如下代码：
wv.setLayerType(View.LAYER]]></description><category></category></item><item><title><![CDATA[EcmaScript 2022中的新特性]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/120206516</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/120206516</guid><author>ForeverCjl</author><pubDate>Thu, 09 Sep 2021 17:53:24 +0800</pubDate><description><![CDATA[EcmaScript 2022中的新特性
ES2022 feature: class static initialization blocks
Everything new coming in ES2022
前言
从2015年起，Javascript每年都会在标准中加入一些新的特性。本篇文章将介绍几个已经到stage 4阶段的标准。一般来说，标准的提案需要经过4个阶段，第4个阶段是最后一个阶段。到达第4阶段的标准也意味着标准制定的工作已经基本结束。
现在我们来一起看一看ES2022中的新特性：
类的字段
类]]></description><category></category></item><item><title><![CDATA[Grafana v7以下版本对多query进行计算 MetaQueries Percent+]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/120180099</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/120180099</guid><author>ForeverCjl</author><pubDate>Wed, 08 Sep 2021 14:54:37 +0800</pubDate><description><![CDATA[场景
在使用Grafana配置图表看板时，我们可能需要对多个查询条件筛选出来的结果进行计算，把计算结果生成最终的图表。例如，我们想制作一个应用崩溃率的图表，那么步骤应该如下：

查询应用启动的数据集合A
查询应用崩溃的数据集合B
通过 (B/A)*100 来生成集合C
将集合C的数据配置成看板

解决方案
在Grafana v7之后的版本中，我们可以使用Transform功能来对两个query进行计算，具体方法可参考文章：https://blog.youkuaiyun.com/weixin_48421114/artic]]></description><category></category></item><item><title><![CDATA[Flutter中如何选择StatelessWidget和StatefulWidget]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/119822621</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/119822621</guid><author>ForeverCjl</author><pubDate>Fri, 20 Aug 2021 14:25:22 +0800</pubDate><description><![CDATA[目录StatelessWidget和StatefulWidget的区别StatelessWidgetStatefulWidget区别什么情况下应该用StatelessWidget？什么情况下应该用StatefulWidget？通用按钮自带倒计时的按钮使用不当会不会影响性能？
Flutter作为“新”的跨平台UI开发框架，延续了React组件化的开发思路，开发者可以通过一个个组件来构建完整的App的界面。由于React中只提供了一个基础组件类React.Component，因此开发者在在写组件代码之前不需要进]]></description><category></category></item><item><title><![CDATA[带你一文读懂Javascript中ES6的Symbol]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/109542813</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/109542813</guid><author>ForeverCjl</author><pubDate>Mon, 09 Nov 2020 19:29:43 +0800</pubDate><description><![CDATA[带你一文读懂Javascript中ES6的Symbol前言基础类型SymbolSymbol.for 与 Symbol.keyForSymbol.iteratorSymbol.searchSymbol.splitSymbol.toPrimitive总结
前言
Symbol这个特性对于很多同学来说，可能是在学习ES6特性的过程中，感到比较困惑的一个特性点。在大部分开发场景中，你可能根本用不到这个特性，但理解Symbol各个属性和方法的作用和意义还是非常有必要的，在一些特定的场景中，你会发现它不可或缺。Symbo]]></description><category></category></item><item><title><![CDATA[教你解决Taro微信小程序中使用Echarts体积过大的问题]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/109536031</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/109536031</guid><author>ForeverCjl</author><pubDate>Fri, 06 Nov 2020 17:33:31 +0800</pubDate><description><![CDATA[背景
近期笔者在使用Taro进行微信小程序开发，当引入Echarts图表库时，微信检测单包超限2M的一系列优化措施的踩坑记录，期望能指导读者少走一些弯路。
为什么选择Echarts？
微信小程序目录市面上使用最多的两款图表库，如下：

echarts-for-weixin——echarts微信小程序版本
wx-charts——基于微信小程序的图表库

对比两款图表库优缺点刚好相反。

echarts-for-weixin：功能强大，但体积非常大
wx-charts：功能相对简单，但体积小

由于笔者对ech]]></description><category></category></item><item><title><![CDATA[Javascript中的方法链式调用]]></title><link>https://blog.youkuaiyun.com/ForeverCjl/article/details/109402465</link><guid>https://blog.youkuaiyun.com/ForeverCjl/article/details/109402465</guid><author>ForeverCjl</author><pubDate>Sat, 31 Oct 2020 15:39:40 +0800</pubDate><description><![CDATA[前言
方法的链式调用这个概念，其实是在面向对象编程中比较常见的语法，它能让使用者在一个对象上连续的调用不同的方法。在不使用临时变量存储中间结果的情况下完成一条语句上多个方法的连续调用。
在使用jquery的过程中，会经常用到链式调用，比如：
$('#forevercjl').addClass('px').removeClass('xp');

下面我们就用一个简单计算器对象例子，来模拟实现这样的链式调用。
为链式调用创建一个对象
首先我们用函数创建一个对象：
const calObj = function(]]></description><category></category></item></channel></rss>