CSS的未来已来
了解更多添加:308139472
前言
最近听说TypeScript3.7添加了对Optional Chaining的支持,然后就想着给鱼头的脚手架ying-template的TS版本升级,然后在命令行发现这样的一句信息:
'postcss-cssnext' 已经被 'postcss-preset-env'代替了。详情请查看 moox.io/blog/deprec…
其实鱼头的脚手架里早就把postcss-cssnext换成了postcss-preset-env,不过一直没删,但是看到这句话之后,处于好奇,就去翻了翻PostCSS 的官网,然后又思考了下这些年CSS的发展历程,遂有这篇文章的出炉。
浅谈现代化的CSS
从1997年CSS1.0发布到如今,从最开始只支持简单的文字排版到如今已经可以做出酷炫的3D动画,CSS已经走过了22个年头,其发展如图所示:
[图片来自MDN]
随着互联网的发展,人们对网页的要求已经是从只要展示图文就好变成了各种交互跟视觉效果都需要有着更多的体验要求。CSS为此也是不断的更新着。
随着web业务日益复杂化和多元化,前端开发也从单纯的web page转变成web app,在此也诞生了“前端工程化”的概念,一个完备的web app往往会很大很复杂,甚至会有很多人共同维护,以往的拼页面,写jQuery已经是不足以支撑现代的需求。同样的,CSS也是如此,不再是内联写几个margin,padding或者HTML一股脑引入几个CSS就足够的,而且由于人员配置的增多,不同的开发,命名习惯,样式是否会冲突也是必须要考虑的。
除了工程问题,还有就是CSS与浏览器之间的关系也是我们不得不考虑的,虽然CSS发展的很快,但是浏览器对CSS新特性支持的进度确实非常缓慢的。所以虽然某些属性已经推出了很多年,但是也往往因为浏览器的原因而无法进行大规模的使用。
虽然在实际开发过程中,CSS有着这样那样让人无法忽略的问题,但是“方法总比困难多”,在前端界也有许多热心的大牛们在尝试着解决这些问题。这次让鱼头与大家一起分享下这些与CSS相关的技巧与方法。
最初的CSS模块化 —— CSS命名规则
命名一直是开发者比较头疼的问题,在前端里,除了JS各种变量的命名,还有元素class的命名,虽然我们可以随意起名,愿意的话甚至可以使用.a .b .c等无意义的规则来命名,但是如果是一个长期的,大型的或多人协作的项目里这么命名,恐怕容易被人胖揍。这次我们来分享下业界常用的用来防挨揍的命名规则。
OOCSS(Object-Oriented CSS)
OOCSS有两个编写原则:
结构与样式分离
容器与内容分离
我们来看看官网的一个例子:
grab
Body
在这里.mod是父类,所有的类都是继承自它,.grab便是子类。
至于.top、.inner与bottom,顾名思义就是不同位置的子盒子。
这里是以“容器”为命名法则。
BEM
BEM 是块(Block)、 元素(Element)、修饰符( Modifier)的单词集合。
在选择器中,我们用以下三种符号来表示以上内容
- 中划线 :仅作为连字符使用,表示某个块或者某个子元素的多单词之间的连接记号。
__双下划线:双下划线用来连接块和块的子元素
_单下划线:单下划线用来描述一个块或者块的子元素的一种状态
就像这样:type-block__element_modifier
官网的例子如下:
.button{
display:inline-block;
border-radius:3px;
padding:7px12px;
border:1px solid#D5D5D5;
background-image:linear-gradient(#EEE,#DDD);
font:70013px/18px Helvetica, arial;
}
.button--state-success{
color:#FFF;
background:#569E3Dlinear-gradient(#79D858,#569E3D)repeat-x;
border-color:#4A993E;
}
.button--state-danger{
color:#900;
}
Normal button
Success button
Danger button
SMACSS
SMACSS,一个长得很像OOCSS的规则。
核心只有以下6个:
Base:页面的基本样式命名规则
Layout:布局命名规则
Module:模块规命名规则
State:状态命名规则
Theme:主题命名规则
Changing State:可变状态的命名规则
修饰符是--,子模块是__
官网的例子如下:
#header{…}
#primarynav{…}
#maincontent{…}
为CSS赋能 —— 预处理器
CSS 预处理器是一个能让你通过预处理器自己独有的语法来生成CSS的程序。市面上有很多CSS预处理器可供选择,且绝大多数CSS预处理器会增加一些原生CSS不具备的特性,例如代码混合,嵌套选择器,继承选择器等。这些特性让CSS的结构更加具有可读性且易于维护。
sass
sass是诞生最早,也是世界上最成熟、最稳定、最强大的专业级CSS扩展语言!(官网说的(O_o)?? )
sass可用使用变量,嵌套规则,混合器,继承等编程语言才有的概念,代码例子如下:
$nav-color:#F90;
nav{
$width:100px;
width:$width;
color:$nav-color;
}
//编译后
nav{
width:100px;
color:#F90;
}
less
Less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量、Mixin、函数等特性,使 CSS 更易维护和扩展。
代码例子如下:
@base:#f938ab;
.box-shadow(@style,@c)when(iscolor(@c)){
-webkit-box-shadow:@style @c;
box-shadow:@style @c;
}
.box-shadow(@style,@alpha:50%)when(isnumber(@alpha)){
.box-shadow(@style,rgba(0,0,0,@alpha));
}
.box{
color:saturate(@base,5%);
border-color:lighten(@base,30%);
div{.box-shadow(005px,30%)}
}
// 编译后
.box{
color:#fe33ac;
border-color:#fdcdea;
}
.box div{
-webkit-box-shadow:005pxrgba(0,0,0,0.3);
box-shadow:005pxrgba(0,0,0,0.3);
}
stylus
Stylus,富于表现力、动态的、健壮的 CSS
代码例子如下:
body
font 12px Helvetica,Arial,sans-serif
a.button
border-radius 5px
完全不需要{} : ;的预处理器,个人是特别不喜欢这种写法,但是对于很多喜欢简洁的开发者来说,这确实非常好的编写方式
如魔法师一般的存在 —— CSS Houdini
有点时候眼看CSS出来新的属性,但是因为浏览器兼容的问题,所以往往是只能看而不能用,即便有的属性可以用,但也因为各浏览器的现实情况而存在意想不到的BUG,那么这就意味着一个属性出来之后我们要等到5年甚至更久之后才能使用吗?都9012年了耶?
CSS Houdini是什么?
CSS Houdini是一组底层API,它们公开了CSS引擎的各个部分,从而使开发者可以通过这组API来扩展CSS。它让开发者拥有了直接访问CSSOM的能力,开发者可以通过这组API来编写浏览器可解析的CSS代码,这让开发者可以在不需要等待浏览器的实现的前提下实现自己想要的CSS功能。
[图片来自:www.qed42.com/blog/buildi…]
如上所示,不同的API所对应的就是浏览器不同的渲染环节,用时下流行的概念来解释就是浏览器加载时不同生命周期的钩子函数。
简单来说,CSS Houdini就是JS IN CSS ,niubility ..
CSS Houdini是怎么工作的?
我们可访问的7个API如下:
Typed OM API
Properties & Values API
Paint API
Layout API
Animation worklet
Parser API
Font Metrics API
Mmmm,虽然是有7个API(Houdini drafts上还有一些),但浏览器实际的支持情况其实是这样的:
[图片来自:ishoudinireadyyet.com/]
CSS Houdini的工作流程如下:
[图片来自:www.qed42.com/blog/buildi…]
钩子进入渲染的进程中
JS是这个钩子的核心
使用JS的Typed OM,可以挂载自定义的属性,绘制图形,布局以及动画
还有其他两个API:Parser API 和 Font Metrics API。它们用于注册CSS相关的新事物
一些示例
本篇不打算细讲CSS Houdini,所以不会画出所有的DEMO,有兴趣的可以查看底部的“资料来源”,从而获取更加详细的信息。
Typed OM
* {
margin:0;
padding:0;
}
.box{
background:linear-gradient(to right,#2c3e50,#4ca1af);
}
'use strict'
box.attributeStyleMap.set('width',CSS.px(200))
box.attributeStyleMap.set('height',CSS.px(200))
const[x,y]='width,height'
.split(',')
.map(val=>Number.parseInt(box.computedStyleMap().get(val)))
box.attributeStyleMap.set('transform',newCSSTranslate(CSS.px(x),CSS.px(y)))
console.log(box.computedStyleMap().get('transform'))
console.log(window.getComputedStyle(box,null)['transform'])
上面就是Typed OM的示例,这里值得一提的就是,如果我们用getComputedStyle去获取transform的值,最终结果是个矩阵,这其实不太方便我们做二次操作,但是用Typed OM的JS APIcomputedStyleMap,去取的结果就是一个具体属性的集合,这是非常有利于我们进行二次操作的。
Paint API
Paint API就是允许你例如Canvas的属性来编写CSS样式,使用方法也很简单,我们可以看看slides.iamvdo.me/waq19/#/35上的示例
首先我们新建个文件叫registerPaint.js,在里面写下以下代码:
registerPaint('circle-ripple',class{
staticgetinputProperties(){return['--circle-color',
'--circle-radius','--circle-x','--circle-y'
]}
paint(ctx,geom,props,args){
constx=props.get('--circle-x').value;
consty=props.get('--circle-y').value;
constradius=props.get('--circle-radius').value;
}
}
然后再新建一个index.html,并且在JS代码里注册上面写好的registerPaint.js,方式如下:CSS.paintWorklet.addModule('registerPaint.js');
具体代码如下:
.el{
--circle-radius:0;
--circle-color:deepskyblue;
background-image:paint(circle-ripple);
}
.el.animating{
transition:--circle-radius1s,
--circle-color1s;
--circle-radius:300;
--circle-color:transparent;
}
'use strict'
CSS.paintWorklet.addModule('registerPaint.js');
el.addEventListener('click',e=>{
el.classList.add('animating');
el.attributeStyleMap.set('--circle-x',e.offsetX);
el.attributeStyleMap.set('--circle-y',e.offsetY);
});
所以我们有以下的效果:
CSS届的Babel —— PostCSS
说到底CSS Houdini其实也只是JS IN CSS,并不是纯正的CSS,那么对于一些新的CSS属性,我们相用的话,真的还得等5年后吗?还有即便是有各种工具,但是像一些兼容性写法,厂商前缀,循环,原生CSS也没有,我们不是还得需要依赖CSS预处理器吗?
PostCSS是什么?
简单来说PostCSS就是可以让开发者使用JS来处理CSS的处理器,它分了以下5大类功能:
增强代码的可读性
利用从 Can I Use 网站获取的数据为 CSS 规则添加特定厂商的前缀。Autoprefixer 自动获取浏览器的流行度和能够支持的属性,并根据这些数据帮你自动为 CSS 规则添加前缀。
例如我们输入以下代码:
:fullscreen{
}
那么就会输出:
:-webkit-:full-screen{
}
:-moz-:full-screen{
}
:full-screen{
}
将未来的 CSS 特性带到今天!
PostCSS Preset Env 帮你将现代 CSS 语法转换成大多数浏览器都能理解的东西,根据你的目标浏览器或运行时环境来确定你需要的 polyfills,基于 cssdb 实现。
例如我们输入以下代码:
@custom-media--med(width <= 50rem);
@media(--med){
a {
&:hover{
color:color-mod(blackalpha(54%));
}
}
}
就会输出:
@media(max-width:50rem){
a:hover{
color:rgba(0,0,0,0.54);
}
}
终结全局 CSS
CSS 模块 就是说你永远不用担心命名太大众化而造成冲突太普通,只要用最有意义的名字就行了。
例如我们输入以下代码:
.name{
color:gray;
}
就会输出:
.Logo__name__SVK0g{
color:gray;
}
避免 CSS 代码中的错误
通过使用 stylelint 强化一致性约定并避免样式表中的错误,stylelint 是一个现代化 CSS 代码检查工具。它支持最新的 CSS 语法,包括类似 CSS 的语法,例如 SCSS 。
例如我们输入以下代码:
a {
color:#d3;
}
那么控制台会抛出错误:
app.css
2:10Invalid hex color
强大的网格系统
LostGrid 利用 calc() 和你所定义的分割方式来创建网格系统,无需传递大量参数。
例如我们输入以下代码:
div {
lost-column:1/3
}
就会输出:
div {
width:calc(99.9%*1/3-
(30px -30px *1/3));
}
div:nth-child(1n){
float:left;
margin-right:30px;
clear:none;
}
div:last-child{
margin-right:0;
}
div:nth-child(3n){
margin-right:0;
float:right;
}
div:nth-child(3n + 1){
clear:both;
}
可窥探的未来 —— cssdb
cssdb是postcss-preset-env的实现基准,主要就是CSS的新功能功能及这些功能从提出到成为标准时所在的进程。
cssdb跟ecma一样,对新属性分了不同的进程,具体的进程如下:
Stage 0:脑袋风暴阶段。高度不稳定,可能会发生变化。
Stage 1:实验阶段。也非常不稳定,可能会发生变化,但是该提案已得到W3C成员的认可。
Stage 2:承认阶段。高度不稳定并且可能会发生变化,但是正在积极研究中。
Stage3:拥抱阶段。稳定且变化不大,此功能可能会成为标准。
Stage4:标准阶段。最终的解决方案,所有主流浏览器都支持。
这就是postcss-preset-env依赖的实现基准,那么如果我们想要在我们的代码里使用这些Stage,该怎么做呢?
以我的脚手架ying-template为例,我们来查看在webpack中的实际配置:
首先我们先安装postcss以及其相应的插件:
npm install postcss postcss-loader postcss-preset-env postcss-nesting--save-dev
然后我们在webpack的config配置module中输入以下配置:
module:{
rules:[
{
test:/\.css$/,
include,
exclude,
use:[/* 你其它的loader */'postcss-loader']
}
]
}
然后在根目录新建一个postcss.config.js
constpostcssConfig={
plugins:{
precss:{},
'postcss-preset-env':{
browsers:'last 2 versions',// 浏览器兼容的版本
stage:3// 你用的属性所在的阶段
},
'postcss-nesting':{}// 这里就是你所使用的插件
}
};
module.exports=postcssConfig
复制代码
这样就完成了,如果想看完整的配置,可以clone我的脚手架:github.com/KRISACHAN/y…
(这是个多页面的webpack4脚手架,集成了babel 7,precss 4,typescript3.7,karma以及eslint等现代前端开发所需常用的东西,有兴趣的可以去看看。)
我们可以通过preset-env.cssdb.org/playground这个网站来查看具体的编译结果。
编译结果图如下:
是不是非常神奇呢?
后话
随着前端工程的普及,某E浏览器的没落,CSS的发展可谓是一日千里,近日也有一些数学属性的提案在发起,以后会发展成什么样,没人可以知道。只是总的来说,CSS的未来是一片光明的。本文简单分享了一些现代化的CSS知识,通过这些知识,我们很容易就能写出完备且现代化的CSS代码,能够给创造出更多的效益,希望大家可以积极地用起这些知识,并对CSS可以有更多的思考以及想象。
CSS,未来可期
你可能感兴趣的:(CSS的未来已来)
Tsfresh + TA-Lib + LightGBM :A 股市场量化投资策略实战入门
船长@Quant
Python 金融科技 python tsfresh TA-Lib LightGBM 量化技术 策略开发
Tsfresh+TA-Lib+LightGBM:A股市场量化投资策略实战入门本项目以A股市场为研究对象,通过量化技术对市场数据进行分析,构建量化投资策略,并利用历史数据回测验证策略的有效性。项目旨在为量化技术初学者提供一个系统的学习框架,帮助读者掌握从数据获取到策略评估的全流程操作。文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。适合量化新手建立系统认
flink从kafka读取数据写入clickhouse本地表的实现
Breatrice_li
kafka flink 分布式 大数据
实现功能因为直接写clickhouse的分布式表在数据量比较大的时候会有各种问题,所以做了一个flink读取kafka数据然后路由写入到相应的本地表节点,并且关于不同的表的配置信息可以随时更改并设置生效时间。实现流程首先从kafka将数据读取过来然后进行相应的处理及逻辑判断写入到对应的clickhouse表格中最后根据CDC读取来的配置信息进行相应节点的hash路由,直接写入本地表读取kafka数
demo flink写入kafka_Flink 写入数据到 Kafka
ONES Piece
demo flink写入kafka
Flink写入数据到Kafka前言通过Flink官网可以看到Flink里面就默认支持了不少sink,比如也支持Kafkasinkconnector(FlinkKafkaProducer),那么这篇文章我们就来看看如何将数据写入到Kafka。准备Flink里面支持Kafka0.8、0.9、0.10、0.11.这里我们需要安装下Kafka,请对应添加对应的FlinkKafkaconnector依赖的版
Flink读取kafka数据并写入HDFS
王知无(import_bigdata)
Flink系统性学习专栏 hdfs kafka flink
硬刚大数据系列文章链接:2021年从零到大数据专家的学习指南(全面升级版)2021年从零到大数据专家面试篇之Hadoop/HDFS/Yarn篇2021年从零到大数据专家面试篇之SparkSQL篇2021年从零到大数据专家面试篇之消息队列篇2021年从零到大数据专家面试篇之Spark篇2021年从零到大数据专家面试篇之Hbase篇
Mininet树形拓扑解析
漫谈网络
网络技术进阶通途 网络 mininet sdn nfv
在Mininet中,tree,depth,fanout用于定义树形拓扑的参数,其中:depth:树的深度(层数),包括根节点所在的层。fanout:每层节点的分叉数(每个节点连接的子节点数量)。对于tree,4,3,即深度为4,分叉数为3,其节点生成规则如下:一、拓扑参数定义depth=4:交换机的层级数(根为第1层,共4层交换机)。fanout=3:每台交换机(非最后一层)连接3台子交换机或主机
从零实现B站视频下载器:Python自动化实战教程
木觞清
# 编程语言 自动化 运维
一、项目背景与实现原理1.1B站视频分发机制Bilibili的视频采用音视频分离技术,通过以下方式提升用户体验:动态码率适配(1080P/4K/HDR)分段加载技术(基于M4S格式)内容保护机制(防盗链/签名验证)1.2技术实现路线graphTDA[模拟浏览器请求]-->B[获取加密播放信息]B-->C[解析音视频地址]C-->D[多线程下载]D-->E[FFmpeg合并]二、代码逐层解析2.1请
vue3当中使用Pinia的store的组件化开发模式
堕落年代
vue vue.js
一、安装与初始化安装Pinianpminstallpinia#或yarnaddpinia目的:引入Pinia核心库,为状态管理提供基础支持。挂载Pinia实例在main.js中初始化并注入Vue应用:import{createApp}from'vue'import{createPinia}from'pinia'importAppfrom'./App.vue'constapp=createApp(A
从基础到实践(十九):DC/DC由来和工作原理介绍
硬件进化论
嵌入式硬件 单片机 压力测试 电脑 智能手机 数码相机 智能手表
第一章DC/DC技术的起源与演进之路1.1电力革命的早期困境(1880s-1940s)在爱迪生与特斯拉的"电流战争"时期,直流供电系统暴露出传输损耗大的致命缺陷。尽管交流电最终成为电网主流,但直流电在终端设备供电的不可替代性催生了最早的电压转换需求。1930年代真空管收音机的普及使这一问题凸显:车载6V蓄电池需升压至200V以上供电子管工作,工程师们通过笨重的机械振动子式换流器(VibratorC
vscode连接远程服务器docker里的容器--使用remote ssh
欢仔要学习
python 学习 ubuntu
背景介绍:因为工作的原因,图像相关,模型训练,需要在服务器上面搞,同时,服务器上面的环境配置,全部使用的是docker创建容器的方式。但是呢,之前没有配置好服务器与本机的交互环境,每次更改代码,要上传,下载,很不方便,同时图片也没办法可视化。很不友好。于是就想要使用vscode来连接远程服务器docker;因为docker创建的那个容器相当于是一台ubuntu主机,配置好端口,然后我们从外面去连接
vue3使用swiper7
我承认都是月亮惹的祸
使用第三方库 vue.js 前端 javascript
vue3中使用swiper7基本使用swiper导入Swiper导入组件import{Swiper,SwiperSlide}from'swiper/vue/swiper-vue.js';导入需要使用到swiper的组件模块importSwiperCore,{Navigation,A11y}from'swiper';这里导入了Navigation模块,也就是使用左右箭头来导航.与A11y是一个无障碍
PyCINRAD读取探测中心天气雷达拼图系统v3产品
pysoer
python
PyCINRADPyCINRAD号称国内最强大的雷达数据处理工具,支持多种CINRAD雷达数据格式,兼容性强,横扫CMA雷达基数据和产品,国内首个支持“探测中心拼图3.0”。快速提取、计算雷达衍生产品,如组合反射率CR、回波顶高ET、降水粒子分类HCL等。作为一个开源项目,PyCINRAD对所有用户免费开放,鼓励社区贡献和改进。据悉已遍布CMA的各个系统角落。PyCINRAD官网https://p
PTA--- 666(递归搜索)
对方正在长头发丿
算法 数据结构 蓝桥杯 c++ 深度优先
题目描述:小明有一张m*n的好习惯记录卡,记录每一天的好习惯目标达成度(数字0-9表示)。某天目标完成达成,就在当天的格子里写上数字6,目标没有完全达成就写上一个小于6的数字(0-5),目标超额完成就写上一个大于6的数字(7-9)。记录卡上如果能找到一条长度为3的路径并且路径上的三个数字都大于等于6(这里的路径是指从某个格子出发,可以向左、右、上、下格子移动,并且不能重复经过一个格子),则小明就能
Spring Boot 中使用 @Transactional 注解配置事务管理
m0_74823434
面试 学习路线 阿里巴巴 spring boot 数据库 sql
事务管理是应用系统开发中必不可少的一部分。Spring为事务管理提供了丰富的功能支持。Spring事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染,因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Transa
java for循环内执行多线程
m0_74823434
面试 学习路线 阿里巴巴资料职业发展 java python 开发语言 后端
目录一、java用多线程来加快循环效率(推荐第3种!!!!)?第一种:线程池搭配闭锁?第二种:分页概念执行线程?第三种:分页概念执行线程进阶版!!!!一、java用多线程来加快循环效率(推荐第3种!!!!)第一种:线程池搭配闭锁涉及知识:Executors(线程池)、CountDownLatch(闭锁)优点:代码简洁,方便阅读,性能稳定;缺点:Executors创建的线程池是公用的,如果多个地方使
C语言基础(函数)
指尖DE格桑花
c语言 开发语言 初学者 嵌入式
函数的概述函数:实现一定功能的,独立的代码模块。对于函数的使用,一定是先定义,后使用。使用函数的优势:①我们可以通过函数提供功能给别人使用。当然我们也可以使用别人提供的函数,减少代码量。②借助函数可以减少重复性的代码。③实现结构化(模块化)程序设计思想。关于结构化设计思想:将大型的任务功能划分为相互独立的小型的任务模块来设计。函数是C语言程序的基本组成单元:C语言程序是由一个(必然是main函数)
MyBatisPlus 代码生成器如何使用?一篇文章学会它!!!
程序猿ZhangSir
Java 数据库 # MyBatis java spring 数据库
目录一.MP代码生成器简介二.准备工作2.1建立数据库和表2.1创建项目三.编写工具类3.1创建类3.2定义数据库连接变量3.3定义单表代码生成函数3.4扩展为任意表自动生成代码四.测试代码生成器4.1测试单表生成model方法一.MP代码生成器简介代码生成器是MyBatis-Plus提供的一个非常实用的功能,可以快速生成Entity、Mapper、MapperXML、Service、Contro
使用 Redis 实现手机号验证码登陆功能,实际开发中使用 Token 实现登录校验又是如何做的?
程序猿ZhangSir
Java Spring全家桶 微服务 java bootstrap 开发语言
目录一.使用Redis实现短信登陆功能1.1前言1.2简要分析短信登陆的业务流程1.3代码书写1.4页面展示效果1.5代码优化1.6优化之后的代码二.登录Token2.1JWT简介2.2JWT的使用方式2.3返回token2.4JWT的校验方式一.使用Redis实现短信登陆功能1.1前言对于我们用户来讲,我们在登陆一个APP的时候,有很多种登陆方式,比如"微信扫码"、"手机号登陆"、"支付宝扫码"
This robot has a joint named “gripper_finger_joint“ which is not in the gazebo model.
无码不欢的我
ROS
在B站上看古月居的课《ROS机械臂开发:从入门到实战》,在运行第9节的代码时,出现如下报错:Thisrobothasajointnamed"gripper_finger_joint"whichisnotinthegazebomodel.本人所运行环境为:ubuntu版本:20.04ROS版本:noetic错误分析:xacro的宏调用格式错误,正确格式为或者为:...修改方法:1.找到probot_
Kafka系列之—向Kafka 写入数据(四)
葛旭朋
Kafka kafka 分布式 java
一,创建Kafka生产者1.1必选的三个属性1.1.1bootstrap.servers指定broker的地址清单,不需要包含所有的broker地址,生产者会从给定的broker里找到其它broker的信息,建议最少提供两个broker的信息。1.1.2key.serializerbroker希望接收到的消息的键和值都是字节数组。1.1.3value.serializer指定的类会将值序列化。1.
chatgpt赋能python:Python处理雷达基数据:从入门到实践
lvsetongdao123
ChatGpt python chatgpt 开发语言 计算机
Python处理雷达基数据:从入门到实践随着气象技术的不断发展,雷达探测技术已成为当今天气预报和气象研究的主要手段之一。雷达基数据是气象雷达接收到的未经加工的原始数据,因其包含大量天气信息,不仅在天气预报、天气预警等方面得到了广泛应用,还被广泛地用于气象科研和大气环境研究。本文将介绍如何使用Python处理雷达基数据,解析其中的信息,获取有效的天气数据,以及分析和可视化这些数据。雷达基数据格式与处
c++右值引用详解!
好好学习O(∩_∩)O
c++ 开发语言
前言左值引用可以参考笔者的这篇文章---从c到c++——4:引用-CSDN博客(ps:这篇文章里的引用单只左引用笔者当时水平不高(虽然现在也不高)起错了名字)左值引用与右值引用的定义c++中,无论是左值引用与右值引用,用途都是在给对象起别名左值与右值的概念左值和右值是c++中的一个概念,严格的来说,对于系统提供的=操作符来说(自己提供的重载函数不算),可以放在等号左边的或者能加const的称为左值
unionall的用法(当某条记录为空时,union all是否可以合并此条记录)
hammring
mysql
我们经常说union和unionall的区别在于:1.union合并相同的列时,会去重只取其中的一条;2.unionall合并所有的列。但是如果在按照某一条件进行查询时,如果表中数据没有符合该条件的记录。(即按此条件查询,表中查找到的的记录每列都为空)此时unionall并不能合并这种空的记录。比如新建一个表名为t_student的表。记录学生的姓名,性别,年龄和成绩等基础信息。在t_studen
PyCINRAD 安装和配置指南
颜欢钰Edith
PyCINRAD安装和配置指南PyCINRADDecodeCINRAD(ChinaNewGenerationWeatherRadar)dataandvisualize.项目地址:https://gitcode.com/gh_mirrors/py/PyCINRAD1.项目基础介绍和主要编程语言项目基础介绍PyCINRAD是一个开源的气象雷达数据处理和可视化库,专门用于解码中国新一代天气雷达(CINR
Kafka 数据写入问题
喝醉酒的小白
DBA kafka 分布式
目录标题分析思路1.**生产者配置问题**:Kafka生产者的配置参数生产者和消费者的处理确定并优化2.**网络问题**:3.**Kafka集群配置问题**:unclean.leader.election.enable4.**Zookeeper配置问题**:5.**JVM参数调优**:6.**副本因子和同步复制**:分析思路针对您提到的Kafka数据写入问题,以下是一些具体的原因和排查命令:1.生
微信小程序面试内容整理-图片优化
不务正业的猿
面试 微信小程序 前端 微信小程序 notepad++ 小程序 面试 职场和发展
在微信小程序中,图片优化是提升加载速度、节省网络带宽和提高用户体验的重要步骤。图片通常是小程序页面中的主要资源,合理的图片优化能显著提高小程序的性能,尤其是在用户网络状况较差的情况下。1.选择合适的图片格式不同的图片格式有不同的特点,选择合适的格式能够有效减小图片的大小,同时保证图片质量。
印度、马来股票K线接口与实时数据对接文档
金融数据出海
数据分析 金融 python3.11 数据库
概述本文档旨在为开发者提供关于如何使用StockTVAPI获取特定股票或指数的K线数据(即OHLCV数据,包括开盘价、最高价、最低价、收盘价以及成交量),以及如何通过WebSocket(WS)获取实时市场数据的详细指南。通过本文档,您将了解到如何构造请求URL,解析返回的数据,以及一些实用的应用场景示例。K线接口说明请求方法GET请求URLhttps://api.stocktv.top/stock
【数据库】MySQL的索引详解
此木|西贝
数据库 数据库 mysql
简介索引是一种用于快速查询和检索数据的数据结构,类似于书的目录。在几百页的书通过几页目录就可以精确定位到我们想看的章节优点和缺点优点正确的使用索引可以大大提高检索速度可以使用唯一索引保证数据在库中的唯一性使用聚合索引减少回表,降低IO次数缺点索引不宜创建的太多,否则增删改时不仅修改数据,还要修改大量的索引数据索引也会占用磁盘空间索引结构B树:多路平衡查找树,B树的所有节点都会存储key(索引)和d
【数据库】MySQL事务详解
此木|西贝
数据库 数据库 mysql
事务的隔离级别读未提交(read-uncommitted):最低级的隔离级别,允许其他事务读到未提交的值;读已提交(read-committed):事务只能读取到其他事务提交的数据;可重复读(repeatable-read):对同一条数据多次读取结果都是一样(mysql默认隔离级别);串行化(serializable):最高的隔离级别,所有事务穿行执行,事务间不会产生干扰隔离级别存在的问题读未提交
使用TensorFlow、OpenCV和Pygame实现图像处理与游戏开发
UwoiGit
tensorflow opencv pygame
在本篇文章中,我们将介绍如何结合使用TensorFlow、OpenCV和Pygame来进行图像处理和游戏开发。这三个工具在机器学习、计算机视觉和游戏开发领域都非常流行,并且它们的结合可以提供强大的功能和无限的创造力。我们将逐步介绍如何安装和配置这些工具,并提供相关的源代码示例。安装TensorFlowTensorFlow是一个基于数据流图的开源机器学习框架,提供了丰富的工具和库来构建和训练各种深度
AIGC时代品牌突围战:10招玩转DeepSeek内容推荐(深度扩展版)
白雪讲堂
人工智能 大数据 机器学习
一、认知革命:从SEO到GEO的生死迭代案例对比:传统SEO困境:某家电品牌2023年投入200万SEO优化,关键词排名TOP3但流量下降42%(SEMrush数据)GEO突破案例:某母婴品牌通过结构化数据改造,AI推荐量从日均300次飙升至1.2万次(来源:DeepSeek官方案例库)实战要点:内容形态改造:将产品参数表升级为JSON-LD格式(某手机品牌实现参数类问题100%引用)流量分配逻辑
Hadoop(一)
朱辉辉33
hadoop linux
今天在诺基亚第一天开始培训大数据,因为之前没接触过Linux,所以这次一起学了,任务量还是蛮大的。
首先下载安装了Xshell软件,然后公司给了账号密码连接上了河南郑州那边的服务器,接下来开始按照给的资料学习,全英文的,头也不讲解,说锻炼我们的学习能力,然后就开始跌跌撞撞的自学。这里写部分已经运行成功的代码吧.
在hdfs下,运行hadoop fs -mkdir /u
maven An error occurred while filtering resources
blackproof
maven 报错
转:http://stackoverflow.com/questions/18145774/eclipse-an-error-occurred-while-filtering-resources
maven报错:
maven An error occurred while filtering resources
Maven -> Update Proje
jdk常用故障排查命令
daysinsun
jvm
linux下常见定位命令:
1、jps 输出Java进程
-q 只输出进程ID的名称,省略主类的名称;
-m 输出进程启动时传递给main函数的参数;
&nb
java 位移运算与乘法运算
周凡杨
java 位移 运算 乘法
对于 JAVA 编程中,适当的采用位移运算,会减少代码的运行时间,提高项目的运行效率。这个可以从一道面试题说起:
问题:
用最有效率的方法算出2 乘以8 等於几?”
答案:2 << 3
由此就引发了我的思考,为什么位移运算会比乘法运算更快呢?其实简单的想想,计算机的内存是用由 0 和 1 组成的二
java中的枚举(enmu)
g21121
java
从jdk1.5开始,java增加了enum(枚举)这个类型,但是大家在平时运用中还是比较少用到枚举的,而且很多人和我一样对枚举一知半解,下面就跟大家一起学习下enmu枚举。先看一个最简单的枚举类型,一个返回类型的枚举:
public enum ResultType {
/**
* 成功
*/
SUCCESS,
/**
* 失败
*/
FAIL,
MQ初级学习
510888780
activemq
1.下载ActiveMQ
去官方网站下载:http://activemq.apache.org/
2.运行ActiveMQ
解压缩apache-activemq-5.9.0-bin.zip到C盘,然后双击apache-activemq-5.9.0-\bin\activemq-admin.bat运行ActiveMQ程序。
启动ActiveMQ以后,登陆:http://localhos
Spring_Transactional_Propagation
布衣凌宇
spring transactional
//事务传播属性
@Transactional(propagation=Propagation.REQUIRED)//如果有事务,那么加入事务,没有的话新创建一个
@Transactional(propagation=Propagation.NOT_SUPPORTED)//这个方法不开启事务
@Transactional(propagation=Propagation.REQUIREDS_N
我的spring学习笔记12-idref与ref的区别
aijuans
spring
idref用来将容器内其他bean的id传给<constructor-arg>/<property>元素,同时提供错误验证功能。例如:
<bean id ="theTargetBean" class="..." />
<bean id ="theClientBean" class=&quo
Jqplot之折线图
antlove
js jquery Web timeseries jqplot
timeseriesChart.html
<script type="text/javascript" src="jslib/jquery.min.js"></script>
<script type="text/javascript" src="jslib/excanvas.min.js&
JDBC中事务处理应用
百合不是茶
java JDBC编程 事务控制语句
解释事务的概念; 事务控制是sql语句中的核心之一;事务控制的作用就是保证数据的正常执行与异常之后可以恢复
事务常用命令:
Commit提交
[转]ConcurrentHashMap Collections.synchronizedMap和Hashtable讨论
bijian1013
java 多线程 线程安全 HashMap
在Java类库中出现的第一个关联的集合类是Hashtable,它是JDK1.0的一部分。 Hashtable提供了一种易于使用的、线程安全的、关联的map功能,这当然也是方便的。然而,线程安全性是凭代价换来的――Hashtable的所有方法都是同步的。此时,无竞争的同步会导致可观的性能代价。Hashtable的后继者HashMap是作为JDK1.2中的集合框架的一部分出现的,它通过提供一个不同步的
ng-if与ng-show、ng-hide指令的区别和注意事项
bijian1013
JavaScript AngularJS
angularJS中的ng-show、ng-hide、ng-if指令都可以用来控制dom元素的显示或隐藏。ng-show和ng-hide根据所给表达式的值来显示或隐藏HTML元素。当赋值给ng-show指令的值为false时元素会被隐藏,值为true时元素会显示。ng-hide功能类似,使用方式相反。元素的显示或
【持久化框架MyBatis3七】MyBatis3定义typeHandler
bit1129
TypeHandler
什么是typeHandler?
typeHandler用于将某个类型的数据映射到表的某一列上,以完成MyBatis列跟某个属性的映射
内置typeHandler
MyBatis内置了很多typeHandler,这写typeHandler通过org.apache.ibatis.type.TypeHandlerRegistry进行注册,比如对于日期型数据的typeHandler,
上传下载文件rz,sz命令
bitcarter
linux命令rz
刚开始使用rz上传和sz下载命令:
因为我们是通过secureCRT终端工具进行使用的所以会有上传下载这样的需求:
我遇到的问题:
sz下载A文件10M左右,没有问题
但是将这个文件A再传到另一天服务器上时就出现传不上去,甚至出现乱码,死掉现象,具体问题
解决方法:
上传命令改为;rz -ybe
下载命令改为:sz -be filename
如果还是有问题:
那就是文
通过ngx-lua来统计nginx上的虚拟主机性能数据
ronin47
ngx-lua 统计 解禁ip
介绍
以前我们为nginx做统计,都是通过对日志的分析来完成.比较麻烦,现在基于ngx_lua插件,开发了实时统计站点状态的脚本,解放生产力.项目主页: https://github.com/skyeydemon/ngx-lua-stats 功能
支持分不同虚拟主机统计, 同一个虚拟主机下可以分不同的location统计.
可以统计与query-times request-time
java-68-把数组排成最小的数。一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的。例如输入数组{32, 321},则输出32132
bylijinnan
java
import java.util.Arrays;
import java.util.Comparator;
public class MinNumFromIntArray {
/**
* Q68输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
* 例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题
Oracle基本操作
ccii
Oracle SQL总结 Oracle SQL语法 Oracle基本操作 Oracle SQL
一、表操作
1. 常用数据类型
NUMBER(p,s):可变长度的数字。p表示整数加小数的最大位数,s为最大小数位数。支持最大精度为38位
NVARCHAR2(size):变长字符串,最大长度为4000字节(以字符数为单位)
VARCHAR2(size):变长字符串,最大长度为4000字节(以字节数为单位)
CHAR(size):定长字符串,最大长度为2000字节,最小为1字节,默认
[强人工智能]实现强人工智能的路线图
comsci
人工智能
1:创建一个用于记录拓扑网络连接的矩阵数据表
2:自动构造或者人工复制一个包含10万个连接(1000*1000)的流程图
3:将这个流程图导入到矩阵数据表中
4:在矩阵的每个有意义的节点中嵌入一段简单的
给Tomcat,Apache配置gzip压缩(HTTP压缩)功能
cwqcwqmax9
apache
背景:
HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML ,CSS,Javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,
SpringMVC and Struts2
dashuaifu
struts2 springMVC
SpringMVC VS Struts2
1:
spring3开发效率高于struts
2:
spring3 mvc可以认为已经100%零配置
3:
struts2是类级别的拦截, 一个类对应一个request上下文,
springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应
所以说从架构本身上 spring3 mvc就容易实现r
windows常用命令行命令
dcj3sjt126com
windows cmd command
在windows系统中,点击开始-运行,可以直接输入命令行,快速打开一些原本需要多次点击图标才能打开的界面,如常用的输入cmd打开dos命令行,输入taskmgr打开任务管理器。此处列出了网上搜集到的一些常用命令。winver 检查windows版本 wmimgmt.msc 打开windows管理体系结构(wmi) wupdmgr windows更新程序 wscrip
再看知名应用背后的第三方开源项目
dcj3sjt126com
ios
知名应用程序的设计和技术一直都是开发者需要学习的,同样这些应用所使用的开源框架也是不可忽视的一部分。此前《
iOS第三方开源库的吐槽和备忘》中作者ibireme列举了国内多款知名应用所使用的开源框架,并对其中一些框架进行了分析,同样国外开发者
@iOSCowboy也在博客中给我们列出了国外多款知名应用使用的开源框架。另外txx's blog中详细介绍了
Facebook Paper使用的第三
Objective-c单例模式的正确写法
jsntghf
单例 ios iPhone
一般情况下,可能我们写的单例模式是这样的:
#import <Foundation/Foundation.h>
@interface Downloader : NSObject
+ (instancetype)sharedDownloader;
@end
#import "Downloader.h"
@implementation
jquery easyui datagrid 加载成功,选中某一行
hae
jquery easyui datagrid 数据加载
1.首先你需要设置datagrid的onLoadSuccess
$(
'#dg'
).datagrid({onLoadSuccess :
function
(data){
$(
'#dg'
).datagrid(
'selectRow'
,3);
}});
2.onL
jQuery用户数字打分评价效果
ini
JavaScript html jquery Web css
效果体验:http://hovertree.com/texiao/jquery/5.htmHTML文件代码:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>jQuery用户数字打分评分代码 - HoverTree</
mybatis的paramType
kerryg
DAO sql
MyBatis传多个参数:
1、采用#{0},#{1}获得参数:
Dao层函数方法:
public User selectUser(String name,String area);
对应的Mapper.xml
<select id="selectUser" result
centos 7安装mysql5.5
MrLee23
centos
首先centos7 已经不支持mysql,因为收费了你懂得,所以内部集成了mariadb,而安装mysql的话会和mariadb的文件冲突,所以需要先卸载掉mariadb,以下为卸载mariadb,安装mysql的步骤。
#列出所有被安装的rpm package rpm -qa | grep mariadb
#卸载
rpm -e mariadb-libs-5.
利用thrift来实现消息群发
qifeifei
thrift
Thrift项目一般用来做内部项目接偶用的,还有能跨不同语言的功能,非常方便,一般前端系统和后台server线上都是3个节点,然后前端通过获取client来访问后台server,那么如果是多太server,就是有一个负载均衡的方法,然后最后访问其中一个节点。那么换个思路,能不能发送给所有节点的server呢,如果能就
实现一个sizeof获取Java对象大小
teasp
java HotSpot 内存 对象大小 sizeof
由于Java的设计者不想让程序员管理和了解内存的使用,我们想要知道一个对象在内存中的大小变得比较困难了。本文提供了可以获取对象的大小的方法,但是由于各个虚拟机在内存使用上可能存在不同,因此该方法不能在各虚拟机上都适用,而是仅在hotspot 32位虚拟机上,或者其它内存管理方式与hotspot 32位虚拟机相同的虚拟机上 适用。
SVN错误及处理
xiangqian0505
SVN提交文件时服务器强行关闭
在SVN服务控制台打开资源库“SVN无法读取current” ---摘自网络 写道 SVN无法读取current修复方法 Can't read file : End of file found
文件:repository/db/txn_current、repository/db/current
其中current记录当前最新版本号,txn_current记录版本库中版本