在上一篇关于SitePoint的文章中 ,我质疑屏幕阅读器是否可以使用AJAX脚本技术,并发现在大多数情况下它们是不可行的 。 这样做令人失望-指出一个问题而无法提供任何答案。 但是我真的别无选择,因为据我所知,没有任何具体的解决方案可以提供。 (尽管自那时以来,其他开发人员进一步扩大了界限 ;特别重要的是Gez Lemon和Steve Faulkner在这一领域所做的工作 。)
但是可访问性并不总是那么困难! 我对这一事实感到非常敏感,因为许多人将其视为一大堆问题,而实际上可访问性只是另一个设计挑战,通常,它比其他任何问题都没有困难或问题。 AJAX是一个特别尴尬的示例。 但是,在大多数情况下,提供可访问性确实并不难。
您不能总是得到想要的东西。 但是如果您有时尝试,您可能会发现,您会得到所需的东西。
—滚石
在本文中,我想对那些尝试使其Web应用程序可访问的用户表示满意。 为了实现这一点,在介绍与设备无关的脚本时,我将讨论与JavaScript可访问性相关的一些更基本的可解决问题。
键盘导航?
我们大多数人在大多数图形界面导航中都使用鼠标,但是有些人不能,因此必须使用键盘来导航。 例如,对于患有手部震颤的人来说,有效使用鼠标所需的精确控制可能根本就不可能。 对于屏幕阅读器等辅助技术的用户,键盘是主要的交互方法。 毕竟,在看不见指针的情况下使用鼠标相当困难!
提供键盘访问权限也可以创建更好的可用性,因为尽管如此,许多可以使用鼠标的人还是喜欢在某些任务或特定时间使用键盘。 这些人通常是高级用户-通常更熟悉计算机工作原理的人员,并期望能够根据需要使用鼠标或键盘与功能进行交互。
如果您不习惯使用键盘浏览网站,请立即尝试! 花一些时间在自己的网站上以及经常访问的其他网站上,以感受一下不用鼠标冲浪的感觉。 发现出现问题的地方,并思考如何避免这些问题。
设备独立!
提到“键盘”访问总是有点误导,因为它不仅仅是我们在谈论的键盘本身。 我们正在谈论尝试提供设备独立性,以便无论用户的交互方式如何,他们都可以使用脚本。
例如,鼠标事件可能根本不会由鼠标生成。 它们可能是由于轨迹球或手持游戏机上的模拟摇杆的移动引起的。 焦点事件可能是由键盘用户使用Tab键导航或由Opera用户使用浏览器的语音控制功能说出的导航命令产生的。
从理论上讲,我们希望能够支持任何交互方式,而不管输入设备如何。 但是实际上,所有这些形式的交互通常可以归结为两种基本类型之一:“鼠标”(单击或移动界面元素)和“键盘”(通过字符输入提供输入或指令)。 这些处理浏览器公开的事件的两个相当谨慎的子集,而忽略了大多数编程事件(加载,错误等)。
三大支柱
我假设您已经非常熟悉鼠标事件的脚本编写,并且仅查看键盘事件的脚本编写。 (如果您需要事件的介绍,以及对现代JavaScript技术在现实世界中使用情况的详细介绍,则可以阅读我的书 。)为此,我要讨论三件事:三件事您可能会说“支柱”,它们共同为设备独立性奠定了基础:
提供可访问的交互式元素。
选择适当的触发元素。
旨在配对脚本挂钩,而不是事件挂钩。 这些术语现在可能没有意义,但是到您阅读完本文时,这些术语才有意义。
我也希望您牢记,当我们经历这些问题时,迎合可及性就是要提供等同性,这与等同性不同。 我们是否为不同的用户提供不同的路径并不一定要紧,只要每个人都有一条通往同等最终结果的路径即可。 稍后,当我们看一些实际的例子时,我们将看到甚至根本不同的方法如何整体上也可以导致等效的结果。
提供可访问的交互式元素
首先,如果要捕获来自键盘的输入,则需要使用可以接受焦点的元素:主要是链接(
)和表单控件(
,
,
和
)。 请注意,还可以将焦点分配给图像映射中的
元素,
或
,在某些情况下还可以将
(取决于其嵌入的数据类型),并且在大多数情况下浏览器,文档或documentElement本身。
对于这些交互,我们只能处理的事件是键盘实际上可以生成的事件:主要是focus
, blur
(当当前聚焦的元素失去焦点时触发), click
(通过键盘激活链接或按钮在编程上与单击相同)。 (使用鼠标),以及三个按键操作事件( keydown
, keyup
和keypress
。
除了这些直接输入事件外,我们还可以使用编程事件-即响应状态变化而间接触发的事件。 编程事件的示例包括臭名昭著的window.onload
事件和XMLHttpRequest
对象的onreadystatechange
事件。
我们还可以使用与模式无关的事件,即,用户的交互方式对他们的触发方式或触发时间没有任何影响的事件,例如表单的提交事件。
但是,这是一个重要的警告,这并不意味着我们不必将特定于鼠标的事件分配给垃圾箱,也不必将不可聚焦的元素完全放到边线。 这仅意味着我们将不得不重新考虑某些任务的方法。 请记住,这是关于等价而不是平等。 只要每个用户都可以访问其中至少一个,所有路径都是好的。
选择适当的触发元素
我使用术语“触发元素”来指代任何用于触发行为响应的元素。 触发元素是用户与之交互以便引起其他事情发生的东西。 这可能是指向flickr上的照片“添加标签”的简单链接:
或者它可以在照片的顶部包含一系列图标,旨在允许用户执行诸如将照片添加到自己的收藏夹中的操作:
但是,正如我们已经指出的,实现这些触发器可用的元素的选择是有限的。
现在,
元素是我的特别喜欢的元素,因为它非常灵活:它可以像其他任何元素一样设置样式,可以包含其他HTML,可以启用或禁用,并将状态报告给用户代理,并且它可以用作活动触发元素而没有任何值。 但是,像所有
元素一样,其唯一有效的上下文在
内部。
相比之下,使用链接作为触发器的问题在于,尽管可以使它们以任何喜欢的方式出现,但是它们始终必须具有某种值:键盘上的href属性中没有任何内容的链接是不可访问的。
通常公认的最佳实践是使用渐进增强功能 -包括指向等效的非脚本功能的默认href
属性-但这在我们完全脚本化的环境中工作(例如,处理链接)时不一定适当它本身是在满足其他地方非脚本用户的应用程序中通过脚本生成的。 这种情况通常导致需要链接具有“ #
”或“ javascript:void(null)
”或类似的(本质上是垃圾) href
。
但是,所有这一切都与要点无关,因为我们对元素的选择应基于触发器的实际作用和作用。 为了方便起见,我们不能仅使用
来避免链接问题,反之亦然。 我们必须考虑语义,并尝试确保触发元素看起来像是触发元素,并且其外观与其功能一致。
这并不总是那么容易。 flickr图标示例是一个特别棘手的示例。 让我们再来看一遍:
这些图标的整体外观表明它们是按钮,例如Photoshop或MS Office中的工具栏按钮。 但是从功能上讲,前三个是脚本操作,而最后一个实际上是指向另一个页面的链接。
因此,前三个应该是
元素,而最后一个是
吗? 也许“所有尺寸”应该是一个单独的链接,而该链接根本不属于此工具栏?
那“添加标签”链接呢?
那不是一个按钮,而是一个按钮,因为它是脚本操作,而不是页面视图? (而且,当我们在使用它时,如果JavaScript不可用,它是否不应该做某些事情……?)
在这种情况下,总的结论可能是flickr的界面设计(与Web 2.0的大部分形式一样)只是一种偶然现象,并且没有经过深思熟虑。
但是,所有这一切确实很重要-语义不只是注视肚脐的一种练习。 元素的选择对用户代理非常重要,因为它们依赖于标记语义来识别内容是什么,而这又对希望有效使用该内容的普通用户而言至关重要。
如果您仍然觉得这仅仅是关于语义纯净的学术讨论,那么让我们看一个实际的示例,说明在现实世界中触发元素选择为何重要的原因:Opera的键盘导航。
Opera在导航表单元素时使用的键与在链接中导航时使用的键不同(表单元素使用Tab键,而链接导航在“ next。”和“ previous anchor”中分别使用“ A”和“ Q”)。 因此,如果我们使用看起来像链接按钮的界面元素,反之亦然,则将为使用键盘进行导航的Opera用户创建一个认知和可用性问题。 再举一个例子,让我们检查一下Basecamp在其Writeboard应用程序中的作用:
“编辑此页面”看起来像一个按钮,因此我们应该能够像其他按钮一样使用Tab键查看; 但是我们不能,因为它根本不是按钮。 这是一个样式链接。
毕竟,它应该是一个
,因为这就是它的样子。 还是应该只是(看起来像)一个简单的链接,因为它实际上所做的是加载整个新页面? 在这种情况下,我认为是后者。
就像我说的那样,这方面并不总是那么容易,但是如果应用程序要像使用键盘一样直观,就必须考虑它。 通常,我认为应该将链接用于加载新页面而不发布任何数据(即GET
请求)的操作,并且应将按钮或其他适当的表单小部件用于其他所有操作。 (毕竟,除了复杂形式之外,什么是应用程序?)。 HTTP 1.1规范回应了该视图,该规范指出GET请求不应用于将更改资源的操作,例如删除,创建或更新内容。
但是在所有情况下,触发器元素都必须看起来像它的样子。
寻找行为配对,而不是事件配对
用于WCAG 1.0的HTML技术建议,一种满足设备独立性的好方法是提供冗余输入事件-同一元素“配对”在一起的两个处理程序。 它提供的示例包括将keydown与mousedown配对,或使用keyup与mouseup搭配使用。
但是,这是解决提供设备独立性问题的错误方法,因为键盘和鼠标事件在概念上是不同的,并且在许多情况下,行为完全不同。 在我们的实际示例的第一部分中,我们将很快看到这种差异。
我认为从行为配对而非事件配对的角度进行思考会更有帮助。 如果您有一项功能是由mousedown事件驱动的,请不要认为:“如何使用keydown事件来使这项工作正常进行?” 只是想一想:“我如何才能通过键盘进行这项工作?”
我会劈头发吗? 我不这么认为。 当以这种方式考虑时,问题会导致不同的答案。 第一个问题询问一种特定的方法,该方法可能有效也可能无效。 第二个问题只是询问是否有方法; 它对任何兼容的解决方案都是开放的。 在最后一个实际示例中,“拖放”功能将使我们看到思维上的巨大差异。
一些实际的例子
让我们看一些实际的例子。 我不会在这里深入研究代码。 这只是对鼠标实现的一些不同类型脚本的基本回顾; 我们还将考虑如何在键盘上实现它们。
简单的滚动和显示内容
一个简单的过渡效果可能包括链接上的颜色或背景图像更改。 您可能比不熟悉应用了块显示的链接以及:hover
和:focus
伪类,以便它们可以进行后台交换而无需JavaScript。
只要使用适当的链接或其他可聚焦的元素(不只是纯文本内容元素,如
或 ),脚本化的过渡通常就很容易扩展到键盘。 在我们的第一个示例中,我们将通过切换类名(例如,使用假设的addEvent
函数)来触发单个元素的简单效果;当您在自己的工作中应用代码时,请替换为它 -您可以选择自己喜欢的):
addEvent(link, 'mouseover', function()
{
link.className = 'rollover';
});
addEvent(link, 'mouseout', function()
{
link.className = '';
});
我们可以简单地添加一对focus
和blur
处理程序,以对通过键盘导航的人们执行相同的工作:
addEvent(link, 'focus', function()
{
link.className = 'rollover';
});
addEvent(link, 'blur', function()
{
link.className = '';
});
当处理一组元素上的事件时,情况更加复杂,因为焦点事件不会冒泡。 当元素传递触发其父元素的事件时,就会发生事件冒泡。 虽然我们可以使用单个文档级侦听器(有时称为事件委托 )来处理任何元素上的鼠标事件,但对于不会冒泡的事件,我们不能做同样的事情:
addEvent(document, 'mouseover', function(e)
{
var target = typeof e.target != 'undefined'
? e.target : e.srcElement;
//"target" is whatever node the event bubbles up from
});
这种方法之所以有效,是因为鼠标事件从发生时起就冒出。 但是,由于焦点事件不会冒泡,因此此类功能将仅处理文档节点上发生的事件。
如果要捕获一组元素中每个元素上的事件,则必须遍历这些元素并将侦听器分别绑定到每个元素:
var links = list.getElementsByTagName('a');
for(var i=0; i
{
addEvent(links[i], 'focus', function()
{
//and so on ...
});
}
请记住,鼠标到键盘行为的确切转换不一定是正确的,因为这两种行为之间的可用性问题通常非常不同。 考虑DHTML菜单中的打开和关闭计时器。 这些对于鼠标是必需的,但对于键盘则是不希望的。 毕竟,用户使用键盘导航时不可能“滑出菜单”边缘,因此所有计时器都提供了无用的菜单暂停功能。
AJAX和其他RPC脚本
AJAX脚本编写的核心处理程序性事件,例如XMLHttpRequest
对象的onreadystatechange事件或用于数据检索的iframe的load事件。 用户的交互方式不会影响这些事件的行为,因此我们不需要特别考虑每种交互方式。
但是,我们确实有两个要考虑的重点。
首先,最明显的是,我们应该首先考虑如何触发这些过程。 如果要通过用户操作启动请求或过程,则必须确保该操作可以由键盘用户触发。 正如我们已经讨论过的,解决方案只是选择合适的触发元素。
第二个问题要求仔细构造响应HTML,以确保我们维持可用的制表符顺序。 如果我们响应用户的操作创建新内容,并且新内容本身是交互式的,则必须确保将其插入HTML中的逻辑点。
例如,假设我们有一个“用户首选项”表单,用户可以在其中指定其个人详细信息。 在这种情况下,他们必须提供原籍国信息:
Country:
UK
Australia
我们可以将onchange事件侦听器附加到select元素,该侦听器运行代码以创建辅助选择,允许用户选择适当的县或州。 但是,我们希望键盘用户可以立即访问辅助选择,因此我们应该将其插入正确的位置-在第一个标签之后,按钮之前:
var button = document.getElementById('save-button');
button.parentNode.insertBefore(newselect, button);
本示例假定已经创建了新的选择器和标签,并将其保存到对象引用newselect中。
拖放
无论您是否要使其可访问,“拖放”功能在最佳情况下都需要复杂的脚本编写! 乍一看,使此功能可访问的任务看起来是不可能的,因为拖动'n'的动作是mousemove事件,没有键盘等效项。 但是只要稍加思考,就可以做到!
想象一下,我们的应用程序包含一个垂直列表或垂直列的框,用户可以拖动'n'下拉框来重新排序。 用户的鼠标拾取一个对象,将其移动,然后将其捕捉到新位置; 动作的最终结果只是对象顺序的改变-用户拖动的对象已向上或向下移动了x个空格。 我们不能使用向上和向下箭头键生成的命令来达到相同的结果吗?
确实,我们可以,但是要做到这一点,我们需要键盘的触发元素:可聚焦的元素(可拖动对象本身或其中的某些东西),可以处理来自箭头键的事件。
在下图中,您可以看到一个指示鼠标行为的框。 顶部的暗条是鼠标的触发元素。 用户单击此区域并移动鼠标以拖动该框。 因此,此行为的主要活动事件是mousemove
:
现在,如果我们在可拖动元素内添加链接或按钮,并将其设置为看起来像图形图标的样式,则可以将该图标用作键盘的触发元素。 在这种推理方式下,该行为的主要活动事件是keypress
:
从这个例子中,我们可以看到事件配对是徒劳的。 mousemove和keypress事件之间几乎没有功能相似性,但是那是我们需要为鼠标和键盘用户提供的两个事件。 为了使此功能适用于键盘,我们逐步完成了概念上的旅程,展示了我们如何实现最终目标-等效功能。 实现的细节就是细节。 这些图片来自实际的脚本,该脚本太大了,无法在此处复制,但是如果您要下载并使用它,可以在我的网站上找到它。
辅助功能不是功能
在我的想象中,没有并发症。
- 凯莉·米洛
可访问性设计就像盖房子的基础一样—从一开始就很容易,但是之后很难破解。
显然,最好的方法是从项目一开始就考虑可访问性-认识到可访问性是设计考虑因素,而不是功能。 确实, 乔·克拉克(Joe Clark)对Basecamp的可访问性的评估指出,如果将可访问性视为一项功能,则可能会忽略它。 “大多数开发人员无论如何都会把它遗忘;大多数开发人员不知道关于可访问性的第一件事,甚至不知道它很重要。” 可以肯定的是,这是令人怀疑的,但这是事实。
牢记这一点,在此我想给您举例说明一些很酷和鼓舞人心的事,这些事确实是该领域最佳实践的典范。 它不是新的(它已经存在一年多了,由Derek Featherstone在Web Essentials 2005上提出并提出),但是其纯粹的优雅和简单性仍然让我大吃一惊: 它是语义,可访问的填字游戏 。
我们不可能像德里克一样有才华! 但是,从日常实践的角度来看,我希望我已经开始证明与设备无关的脚本确实不是那么困难或复杂。 它可能与我们过去的工作方式有所不同,但真正需要做的只是一点点额外的思考。
From: https://www.sitepoint.com/accessible-javascript/
你可能感兴趣的:(可访问的JavaScript:鼠标之外)
【Day24 LeetCode】贪心Ⅱ
银河梦想家
leetcode 算法
一、贪心Ⅱ1、买卖股票的最佳时机II122这题第一想法是使用动态规划做,每天有两个状态,持有股票和非持有股票,每次计算这两个状态下的最优值。classSolution{public:intmaxProfit(vector&prices){//表示当前没有/有股票的两个状态intdp0=0,dp1=-prices[0];for(inti=1;i&prices){intans=0;for(inti=1
【Day26 LeetCode】贪心Ⅳ
银河梦想家
leetcode 算法
一、贪心1、用最少数量的箭引爆气球452对右区间进行排序,然后判断其它区间是否与该区间有重叠。classSolution{staticboolcmp(vector&a,vector&b){returna[1]>&points){//对右区间进行排序sort(points.begin(),points.end(),cmp);intpre=points[0][1],ans=1;for(autopoin
【Day1 Leetcode 】二分查找和双指针
银河梦想家
leetcode 算法
一、二分查找1.1二分查找704这题比较简单,是二分查找的入门题,主要是要注意二分区间的写法,我个人是比较喜欢左闭右闭的写法。代码如下:classSolution{public:intsearch(vector&nums,inttarget){intleft=0,right=nums.size()-1;while(lefttarget)right=mid-1;elseleft=mid+1;}ret
剩余电流动作保护器和接地系统
ACRELKY
安全
摘要:剩余电流动作保护器在不同的接地系统中有其适用性和严格的接线方式,错误地选用剩余电流动作保护器或不规范地接线,会使剩余电流动作保护器误动或拒动,甚至引起人身触电和电气火灾事故。从剩余电流动作保护器工作原理出发,着重于用电设备的电流矢量分析与计算,阐述剩余电流动作保护器在低压配电接地系统中的应用特性,定量地分析接地系统类型对剩余电流动作保护器工作的影响。电流矢量的分析方法为剩余电流动作保护器的应
(C++)P1216数字三角形(动态规划)⭐⭐⭐⭐
*TQK*
算法练习 c++ 动态规划
[USACO1.5][IOI1994]数字三角形NumberTriangles-洛谷题目描述观察下面的数字金字塔。写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。在上面的样例中,从7→3→8→7→5的路径产生了最大权值。输入格式第一个行一个正整数r,表示行的数目。后面每行为这个数字金字塔特定行包含的整数。输出格式单独的一行,包含
INTJ 型人格详细解读职业发展、情感沟通和心理健康
Luntu
www.zxgj.cn 求职招聘 职场和发展 程序人生
INTJ型人格,也被称之为建筑师型人格,在MBTI16种人格类型里,那可是相当独特又少见的一类。这类人思维深邃得很,脑袋里全是创造力,看世界的角度独特得很。INTJ擅长逻辑分析,瞅一眼就能抓住事物的本质,靠着超强的内在逻辑,搭建起属于自己对世界的认知体系。本文主要是分析intj型人格的特征(包括优势和不足),并将这些特征和职业发展,人际关系,心理健康等方面相结合,探索intj型人格的各方面,为谋划
系统相关类——java.lang.Math (三)(案例详细拆解小白友好)
励志去大厂的菜鸟
Java思想和方法 Java学习 白话拆解Java java 开发语言 服务器 深度学习 学习方法
前言:小编打算近期更俩三期类的专栏,一些常用的专集类,给大家分好类别总结和详细的代码举例解释。今天是第三个java.lang.Math类我们一直都是以这样的形式,让新手小白轻松理解复杂晦涩的概念,把Java代码拆解的清清楚楚,每一步都知道他是怎么来的,为什么用这串代码关键字,对比同类型的代码,让大家真正看完以后融会贯通,举一反三,实践应用!!!!①官方定义和大白话拆解对比②举生活中常见贴合例子、图
CTF学习法则——寒假篇 新手赶快收藏吧!
网络安全技术分享
学习 网络 安全 web安全 CTF
CTF(CapturetheFlag)是网络安全领域中的一种比赛形式,涵盖了漏洞利用、逆向工程、加密解密、编码解码等多方面的技术,参与者通过解决难题(称为“Flag”)获得积分。对于想要在寒假期间提升CTF技能的同学们,以下是一些有效的学习法则,可以帮助你高效地进行学习和提升:1.合理规划学习时间寒假时间有限,建议制定合理的学习计划:每天固定时间学习:保持稳定的学习节奏,避免临时抱佛脚。分阶段学习
2024 年最新基于 Spring Cloud 的微服务架构分析
2401_83916326
程序员 架构 spring cloud 微服务
SpringCloud的核心组件==================1.Eureka(注册中心)================Eureka是SpringCloud微服务架构中的注册中心,专门负责服务的注册与发现,里面有一个注册表,保存了各个服务器的机器和端口。Eureka服务端:也称服务注册中心,同其他服务注册中心一样,支持高可用配置。如果Eureka以集群模式部署,当集群中有分片出现故障时,那
2024年大数据最全数据仓库|数据库面试题总结_面试题 数据仓库
2301_82243558
程序员 大数据 数据仓库 数据库
这里值得注意的是不要想着为每个字段建立索引,因为优先使用索引的优势就在于其体积小。索引有哪几种类型?主键索引:数据列不允许重复,不允许为NULL,一个表只能有一个主键。唯一索引:数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。可以通过ALTERTABLEtable_nameADDUNIQUE(column);创建唯一索引可以通过ALTERTABLEtable_nameADDUNI
Vue - toRefs() 和 toRef() 的使用
来一碗刘肉面
Vue vue.js 前端 javascript
一、toRefs()在Vue3中,toRefs()可以将响应式对象的属性转换为可响应的refs。主要用于在解构响应式对象时,保持属性的响应性。1.导入toRefs函数import{toRefs}from'vue';2.将响应式对象的属性转换为refconststate=reactive({count:0,message:'Hello,Vue3!'});//toRefs()接受一个响应式对象,并返回
ARM下汇编语言编程
Kylin77626
arm开发
一、ARM汇编语言程序格式ARM汇编语言是以段(section)为单位来组织源文件的。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要用到的数据。一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。二、ARM汇编语言中常用的伪操作例如:areareset,code,readonly;声明了一个名
如何用Python将pdf文件转化为高清图片
张登杰踩
pdf
最近在整理文档,需要将文档进行OCR识别,然后结构化。直接解析pdf文档,行不通,因为文档里面是图片。于是采取先转图片,然后OCR,然后结构化。下面是pdf文档转图片的方法。importfitz#PyMuPDFdefpdf_to_images(pdf_path,images_folder):#打开PDF文件document=fitz.open(pdf_path)forpage_numinrange
华为OD机试E卷 --选修课--24年OD统一考试(Java & JS & Python & C & C++)
飞码创造者
最新华为OD机试题库2024 华为od java javascript python js c语言
文章目录题目描述输入描述输出描述用例题目解析JS算法源码Java算法源码python算法源码c算法源码题目描述现有两门选修课,每门选修课都有一部分学生选修,每个学生都有选修课的成绩,需要你找出同时选修了两门选修课的学生,先按照班级进行划分,班级编号小的先输出,每个班级按照两门选修课成绩和的降序排序,成绩相同时按照学生的学号升序排序。输入描述第一行为第一门选修课学生的成绩,第二行为第二门选修课学生的
Python调用open ai接口
蓝天星空
编程 人工智能 python
要使用Python调用OpenAI的接口,您需要完成以下几个步骤:1.**注册并获取API密钥**2.**安装OpenAI的Python库**3.**编写Python代码以调用API**以下是详细的步骤说明:---###1.注册并获取API密钥首先,您需要在[OpenAI官方网站](https://beta.openai.com/signup/)注册一个账户。注册完成后,您需要创建一个API密钥:
2025春招 SpringCloud 面试题汇总
威哥爱编程(马剑威)
V哥原创技术栈 spring cloud spring 后端
大家好,我是V哥。SpringCloud在面试中属于重灾区,不仅是基础概念、组件细节,还有高级特性、性能优化,关键是项目实践经验的解决方案,都是需要掌握的内容,正所谓打有准备的仗,秒杀面试官,如果你正在准备这一块内容,V哥整理的以下面试题及答案,可能在2025年SpringCloud面试中出现,有备无患。先赞再看后评论,腰缠万贯财进门。一、基础概念部分什么是SpringCloud?SpringCl
把markdown转换为pdf的方法
hunter206206
经验 Markdown pdf
将Markdown文件转换为PDF有多种方法,以下是几种常见的方式:1.使用VSCode和Markdown插件VSCode是一款流行的代码编辑器,支持通过插件将Markdown转换为PDF。步骤:安装VSCode:下载地址:VSCode官网安装Markdown插件:打开VSCode,点击左侧扩展图标(或按Ctrl+Shift+X)。搜索并安装MarkdownAllinOne和MarkdownPDF
新能源汽车充电桩选型以及安装应用
ACRELKY
汽车
摘要:随着当前经济的不断发展,国家的科技也有了飞速的进步,传统的燃油汽车已经不能适应当前社会的发展,不仅对能源造成巨大的消耗,还对环境造成了污染,当前一种新型的交通运输工具正在占领汽车市场。在环境问题和能源问题愈发严重的当今社会,节能减排已经成为全世界的共同课题,绿色交通已经成为各国节能减排的一个重点,在当前状态下汽车行业有了新的发展,新能源汽车应运而生。本文主要对新能源汽车充电桩选型以及安装进行
【前端】--- ES6下篇(带你深入了解ES6语法)
心.c
前端 es6 ecmascript
前言:ECMAScript是JavaScript的标准化版本,由ECMA国际组织制定。ECMAScript定义了JavaScript的语法、类型、语句、关键字、保留字等。ES6是ECMAScript的第六个版本,于2015年发布,引入了许多重要的新特性,使JavaScript更加现代化。进制ES6中增加了二进制和八进制的写法:二进制使用前缀'0b'或'0B',八进制使用前缀'0o'或'0O'二进制
Linux搭建wordpress
长江空自流
vps linux wordpress 安装
Linux搭建wordpress一、环境vps:Centos6x86minimal512ram小内存xshell5:ssh远程连接主机首先搭建lamp环境(linuxapachemysqlphp或python等)二、apache1安装yuminstallhttpd2启动apacheservicehttpdstart直接在浏览器中输入IP地址,应该就可以访问到Apache的欢迎页面了三、mysql1
python中strip()和split()的使用方法(学习笔记)
木子_李轩
笔记
1.strip():用于移除字符串头、尾指定的字符(默认空格),不能删除中间部分的字符。#未使用strip()path=r"C:\Users\67539\Desktop\22\11.txt"f=open(path,"r")forlineinf:#按行读取print(line)f.close()#结果cat22airplane23dog58mug86#########################
Flask基础和URL映射
終不似少年遊*
python进阶学习 flask python 后端 开发框架
目录1.Flask介绍2.Flask第一个应用程序3.Flask运行方式4.Flask中DEBUG模式5.Flask环境参数的加载6.Flask路径参数的使用7.Flask路径参数类型8.Flask路径参数类型转换底层9.Flask自定义路由转换器自定义步骤:10.自定义转换to_python函数11.Postman的使用功能:使用示例:12.查询参数的使用13.请求体参数的使用14.上传文件的使
Open AI GPT大模型深度解析:通往智能的里程碑
xziyuan
人工智能 gpt
大模型——OpenAIGPT大模型介绍人工智能技术的快速发展引发了对智能系统和应用的巨大需求。多模态大模型已经成为了人工智能领域的重要研究方向之一。OpenAI作为一家全球领先的人工智能公司,在推动人工智能技术的边界上发挥着重要作用,其在大模型方面的研究和应用也是一直处于领先地位。本文将介绍OpenAI多模态大模型的研究成果和应用,探讨其在人工智能领域的重要性和影响力,以及给世界带来的可能性。1.
python strip() 函数和 split() 函数的详解
xinyuerr
java python python java 数据库
本文主要介绍了pythonstrip()函数和split()函数的详解及实例的相关资料,需要的朋友可以参考下pythonstrip()函数和split()函数的详解及实例一直以来都分不清楚strip和split的功能,实际上strip是删除的意思;而split则是分割的意思。因此也表示了这两个功能是完全不一样的,strip可以删除字符串的某些字符,而split则是根据规定的字符将字符串进行分割。下
# AI计算模式 神经网络模型 深度神经网络 多层感知机 卷积神经网络 循环神经网络 长短期记忆网络 图像识别、语音识别、自然语言 轻量化模型和模型压缩 大模型分布式并行
EwenWanW
AGI 人工智能 神经网络 dnn
AI计算模式AI技术发展至今,主流的模型是深度神经网络模型。近20年来,神经网络模型经过多样化的发展,模型总体变得越来越复杂和庞大,对硬件设备的计算速度、存储能力、通信速度的要求越来越高。尽管学者已经提出了许多方法优化模型结构,降低模型的参数量,但是伴随着人们对AI能力的要求越来越高,模型变得更大是不可避免的。原先单CPU可进行模型的训练与推理,如今需要使用GPU、TPU等设备,并通过分布式并行的
java枚举转json
软件老王
枚举 json
1、背景java后端的枚举类型,要展示到前端,提供给用户进行下拉选择,java后端需要封装enum为json字符串提供给前端,需要首先将枚举类型转为list,然后再转为json字符串。2、方案方案也很简单,使用EnumSet.allOf(TestEnum.class),将数据获取到再塞到list中就可以了。代码如下:importcom.alibaba.fastjson.JSONObject;imp
服务器遭到入侵后的排查与应对
Ryann6
服务器 运维
目录1.立即隔离受影响的服务器2.检查系统日志重点检查:3.检查运行中的进程和开放端口4.检查文件系统的异常更改5.分析网络流量6.检查用户账户和权限7.查杀恶意软件8.恢复系统和加强防御最后在当今的网络环境中,服务器遭到入侵已经成为一个不可忽视的安全威胁。无论是个人网站、企业服务,还是云平台上的资源,一旦服务器被攻击,可能会导致数据泄露、服务中断、甚至财务损失。本文将介绍如何在服务器遭到入侵后进
如何在 Linux 系统中查看 CPU 核数和内存大小
Ryann6
linux 运维 服务器 性能优化
在日常运维和开发中,了解服务器或虚拟机的硬件配置是非常重要的一环。无论是进行性能调优,还是资源分配,了解CPU的核数和内存大小可以帮助我们更好地规划应用的运行环境。本篇博客将介绍如何在Linux系统中查看CPU核数和内存大小。一、查看CPU核数在Linux中,查看CPU信息可以使用lscpu和nproc命令。这两个命令提供了CPU详细的配置数据以及核心数量。1.使用lscpu命令lscpu是Lin
Javaweb--SpringBoot
顾以沫
Java web spring boot java 数据库
1.SpringBoot入门简化Spring开发的一个框架,SpringBoot旨在帮助开发者快速搭建Spring框架。整个Spring的一个合集,可以简化配置2.微服务(1)微服务就是一种架构风格(2)微服务就是把一个项目拆分成独立的多个服务,并且多个服务是可以独立运行的,而每个服务都会占用线程。(3)通过HTTPS的方式进行互通每一个功能元素都是一个可以独立替换和独立升级的软件单元微服务(ma
LLaMA Pro是什么 相比于lora full freeze有什么区别 怎么使用
Ven%
简单说深度学习 深度学习基础动手 深度学习速通系列 llama transformer 深度学习 人工智能
1.LLaMAPro是什么?LLaMAPro是一种基于LLaMA架构改进的大型语言模型(LLM),旨在解决大模型微调中的知识遗忘问题。它通过在原有模型的基础上扩展新的模块(如Transformer块),并在微调时仅训练这些新增模块,从而在适应新任务的同时保留预训练模型的通用知识。LLaMAPro在代码理解、数学推理和语言理解等任务上表现出色,特别适合需要持续学习和多任务处理的场景。2.LLaMAP
VMware Workstation 11 或者 VMware Player 7安装MAC OS X 10.10 Yosemite
iwindyforest
vmware mac os 10.10 workstation player
最近尝试了下VMware下安装MacOS 系统,
安装过程中发现网上可供参考的文章都是VMware Workstation 10以下, MacOS X 10.9以下的文章,
只能提供大概的思路, 但是实际安装起来由于版本问题, 走了不少弯路, 所以我尝试写以下总结, 希望能给有兴趣安装OSX的人提供一点帮助。
写在前面的话:
其实安装好后发现, 由于我的th
关于《基于模型驱动的B/S在线开发平台》源代码开源的疑虑?
deathwknight
JavaScript java 框架
本人从学习Java开发到现在已有10年整,从一个要自学 java买成javascript的小菜鸟,成长为只会java和javascript语言的老菜鸟(个人邮箱:deathwknight@163.com)
一路走来,跌跌撞撞。用自己的三年多业余时间,瞎搞一个小东西(基于模型驱动的B/S在线开发平台,非MVC框架、非代码生成)。希望与大家一起分享,同时有许些疑虑,希望有人可以交流下
平台
如何把maven项目转成web项目
Kai_Ge
maven MyEclipse
创建Web工程,使用eclipse ee创建maven web工程 1.右键项目,选择Project Facets,点击Convert to faceted from 2.更改Dynamic Web Module的Version为2.5.(3.0为Java7的,Tomcat6不支持). 如果提示错误,可能需要在Java Compiler设置Compiler compl
主管???
Array_06
工作
转载:http://www.blogjava.net/fastzch/archive/2010/11/25/339054.html
很久以前跟同事参加的培训,同事整理得很详细,必须得转!
前段时间,公司有组织中高阶主管及其培养干部进行了为期三天的管理训练培训。三天的课程下来,虽然内容较多,因对老师三天来的课程内容深有感触,故借着整理学习心得的机会,将三天来的培训课程做了一个
python内置函数大全
2002wmj
python
最近一直在看python的document,打算在基础方面重点看一下python的keyword、Build-in Function、Build-in Constants、Build-in Types、Build-in Exception这四个方面,其实在看的时候发现整个《The Python Standard Library》章节都是很不错的,其中描述了很多不错的主题。先把Build-in Fu
JSP页面通过JQUERY合并行
357029540
JavaScript jquery
在写程序的过程中我们难免会遇到在页面上合并单元行的情况,如图所示
如果对于会的同学可能很简单,但是对没有思路的同学来说还是比较麻烦的,提供一下用JQUERY实现的参考代码
function mergeCell(){
var trs = $("#table tr");
&nb
Java基础
冰天百华
java基础
学习函数式编程
package base;
import java.text.DecimalFormat;
public class Main {
public static void main(String[] args) {
// Integer a = 4;
// Double aa = (double)a / 100000;
// Decimal
unix时间戳相互转换
adminjun
转换 unix 时间戳
如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)? Java time JavaScript Math.round(new Date().getTime()/1000)
getTime()返回数值的单位是毫秒 Microsoft .NET / C# epoch = (DateTime.Now.ToUniversalTime().Ticks - 62135
作为一个合格程序员该做的事
aijuans
程序员
作为一个合格程序员每天该做的事 1、总结自己一天任务的完成情况 最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多
2、考虑自己明天应该做的主要工作 把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作
3、考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法 出错不要紧,最重
由html5视频播放引发的总结
ayaoxinchao
html5 视频 video
前言
项目中存在视频播放的功能,前期设计是以flash播放器播放视频的。但是现在由于需要兼容苹果的设备,必须采用html5的方式来播放视频。我就出于兴趣对html5播放视频做了简单的了解,不了解不知道,水真是很深。本文所记录的知识一些浅尝辄止的知识,说起来很惭愧。
视频结构
本该直接介绍html5的<video>的,但鉴于本人对视频
解决httpclient访问自签名https报javax.net.ssl.SSLHandshakeException: sun.security.validat
bewithme
httpclient
如果你构建了一个https协议的站点,而此站点的安全证书并不是合法的第三方证书颁发机构所签发,那么你用httpclient去访问此站点会报如下错误
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path bu
Jedis连接池的入门级使用
bijian1013
redis redis数据库 jedis
Jedis连接池操作步骤如下:
a.获取Jedis实例需要从JedisPool中获取;
b.用完Jedis实例需要返还给JedisPool;
c.如果Jedis在使用过程中出错,则也需要还给JedisPool;
packag
变与不变
bingyingao
不变 变 亲情永恒
变与不变
周末骑车转到了五年前租住的小区,曾经最爱吃的西北面馆、江西水饺、手工拉面早已不在,
各种店铺都换了好几茬,这些是变的。
三年前还很流行的一款手机在今天看起来已经落后的不像样子。
三年前还运行的好好的一家公司,今天也已经不复存在。
一座座高楼拔地而起,
【Scala十】Scala核心四:集合框架之List
bit1129
scala
Spark的RDD作为一个分布式不可变的数据集合,它提供的转换操作,很多是借鉴于Scala的集合框架提供的一些函数,因此,有必要对Scala的集合进行详细的了解
1. 泛型集合都是协变的,对于List而言,如果B是A的子类,那么List[B]也是List[A]的子类,即可以把List[B]的实例赋值给List[A]变量
2. 给变量赋值(注意val关键字,a,b
Nested Functions in C
bookjovi
c closure
Nested Functions 又称closure,属于functional language中的概念,一直以为C中是不支持closure的,现在看来我错了,不过C标准中是不支持的,而GCC支持。
既然GCC支持了closure,那么 lexical scoping自然也支持了,同时在C中label也是可以在nested functions中自由跳转的
Java-Collections Framework学习与总结-WeakHashMap
BrokenDreams
Collections
总结这个类之前,首先看一下Java引用的相关知识。Java的引用分为四种:强引用、软引用、弱引用和虚引用。
强引用:就是常见的代码中的引用,如Object o = new Object();存在强引用的对象不会被垃圾收集
读《研磨设计模式》-代码笔记-解释器模式-Interpret
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
package design.pattern;
/*
* 解释器(Interpreter)模式的意图是可以按照自己定义的组合规则集合来组合可执行对象
*
* 代码示例实现XML里面1.读取单个元素的值 2.读取单个属性的值
* 多
After Effects操作&快捷键
cherishLC
After Effects
1、快捷键官方文档
中文版:https://helpx.adobe.com/cn/after-effects/using/keyboard-shortcuts-reference.html
英文版:https://helpx.adobe.com/after-effects/using/keyboard-shortcuts-reference.html
2、常用快捷键
Maven 常用命令
crabdave
maven
Maven 常用命令
mvn archetype:generate
mvn install
mvn clean
mvn clean complie
mvn clean test
mvn clean install
mvn clean package
mvn test
mvn package
mvn site
mvn dependency:res
shell bad substitution
daizj
shell 脚本
#!/bin/sh
/data/script/common/run_cmd.exp 192.168.13.168 "impala-shell -islave4 -q 'insert OVERWRITE table imeis.${tableName} select ${selectFields}, ds, fnv_hash(concat(cast(ds as string), im
Java SE 第二讲(原生数据类型 Primitive Data Type)
dcj3sjt126com
java
Java SE 第二讲:
1. Windows: notepad, editplus, ultraedit, gvim
Linux: vi, vim, gedit
2. Java 中的数据类型分为两大类:
1)原生数据类型 (Primitive Data Type)
2)引用类型(对象类型) (R
CGridView中实现批量删除
dcj3sjt126com
PHP yii
1,CGridView中的columns添加
array(
'selectableRows' => 2,
'footer' => '<button type="button" onclick="GetCheckbox();" style=&
Java中泛型的各种使用
dyy_gusi
java 泛型
Java中的泛型的使用:1.普通的泛型使用
在使用类的时候后面的<>中的类型就是我们确定的类型。
public class MyClass1<T> {//此处定义的泛型是T
private T var;
public T getVar() {
return var;
}
public void setVa
Web开发技术十年发展历程
gcq511120594
Web 浏览器 数据挖掘
回顾web开发技术这十年发展历程:
Ajax
03年的时候我上六年级,那时候网吧刚在小县城的角落萌生。传奇,大话西游第一代网游一时风靡。我抱着试一试的心态给了网吧老板两块钱想申请个号玩玩,然后接下来的一个小时我一直在,注,册,账,号。
彼时网吧用的512k的带宽,注册的时候,填了一堆信息,提交,页面跳转,嘣,”您填写的信息有误,请重填”。然后跳转回注册页面,以此循环。我现在时常想,如果当时a
openSession()与getCurrentSession()区别:
hetongfei
java DAO Hibernate
来自 http://blog.csdn.net/dy511/article/details/6166134
1.getCurrentSession创建的session会和绑定到当前线程,而openSession不会。
2. getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭。
这里getCurrentSession本地事务(本地
第一章 安装Nginx+Lua开发环境
jinnianshilongnian
nginx lua openresty
首先我们选择使用OpenResty,其是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用。借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程序。而且OpenResty提供了大量组件如Mysql、Redis、Memcached等等,使在Nginx上开发Web应用更方便更简单。目前在京东如实时价格、秒
HSQLDB In-Process方式访问内存数据库
liyonghui160com
HSQLDB一大特色就是能够在内存中建立数据库,当然它也能将这些内存数据库保存到文件中以便实现真正的持久化。
先睹为快!
下面是一个In-Process方式访问内存数据库的代码示例:
下面代码需要引入hsqldb.jar包 (hsqldb-2.2.8)
import java.s
Java线程的5个使用技巧
pda158
java 数据结构
Java线程有哪些不太为人所知的技巧与用法? 萝卜白菜各有所爱。像我就喜欢Java。学无止境,这也是我喜欢它的一个原因。日常
工作中你所用到的工具,通常都有些你从来没有了解过的东西,比方说某个方法或者是一些有趣的用法。比如说线程。没错,就是线程。或者确切说是Thread这个类。当我们在构建高可扩展性系统的时候,通常会面临各种各样的并发编程的问题,不过我们现在所要讲的可能会略有不同。
开发资源大整合:编程语言篇——JavaScript(1)
shoothao
JavaScript
概述:本系列的资源整合来自于github中各个领域的大牛,来收藏你感兴趣的东西吧。
程序包管理器
管理javascript库并提供对这些库的快速使用与打包的服务。
Bower - 用于web的程序包管理。
component - 用于客户端的程序包管理,构建更好的web应用程序。
spm - 全新的静态的文件包管
避免使用终结函数
vahoa.ma
java jvm C++
终结函数(finalizer)通常是不可预测的,常常也是很危险的,一般情况下不是必要的。使用终结函数会导致不稳定的行为、更差的性能,以及带来移植性问题。不要把终结函数当做C++中的析构函数(destructors)的对应物。
我自己总结了一下这一条的综合性结论是这样的:
1)在涉及使用资源,使用完毕后要释放资源的情形下,首先要用一个显示的方