useGlobalState:一个创建全局共享状态的 react hook。
const useGlobalValue = createGlobalState<number>(0);
const CompA: FC = () => {
const [value, setValue] = useGlobalValue();
return <button onClick={() => setValue(value + 1)}>+</button>;
};
const CompB: FC = () => {
const [value, setValue] = useGlobalValue();
return <button onClick={() => setValue(value - 1)}>-</button>;
};
const Demo: FC = () => {
const [value] = useGlobalValue();
return (
<div>
<p>{value}</p>
<CompA />
<CompB />
</div>
);
};
// hookState.ts
export function resolveHookState<S>(nextState: IHookStateInitAction<S>): S;
export function resolveHookState<S, C extends S>(
nextState: IHookStateSetAction<S>,
currentState?: C
): S;
export function resolveHookState<S, C extends S>(
nextState: IHookStateResolvable<S>,
currentState?: C
): S;
export function resolveHookState<S, C extends S>(
nextState: IHookStateResolvable<S>,
currentState?: C
): S {
if (typeof nextState === 'function') {
return nextState.length ? (nextState as Function)(currentState) : (nextState as Function)();
}
return nextState;
}
// useEffectOnce.ts
const useEffectOnce = (effect: EffectCallback) => {
useEffect(effect, []);
};
// useIsomorphicLayoutEffect
const useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : useEffect;
export function createGlobalState<S = any>(
initialState: IHookStateInitAction<S>
): () => [S, (state: IHookStateSetAction<S>) => void];
export function createGlobalState<S = undefined>(): () => [
S,
(state: IHookStateSetAction<S>) => void
];
export function createGlobalState<S>(initialState?: S) {
const store: {
state: S;
setState: (state: IHookStateSetAction<S>) => void;
setters: any[];
} = {
state: initialState instanceof Function ? initialState() : initialState,
setState(nextState: IHookStateSetAction<S>) {
store.state = resolveHookState(nextState, store.state);
store.setters.forEach((setter) => setter(store.state));
},
setters: [],
};
return () => {
const [globalState, stateSetter] = useState<S | undefined>(store.state);
useEffectOnce(() => () => {
store.setters = store.setters.filter((setter) => setter !== stateSetter);
});
useIsomorphicLayoutEffect(() => {
if (!store.setters.includes(stateSetter)) {
store.setters.push(stateSetter);
}
});
return [globalState, store.setState];
};
}
export default createGlobalState;
我比较喜欢这种函数重载,使用的时候很方便,使用时可以灵活传参。
export function createGlobalState<S = any>(
initialState: IHookStateInitAction<S>
): () => [S, (state: IHookStateSetAction<S>) => void];
export function createGlobalState<S = undefined>(): () => [
S,
(state: IHookStateSetAction<S>) => void
];
export function createGlobalState<S>(initialState?: S) {}
uselayoutEffect 在组件内容渲染之前执行。
useEffect 在组件内容渲染之后执行,返回的函数在组件卸载时执行。
源码中利用 uselayoutEffect 在组件渲染前将 stateSetter 放入 store.setters 数组中,利用 useEffect 在组件
卸载时去掉 store.setters 中的 stateSetter。
整体代码思路解构很清晰,创建一个全局对象,当组件渲染时基于全局对象创建组件的状态,通过执
行全局对象的 setters 队列来更新对应的组件状态。
和 VueUse 的 useGlobalState 源码简单对比下:
代码结构思路上更新喜欢 ReactUse useGlobalState 的写法,整体实现思路很清晰,灵活度更高些。
VueUse useGlobalState 的实现上更简单,不用单独给组件创建和释放状态,而且可以创建全局状态相关的 computed 和 watch。但 vue 组件卸载时会自动处理释放 computed 和 watch 的 effects,所以要通过 effectScope 创建 effect 作用域避免释放 computed 和 watch 的 effects,而这样导致代码结构并不是很好理解,官网对 effectScope 的解释也很简单。
使用网络协议分析仪Wireshark环境操作系统:运行Win10操作系统的PC一台 网络平台:以太网 机器的IP地址:IPv4:xxxxxxxxxxxx实验目的1)能够正确安装配置网络协议分析仪Wireshark 2)熟悉使用Wireshark分析网络协议的基本方法 3)加深对协议格式、协议层次和协议交互过程的理解。实验内容及步骤1.安装网络协议分析仪 安装wireshark版本2.6.3。双击wireshark安装程序图标,机内安装过程。根据提示进行选择确认,可以顺利安装系统。安装好后需重启系统。2.使用Wireshark分析协议 ⑴启动系统。点击“Wireshark”图标,出现如图1所示的软件界面。 ⑴启动系统。点击“Wireshark”图标,出现如图1所示的软件界面。 ⑵打开命令行,输入tracertwww.baidu.com ⑶在启动界面双击以太网开始抓包,在过滤器中输入“ip.addr==119.75.216.20”开始抓包。 实验结果1、tracertwww.baidu.com 分析: ①Tracert:路由跟踪实用程序。用于确定IP数据包访问目标所采取的路径,
前言QtQuick和QtWidgets这两种技术,官方是强推QtQuick的。https://download.qt.io/official_releases/QtForPython/注意:QtWidgets使用Python结合PySide2开发的时候,窗口的缩放,内部的组件不会随之缩放,用C++开发使用同样的UI文件就没有问题,不知道是PySide2的BUG还是哪的问题。 所以目前我就不太建议用QtWidgets形式开发,建议QtQuick. 常见属性结合控件的SizePolicy属性,来控制布局管理中的控件的尺寸自适应方式。一些常用值的含义:Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。 Minimum:控件的sizeHint为控件的最小尺寸。控件不能小于这个sizeHint,但是可以放大。 Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小的允许尺寸。 Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小。 Expandint:控件可以自行增大或者缩小。 注:sizeHint(布局
乍一看这题很熟悉,原来之前做过它的第二道,参见 LeetCode122.BestTimetoBuyandSellStock解题@GhostLWB 来看一下题目Sayyouhaveanarrayforwhichtheithelementisthepriceofagivenstockondayi.Ifyouwereonlypermittedtocompleteatmostonetransaction(ie,buyoneandselloneshareofthestock),designanalgorithmtofindthemaximumprofit.题目的大意是,给你一个数组,里面的第i个元素是第i天的股票股价,你只可以进行最多一次交易(一次买入,一次卖出),你要设计一种算法找到最大的利润。 Example1:Input:[7,1,5,3,6,4] Output:5 max.difference=6-1=5(not7-1=6,assellingpriceneedstobelargerthanbuyingprice) Example2:Input:[7,6,4,3,1] Output:0 I
python测开笔试题100个人围一圈编号1-100,依次开始报数, 从1开始,报到3的退出,然后继续从1开始,报到3退出,直到最后只有2个人,得到编号58,91 从1开始,报到4的退出,然后继续从1开始,报到4退出,直到最后只有3个人,得到编号34,45,97实现效果: 输入:3 输出:58,91 输入:4 输出:34,45,97python3代码解决思路,先把1-100编号,前面的99个单独取出来(能数到1-3),最后一个100,由于只有一个了,先单独拿出来 下一步前99个,数到3的移除,得到一个新的列表编号 把100和新的列表编号拼接到一块,这样可以进行下一轮的报数n=3#报的数 a=list(range(1,101))#编号1-100 #取出最后的余数 end_a=a[len(a)//n*n:]#多余的 start_a=a[:len(a)//n*n] #print(start_a) #print(end_a) i=n whilei<=len(start_a): #每隔3移除掉 start_a.remove(start_a[i-1]) i=(i-1)+n #多余的数拼接到前
1.依赖Flink版本:1.11.2 ApacheFlink内置了多个KafkaConnector:通用、0.10、0.11等。这个通用的KafkaConnector会尝试追踪最新版本的Kafka客户端。不同Flink发行版之间其使用的客户端版本可能会发生改变。现在的Kafka客户端可以向后兼容0.10.0或更高版本的Broker。对于大多数用户使用通用的KafkaConnector就可以了。但对于0.11.x和0.10.x版本的Kafka用户,我们建议分别使用专用的0.11和0.10Connector。有关Kafka兼容性的详细信息,请参阅Kafka官方文档。通用Connector: <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka_2.11</artifactId> <version>1.11.2</version> </dependency>复制0.11Connec
“灵魂拷问分布式系统为什么需要注册中心呢?分布式系统注册中心有哪些坑?分布式系统注册中心怎么来实现呢?注册中心利用现成的组件很好实现吗?看到标题你可能会鄙视一下,注册中心有是什么讲的。注册中心作为现在架构中的一个组件来说,确实很常见。微服务作为分布式系统最典型的一种表现形式,是最近几年最流行的概念之一。每个讲微服务的文章中或多或少都会提及注册中心,但也只是一带而过,注册中心作为分布式系统或者微服务架构中最重要的一环,我觉得有必要写一篇单独的文章来详细的介绍一下,这也是有这篇文章的原因。分布式系统的痛点注册中心从架构的角度来讲,其实是一个统称的概念,并非现在流行的微服务所有,在很早之前利用Nginx做负载均衡(反向代理)的时候,Nginx会根据配置文件把每个请求根据配置的策略导向后端具体的处理程序,在这个流程中,站在客户端角度,Nginx很像一个网关,站在后端处理程序的角度,Nginx更像是服务的管理中心,它管理着所有可以提供服务的后端处理程序信息,并且还可以利用某些手段来达到服务的健康检查,服务的自动注册和剔除等操作。当然现在流行微服务,网关和注册中心被分为两个并行的概念和组件。在重要
怎样辨别MacBook是否为翻新机?如果你是在正规渠道购买MacBook笔记本的话,如苹果直营店,官网等,是不用担心买到翻新机的问题。不过有的小伙伴可能会选择其它一些渠道,购买水货之类,这样的话,如果遇到奸商的话,就有可能会遇到二手的翻新机。这里小编给大家简单介绍一下怎么辨别MacBook笔记本是否为翻新机的方法。一、先从外观着手1要辨别一款MacBook笔记本是否为翻新机的话,首先可以从它的外观下手。从整个机身,屏幕,键盘下手,看看是否有划痕,外观损伤等。2、另外还可以查看笔记本底部的螺丝,看看是否有被扭动过的痕迹。3、如果底部的螺丝有明显被扭动过的痕迹的话,那说明此机器肯定是翻新机了。如果笔记本的外观没有问题,螺丝也没有被扭动过的痕迹的话,请接着往下看。二、查看电池使用信息1、由于MacBookPro或AIr都会内置一块电池,在使用过程会经常为电池充放电,并且电池有忘记功能。我们可以先查看电池的使用次数,从这里着手,看看当前笔记本是否为翻新机。进入Mac系统以后,请点击屏幕左上角的苹果图标,再点击“关于本机”选项,如图所示2、在关于本机信息窗口中点击“系统报告”按钮,如图所示3、接
1.类中的函数定义后加了一个const代表什么?代表它将具备以下三个性质: 1.const对象只能调用const成员函数。 2.const对象的值不能被修改,在const成员函数中修改const对象数据成员的值是语法错误 3.在const函数中调用非const成员函数是语法错误 任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。 所以看完上面这句话就应该明白了函数定义后加const的用处,以及什么时候用到const,这会是一个好的编程习惯的。 以下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编译器将指出GetCount函数中的错误。 classStack { public: voidPush(intelem); intPop(void); intGetCount(void)const;//const成员函数 private: intm_num; intm_data[
流畅设计FluentDesignSystem中的光照效果RevealBrush,WPF也能模拟实现啦!发布于2018-04-0508:34 更新于2018-05-2912:56UWP才能使用的流畅设计效果好惊艳,写新的UWP程序可以做出更漂亮的UI啦!然而古老的WPF项目也想解解馋怎么办?于是我动手实现了一个!迫不及待看效果 ▲是不是很像UWP中的RevealBorderBrush?不止是效果像,连XAML写法也像:<BorderBorderThickness="1"Margin="50,34,526,348"> <Border.BorderBrush> <demo:RevealBorderBrush/> </Border.BorderBrush> </Border> <BorderBorderThickness="1"Margin="50,76,526,306"> <Border.BorderBrush> <demo
摘要开发一个软件,并把源代码发布到github,就是开源么?如何能够开发一个有价值的开源项目、如何能够维持一个健康活跃的社区并让开源项目真正从中受益、如何能够通过它帮助他人和提高自己,这些才是开源更需要关注的方面。我们来看看当当架构部总监是如何从四个方面来玩转Java开源项目。视频内容Java开源现状Java是一门历史非常悠久的开发语言,从1995年初见至今,时间的指针已不知不觉的拨动了二十多个年头。请跟我简单回顾一下Java那些抓住历史高光的瞬间,也顺便回忆一下当时那些与Java一起产生共鸣的技术风暴。Java首次出现在人们的视野中是1995年,它提出了Writeonce,runanywhere的口号让开发者觉得兴奋。随着JDK1.0的发布,一些核心概念闪亮登场,它们是JVM,Applet和AWT。Applet和AWT目前虽已退出历史潮流,但当初在网页上展现的冒着热气的咖啡的Applet小程序,确实让人眼前一亮。JVM则沿用至今,基于JVM的跨平台特性对后续的技术产生了深远的影响。1998年发布的JDK1.2,首次提出了J2SE、J2EE和J2ME三个系列,分别对应于标准开发,企业级
复制表--复制表 createtablenew_tableasselect*fromProduct复制--复制表结构不要数据 createtablenew_tableasselect*fromProductwhere1=2复制在where后面跟一个不成立的条件,就会仅复制表的结构而不复制表的内容。删除表--删除表 deletetablenew_table --删除表,无法找回 truncatetablenew_table复制序列序列(SEQUENCE)其实是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。其主要的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值。 使用语句创建序列----创建序列 createsequenceuser_seq incrementby1 startwith1 nomaxvalue nominvalue nocache复制多表查询select*fromp_empe,p_deptdwheree.deptno=d.deptno复制笛卡尔积 笛卡尔积在sql中实现的方式是交叉连接,所有连接方
在学习和做练习题的过程中,发现部分内容比较绕,不太容易理解,题不太容易做对,因此加入了一轮重难点学习的过程。区分项目经理和公司高级管理层的职责和角色? 项目经理角色:综合者、沟通者、团队领导、决策者、气氛创造者。项目经理职责(可分为两部分):管理部分,制定项目管理计划、制定进度表、费用估算、团队发展、趋势分析;汇报部分,绩效报告、进度报告、管理项目的可交付成果、对项目的成功负责。高管角色:任命项目经理、批准项目计划和整体变更、提供支持。高管职责:在特殊情况下接入项目,包括:估算和风险识别所需的历史资料不足,项目经理权利不足,项目资源未能满足,团队没有产出可交付成果。组建项目团队的原则和建设团队的原则(有效团队和无效团队的特征)? 组建基本原则包括:尽早、持续、选择合适人员、确认重大贡献人、取得团队的同意认可。建设团队的目标是:提高成员知识和技能,提高团队成员之间的信任感,创造富有生气和凝聚力的团队文化。有效团队特征:具有共同目标、喜欢一起工作、通过完成自己任务为项目目标作贡献、成员具有相关技能、对项目高度忠诚、形成团队精神。无效团队特征:挫折、冲突和不良竞争、没有效率的会议、对项目经理
大家好,又见面了,我是你们的朋友全栈君。 前言一般情况下属性都是放到data中的,但是有些属性可能是需要经过一些逻辑计算后才能得出来,那么我们可以把这类属性变成计算属性。比如以下:<divid="example"> {{message.split('').reverse().join('')}} </div>复制在这个地方,模板不再是简单的声明式逻辑。你必须看一段时间才能意识到,这里是想要显示变量message的翻转字符串。当你想要在模板中的多处包含此翻转字符串时,就会更加难以处理。所以,对于任何复杂逻辑,你都应当使用计算属性。 基础例子<divid="app"> <h2>总价格:{{totalPrice}}</h2> </div> <script> constvm=newVue({ el:"#app", data:{ message:"hello", books:[ {name:
“想要发一篇论文,怎么就那么难?” 无论几岁的计算机视觉党,面对这样的灵魂拷问,很有可能都要陷入沉思。0-1岁的科研人要考虑的是, 谁来告诉我,哪个研究方向比较好,比较热门,比较不卷,比较好发论文。2岁以上的科研人已然入坑,一时半会也爬不出来, 所以想着,求大神指导,怎么“抢idea”、怎么占坑、怎么快速发论文……大多数CV研究生的最终目的地无非两个,工程上的或者学术上的。要么进大厂当算法工程师;要么成为Lab算法研究员。而要到达理想目的地的前提条件是,有一份拿得出手的成绩——发论文的数量和质量无疑是最好的背书。然而,导师时常无法抽出时间指导,想发论文却无人指点……近年来计算机视觉绝对算是大热门。从各个顶会论文的收录情况也不难看出其热度,但总有些冷静的学生: 计算机视觉领域还有不卷的方向吗?哪些方向比较好发论文?idea和创新方向从哪里来?10月11日,沃恩智慧公开课,邀请顶会顶刊审稿人Henk老师,一小时梳理“走红”CV圈的自监督学习发展脉络及经典、前沿方法。帮助大家理清科研思路,高效获取创新点及idea。(添加老师微信即刻获取带读论文代码。)扫码免费听自监督学习直播课一起 get
一、undefinedsymbol错误 今天在运行模块执行文件时,出现了如下报错"symbollookuperror"、"undefinedsymbol",提示cos_getfile_mcd可执行文件在加载.so文件时,出现了无法找到符号的错误,并给出了具体错误:_ZN20CCosGetfileTimerInfoC2Ev符号未定义。 那么如何定位该错误呢?一般可以先使用ldd指令去查看一下可执行文件的链接库,但是我的可执行文件是在加载调用.so文件的过程中出现报错,ldd指令并没有解决我的问题,因此要用的nm指令来定位错误源。那么接着请往下看看nm指令介绍。 二、nm指令 1、nm指令的作用 nm命令主要是用来列出某些文件中的符号(说白了就是一些函数和全局变量等),后端程序员一般需要掌握该指令。 2、nm指令的参数 nm指令的参数如下: 复制 #指令使用格式 nm-xx[objfile...] #指令中的-xx即为如下参数列表 [-a|--debug-syms] [
HyperledgerFabric、Corda和以太坊的对比 三种不同的框架 我们从HyperledgerFabric、R3Corda和以太坊的白皮书中可以看到,三种框架在可能的应用领域上分别具有完全不同的想法。 Fabric[1]和Corda[2]的开发是受具体用例驱动的。其中,Corda的用例来自于金融服务行业,这也是Corda可见的主要应用领域。Fabric设计提供一种模块化、可扩展的架构,可用于从银行、医疗保健到供应链等各个行业。 以太坊表现出完全独立于任何特定的应用领域[3]。然而与Fabric相比,以太坊并未突出模块化,而重在为各种交易和应用提供一个通用平台。 对等端的参与 在传统的集中式数据存储中,只有一个实体(即所有者)可以保留账本这一底层数据库的副本。因此,该实体控制了哪些数据可以提供,以及允许其它实体提供什么数据。DLT的出现,从根本上改变了分布式数据存储的方式,实现了多个实体拥有底层数据库副本,自然也支持每个拷贝做出贡献。参与分布式数据存储的所有实体,形成一种由所谓“节点”或“对等端”构成的网络。由于数据是分布式存储的,因此难以确保所有
gtkmm24-devel-2.24.5-2.fc26.aarch64.rpm2017-02-1118:17620KfedoraMirroringProject 复制 gtkmm24-docs-2.24.5-2.fc26.noarch.rpm2017-02-1118:179.0MfedoraMirroringProject 复制 gtkmm30-3.22.0-2.fc26.aarch64.rpm2017-02-1118:31918KfedoraMirroringProject 复制 gtkmm30-devel-3.22.0-2.fc26.aarch64.rpm2017-02-1118:31694KfedoraMirroringProject 复制 gtkmm30-doc-3.22.0-2.fc26.noarch.rpm2017-02-1118:3111MfedoraMirroringProject 复制 gtkparasite-0.2.0-0.2.20121121git0a0c90b7.fc26.aarch64.rpm2017-02-1118:2231KfedoraMirr
RecentlywewerebuildingaShinyAppinwhichwehadtoloaddatafromaverylargedataframe.Itwasdirectlyimpactingtheappinitializationtime,sowehadtolookintodifferentwaysofreadingdatafromfilestoR(inourcasecustomerprovided csv files)andidentifythebestone. Thegoalofmypostistocompare: read.csv from utils,whichwasthestandardwayofreading csvfilestoRinRStudio, read_csv from readr whichreplacedtheformermethodasastandardwayofdoingitinRStudio, load and readRDS from
比亚迪总裁王传福说:诺基亚的倒塌给我们留下深刻的思考,它的倒下,是因为技术战略错了。不用安卓这个体系,用它自己的塞班体系…许多传统企业由于缺乏技术战略,纷纷倒下,如柯达、UT斯达康、朗科、奥林巴斯等企业,因为缺乏技术创新而惨遭市场淘汰。 共创力咨询认为,如今,在竞争激烈的市场中,技术战略是实现企业战略重要支撑,技术洞察决定技术路线,技术路线决定技术战略。如果技术路线错误,会使得企业元气大伤,甚至走向消亡。技术战略在企业战略中的位置如下: 技术战略规划的目的 技术战略规划主要用于指导公司所有产品线,业务部门的技术战略规划活动,提前识别和布局好未来3-5年重大技术解决方案和关键技术,提前准备好产品需要的关键技术,确保公司技术准备好。随着国家对科技创新越来越重视,各种新兴技术如5G、物联网、高端医疗诊断设备、基因检测、现代中药、智能机器人、3D打印、北斗卫星等成为现代高科技企业的创新焦点,共创力咨询认为,企业技术规划的价值有两个方面:技术资产化和技术商品化: 技术战略规划的核心内容 技术战略规划的主要活动之一:五看四定 从不确定性中识别未来机会,找到立足市场的核
VMwareWorkstation与Device/CredentialGuard不兼容。在禁用Device/CredentialGuard后,可以运行VMwareWorkstation。 1. 2. “win+R“打开运行,输入gpedit.msc 本地计算机策略-->计算机配置-->管理模板>系统-->DeviceGuard 基于虚拟化的安全设置为“已禁用” 3. 右键开始选项(或者是“win+x”)点击“WindowsPowerShell(管理员)(A)” 输入:bcdedit/sethypervisorlaunchtypeoff确认即可 --------小尾巴 ________一个人欣赏-最后一朵颜色的消逝-忠诚于我的是·一颗叫做野的心.决不受人奴役.怒火中生的那一刻·终将结束...
**D:字符串的展开** 时间限制:1000MS内存限制:32768KB 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母或数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”。在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活。具体约定如下: (1)遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符。 (2)参数p1:展开方式。p1=1时,对于字母子串,填充小写字母;p1=2时,对于字母子串,填充大写字母。这两种情况下数字子串的填充方式相同。p1=3时,不论是字母子串还是数字字串,都用与要填充的字母个数相同的星号“*”来填充。 (3)参数p2:填充字符的重复个数。p2=k表示同一个字符要连续填充k个。例如,当p2=3时,子串“d-h”应扩展为“deeefffgggh”。减号两边的字