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的未来已来)
Cameralink转SDI接口转换器
昆山森启智能科技有限公司
1.概述Cameralink转SDI接口转换器(简称转换器)是基于FPGA设计的一款多功能视频处理设备,具有丰富的硬件资源和外围接口。转换器将Cameralink接口输入的图像数据转成SDI图像输出,同时还可实现数据格式转换,帧率变换,分辨率变换,OSD,缩放,开窗,增强等图像预处理功能。2.技术特性2.1主要功能a.支持Cameralink视频输入(支持多种分辨率默认1080p@30hz)b.支
未来的量子通信:从量子密钥分发到量子互联网的安全通信
AI天才研究院
计算 DeepSeek R1 & 大数据AI人工智能大模型 AI大模型企业级应用开发实战 java python javascript kotlin golang 架构 人工智能 大厂程序员 硅基计算 碳基计算 认知计算 生物计算 深度学习 神经网络 大数据 AIGC AGI LLM 系统架构设计 软件哲学 Agent 程序员实现财富自由
未来的量子通信:从量子密钥分发到量子互联网的安全通信关键词:量子通信量子密钥分发量子互联网安全通信量子隐形传态摘要:本文旨在探讨量子通信的广阔前景,从量子密钥分发到量子互联网的安全通信。我们将逐步分析量子通信的核心概念、技术原理以及其实际应用,旨在为读者提供一个清晰而全面的理解。通过深入探讨量子密钥分发(QKD)和量子隐形传态(CHT)的基本原理,以及量子重复器和量子中继的概念,我们将展示量子通信
JavaScript设计模式 -- 状态模式
鎈卟誃筅甡
javascript 设计模式 状态模式
在软件开发中,很多对象的行为会随着其内部状态的变化而改变。如果将所有状态逻辑写在一个类中,代码不仅臃肿而且难以维护。**状态模式(StatePattern)**正是为了解决这个问题而设计的。通过将对象的状态封装成独立的状态类,并将状态相关的行为转移到这些状态类中,状态模式让对象在内部状态发生变化时自动切换行为,达到了将状态转换与行为实现分离的目的。本文将详细介绍状态模式的核心思想、基本结构与优缺点
告别高价低效采购,进销存询价单来破局
雪兽软件
科技前沿 ERP系统 进销存软件 订单日记 询价单
在企业运营过程中,采购环节是成本控制与资源获取的关键节点。而进销存软件(如订单日记)中的询价单功能,正悄然改变着企业的采购管理模式,为企业发展带来诸多显著好处。一、高效获取市场价格信息传统采购询价,需采购人员逐个联系供应商,耗时费力。有了进销存软件的询价单功能,企业能一键向多家供应商发送询价需求,短时间内即可收到详尽报价。比如一家制造企业要采购一批原材料,使用询价单功能,几小时内就能获取数十家供应
6个大数据应用案例
雪兽软件
科技前沿 大数据
根据市场数据预测报告,到2026年,全球大数据市场可能达到2684亿美元。随着大数据市场的快速增长,组织正在利用大数据来获得洞察力,帮助他们做出更好的决策,改善运营,最终推动最佳增长。从医疗保健到金融,从零售到电信,大数据正被用于改变行业的运作方式,使企业能够创造新的收入来源,增强客户体验,提高运营效率。这个全面的博客将探索令人兴奋的大数据用例领域,探索商业组织如何利用数据获得洞察力,推动创新,并
25 架构能力
susemm
软件架构实践(第4版) 架构 java 微服务 软件架构
文章目录第25章架构能力25.1个人能力:架构师的职责、技能和知识职责技能知识那经验方面呢?25.2软件架构组织的能力25.3成为更优秀的架构师接受指导指导他人25.4小结25.5扩展阅读25.6问题讨论第25章架构能力人生苦短,学海无涯。——杰弗里・乔叟(GeoffreyChaucer)如果软件架构值得去做,那肯定值得做好。大多数关于架构的文献都集中在技术方面。这并不奇怪,因为它是一门深奥的技术
关于Union 中 ORA-12704:字符集不匹配问题的解决
招財進寳
ORACLE
在使用Unionall连接时,若A集合中某列为nvarchar2或nvarchar类型,而B集合中无此列,用‘’来代替是会报字符集不匹配,解决方法有两种,见下面的示例例:select'中国','China',cast('中国'asnvarchar2(10))Tfromdualunionallselect'美国','USA',''fromdual;如上,T的类型为nvarchar2,长度为10,如果
conda-pack迁移虚拟环境
哎呀呀,知识来我的脑子里
conda
从源电脑中迁移anaconda的环境到目标电脑,首先两个电脑都安装了anaconda。一、源电脑的环境打包使用AnacondaPrompt操作1.安装conda-pack工具condainstallconda-pack2.确定环境condaenvlist找到你想要打包环境名。比如我的环境名是Py363.打包环境condapack-nPy36-oPy36.tar.gz4.将打包环境拷贝到U盘环境打包
大客户管理的方法和策略
客户管理crm系统
大客户管理的核心在于精准识别客户价值、提供个性化解决方案、建立长期互信关系,并通过数据优化决策。根据Gartner研究,80%的企业利润来自20%的大客户,而分层管理能提升30%的客户留存率。以精准分层为例,企业需根据客户贡献度、战略匹配度等维度划分优先级,例如,某全球500强企业通过RFM模型(最近消费、频率、金额)筛选出Top5%客户,针对性投入资源后,次年营收增长达18%。一、大客户分层与识
软件项目管理
*neverGiveUp*
期末不挂科 其他 职场和发展
一、填空题1、项目是为创造独特的产品、服务或成果而进行的临时性的工作。2、PMBOK(2016)将项目管理分为五个过程组,即启动、计划、执行、控制和收尾,与十大知识领域(整合管理、范围管理、时间管理、成本管理、质量管理、人力资源管理、沟通管理、风险管理、采购管理、干系人管理。)。3、国际标准ISO8042综合将软件质量定义为:反应实体满足明确的和隐含的需求能力的特性的总和。4、国际标准化组织:“是
ReentrantLock 公平锁与非公平锁的源码实现分析
java
一、ReentrantLock的锁类型ReentrantLock内部通过Sync类(继承自AbstractQueuedSynchronizer)实现锁机制,其子类FairSync(公平锁)和NonfairSync(非公平锁)分别对应两种模式://ReentrantLock构造函数(默认非公平锁)publicReentrantLock(){sync=newNonfairSync();}//指定公平性
AQS 核心原理与高频面试题详解
java
前言AQS(AbstractQueuedSynchronizer)是Java并发包(java.util.concurrent)中的核心基础类,它提供了一个框架来实现阻塞锁和相关的同步器(如信号量、CountDownLatch等)。AQS内部使用了一个FIFO的双向队列来管理线程,这个队列存储的是等待获取同步状态的线程节点。一、AQS的核心原理1.AQS的作用是什么?AQS是一个用于构建锁和同步器的
红队视角出发的k8s敏感信息收集——Kubernetes API 扩展与未授权访问
周周的奇妙编程
kubernetes 容器 云原生
针对Kubernetes第三方组件与Operator的详细攻击视角分析,涵盖ServiceMesh、HelmReleases和DatabaseOperators的潜在风险及利用方法。攻击链示例1.攻击者通过未授权的Tiller服务部署恶意HelmChart→2.创建后门Pod并横向移动至Istio控制平面→3.提取Envoy配置发现未加密的数据库服务→4.通过MySQLOperator创建管理员账
红队内网攻防渗透:内网渗透之Windows内网信息收集:内网和域
HACKNOE
红队攻防内网渗透研究院 web安全 网络安全 系统安全
红队内网攻防渗透1.内网渗透之信息收集1.内网信息收集的目的2.本机信息收集网络配置查询操作系统及版本信息查看系统体系结构查看安装的软件及版本、路径等查询本机服务查询进程列表查毒软件查看启动程序信息查看计划任务查看主机开机时间查询用户列表获取本地管理员查看当前在线用户列出或断开本地计算机与所连的客户端之间的会话查看端口列表查看补丁列表查看共享连接保存当前主机上的所有WiFi信息查看本机共享列表查询
Windows奇技淫巧之网络命令行
沉迷单车的追风少年
服务端编程 计算机网络 经验问题汇总 windows 网络
写在前面:Linux老鸟会深度沉迷命令行,各种奇技淫巧心中涨,但是windows上的命令行相当好用,各种骚操作也是眼花缭乱。其中网络操作经常使用,本文做一个简单的总结。目录1、ipconfig:显示当前TCP/IP配置的设置值2、ping:测试目的站是否可达及相关状态3、arp:地址解析协议4、traceroute:路由跟踪5、route:操作路由表6、netstat:显示协议统计信息7、nbts
义父们,支持我兄弟参加CSDN博客之星2024!他是一名优秀的运维工程师!
qq_42856429
运维 java 开发语言
标题:支持我兄弟参加CSDN博客之星2024!他是一名优秀的运维工程师!大家好,今天想为大家推荐一位非常优秀的技术博主——XMYX-0。他是一名专注于运维领域的开发者,尤其擅长Kubernetes(K8s)和Python自动化运维。他正在参加CSDN博客之星2024活动,希望大家能够为他投上宝贵的一票!为什么支持他?Kubernetes(K8s)领域的深度实践者在K8s领域有着丰富的实战经验。他的
conda虚拟环境的打包和迁移
YYY7
环境配置 conda python linux
本文主要记录conda-pack打包环境的过程。安装conda-pack第三方库:pipinstallconda-pack对环境进行打包。可以通过运行以下命令来完成此操作:condapack-n{环境名称}-o{输出压缩包路径,默认是当前目录***.tar.gz}在需要环境的系统中解压缩文件到conda的envs目录下,记得在envs目录新建一个文件夹:tarxzf***.tar.gz-C{目标路
从Paxos到Zookeeper笔记1——第一章:分布式架构
半臻(火白)
分布式 大数据 zookeeper
第1章:分布式架构将多台机器组成分布式的处理方式越来越收到业界的青睐。1.1从集中式到分布式由于大型主机拥有卓越的性能和良好的稳定性,在单机处理方面优势非常明显。但是随着计算机系统向网络化和微型化的方向发展,传统的集中式处理越来越不适应人们的需求。大型主机的缺点:(1)操作难度大。(2)价格昂贵(3)虽然大型主机稳定,但是一旦出现故障后果严重(4)扩容非常困难阿里提出的“去IOE”运动,让计算和存
SQL中char和nchar 的区别
未来无限
C#Winform设计 sql 数据库 char和nchar 的区别
char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据。所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;而变长字符数据则不会以空格填充。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。后面三种数据类型和前面的相比,
conda实现虚拟环境的迁移
邹小妹
参考https://zhuanlan.zhihu.com/p/87344422使用conda将服务器上配置好的虚拟环境从当前ip迁移到目标ip。1、如果需要在具有相同操作系统的计算机之间复制环境,则可以生成speclist。生成speclist文件:condalist--explicit>spec-list.txt重现环境:condacreate--namepython-course--files
如何在不依赖函数调用功能的情况下结合工具与大型语言模型
Jason9510
语言模型 人工智能
当大型语言模型(LLM)原生不支持函数调用功能时,如何实现智能工具调度?本文通过自然语言解析+结构化输出控制的方法来实现。GitHub代码地址核心实现步骤定义工具函数使用@tool装饰器声明可调用工具:fromlangchain_core.toolsimporttool@tooldefmultiply_by_max(a:int,b:list[int])->int:"""将a乘以b列表中的最大值""
GPT-4o mini 大模型价格战,一百万 Token 只需要 1.1元 RMB
简简单单OnlineZuozuo
m1 Python 领域 m4 杂项 GPT-4o mini ChatGPT ChatGPT 4.0 大模型 LLM
本心、输入输出、结果文章目录GPT-4omini大模型价格战,一百万Token只需要1.1元RMB前言目前它的定价方案是每处理一百万个token仅需15美分GPT-4omini极快的响应速度GPT-4omini大模型价格战,一百万Token只需要1.1元RMB编辑|简简单单Onlinezuozuo地址|https://blog.csdn.net/qq_15071263如果觉得本文对你有帮助,欢迎点
ORACLE错误编码大全
妙趣生花
BUG 数据库 oracle
ORA-00001:违反唯一约束条件(.)ORA-00017:请求会话以设置跟踪事件ORA-00018:超出最大会话数ORA-00019:超出最大会话许可数ORA-00020:超出最大进程数()ORA-00021:会话附属于其它某些进程;无法转换会话ORA-00022:无效的会话ID;访问被拒绝ORA-00023:会话引用进程私用内存;无法分离会话ORA-00024:单一进程模式下不允许从多个进程
人工智能的发展领域之GPU加速计算的应用概述、架构介绍与教学过程
m0_74824592
面试 学习路线 阿里巴巴 人工智能 架构
文章目录一、架构介绍GPU算力平台概述优势与特点二、注册与登录账号注册流程GPU服务器类型配置选择指南内存和存储容量网络带宽CPU配置三、创建实例实例创建步骤镜像选择与设置四、连接实例SSH连接方法远程桌面配置一、架构介绍GPU算力平台概述一个专注于GPU加速计算的专业云服务平台,隶属于软件和信息技术服务业。主要面向高校、科研机构和企业用户。该平台提供多种NVIDIAGPU选择,适用于机器学习、人
什么是MVC?什么是SpringMVC?什么是三层架构?
m0_74824802
面试 学习路线 阿里巴巴 mvc 架构
文章目录应用分层什么是MVC?什么是SpringMVC?三层架构三层架构和MVC的关系应用分层在讲解什么是MVC之前,先来理解一下什么是应用分层。应用分层是一种软件开发设计思想,将应用程序划分成N个层次,每个层次都分别负责自己的职责,多个层次之间来协同提供完整的功能,根据项目的复杂度,将项目分成三层或四层等。举个例子:比如,一个公司创始初期,创始人要身兼数职,既要做财务,又要做人事,又要做行政,但
解决Mybatis-plus与springboot3.0+、spring6.0+的兼容性问题
lian潋湄
mybatis
根据mybatis-plus学习框架时,一直都会报错如下信息:当时并不知道这几个工具之间存在版本兼容性问题,就一直苦于找不到合适的解决方法,于是便上网开始了疯狂的搜索,发现改了好多地方还是不行。偶然间了解到了工具之间版本是存在兼容性问题的,一开始问ChatGPT也并没有给出正确的回答,于是我去了最最权威的官网查看,终于发现了问题所在:mybatis-plus官网给出的mybatis-plus插件依
MIPI转换芯片、ICN6211、ICN6202、MIPI转RGB、MiPI转LVDS、分辨率最高1080P、MIPI转双路LVDS
17633853662
视频编解码 音视频 实时音视频 桥接模式
MIPI转换芯片、ICN6211、ICN6202、MIPI转RGB、MiPI转LVDS、分辨率最高1080P、MIPI转双路LVDS1:ICN6211是一颗MIPI转RGB的桥接芯片如下图2:ICN6202是一颗MIPI转LVDS的桥接芯片如下图这两颗芯片主要应用在:手机、平板、老年机、车机等产品上。可以用在MTK、高通、RK、全志、英特尔等芯片上。发布的这两颗视频转换的芯片希望大家可以学习一下,
数据库字段类型和Java的对应关系
m0_67265654
java java 后端
1、CHAR、VARCHAR、LONGVARCHAR可映射为String或char[],但String更适合于一般用法2、BINARY、VARBINARY和LONGVARBINARY都可用同一byte数组来表示。3、BITBIT类型的Java映射的推荐类型是Java布尔型4、SMALLINTSMALLINT类型的Java映射的推荐类型是16位的Javashort类型5、INTEGERINTEGER
Flux【Lora模型】:效率太高了,超写实逼真黑悟空Flux Lora它来了
AI绘画师-海绵
ui AIGC 人工智能 3d 平面 设计 计算机
在大家热心谈论黑悟空的时候,AI绘画领域也不甘落后,结合最近火爆的AI绘画工具Flux,各路大神第一时间就训练出了Flux的loar版本,今天我们就来体验感受一下大神“AIGAME熊熊”推出的Flux版本的loar模型:FLUX1-超写实逼真黑悟空模型下载地址(文末网盘地址也可获取)****触发词:aiyouxiketang下面是作者推荐的提示词:amaninarmorwithabeardanda
Vue2 与 Vue3 中 Computed 计算属性详解
阿贾克斯的黎明
前端 vue.js 前端 javascript
目录Vue2与Vue3中Computed计算属性详解一、Vue2中的Computed计算属性1.简单写法2.get和set写法二、Vue3中的Computed计算属性1.简单写法2.get和set写法三、总结在Vue开发中,计算属性(computed)是一个非常重要的特性,它可以对数据进行二次计算,为我们的开发带来了很大的便利。本文将结合Vue2和Vue3的特点,深入探讨computed计算属性,
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记录版本库中版本