前端技术
HTML
CSS
Javascript
前端框架和UI库
VUE
ReactJS
AngularJS
JQuery
NodeJS
JSON
Element-UI
Bootstrap
Material UI
服务端和客户端
Java
Python
PHP
Golang
Scala
Kotlin
Groovy
Ruby
Lua
.net
c#
c++
后端WEB和工程框架
SpringBoot
SpringCloud
Struts2
MyBatis
Hibernate
Tornado
Beego
Go-Spring
Go Gin
Go Iris
Dubbo
HessianRPC
Maven
Gradle
数据库
MySQL
Oracle
Mongo
中间件与web容器
Redis
MemCache
Etcd
Cassandra
Kafka
RabbitMQ
RocketMQ
ActiveMQ
Nacos
Consul
Tomcat
Nginx
Netty
大数据技术
Hive
Impala
ClickHouse
DorisDB
Greenplum
PostgreSQL
HBase
Kylin
Hadoop
Apache Pig
ZooKeeper
SeaTunnel
Sqoop
Datax
Flink
Spark
Mahout
数据搜索与日志
ElasticSearch
Apache Lucene
Apache Solr
Kibana
Logstash
数据可视化与OLAP
Apache Atlas
Superset
Saiku
Tesseract
系统与容器
Linux
Shell
Docker
Kubernetes
[Context Context 在文中以...]的搜索结果
这里是文章列表。热门标签的颜色随机变换,标签颜色没有特殊含义。
点击某个标签可搜索标签相关的文章。
点击某个标签可搜索标签相关的文章。
HessianRPC
...,降低系统负载压力。文中给出了一个基于HessianRPC的熔断器实现示例,展示如何通过计数器记录失败次数,并在超过阈值时开启断路器,直接返回备用数据。 Fallback机制 , 指在主服务不可用的情况下,系统能够自动切换至备用服务或返回默认值的处理方式。文章中提到,Fallback机制通常与服务降级配合使用,用于提供替代性的响应结果。例如,当getUserInfo()方法调用失败时,Fallback机制会返回一个预定义的默认用户信息对象,告知用户当前服务不可用,而不是让用户长时间等待或看到错误页面。Fallback机制有助于提升系统的健壮性和用户体验。
2025-05-01 15:44:28
18
半夏微凉
转载文章
...互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 树莓派连接侧屏出现黑屏蓝屏解决方法: 在Windows下,进入已写入树莓派系统的SD卡,找到config.txt(最好备份一下这个)。每个人的侧屏显示器分辨率不一样,对于直接复制别人的代码很难解决问题,先理解下每个变量和参数的含义 config文件介绍: config文件中注释可以通过用‘’字符开始一行来添加 如果您希望更改具有影响,则“取消注释”意味着删除‘’ sdtv_mode=2将SDTV模式设置为PAL(在欧洲使用) hdmi_drive=1正常DVI模式(无声音) hdmi_drive=2将监视器强制到HDMI模式,以便通过HDMI电缆发送声音 hdmi_group=1将监视器模式设置为CEA hdmi_group=2将监视器模式设置为DMT hdmi_mode=16将监视器分辨率设置为1080P 60 Hz 这个是我侧屏解决黑屏的关键一个参数,先查看自己使用显示器的分辨率,对照hdmi_mode表值,进行改写。我的侧屏分辨率是19201080,选择hdmi_mode=16。 hdmi_group定义了CEA或DMT格式的屏幕分辨率 如果hdmi_group=1(CEA),则这些值有效。hdmi_mode=1 VGAhdmi_mode=2 480p 60 Hzhdmi_mode=3 480p 60 Hz Hhdmi_mode=4 720p 60 Hzhdmi_mode=5 1080i 60 Hzhdmi_mode=6 480i 60 Hzhdmi_mode=7 480i 60 Hz Hhdmi_mode=8 240p 60 Hzhdmi_mode=9 240p 60 Hz Hhdmi_mode=10 480i 60 Hz 4xhdmi_mode=11 480i 60 Hz 4x Hhdmi_mode=12 240p 60 Hz 4xhdmi_mode=13 240p 60 Hz 4x Hhdmi_mode=14 480p 60 Hz 2xhdmi_mode=15 480p 60 Hz 2x Hhdmi_mode=16 1080p 60 Hzhdmi_mode=17 576p 50 Hzhdmi_mode=18 576p 50 Hz Hhdmi_mode=19 720p 50 Hzhdmi_mode=20 1080i 50 Hzhdmi_mode=21 576i 50 Hzhdmi_mode=22 576i 50 Hz Hhdmi_mode=23 288p 50 Hzhdmi_mode=24 288p 50 Hz Hhdmi_mode=25 576i 50 Hz 4xhdmi_mode=26 576i 50 Hz 4x Hhdmi_mode=27 288p 50 Hz 4xhdmi_mode=28 288p 50 Hz 4x Hhdmi_mode=29 576p 50 Hz 2xhdmi_mode=30 576p 50 Hz 2x Hhdmi_mode=31 1080p 50 Hzhdmi_mode=32 1080p 24 Hzhdmi_mode=33 1080p 25 Hzhdmi_mode=34 1080p 30 Hzhdmi_mode=35 480p 60 Hz 4xhdmi_mode=36 480p 60 Hz 4xHhdmi_mode=37 576p 50 Hz 4xhdmi_mode=38 576p 50 Hz 4x Hhdmi_mode=39 1080i 50 Hz reduced blankinghdmi_mode=40 1080i 100 Hzhdmi_mode=41 720p 100 Hzhdmi_mode=42 576p 100 Hzhdmi_mode=43 576p 100 Hz Hhdmi_mode=44 576i 100 Hz hdmi_mode=45 576i 100 Hz Hhdmi_mode=46 1080i 120 Hz hdmi_mode=47 720p 120 Hz hdmi_mode=48 480p 120 Hz hdmi_mode=49 480p 120 Hz Hhdmi_mode=50 480i 120 Hz hdmi_mode=51 480i 120 Hz Hhdmi_mode=52 576p 200 Hz hdmi_mode=53 576p 200 Hz Hhdmi_mode=54 576i 200 Hz hdmi_mode=55 576i 200 Hz Hhdmi_mode=56 480p 240 Hz hdmi_mode=57 480p 240 Hz Hhdmi_mode=58 480i 240 Hz hdmi_mode=59 480i 240 Hz HH指16:9变体(通常为4:3模式)。2x意味着像素加倍(即更高的时钟速率,每个像素重复两次)4x意味着像素四倍(即更高的时钟速率,每个像素重复四次)。 如果hdmi_group=2(Dmt),则这些值有效。有一个像素时钟限制,这意味着支持的最高模式是1920x1200@60 Hz,减少了消隐。hdmi_mode=1 640x350 85 Hzhdmi_mode=2 640x400 85 Hzhdmi_mode=3 720x400 85 Hzhdmi_mode=4 640x480 60 Hzhdmi_mode=5 640x480 72 Hzhdmi_mode=6 640x480 75 Hzhdmi_mode=7 640x480 85 Hzhdmi_mode=8 800x600 56 Hzhdmi_mode=9 800x600 60 Hzhdmi_mode=10 800x600 72 Hzhdmi_mode=11 800x600 75 Hzhdmi_mode=12 800x600 85 Hzhdmi_mode=13 800x600 120 Hzhdmi_mode=14 848x480 60 Hzhdmi_mode=15 1024x768 43 Hz DO NOT USEhdmi_mode=16 1024x768 60 Hzhdmi_mode=17 1024x768 70 Hzhdmi_mode=18 1024x768 75 Hzhdmi_mode=19 1024x768 85 Hzhdmi_mode=20 1024x768 120 Hzhdmi_mode=21 1152x864 75 Hzhdmi_mode=22 1280x768 Reduced blankinghdmi_mode=23 1280x768 60 Hzhdmi_mode=24 1280x768 75 Hzhdmi_mode=25 1280x768 85 Hzhdmi_mode=26 1280x768 120 Hz Reduced blankinghdmi_mode=27 1280x800 Reduced blankinghdmi_mode=28 1280x800 60 Hz hdmi_mode=29 1280x800 75 Hz hdmi_mode=30 1280x800 85 Hz hdmi_mode=31 1280x800 120 Hz Reduced blankinghdmi_mode=32 1280x960 60 Hz hdmi_mode=33 1280x960 85 Hz hdmi_mode=34 1280x960 120 Hz Reduced blankinghdmi_mode=35 1280x1024 60 Hz hdmi_mode=36 1280x1024 75 Hz hdmi_mode=37 1280x1024 85 Hz hdmi_mode=38 1280x1024 120 Hz Reduced blankinghdmi_mode=39 1360x768 60 Hz hdmi_mode=40 1360x768 120 Hz Reduced blankinghdmi_mode=41 1400x1050 Reduced blankinghdmi_mode=42 1400x1050 60 Hz hdmi_mode=43 1400x1050 75 Hz hdmi_mode=44 1400x1050 85 Hz hdmi_mode=45 1400x1050 120 Hz Reduced blankinghdmi_mode=46 1440x900 Reduced blankinghdmi_mode=47 1440x900 60 Hz hdmi_mode=48 1440x900 75 Hz hdmi_mode=49 1440x900 85 Hz hdmi_mode=50 1440x900 120 Hz Reduced blankinghdmi_mode=51 1600x1200 60 Hz hdmi_mode=52 1600x1200 65 Hz hdmi_mode=53 1600x1200 70 Hz hdmi_mode=54 1600x1200 75 Hz hdmi_mode=55 1600x1200 85 Hz hdmi_mode=56 1600x1200 120 Hz Reduced blankinghdmi_mode=57 1680x1050 Reduced blankinghdmi_mode=58 1680x1050 60 Hz hdmi_mode=59 1680x1050 75 Hz hdmi_mode=60 1680x1050 85 Hz hdmi_mode=61 1680x1050 120 Hz Reduced blankinghdmi_mode=62 1792x1344 60 Hz hdmi_mode=63 1792x1344 75 Hz hdmi_mode=64 1792x1344 120 Hz Reduced blankinghdmi_mode=65 1856x1392 60 Hz hdmi_mode=66 1856x1392 75 Hz hdmi_mode=67 1856x1392 120 Hz Reduced blankinghdmi_mode=68 1920x1200 Reduced blankinghdmi_mode=69 1920x1200 60 Hz hdmi_mode=70 1920x1200 75 Hz hdmi_mode=71 1920x1200 85 Hz hdmi_mode=72 1920x1200 120 Hz Reduced blankinghdmi_mode=73 1920x1440 60 Hz hdmi_mode=74 1920x1440 75 Hz hdmi_mode=75 1920x1440 120 Hz Reduced blankinghdmi_mode=76 2560x1600 Reduced blankinghdmi_mode=77 2560x1600 60 Hz hdmi_mode=78 2560x1600 75 Hz hdmi_mode=79 2560x1600 85 Hz hdmi_mode=80 2560x1600 120 Hz Reduced blankinghdmi_mode=81 1366x768 60 Hz hdmi_mode=82 1080p 60 Hz hdmi_mode=83 1600x900 Reduced blankinghdmi_mode=84 2048x1152 Reduced blankinghdmi_mode=85 720p 60 Hz hdmi_mode=86 1366x768 Reduced blanking 建议的低分辨率尝试开始,出现正常桌面在不断调整参数 ps:在网上买的小显示屏坏的,怎么调都是黑屏,最后用电脑的侧屏成功了。 (先让屏幕亮,然后在调适合屏幕的参数) overscan_left=20在左边跳过的像素数 overscan_right=20在右边跳过的像素数 overscan_top=20要跳过顶部的像素数 overscan_bottom要跳过底部的像素数 使显示器变小,以防止文本从屏幕上溢出 start_x启用照相机模块。起始x=1 disable_camera_led=1在录制视频或拍摄静止照片时,关闭红色照相机LED gpu_mem=128摄像机用最小GPU内存 disable_audio_dither=1禁止在PWM音频算法上抖动。如果您在音频插孔上遇到白噪声问题,请尝试此方法。 sdtv_mode=0复合输出定义TV标准(默认值=0) sdtv_mode=0 正常 NTSCsdtv_mode=1 日文版 NTSC – (无基座)sdtv_mode=2 正常 PALsdtv_mode=3 巴西版本 PAL sdtv_aspect=1 4:3 sdtv_aspect=2 14:9 sdtv_aspect=3 16:9定义复合输出的高宽比(默认值=1) hdmi_safe=1使用“安全模式”设置尝试引导与最大的HDMI兼容性。这与以下组合相同: hdmi_force_hotplug=1hdmi_niel_edid=0xa5000080 config_hdmi_boost=4hdmi_group=2hdmi_mode=4disdable_overscan=0overcan_left=24overcan_right=24overscan_top=24overcan_base=24 ps:可参考 hdmi_edid_file=1当设置为1时,将从edid.dat文件而不是从监视器读取edid数据 hdmi_force_hotplug=1即使没有检测到hdmi监视器,也可以使用hdmi模式。 hdmi_niel_edid=0xa5000080如果显示没有准确的Edid,则启用忽略Edid/Display数据。 hdmi_ignore_hotplug=1即使检测到hdmi监视器,也可以使用复合模式。 config_hdmi_boost=2配置hdmi接口的信号强度。如果您对hdmi有干扰问题,尝试增加(例如,到7)11是最大的。 disdable_overscan=0设置为1以禁用过度扫描。 max_usb_current=1结合树莓PI B+,引入了一个新的config.txt设置。 max_usb_current=0当添加这一行时,USB电源管理器将将其输出电流限制(对所有4个USB端口加起来)从600 mA更改为1200 mA的两倍。 dtparam=i2c_arm=on在GPIO引脚上启用I2C。 dtparam=i2s=on启用I2S音频硬件。 dtparam=spi=on启用SPI驱动程序。 dtoverlay=xxx向设备树中添加一个覆盖/boot/overays/xxx-overlay.dtb(在树莓派的系统盘中搜索文件位置) 文章总结: 一个树莓派发烧友(小学生)使用树莓派版本4B,参考过很多文章和博客但是都没有成功,最后翻译官方文档,更改参数最终victory!!! 附上我的config文件参数 文章参考: https://elinux.org/RPiconfig 本篇文章为转载内容。原文链接:https://blog.csdn.net/gcyhacker/article/details/122666018。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-07-09 14:23:40
376
转载
转载文章
...互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 近期pm提出需要统计首页商品的曝光亮,由于我们的首页是用的recylerview实现的,这里就来讲下如何使用监听recylerview的滚动事件来实现子view的曝光量统计,我们这里说的view都是列表中的子item条目(子view) 先来看下统计结果图 左边是我们的列表,右边是我们统计到每个条目的曝光量。下面就来讲讲具体实现步骤。 一,activity中使用recylerview并显示数据 这里我不再啰嗦,recylerview最基础的使用。 二,监听recylerview的滚动事件OnScrollListener onScrollStateChanged:监听滚动状态 onScrolled:监听滚动 我们接下来的统计工作,就是拿这两个方法做文章。 //检测recylerview的滚动事件recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {/我这里通过的是停止滚动后屏幕上可见view。如果滚动过程中的可见view也要统计,你可以根据newState去做区分SCROLL_STATE_IDLE:停止滚动SCROLL_STATE_DRAGGING: 用户慢慢拖动SCROLL_STATE_SETTLING:惯性滚动/if (newState == RecyclerView.SCROLL_STATE_IDLE) {.....} }@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);........} });复制代码 首先再次明确下,我们要统计的是用户停止滑动时,显示在屏幕的上控件。所以我们要监测到onScrollStateChanged 方法中 newState == RecyclerView.SCROLL_STATE_IDLE 时,也就是用户停止滚动。然后在这里做文章。 三,获取屏幕内可见条目的起始位置 这里的起始位置就是指我们屏幕当中最上面和最下面条目的位置。比如下图的0就是最上面的可见条目,3就是最下面的可见条目。我们次数的曝光view就是0,1,2,3 这个时候这四个条目显示在屏幕中。我们这时就要对这4个view的曝光量进行加1 那么接下来的重点就是要去获取屏幕内可见条目的起始位置。获取到起始位置后,当前屏幕里的可见条目就都能拿到了。 而recylerview的manager正好给我们提供的有对应的方法。 findFirstVisibleItemPosition()和findLastVisibleItemPosition() 看字面意思就能知道这时干嘛用的。 但是我们的manager不止LinearLayoutManager一种,所以我们要做下区分, //这里我们用一个数组来记录起始位置int[] range = new int[2];RecyclerView.LayoutManager manager = reView.getLayoutManager();if (manager instanceof LinearLayoutManager) {range = findRangeLinear((LinearLayoutManager) manager);} else if (manager instanceof GridLayoutManager) {range = findRangeGrid((GridLayoutManager) manager);} else if (manager instanceof StaggeredGridLayoutManager) {range = findRangeStaggeredGrid((StaggeredGridLayoutManager) manager);}复制代码 LinearLayoutManager和GridLayoutManager获取起始位置方法如下 private int[] findRangeLinear(LinearLayoutManager manager) {int[] range = new int[2];range[0] = manager.findFirstVisibleItemPosition();range[1] = manager.findLastVisibleItemPosition();return range;}private int[] findRangeGrid(GridLayoutManager manager) {int[] range = new int[2];range[0] = manager.findFirstVisibleItemPosition();range[1] = manager.findLastVisibleItemPosition();return range;}复制代码 StaggeredGridLayoutManager获取起始位置有点复杂,如下 private int[] findRangeStaggeredGrid(StaggeredGridLayoutManager manager) {int[] startPos = new int[manager.getSpanCount()];int[] endPos = new int[manager.getSpanCount()];manager.findFirstVisibleItemPositions(startPos);manager.findLastVisibleItemPositions(endPos);int[] range = findRange(startPos, endPos);return range;}private int[] findRange(int[] startPos, int[] endPos) {int start = startPos[0];int end = endPos[0];for (int i = 1; i < startPos.length; i++) {if (start > startPos[i]) {start = startPos[i];} }for (int i = 1; i < endPos.length; i++) {if (end < endPos[i]) {end = endPos[i];} }int[] res = new int[]{start, end};return res;}复制代码 四,获取到起始位置以后,我们就根据位置获取到view及view中的数据 上面第三步拿到屏幕内可见条目的起始位置以后,我们就用一个for循环,获取当前屏幕内可见的所有子view for (int i = range[0]; i <= range[1]; i++) {View view = manager.findViewByPosition(i);recordViewCount(view);}复制代码 recordViewCount是我自己写的用于获取子view内绑定数据的方法 //获取view绑定的数据private void recordViewCount(View view) {if (view == null || view.getVisibility() != View.VISIBLE ||!view.isShown() || !view.getGlobalVisibleRect(new Rect())) {return;}int top = view.getTop();int halfHeight = view.getHeight() / 2;int screenHeight = UiUtils.getScreenHeight((Activity) view.getContext());int statusBarHeight = UiUtils.getStatusBarHeight(view.getContext());if (top < 0 && Math.abs(top) > halfHeight) {return;}if (top > screenHeight - halfHeight - statusBarHeight) {return;}//这里获取的是我们view绑定的数据,相应的你要去在你的view里setTag,只有set了,才能getItemData tag = (ItemData) view.getTag();String key = tag.toString();if (TextUtils.isEmpty(key)) {return;}hashMap.put(key, !hashMap.containsKey(key) ? 1 : (hashMap.get(key) + 1));Log.i("qcl0402", key + "----出现次数:" + hashMap.get(key));}复制代码 这里有几点需要注意 1,这这里起始位置的view显示区域如果不超过50%,就不算这个view可见,进而也就不统计曝光。 2,我们通过view.getTag();获取view里的数据,必须在此之前setTag()数据,我这里setTag是在viewholder中把数据set进去的 到这里我们就实现了recylerview列表中view控件曝光量的统计了。下面贴出来完整的代码给大家 package com.example.qcl.demo.xuexi.baoguang;import android.app.Activity;import android.graphics.Rect;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.text.TextUtils;import android.util.Log;import android.view.View;import com.example.qcl.demo.utils.UiUtils;import java.util.concurrent.ConcurrentHashMap;/ 2019/4/2 13:31 author: qcl desc: 安卓曝光量统计工具类 wechat:2501902696/public class ViewShowCountUtils {//刚进入列表时统计当前屏幕可见viewsprivate boolean isFirstVisible = true;//用于统计曝光量的mapprivate ConcurrentHashMap<String, Integer> hashMap = new ConcurrentHashMap<String, Integer>();/ 统计RecyclerView里当前屏幕可见子view的曝光量 /void recordViewShowCount(RecyclerView recyclerView) {hashMap.clear();if (recyclerView == null || recyclerView.getVisibility() != View.VISIBLE) {return;}//检测recylerview的滚动事件recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {/我这里通过的是停止滚动后屏幕上可见view。如果滚动过程中的可见view也要统计,你可以根据newState去做区分SCROLL_STATE_IDLE:停止滚动SCROLL_STATE_DRAGGING: 用户慢慢拖动SCROLL_STATE_SETTLING:惯性滚动/if (newState == RecyclerView.SCROLL_STATE_IDLE) {getVisibleViews(recyclerView);} }@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);//刚进入列表时统计当前屏幕可见viewsif (isFirstVisible) {getVisibleViews(recyclerView);isFirstVisible = false;} }});}/ 获取当前屏幕上可见的view /private void getVisibleViews(RecyclerView reView) {if (reView == null || reView.getVisibility() != View.VISIBLE ||!reView.isShown() || !reView.getGlobalVisibleRect(new Rect())) {return;}//保险起见,为了不让统计影响正常业务,这里做下try-catchtry {int[] range = new int[2];RecyclerView.LayoutManager manager = reView.getLayoutManager();if (manager instanceof LinearLayoutManager) {range = findRangeLinear((LinearLayoutManager) manager);} else if (manager instanceof GridLayoutManager) {range = findRangeGrid((GridLayoutManager) manager);} else if (manager instanceof StaggeredGridLayoutManager) {range = findRangeStaggeredGrid((StaggeredGridLayoutManager) manager);}if (range == null || range.length < 2) {return;}Log.i("qcl0402", "屏幕内可见条目的起始位置:" + range[0] + "---" + range[1]);for (int i = range[0]; i <= range[1]; i++) {View view = manager.findViewByPosition(i);recordViewCount(view);} } catch (Exception e) {e.printStackTrace();} }//获取view绑定的数据private void recordViewCount(View view) {if (view == null || view.getVisibility() != View.VISIBLE ||!view.isShown() || !view.getGlobalVisibleRect(new Rect())) {return;}int top = view.getTop();int halfHeight = view.getHeight() / 2;int screenHeight = UiUtils.getScreenHeight((Activity) view.getContext());int statusBarHeight = UiUtils.getStatusBarHeight(view.getContext());if (top < 0 && Math.abs(top) > halfHeight) {return;}if (top > screenHeight - halfHeight - statusBarHeight) {return;}//这里获取的是我们view绑定的数据,相应的你要去在你的view里setTag,只有set了,才能getItemData tag = (ItemData) view.getTag();String key = tag.toString();if (TextUtils.isEmpty(key)) {return;}hashMap.put(key, !hashMap.containsKey(key) ? 1 : (hashMap.get(key) + 1));Log.i("qcl0402", key + "----出现次数:" + hashMap.get(key));}private int[] findRangeLinear(LinearLayoutManager manager) {int[] range = new int[2];range[0] = manager.findFirstVisibleItemPosition();range[1] = manager.findLastVisibleItemPosition();return range;}private int[] findRangeGrid(GridLayoutManager manager) {int[] range = new int[2];range[0] = manager.findFirstVisibleItemPosition();range[1] = manager.findLastVisibleItemPosition();return range;}private int[] findRangeStaggeredGrid(StaggeredGridLayoutManager manager) {int[] startPos = new int[manager.getSpanCount()];int[] endPos = new int[manager.getSpanCount()];manager.findFirstVisibleItemPositions(startPos);manager.findLastVisibleItemPositions(endPos);int[] range = findRange(startPos, endPos);return range;}private int[] findRange(int[] startPos, int[] endPos) {int start = startPos[0];int end = endPos[0];for (int i = 1; i < startPos.length; i++) {if (start > startPos[i]) {start = startPos[i];} }for (int i = 1; i < endPos.length; i++) {if (end < endPos[i]) {end = endPos[i];} }int[] res = new int[]{start, end};return res;} }复制代码 使用就是在我们的recylerview设置完数据以后,把recylerview传递进去就可以了。如下图: 我们统计到曝光量,拿到曝光view绑定的数据,就可以结合后面的view点击,来看下那些商品view的曝光量高,那些商品的转化率高。当然,这都是运营小伙伴的事了,我们只需要负责把曝光量统计到即可。 如果你有任何编程方面的问题,可以加我微信交流 2501902696(备注编程) by:年糕妈妈qcl 转载于:https://juejin.im/post/5ca30ad1e51d4514c01634f1 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_34150503/article/details/91475198。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-07-29 13:55:00
323
转载
RabbitMQ
...不可用的情况下。在本文中,重试机制被用来处理 RabbitMQ 连接故障,通过设置合理的重试次数和间隔时间,可以有效地提高消息传递的成功率。例如,当应用程序尝试连接 RabbitMQ 服务器失败时,可以通过重试机制在指定的时间间隔后再次尝试连接。 断线重连策略 , 断线重连策略是指在应用程序与服务器之间的连接意外中断后,能够自动检测到这种中断,并尝试重新建立连接的一种机制。这种策略有助于保持应用程序与服务器之间的持续通信,减少因连接中断导致的服务中断时间。在本文中,断线重连策略被用来确保即使在网络波动或服务器重启的情况下,应用程序也能继续向 RabbitMQ 发送消息。通过在每次连接失败后等待一段时间再重新尝试连接,可以避免频繁的连接请求,减轻服务器压力。
2024-12-02 16:11:51
95
红尘漫步
转载文章
...互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 写在最前边: Dell这个牌子的一个主要特征就是兼容性极差,硬件留给你的操作空间极小,很离谱,很想跟戴尔绕着走 这个结论的出现就得从我的G15说起了:当时买的时候只有一个固态硬盘,想加装一个,然后就买了当时的PCIE4.0协议的三星980pro,后来发现硬盘口只有原厂硬盘的硬盘口支持4.0协议,这还没完。硬盘装上去之后,暂时看不出什么异常,但是电脑经常会卡死,就是屏幕亮着啥也点不动,B站也一堆改装翻车的,后来把三星980pro换到了3.0的口,问题就没在发生过了。从此Dell的不兼容性就给我留下了深深的印象。 最近,我们办公室的服务器噪音巨大,从开机键按下的一刻起就是飞机起飞状态。一看牌子:好家伙,Dell的!!!那没事了…Giao~ 还是抱有一丝希望地去网上搜了一下,果然是因为硬件设备的原因,T640无法识别3090,进而无法自适应调整风扇转速。Dell,不愧是你! 经过较为漫长的搜索调试,最后终于对风扇转速实现了较为方便的手动控制,下面对这个过程进行一下梳理。 -------------------------------------------------------------------------------------分界线------------------------------------------------------------------------------------- 1.首先是参考了这一篇文章:https://zhuanlan.zhihu.com/p/336990051 主要介绍了两种方式解决这个问题: 使用racadm温度调控,但是配置教程是Ubuntu16.04下的,过程中有些linux语句在18.04中运行报错,本身对linux就不是很熟,然后我果断放弃。 更新BIOS 和IDRAC,他2022年3月3日通过更新版本,实现了风扇转速的控制,但是我2022年6月,按照他给的下载版本,更新了,发现没用啊??!!回退版本没用,更新版本也没用,就很离谱,难道因为他是2080ti,我是3090的问题??操作步骤如下: 参考该博客对服务器IDRAC配置 https://www.dell.com/support/kbdoc/zh-cn/000177212,查看解决方案中的开机自检期间为F2进行配置 配置好后,在服务器后后面有个IDRAC的网线插口,用网线与笔记本连接,连接成功后会显示未识别网络(如果是红叉的话是没有连接成功,检查上一步,尝试关机重启等),修改IP地址,跟上一步设置的服务器IP在同一网段,不是同一IP!!,比如服务器是192.168.0.120,笔记本可以设置192.168.0.100。(https://new.qq.com/omn/20210119/20210119A01ROV00.html) IE浏览器打开192.168.0.100网址,提示不安全,然后忽略掉,输入账号密码就可以进去了 进去后在下图位置,上传更新文件进行安装。 2.后面又看到一篇博客:https://blog.csdn.net/qq_36810544/article/details/115734795这篇博客比上边那篇早,应该是有参考吧,说是更新版本就行了,然并卵啊,可能是因为他是Ubuntu20.04,我是18.04的原因? 3.最后没招了,用IPMITOOL手动调节吧,参考了博客:https://blog.51cto.com/u_15072918/4392813 这篇博客也是更新后仍然无法识别3090(实际上我下的新版本的IDRAC是可以识别出有GPU的,但是还是显示不可用哇),所以就把IDRAC的版本回退到3.30以下使用IPMITOOL进行行手动调节转速了。 具体步骤如下: 将IDRAC回退到3.30版本,下载地址:https://www.dell.com/support/home/zh-cn/drivers/driversdetails 有的版本IDRAC可能需要把IMPI取消禁用,就在笔记本访问的IP地址的网页里修改即可,应该是在IDRAC设置中,没找到的话应该是不需要操作。 下载IPMITOOLWIN版本程序后解压,终端cd进入该文件夹,然后运行ipmitool命令: 关闭自动控制:ipmitool -I lanplus -U 用户名 -P 密码 -H 服务器地址 raw 0x30 0x30 0x01 0x00 设置风扇转速:ipmitool -I lanplus -U 用户名 -P 密码 -H 192.168.0.120 raw 0x30 0x30 0x02 0xff 0x64 ,最后两位对应16进制的风扇转速。64对应100%。 3.转速现在是可以手动调节了,但是每次都要执行终端命令太麻烦了,然后我写了一个小的gui界面,可以更方便地对风扇转速进行调节。界面如下,可以通过+和-增加和降低风速,也可以设定数值进行Set。 为了防止过热,最低风扇转速设置成了30%。需要注意:这个文件中IDRAC的IP必须是192.168.0.120才可以。 本文就先写到这里了,调节软件如果有需求的话可以后续上传,我在程序中也放了IPMITOOLWIN的文件,不需要再进行下载。有更好的解决方法也欢迎评论区分享。 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_42686221/article/details/125478351。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-02-24 14:29:07
174
转载
转载文章
...互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式。SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP(来自百度的解释) JSch是Java Secure Channel的缩写。 JSch是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序。 ChannelSftp类是JSch实现SFTP核心类,它包含了所有SFTP的方法,如: put(): 文件上传get(): 文件下载cd(): 进入指定目录ls(): 得到指定目录下的文件列表rename(): 重命名指定文件或目录rm(): 删除指定文件mkdir(): 创建目录rmdir(): 删除目录 1、先引入jar包 <dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.2</version></dependency> 账号密码类 public interface SFTPDTO {/FTP登录用户名/public static final String username=xxxx;/ FTP登录密码/public static final String password=xxxx;/ 私钥/public static final String privateKey = xxxx;/ FTP服务器地址IP地址/public static final String host=xxxx;/ FTP端口/public static final int port=xxxx;} 重要类,里面包含开启连接和关闭连接。 public class SFTPUtils {private ChannelSftp sftp;private Session session;public void login(){try {JSch jsch = new JSch();if (SFTPDTO.privateKey != null) {jsch.addIdentity(SFTPDTO.privateKey);// 设置私钥}session = jsch.getSession(SFTPDTO.username, SFTPDTO.host, SFTPDTO.port);if (SFTPDTO.password != null) {session.setPassword(SFTPDTO.password);}Properties config = new Properties();config.put("StrictHostKeyChecking", "no");session.setConfig(config);session.connect();Channel channel = session.openChannel("sftp");channel.connect();sftp = (ChannelSftp) channel;} catch (Exception e) {log.error("Cannot connect to specified sftp server : {}:{} \n Exception message is: {}", new Object[]{SFTPDTO.host, SFTPDTO.port, e.getMessage()});} }/ 关闭连接 server/public void logout(){if (sftp != null) {if (sftp.isConnected()) {sftp.disconnect();log.info("sftp is closed already");} }if (session != null) {if (session.isConnected()) {session.disconnect();log.info("sshSession is closed already");} }}/ 将输入流的数据上传到sftp作为文件 @param directory 上传到该目录 @param sftpFileName sftp端文件名 @throws SftpException @throws Exception/public void upload(String directory, String sftpFileName, InputStream input) throws SftpException{try {sftp.cd(directory);} catch (SftpException e) {log.warn("directory is not exist");sftp.mkdir(directory);sftp.cd(directory);}sftp.put(input, sftpFileName);log.info("file:{} is upload successful" , sftpFileName);} } 测试一下 public static void main(){SFTPUtils sftp = new SFTPUtils();sftp.login();String audioUrl = courseSection.getAudioUrl();String temp[] = audioUrl.split("\\\\");String fileName = temp[temp.length - 1];InputStream inputStream = FileUtils.urlInputStream(audioUrl);sftp.upload("/www/website/haha/audio", fileName, inputStream);//上传//拼接最终的urlString newUrl = "https://static.taobao.com/website/ancai/audio/".concat(fileName);sftp.logout();} 把url转成流 public class FileUtils {public static InputStream urlInputStream(String fileUrl){if(StringUtils.isBlank(fileUrl)){return null;}try {URL url = new URL(fileUrl);HttpURLConnection conn = (HttpURLConnection)url.openConnection();//设置超时间为3秒conn.setConnectTimeout(31000);//防止屏蔽程序抓取而返回403错误conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");//得到输入流return conn.getInputStream();} catch (Exception e) {//打印errorlog.error("fileutils.urlinputstream-获取url流失败:",e.getMessage());}return null;} } 实际中,我们使用这个工具类就够用了 public class SFTPUtils {private ChannelSftp sftp;private Session session;public void login(){try {JSch jsch = new JSch();if (SFTPDTO.privateKey != null) {jsch.addIdentity(SFTPDTO.privateKey);// 设置私钥}session = jsch.getSession(SFTPDTO.username, SFTPDTO.host, SFTPDTO.port);if (SFTPDTO.password != null) {session.setPassword(SFTPDTO.password);}Properties config = new Properties();config.put("StrictHostKeyChecking", "no");session.setConfig(config);session.connect();Channel channel = session.openChannel("sftp");channel.connect();sftp = (ChannelSftp) channel;} catch (Exception e) {log.error("Cannot connect to specified sftp server : {}:{} \n Exception message is: {}", new Object[]{SFTPDTO.host, SFTPDTO.port, e.getMessage()});} }/ 关闭连接 server/public void logout(){if (sftp != null) {if (sftp.isConnected()) {sftp.disconnect();log.info("sftp is closed already");} }if (session != null) {if (session.isConnected()) {session.disconnect();log.info("sshSession is closed already");} }}/ 将输入流的数据上传到sftp作为文件 @param directory 上传到该目录 @param sftpFileName sftp端文件名 @throws SftpException @throws Exception/public void upload(String directory, String sftpFileName, InputStream input) throws SftpException{try {sftp.cd(directory);} catch (SftpException e) {log.warn("directory is not exist");sftp.mkdir(directory);sftp.cd(directory);}sftp.put(input, sftpFileName);log.info("file:{} is upload successful" , sftpFileName);}/ 上传单个文件 @param directory 上传到sftp目录 @param uploadFile 要上传的文件,包括路径 @throws FileNotFoundException @throws SftpException @throws Exception/public void upload(String directory, String uploadFile) throws FileNotFoundException, SftpException{File file = new File(uploadFile);upload(directory, file.getName(), new FileInputStream(file));}/ 将byte[]上传到sftp,作为文件。注意:从String生成byte[]是,要指定字符集。 @param directory 上传到sftp目录 @param sftpFileName 文件在sftp端的命名 @param byteArr 要上传的字节数组 @throws SftpException @throws Exception/public void upload(String directory, String sftpFileName, byte[] byteArr) throws SftpException{upload(directory, sftpFileName, new ByteArrayInputStream(byteArr));}/ 将字符串按照指定的字符编码上传到sftp @param directory 上传到sftp目录 @param sftpFileName 文件在sftp端的命名 @param dataStr 待上传的数据 @param charsetName sftp上的文件,按该字符编码保存 @throws UnsupportedEncodingException @throws SftpException @throws Exception/public void upload(String directory, String sftpFileName, String dataStr, String charsetName) throws UnsupportedEncodingException, SftpException{upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName)));}/ 下载文件 @param directory 下载目录 @param downloadFile 下载的文件 @param saveFile 存在本地的路径 @throws SftpException @throws Exception/public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{if (directory != null && !"".equals(directory)) {sftp.cd(directory);}File file = new File(saveFile);sftp.get(downloadFile, new FileOutputStream(file));log.info("file:{} is download successful" , downloadFile);}/ 下载文件 @param directory 下载目录 @param downloadFile 下载的文件名 @return 字节数组 @throws SftpException @throws Exception/public byte[] download(String directory, String downloadFile) throws SftpException, IOException {if (directory != null && !"".equals(directory)) {sftp.cd(directory);}InputStream is = sftp.get(downloadFile);byte[] fileData = IOUtils.toByteArray(is);log.info("file:{} is download successful" , downloadFile);return fileData;}/ 删除文件 @param directory 要删除文件所在目录 @param deleteFile 要删除的文件 @throws SftpException @throws Exception/public void delete(String directory, String deleteFile) throws SftpException{sftp.cd(directory);sftp.rm(deleteFile);}/ 列出目录下的文件 @param directory 要列出的目录 @return @throws SftpException/public Vector<?> listFiles(String directory) throws SftpException {return sftp.ls(directory);}/public static void main(String[] args) throws SftpException, Exception {SFTPUtils sftp = new SFTPUtils("xxxx", "xxx", "upload.haha.com", 8888);sftp.login();InputStream inputStream = getInputStream("http://qiniu.xinxuanhaoke.com/keqianduwu_1.jpg");sftp.upload("/www/website/ancai/audio", "123.jpg", inputStream);sftp.logout();}/} 方式二、使用HuTool的工具类 先引入jar <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.4.0</version></dependency><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.53</version></dependency> public static void main(String[] args) {Sftp sftp = JschUtil.createSftp("ip或者域名", 端口, "账号", "密码");ChannelSftp client = sftp.getClient();String cd = "/www/website/ancai/audio";//要上传的路径try {sftp.cd(cd); //进入指定目录} catch (Exception e) {log.warn("directory is not exist");sftp.mkdir(cd); //创建目录sftp.cd(cd); //进入目录}InputStream inputStream = urlInputStream("http://audio.xinxuanhaoke.com/50bda079e9ef3673bbaeda20321bf932.mp3");//将文件转成流client.put(String.valueOf(inputStream), "1.mp3");//开始上传。} 本文引自:https://www.cnblogs.com/ceshi2016/p/7519762.html 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_37862824/article/details/113530683。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-04-04 09:43:38
72
转载
转载文章
...互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 本周,跟随人事部同事,参加了公司在武汉的校园招聘会。 这是公司第3次在武汉进行校园招聘,吸取了前两次的经验,本次校招安排在国庆前进行,在时间上抢先其它公司,采用了“宣讲、直接做题、筛选、技术面试、人事面试”方式。整个过程持续2.5天:第1天,上午华中科大宣讲、做题,下午武大宣讲、做题,晚上筛选。第2天技术面试。第3天上午人事面试。以下是一些经历记录。 1. 笔试、筛选流程有待改进 宣讲后,直接笔试,然后笔试和简历一起提交,晚上根据试题和简历初步筛选,整个过程出现几个较大问题: 没有地方做题。宣讲时不知道确切人数,很多同学都是站着,之后做题找不到地方,有的同学直接就在膝盖上完成了。在武大更是严重,人数较多,临时找做题的会议室,导致很多同学延迟半小时才开始答题,非常影响学生的答题心情。 试卷不够。同样因为宣讲不知道确切人数,拍脑袋一个方向打印了几十份试卷,结果有的无人问津,如DSP方向;有的则没有试卷,如软件工程师;一些同学发挥才智,直接写答案在自带的空白稿纸上。这也非常影响学生的答题心情。 筛选时间不足。晚上要根据试题和简历筛选出面试人选,并通知到。只有3个小时时间,2百多简历,平均1份不到1分钟,连逐题评分都没有时间。筛选只能跑马观花,看看卷面、答题内容、学校等,个人觉得这种筛选方式非常草率,容易漏掉不善于书写、或发挥不好的其他学校学生。面试中,就有2位同学认为试题答得很好,要求面试。 已将向人事部反应,推荐参考其他公司的,先投简历,初步筛选后,再确定笔试人数,然后再筛选,面试。虽然会多花1天时间,但做题、筛选会更有效率和质量。回复本年度招聘流程就这样了,后续再改进。 2. 与企业职位要求符合度低 与进入面试的学生交谈,主要了解一下课题、自己做的内容,以及与公司职位相关的能力准备。交谈中,发现很多同学对符合职位的特点不能有效突出,从课题项目,转向企业工程化的要求也准备不足。以下是一些问题记录: 课题目的描述不清。一些同学对自己课题的背景、目的、意义描述不清楚,只知道是老师让做的,就去做了。其实硕士期间纯粹研究课题时间只有1年多(2年硕士更少),都要研究出实用东西不太可能,但至少要对自己做的事情有一个系统认识。成人学习过程,只有知道“为什么”,才能学得明白。 课题中自己负责的事情描述不具体。简历中描述的课题常规都很大,不大可能是一个人完成。那就有分模块,模块之间有接口、有通信协议什么的。自己做的这一块,起什么作用,上下游都是干啥的,等等。如果自圆其说都办不到,后续工作任务也会存在问题。 不能突出匹配企业职位的要求。以软件工程师为例,简历上写熟悉面向对象、精通C++,只能说出多态、继承几个名词,用过vector、string;学习C和C++除了谭老的书,就很少自己看其他的;想从事软件工程师,连“新手圣经”代码大全没有听说过。在面试的20多人中,没有一个人拿着笔记本来演示他写的程序,我们都是干说。 对比较适合的人,我都建议他们先看看代码大全、设计模式,不管是否来我们公司。其实,一个真正对某件事情感兴趣的同学,他会主动去找资源,深入理解,不会等到应聘的时候再抱佛脚,找借口。 3. 招聘是体力活 外出前就有些感冒,招聘过程中,拿带子断掉的易拉宝宣传盒子,提数斤重的简历试题,在酒店昏暗灯光中阅卷,坐在椅子中一天且不停地说话,做5小时高铁。。。最后感觉都是机械式的动作,实在是体力活,感冒在武汉有加重倾向,回到深圳后,在草窝中睡了一天,第2天就好了一半。 离开武汉5年多了,本次去武汉招聘,趁着晚上休息时刻,去拜访老师和室友。好久不去,武汉修了环城路,打车都找不到地方,只能到附近的金三利酒店,再重温上学的路。在老师家品尝了招牌的红烧武昌鱼,木耳鸡翅膀,见识老师几十年的工作成果奖励。去室友家,他家公子见到生人就不停的哭,呵呵。回到酒店想一想,时间不在了,记忆模糊了,唯有文字记录之。 节后,我们还要继续后续的校园招聘。(北京、哈尔滨校园招聘记录) 本篇文章为转载内容。原文链接:https://blog.csdn.net/zhouyulu/article/details/8033464。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2024-02-02 13:16:24
525
转载
转载文章
...互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 Java的特点:1、面向对象;它对对象中的类、对象、继承、封装、多态、接口、包等均有很好支持。2、平台无关性;在引入虚拟机之后,Java语言在不同的平台上运行不需要重新编译。3、简单性。4、解释执行;程序在Java平台运行时会被编译成字节码文件,然后可以在有Java环境的操作系统上运行。5、支持多线程,并提供多线程之间的同步机制;6、分布式;7、健壮性;8、高性能;9、安全性。 什么是Java语言 简单地说,Java 是由 Sun Microsystems 公司于 1995 年推出的一门面向对象程序设计语言。2010 年 Oracle 公司收购 Sun Microsystems,之后由 Oracle 公司负责 Java 的维护和版本升级。 其实,Java 还是一个平台。Java 平台由 Java 虚拟机(Java Virtual Machine,JVM)和 Java 应用编程接口(Application Programming Interface,API)构成。Java 应用编程接口为此提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个 Java 平台之后,Java 应用程序就可运行。 Java 平台已经嵌入了几乎所有的操作系统。这样 Java 程序只编译一次,就可以在各种系统中运行。Java 应用编程接口已经从 1.1x 版本发展到 1.2 版本。 Java语言的特点 Java 语言的风格很像 C 语言和 C++ 语言,是一种纯粹的面向对象语言,它继承了 C++ 语言面向对象的技术核心,但是拋弃了 C++ 的一些缺点,比如说容易引起错误的指针以及多继承等,同时也增加了垃圾回收机制,释放掉不被使用的内存空间,解决了管理内存空间的烦恼。 Java 语言是一种分布式的面向对象语言,具有面向对象、平台无关性、简单性、解释执行、多线程、安全性等很多特点,下面针对这些特点进行逐一介绍。 1. 面向对象 Java 是一种面向对象的语言,它对对象中的类、对象、继承、封装、多态、接口、包等均有很好的支持。为了简单起见,Java 只支持类之间的单继承,但是可以使用接口来实现多继承。使用 Java 语言开发程序,需要采用面向对象的思想设计程序和编写代码。 2. 平台无关性 平台无关性的具体表现在于,Java 是“一次编写,到处运行(Write Once,Run any Where)”的语言,因此采用 Java 语言编写的程序具有很好的可移植性,而保证这一点的正是 Java 的虚拟机机制。在引入虚拟机之后,Java 语言在不同的平台上运行不需要重新编译。 Java 语言使用 Java 虚拟机机制屏蔽了具体平台的相关信息,使得 Java 语言编译的程序只需生成虚拟机上的目标代码,就可以在多种平台上不加修改地运行。 3. 简单性 Java 语言的语法与 C 语言和 C++ 语言很相近,使得很多程序员学起来很容易。对 Java 来说,它舍弃了很多 C++ 中难以理解的特性,如操作符的重载和多继承等,而且 Java 语言不使用指针,加入了垃圾回收机制,解决了程序员需要管理内存的问题,使编程变得更加简单。 4. 解释执行 Java 程序在 Java 平台运行时会被编译成字节码文件,然后可以在有 Java 环境的操作系统上运行。在运行文件时,Java 的解释器对这些字节码进行解释执行,执行过程中需要加入的类在连接阶段被载入到运行环境中。 5. 多线程 Java 语言是多线程的,这也是 Java 语言的一大特性,它必须由 Thread 类和它的子类来创建。Java 支持多个线程同时执行,并提供多线程之间的同步机制。任何一个线程都有自己的 run() 方法,要执行的方法就写在 run() 方法体内。 6. 分布式 Java 语言支持 Internet 应用的开发,在 Java 的基本应用编程接口中就有一个网络应用编程接口,它提供了网络应用编程的类库,包括 URL、URLConnection、Socket 等。Java 的 RIM 机制也是开发分布式应用的重要手段。 7. 健壮性 Java 的强类型机制、异常处理、垃圾回收机制等都是 Java 健壮性的重要保证。对指针的丢弃是 Java 的一大进步。另外,Java 的异常机制也是健壮性的一大体现。 8. 高性能 Java 的高性能主要是相对其他高级脚本语言来说的,随着 JIT(Just in Time)的发展,Java 的运行速度也越来越高。 9. 安全性 Java 通常被用在网络环境中,为此,Java 提供了一个安全机制以防止恶意代码的攻击。除了 Java 语言具有许多的安全特性以外,Java 还对通过网络下载的类增加一个安全防范机制,分配不同的名字空间以防替代本地的同名类,并包含安全管理机制。 Java 语言的众多特性使其在众多的编程语言中占有较大的市场份额,Java 语言对对象的支持和强大的 API 使得编程工作变得更加容易和快捷,大大降低了程序的开发成本。Java 的“一次编写,到处执行”正是它吸引众多商家和编程人员的一大优势。 扩展知识: 按应用范围,Java 可分为 3 个体系,即 Java SE、Java EE 和 Java ME。下面简单介绍这 3 个体系。 1. Java SE Java SE(Java Platform Standard Edition,Java 平台标准版)以前称为 J2SE,它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为 Java EE 提供基础,如 Java 语言基础、JDBC 操作、I/O 操作、网络通信以及多线程等技术。图 1 所示为 Java SE 的体系结构。 本篇文章为转载内容。原文链接:https://blog.csdn.net/m0_73892801/article/details/129181633。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-03-25 09:18:50
85
转载
Apache Atlas
...息监听和元数据捕获。文中提到可以通过 Kafka 控制台生产者工具测试 Atlas 与 Kafka 的连接情况,例如使用 kafka-console-producer.sh 命令检查是否能正常发送消息到指定主题,以此验证 Atlas 和 Kafka 的通信状态。
2025-04-03 16:11:35
61
醉卧沙场
转载文章
...互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 All the charts, single package It’s easy with amCharts 5 – all chart types come in a single, easy to understand package! No need to figure out product line up – just get amCharts 5 for everything. And since it was designed to work with modern web dev toolkits like React, Angular, Vue it will just fall into place, right out of the box. X/Y Line & Smoothed line Area Column & Bar Scatter & Bubble Candlestick & OHLC Step (incl. w/ no-riser) Floating & Gantt Waterfall Error Stacked (regular or 100%) Heatmap … and any combination of the above Percent Pie & Donut Nested donut Funnel Pyramid Pictorial Geo maps Map chart Geo heat map Map combined with charts Maps is an add-on and requires separate license. Other Sankey diagram Chord, Chord directed, and Chord non-ribbon diagrams Pack Treemap Tree Sunburst Partition Force-directed tree Radar & Polar Word cloud Venn diagram Efficiency built-in Canvas rendering amCharts 5 uses browser’s Canvas API which in most cases is way faster than SVG. Less moving parts in the DOM tree, faster rendering. Layering Common element groups are isolated into separate independent canvases, so that heavily updated sections do not trigger expensive repaints in places that do not change. Fast data processing Data processing in amCharts 5 is designed to be as efficient as possible. Incremental updates, lack of repetitive aggregations, and lightweight data object use makes data processing fast and very memory-efficient. Faster dashboards amCharts 5 is capable of running scores of charts on the same page, without crippling the browser, due to its lightweight approach to data parsing and rendering. Tiny binaries We made amCharts 5 really small – the core functionality compiles to a file of only around 400KB. Each niche functionality is separated into files, so you load only what you really need. Users will surely appreciate faster load times. Better tree-shaking We also designed amCharts 5 to be extremely tree-shakable. If you are using Webpack or similar packager, only code that is really needed will be included into your final application. The most advanced chart package Classics with some new twists XY charts are now so powerful and flexible, you can plot any data on them. Number, date, duration, or category axes are supported, in all directions. Pie charts are now fully nestable, with support for custom start and end angles, to create half circles. New geo maps Our maps use GeoJSON format. Being open and widely accepted standard it opens up a lot of possibilities and sources for ready-made and custom maps. Furthermore, maps are now very flexible, with multi-series support, configurable down to the nut and bolt. (Maps is and add-on to amCharts 5: Charts which requires separate license) More about amCharts 5: Maps Pictorials Create multi-layer, multi-series pictorial charts. Any SVG path can be used as a shape for your chart. Sankey Diagrams Stunning flow diagrams, in horizontal and vertical. With draggable, fully configurable nodes. Enhanced radar charts With stacked column, bands, axes, and other dramatic enhancements, radar charts are now way more useful. Treemaps Completely zoomable, multi-level, highly configurable. Heatmaps Automatically build heat-maps, with custom axes, color ranges, and awesome new interactive Heat Legend. Create heatmaps using colors, or point size or both. Universal and flexible heat rules allow attaching any value in data to any property or properties on any element. Chord diagrams Visualize your 2-way relational data in a neat circular Chord diagrams. We do have different variations of the classic diagram: Chord, Chord directed, and Chord non-ribbon. True funnel charts amCharts 5 offers true Funnel charts the way they were meant to be. Slice’s area size represents the value, so each step’s influence on overall volume reduction is more prominent than with basic funnels. Trapezoid form can also be configured to further emphasize reduction. Complete it with other visual elements, like fully configurable slice lines, multiple series support, togglable legends, and many many more options. Customizable beauty built-in Powerful theme engine amCharts 5 comes with a bunch of beautiful themes as well as a super flexible theme engine, which you can use. We devised a CSS-like rule-based theme targeting system in themes. Using, creating, customizing themes or standalone rules has never been so easy. The new system allows applying defaults to elements based on their type, features, or position in a virtual element tree. Fresh new look Default looks designed to look fresh, like something out of tomorrow. Carefully selected color schemes and default settings were specifically chosen to make the charts stand out. Silk-smooth animations Every setting – colors, positions, sizes, opacity, and many more – is animatable to ensure smooth transitions. No choppy, stepped animations – everything is fluid, including zoom and toggling of series and other items. Flexibility Element templates Most elements are created using templates: a collection of default settings, events, and adapters. Changing template automatically propagates changes to actual elements, making it easy to do batch updates. Everything’s configurable Numerous configuration options allow inventive uses, bordering on new chart types. Angles, colors, positions, radii, a-n-y-t-h-i-n-g can be set to bend classic and new chart types exactly the way you need them. Element states Easily change how an element looks like under different circumstances, e.g. on some interaction, hover, click, or related to data (eg. column look if a value is down). The engine will automatically apply the required properties as needed, animating between old and new values smoothly. Create and apply custom states via the API. Multi-type multi-axis support Add any number of axes of any type. Create overlaid comparison of different time scales. Use any mix of dimensional values: numbers, dates, categories, or duration. Adapters “Adapters” functionality allows plugging in custom code to dynamically override just about any setting or data value. Text formatting All text labels – tooltips, axis labels, titles, etc. – now support rich text formatting options, like changing colors, font weight, or applying just about any styling option from the CSS arsenal. In addition to formatting support, labels can now contain in-line placeholders for real data, with the ability to apply custom formatting to values. Accessibility & Interactivity Accessibility Accessibility was riding shotgun when amCharts 5 was being developed. All interactive elements are TAB-selectable, with customizable roles, order, and screen-reader texts. Everything that can be moved by touch or mouse, can be moved by keyboard. Everything that can be clicked or toggled, can be interacted with with keyboard, too. Touch support Charts have been designed to work with touch devices out-of-the-box. They will work not only on phones or tablets, but also touch capable computers. Under the hood Built with TypeScript Supports strong type and error checking in TypeScript applications. Enjoy code completion, error checking and dynamic help popups in major IDEs. Full support for TypeScript and ES6 modules. 100% for JavaScript Can be fully used in any vanilla JavaScript application. amCharts 5 does not use or rely on globals, external frameworks or 3rd party libraries. Universal rendering engine Can be used to build dynamic, interactive Canvas-based interfaces and applications. Add various elements to the screen, make them interactive, with a few lines of code. Make them clickable, draggable, hoverable, using built-in interactivity functionality. Our universal layout engine will place, size and arrange elements according to set rules. 本篇文章为转载内容。原文链接:https://blog.csdn.net/john_dwh/article/details/127460821。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-09-17 18:18:34
352
转载
转载文章
...互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 联通智慧足迹技术 本项目由联通智慧足迹投递并参与“数据猿年度金猿策划活动——2021大数据产业创新技术突破榜单及奖项”评选。 数据智能产业创新服务媒体 ——聚焦数智 · 改变商业 中国联通智慧足迹开发的SSNG多源数据处理平台,是完全自研的新一代面向行为集成的位置数据处理系统。平台沉淀海量信令处理过程中的长期经验,着力解决影响数据输出质量的核心堵点,可兼容类似信令的多种LBS数据源接入并实现自动化、标准化输出数据结果。 技术说明 SSNG多源数据处理平台技术创新部分包括: 行为矩阵:将离散的驻留信息,转化为用户的时空矩阵,通过机器学习模式识别,提取出用户的LBS行为特征。 行为集成:将用户的行为矩阵,结合搜集沉淀的土地利用&地物POI数据,为用户的驻留、出行信息赋予具体的目的,便于后续的场景化分析。 人车匹配:结合车联网LBS数据,将轨迹重合度高的“人-车”用户对,通过轨迹伴随算法识别出来,可用于判断用户的车辆保有情况。 路径拟合:解决信令数据定位不连续和受限基站布设密度等问题,引入路网拓扑数据,将用户出行链还原至真实道路上,并确定流向及关键转折点,以便于判断出行方式。 出行洞察:利用信令数据、基站数据,匹配地铁网络、高铁网络,通过机器学习算法,判定用户出行时使用的出行方式。 基于SSNG多源数据处理平台,可实现的技术突破包括: 1)全国长时序人口流动监测技术 针对运营商信令数据以及spark分布式计算平台的特点,独创了处理运营商信令数据的双层计算框架,填补了分布式机器学习方法处理运营商信令数据的空白,实现了大规模高效治理运营商大数据的愿景;研发了人口流动与现代大数据技术相结合的宏观监测仿真模型。 基于以上技术构建了就业、交通、疫情、春运等一系列场景模型,并开发了响应决策平台,实现了对我国人口就业、流动及疫情影响的全域实时监测。 2)全国长时序人口流动预测技术 即人口流动的大尺度OD预测技术,研发了人口跨区域流动OD预测模型,解决了信令大数据在量化模拟大尺度人口流动中的技术难题,形成了对全国人口流动在日、周、月不同时间段和社区、乡镇、县市不同地理尺度进行预测的先进技术,实现了2020年新冠疫情后全国返城返岗和2021年全国春节期间人口流动的高精度预测。 3)实时人口监测 实时人口监测是通过对用户手机信令进行实时处理、计算和分析,得出指定区域的实时人口数量、特征和迁徙情况。包括区域人口密度、人口数量、人口结构、人口来源、人口画像、人口迁徙、职住分析、人口预测等信息。 4)超强数据处理及AI能力 引入Bitmap大数据处理算法及Pilosa数据库集群,采用实时流式计算,集成Kafka、redis、RabbitMQ等分布式大数据处理组件,搭建自有信令大数据处理平台,使用百亿计算go-kite架构,实现毫秒级响应,实时批量处理数据达500000条 /秒,每天可处理1000亿条数据。集成AI分析能力(A/B轨),有效避免了运营商数据采集及传输过程中的时延及中断情况,大幅提高数据结果的实时性。 已获专利情况: 专利名称 专利号 出行统计方法、装置、计算机设备和可读存储介质 ZL 2020 1 0908424.3 信令数据匹配方法、装置及电子设备 ZL 2019 1 1298869.8 轨道交通用户识别方法和装置 ZL 2019 1 0755903.3 公共聚集事件识别方法、装置、计算机设备及存储介质 ZL 2020 1 1191917.6 广域高铁基站识别方法、装置、服务器及存储介质 ZL 2020 1 1325543.2 相关荣誉: 2021地理信息科技进步奖一等奖、中国测绘学会科技进步奖特等奖、2021数博会领先科技成果奖、兼容系统创新应用大赛大数据专项赛优秀奖。 开发团队 ·带队负责人:陶周天 公司CTO,北京大学理学学士。长期任职于微软等世界500强企业,曾任上市公司优炫软件VP,具备丰富的IT架构、数据安全、数据分析建模、机器学习、项目管理经验。牵头组织突破多个技术难题(人地匹配、人车匹配、室内基站优化、行为集成AI等),研发一系列技术专利。 ·团队其他重要成员:刘祖军 高级算法工程师,美国爱荷华大学计算机科学本硕,曾任职于美国俄亥俄州立大学研究院。 ·隶属机构:智慧足迹 智慧足迹数据科技有限公司是中国联通控股,京东科技参股的专业大数据及智能科技公司。公司依托中国联通卓越的数据资源和5G能力,京东科技强大的人工智能、物联网等技术和“产业X科技”能力,聚焦“人口+”大数据,连接人-物-企,成为全域数据智能科技领先服务商。 公司以P·A·Dt为核心能力,面向数字政府、智慧城市、企业数字化转型广大市场主体,专注经济治理、社会治理和企业数字化服务,构建“人口+”七大多源数据主题库,提供“人口+” 就业、经济、消费、民生、城市、企业等大数据产品平台,服务支撑国家治理现代化和国家战略,推动经济社会发展。 目前,公司已服务国家二十多个部委及众多省市政府、300+城市规划、知名企业和高校等智库、国有及股份制银行等数百家头部客户,已建成全球最强大的手机信令处理平台,是中国就业、城规、统计等领域大数据领先服务商。 相关评价 新一代SSNG多源大数据处理平台,提升了手机信令数据在空间数据计算的精度,信令处理结果对室内场景更具敏锐性,在区域范围的职住人群空间分布更加接近实际情况。 ——某央企大数据部技术负责人 新一代SSNG多源大数据处理平台,可处理实时及历史信令数据,应对不同客户应用场景。并且根据长时间序列历史数据实现人口预测,为提高数据精度可对接室内基站数据,从而提供更加准确的人员定位。 ——某企业政府事业部总监 提示:了解更多相关内容,点击文末左下角“阅读原文”链接可直达该机构官网。 《2021企业数智化转型升级服务全景图/产业图谱1.0版》 《2021中国数据智能产业图谱3.0升级版》 《2021中国企业数智化转型升级发展研究报告》 《2021中国数据智能产业发展研究报告》 ❷ 创新服务企业榜 ❸ 创新服务产品榜 ❸ 最具投资价值榜 ❺ 创新技术突破榜 ☆条漫:《看过大佬们发的朋友圈之后,我相信:明天会更好!》 联系数据猿 北京区负责人:Summer 电话:18500447861(微信) 邮箱:summer@datayuan.cn 全国区负责人:Yaphet 电话:18600591561(微信) 邮箱:yaphet@datayuan.cn 本篇文章为转载内容。原文链接:https://blog.csdn.net/YMPzUELX3AIAp7Q/article/details/122314407。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-07-01 09:57:01
344
转载
Hadoop
...时决策。在文章的上下文中,实时数据处理与HBase的集成被提到,说明了HBase如何与其他系统(如流处理系统)结合,以实现数据的即时分析和决策支持,体现了大数据技术在现代业务运营中的时效性需求。
2024-08-10 15:45:14
36
柳暗花明又一村
SpringBoot
...g Boot 的上下文中,实现 CSP 可以帮助保护应用程序免受潜在的攻击,确保只有来自信任源的资源被加载和执行,从而增强应用的整体安全性。在配置 CSP 时,开发者需要权衡性能、用户体验与安全性的关系,合理定义允许的资源来源,以达到最优的安全防护效果。
2024-09-12 16:01:18
86
寂静森林
转载文章
...互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 1.简要说一下CSS的元素分类 块级元素:div,p,h1,form,ul,li; 行内元素 : span,a,label,input,img,strong,em; <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><em>强调文本</em><br><strong>加粗文本</strong><br><dfn>定义项目</dfn><br><code>一段电脑代码</code><br><samp>计算机样本</samp><br><kbd>键盘输入</kbd><br><var>变量</var></body></html 2、HTML <audio> 标签 <audio> 标签是 HTML5 提供的用来播放音频文件的。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><audio controls><source src="/statics/demosource/horse.ogg" ><source src="/statics/demosource/horse.mp3" >您的浏览器不支持 audio 元素。</audio></body></html> 3、HTML <area> 标签 <area> 标签可以在图像上划分区域,这些区域是可以点击的,并且对应不同的操作。 <!DOCTYPE html><html><head><meta charset="utf-8"><title>W3Cschool(w3cschool.cn)</title></head><body><p>点击太阳或其他行星,注意变化:</p><img src="/statics/images/course/planets.gif" width="145" height="126" alt="Planets" usemap="planetmap"><map name="planetmap"><area shape="rect" coords="0,0,82,126" target="_blank" alt="Sun" href="/statics/images/course/sun.gif"><area shape="circle" coords="90,58,3" target="_blank" alt="Mercury" href="/statics/images/course/merglobe.gif"><area shape="circle" coords="124,58,8" target="_blank" alt="Venus" href="/statics/images/course/venglobe.gif"></map></body></html> 4、HTML <select> 标签定义及使用说明 <select> 元素用来创建下拉列表。 <!DOCTYPE html><html><head><meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><select><option value="volvo" style="display:none">Volvo</option><option value="saab">Saab</option><option value="opel">Opel</option><option value="audi">Audi</option></select></body></html> 5、HTML <style> 标签 <style> 标签包含了 HTML 文档的样式详细,在默认情况下,在该元素内写入的样式指令将被认为是CSS。 <!DOCTYPE html><html><head><meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title><style type="text/css">h1 {color:red;}p {color:blue;}</style></head><body><h1>这是一个标题</h1><p>这是一个段落。</p></body></html> 7、HTML <sub> 标签 包含在 <sub> 标签和其结束标签 </sub> 中的内容会以正常内容的一半的高度显示在下方,而且通常较小,请参见下述例子: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool教程(w3cschool.cn)</title> </head><body><p>这个文本包含 <sub>下标</sub>文本。</p><p>这个文本包含 <sup>上标</sup> 文本。</p></body></html> 8、HTML <summary> 标签 <summary> 标签元素作为一个<datails>元素的标题,该标题可以包含详细的信息,但是默认情况下不显示,需要单击才能显示详细信息,请参考下述示 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><details><summary>Copyright 1999-2011.</summary><p> - by Refsnes Data. All Rights Reserved.</p><p>All content and graphics on this web site are the property of the company Refsnes Data.</p></details><p><b>注意:</b>目前只有 Chrome 和 Safari 6 支持 summary 标签。</p></body></html> 9、HTML <table> 标签 <table> 标签用来定义 HTML 表格,一个简单的 HTML 表格应该包括两行两列,如下述示例所示: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool教程(w3cschool.cn)</title> </head><body><table border="1"><tr><th>Month</th><th>Savings</th></tr><tr><td>January</td><td>$100</td></tr><tr><td>February</td><td>$80</td></tr></table></body></html> 10、HTML <textarea> 标签 <textarea> 标签表示多行纯文本编辑控件,用户可在其文本区域中写入文本,请参考下述示例: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool 在线教程(w3cschool.cn)</title> </head><body><textarea rows="10" cols="30">我是一个文本框。</textarea></body></html> 11、HTML <tt> 标签 - HTML5 不支持 <tt> 标签用来改变字体样式,使标签中的文本显示为打字机文本,请参考下述例子: <!DOCTYPE html><html><body><p>This text is normal.</p><p><tt>This text is teletype text.</tt></p></body></html> 12、HTML <u> 标签 <u> 标签可以用来对标签内的文本实现下划线样式,请参考下述示例: <!DOCTYPE html><html><body><p>This is a <u>parragraph</u>.</p></body></html> 13、HTML <ul> 标签 <ul> 标签表示HTML页面中项目的无序列表,一般会以项目符号列表呈现,请参考下述例子: <!DOCTYPE html><html><head><meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><h4>无序列表:</h4><ul><li>咖啡</li><li>茶</li><li>牛奶</li></ul></body></html> 14、HTML <video> 标签 <video> 标签可以将视频内容嵌入到HTML文档中,请参考下述示例: <!DOCTYPE html><html><body><video width="320" height="240" controls><source src="/statics/demosource/movie.mp4" type="video/mp4"><source src="/statics/demosource/movie.ogg" type="video/ogg">您的浏览器不支持 HTML5 video 标签。</video></body></html> 15、HTML <ol> 标签 <ol> 标签在 HTML 中表示有序列表,是 ordered lists 的缩写。您可以自定义有序列表的初始序号,请参考下面的实例: <!DOCTYPE html><html><head><meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><ol><li>咖啡</li><li>茶</li><li>牛奶</li></ol><ol start="50"><li>咖啡</li><li>茶</li><li>牛奶</li></ol></body></html> 16、HTML <noframes> 标签HTML5不支持该标签 <noframes> 标签用于支持不支持 <frame> 元素的浏览器,请参考下面的示例: <html><head><meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><frameset cols="25%,50%,25%"><frame src="/statics/demosource/frame_a.htm"><frame src="/statics/demosource/frame_b.htm"><frame src="/statics/demosource/frame_c.htm"><noframes>抱歉,您的浏览器不支持 frame 属性!</noframes></frameset></html> 17、HTML <hr> 标签 <hr> 标签表示段落级元素之间的主题划分。例如,在下面的实例中我们对具有主题变化的内容使用了 <hr> 标签: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><h1>HTML</h1><p>HTML 是用于描述 web 页面的一种语言。</p><hr><h1>CSS</h1><p>CSS 定义如何显示 HTML 元素。</p></body></html> 18、HTML <h1> - <h6> 标签 <h1> - <h6> 标签用来定义 HTML 标题,表示了 HTML 网页中六个级别的标题。您可以通过下面的这个实例来看看每个级别的标题有什么区别: <!DOCTYPE html><html><head><meta charset="utf-8"><title>W3Cschool(w3cschool.cn)</title></head><body><h1>这是标题1</h1><h2>这是标题2</h2><h3>这是标题 3</h3><h4>这是标题 4</h4><h5>这是标题 5</h5><h6>这是标题 6</h6></body></html> 19、HTML <center> 标签 - HTML 5 不支持 <center> 标签控制文本的居中显示,不能在 HTML5 中使用。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><p>这是一些文本。</p><center>这个文本居中对齐。</center><p>这是一些文本</p></body></html> 20、HTML <button> 标签 <button> 标签用来设置 HTML 中的按钮。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><button type="button" onclick="alert('Hello world!')">Click Me!</button></body></html> 21、HTML <br> 标签 <br> 标签是空标签,可插入一个简单的换行符。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><p>使用br元素<br>在文本中<br>换行。</p></body></html> 22、HTML <dt> 标签 <dt> 标签只能够作为 <dl> 标签的一个子元素出现,常常后跟一个 <dd> 标签。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><dl><dt>咖啡</dt><dd>黑色的热饮</dd><dt>牛奶</dt><dd>白色的冷饮</dd></dl></body></html> 23、HTML <fieldset> 标签 <fieldset> 标签内的一组表单元素会在 WEB 浏览器中以特殊的方式显示,比如不同样式的边界、3D效果等。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><form><fieldset><legend>个人信息:</legend>姓名: <input type="text"><br>邮箱: <input type="text"><br>生日: <input type="text"></fieldset></form></body></html> 24、HTML <embed> 标签 <embed> 标签用来定义在页面中嵌入的内容,比如插件。比如,在下面的实例中我们嵌入了一个 flash 动画: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><embed src="/statics/demosource/helloworld.swf" tppabs="http://W3Cschool.com/tags/helloworld.swf"></body></html> 25、HTML <font> 标签 - HTML5 不支持 <font> 标签的使用示例如下所示,该标签已经过时,因此我们不建议您使用该标签。 <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><p><font size="3" color="red">这是一些文本!</font></p><p><font size="2" color="blue">这是一些文本!</font></p><p><font face="verdana" color="green">这是一些文本!</font></p></body></html> 26、HTML <label> 标签 <label> 标签是一种常见的表单控件,触发对应表单控件功能,让用户在使用表单的时候能够有更好的体验。参考下述的实例: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3Cschool(w3cschool.cn)</title> </head><body><p>点击其中一个文本标签选中选项:</p><form action="/statics/demosource/demo-form.php"><label for="male">Male</label><input type="radio" name="sex" id="male" value="male"><br><label for="female">Female</label><input type="radio" name="sex" id="female" value="female"><br><br><input type="submit" value="提交"></form></body></html> 记录一些重要标签! 本篇文章为转载内容。原文链接:https://blog.csdn.net/chehec2010/article/details/85060460。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-10-11 23:43:21
297
转载
Logstash
...理复杂的数据流。在本文中,Logstash 用于从服务器日志文件中提取并解析数据,如访问时间、用户 ID 和请求 URL 等信息。 Elasticsearch , Elasticsearch 是一个基于 Lucene 构建的开源分布式搜索引擎,具有强大的全文搜索功能,支持结构化搜索、数值搜索及地理空间搜索等多种搜索类型。它采用倒排索引机制,可自动对数据进行索引,从而加快查询速度。在本文中,Elasticsearch 用于存储和检索通过 Logstash 处理后的日志数据,帮助用户快速分析和定位问题。 Grok过滤器 , Grok 是 Logstash 中的一种过滤插件,主要用于解析非结构化日志数据,将其转换成结构化的数据格式。Grok 提供了一系列预定义的模式,如 COMBINEDAPACHELOG,可以根据这些模式对日志内容进行匹配和解析。在本文中,Grok 过滤器用于从 Nginx 访问日志文件中提取关键字段,如访问时间、用户 ID 和请求 URL 等,从而便于后续的数据处理和分析。
2024-12-17 15:55:35
42
追梦人
转载文章
...互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 你知道程序员、高级程序员、架构师、技术经理、技术总监之间有什么区别吗?他们的工作职责又是什么? 小编带大家了解一下,不同等级的程序员之间到底有什么差别。 程序员 程序员,英文名coder/programmer,大家常自嘲叫码农的阶段。这个角色职责是把需求或产品实现为用户可用的软件产品。 此职位为执行级别。另外因为经验较少,一般需要求助别人,或与别人一起完(ban)成(zhuan)一个任务。 此阶段大概要经历3年,程序员的职责如下: 1、对项目经理负责,负责软件项目的详细设计、编码和内部测试的组织实施。 2、协助项目经理和相关人员同客户进行沟通,保持良好的客户关系。 3、参与需求调研、项目可行性分析、技术可行性分析和需求分析。 4、熟悉并熟练掌握交付软件部开发的软件项目的相关软件技术。 5、负责向项目经理及时反馈软件开发中的情况,并根据实际情况提出改进建议。 6、负责对业务领域内的技术发展动态进行分析研究。 高级程序员 高级程序员学名,工程师。 到了这个level,英文名可改叫做 engineer 或 developer。此时你的功力开始增强,这与你平时的积累努力是分不开的,祝贺你~ 此时的你不仅可以完成任务,开始注重代码的质量,能够写出工业级的代码。你的经验可胜任模块级的系统设计,承担完成较为复杂的技术,能有效的自我管理,有帮助别人快速解决问题(trouble shooting)的能力。 此阶段你需要经历到7、8年左右的体验,中间要经历一段深刻自我历练的过程。 有时给人致命一击其实是心里的小蟊贼。一般人在5年前后遇到一个门槛,碰到天花板+彷徨期,或者你打心眼里不在喜欢编程,可尝试转为其它角色,如产品经理,售前售后支持等岗位,也不失为好选择。 当我们熬过这段儿,就会“山随平野尽,江入大荒流“,渐入佳境矣。 高级程序员定义软件功能、做开发计划推进和管理。可以带几个个帮手把产品规划的功能实现,你是团队中的”大手“,遇到难题也是你亲自攻艰克难。 所以,一个高级程序员,他的职责很清晰: 1、负责产品核心复杂功能的方案设计、编码实现 2、负责疑难BUG分析诊断、攻关解决 架构师 到了架构师级别,想必你已经学会降龙十八掌,可登堂入世,成为一位准(lao)专(you)家(tiao)。 我们大喊声:“单打独斗,老衲谁也不惧!“,遂开始领导一众技术高手,指点武功,来设计和完成一个系统,大多是分布式,高并发的系统架构平台。 架构师的任务是为公司产品的业务问题提供高质量技术解决方案,主要着眼于系统的"技术实现" 。 架构师的主要分类: 可能每条产品线都设置了架构师,也可能多条生产品线的的后端是由一个架构师设计的平台提供,所以架构师也是有所不同的,其分类如下: 软件架构师 信息架构师 网站架构师 其主要职责如下: 1、需求分析:“知彼”有时比“知已”还重要。管理市场,产品等的需求,确立关键需求。坚持技术上的优秀与需求的愿景统一,提升技术负债意识,提供技术选项,风险预判,工期等解决方案。 2、架构设计:在产品功能中抽取中非功能的需求,由关键需求变成概念型架构。列出功能树,分层治之,如用户界面层、系统交互层,数据管理层。达成高扩展,高可用,高性能,高安全,易运维,易部署,易接入等能力。 3、功能设计与实现:对架构设计的底层代码级别实现。如公共核心类,接口实现,应用发现规则、接口变更等。 技术经理 人生就是不断上升的过程,你已经到达经理的层次了。如今的你,需要不断提高领导力,需要定期召开团队会议讨论问题。 首先我们要更加自信,在工作中显示自己的功力,给讲话增添力量。如:“本次项目虽然有很大的困难,我们也需苦战到底。当然示先垂范,身先士卒,方能成功!” 技术经理有时候也可能叫系统分析员,一些小公司可能会整个公司或者部门有一个技术经理。技术经理承担的角色主要是系统分析、架构搭建、系统构建、代 码走查等工作,如果说项目经理是总统,那么技术经理就是总理。当然不是所有公司都是这样的,有些公司项目经理是不管技术团队的,只做需求、进度和同客户沟 通,那么这个时候的项目经理就好像工厂里的跟单人员了,这种情况在外包公司比较多。对于技术经理来说,着重于技术方面,你需要知道某种功能用哪些技术合 适,需要知道某项功能需要多长的开发时间等。同时,技术经理也应该承担提高团队整体技术水平的工作。 你需要和大家站在一起,因为人们也都有解决问题的能力,更需要有以下的能力与责任: 1、任务管理:开发工作量评估、定立开发流程、分配和追踪开发任务 2、质量管理:代码review、开发风险判断/报告/协调解决 3、效率提升:代码底层研发和培训、最佳代码实践规范总结与推广、自动化生产工具、自动化部署工具 4、技术能力提升:招聘面试、试题主拟、新人指导、项目复盘与改进 技术总监 如果一个研发团队超过20人,有多条产品线或业务量很大,这时已经有多个技术经理在负责每个业务,这时需要一位技术总监。 主要职责: 1、组建平台研发部,与架构师共建软件公共平台,方便各条产品业务线研发。 2、通过技术平台、通过高一层的职权,管理和协调公司各个部门与本部门各条线。现在每个产品线都应该有合格的技术经理和高级程序员。 结语:我们相信,每个人都能成为IT大神。现在开始,找个师兄带你入门,让你的学习之路不再迷茫。 这里推荐我们的前端学习交流圈:784783012,里面都是学习前端的从最基础的HTML+CSS+JS【炫酷特效,游戏,插件封装,设计模式】到移动端HTML5的项目实战的学习资料都有整理,送给每一位前端小伙伴。 最新技术,与企业需求同步。好友都在里面学习交流,每天都会有大牛定时讲解前端技术! 点击:前端技术分享 本篇文章为转载内容。原文链接:https://blog.csdn.net/webDk/article/details/88917912。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2024-05-10 13:13:48
756
转载
转载文章
...互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 概述 分布式文件系统 适合:一次写入,多次读出,且不支持修改 文件块大小 128M HDFS的shell操作(重点) 基本语法 hadoop fs 具体命令或者hdfs dfs 具体命名 命令大全 Usage: hadoop fs [generic options][-appendToFile <localsrc> ... <dst>] 追加[-cat [-ignoreCrc] <src> ...] 查看[-checksum <src> ...][-chgrp [-R] GROUP PATH...] 改组[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...] 改权限[-chown [-R] [OWNER][:[GROUP]] PATH...] 改所有者[-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] <localsrc> ... <dst>] 上传[-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] 下载[-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...][-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>] 复制[-createSnapshot <snapshotDir> [<snapshotName>]][-deleteSnapshot <snapshotDir> <snapshotName>][-df [-h] [<path> ...]][-du [-s] [-h] [-v] [-x] <path> ...] 统计磁盘文件大小[-expunge][-find <path> ... <expression> ...][-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] 下载[-getfacl [-R] <path>][-getfattr [-R] {-n name | -d} [-e en] <path>][-getmerge [-nl] [-skip-empty-file] <src> <localdst>][-head <file>][-help [cmd ...]][-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]] 查看列表[-mkdir [-p] <path> ...] 创建[-moveFromLocal <localsrc> ... <dst>] 剪切到hdfs[-moveToLocal <src> <localdst>] 剪切到本地[-mv <src> ... <dst>] 移动[-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>] 上传[-renameSnapshot <snapshotDir> <oldName> <newName>][-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...] 删除[-rmdir [--ignore-fail-on-non-empty] <dir> ...][-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]][-setfattr {-n name [-v value] | -x name} <path>][-setrep [-R] [-w] <rep> <path> ...] 设置副本数[-stat [format] <path> ...][-tail [-f] <file>][-test -[defsz] <path>][-text [-ignoreCrc] <src> ...][-touch [-a] [-m] [-t TIMESTAMP ] [-c] <path> ...][-touchz <path> ...][-truncate [-w] <length> <path> ...][-usage [cmd ...]]Generic options supported are:-conf <configuration file> specify an application configuration file-D <property=value> define a value for a given property-fs <file:///|hdfs://namenode:port> specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.-jt <local|resourcemanager:port> specify a ResourceManager-files <file1,...> specify a comma-separated list of files to be copied to the map reduce cluster-libjars <jar1,...> specify a comma-separated list of jar files to be included in the classpath-archives <archive1,...> specify a comma-separated list of archives to be unarchived on the compute machinesThe general command line syntax is:command [genericOptions] [commandOptions] 查看详细命令 hadoop fs -help 命令(如cat) 更改hdfs的权限 vi core-site.xml <property><name>hadoop.http.staticuser.user</name><value>root</value></property> HDFS客户端API操作 Windows环境配置 将Windows依赖放到文件夹, 配置环境变量,添加HADOOP_HOME ,编辑Path添加%HADOOP_HOME%/bin 拷贝hadoop.dll和winutils.exe到C:\Windows\System32 创建java项目 配置 编辑pom.xml <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.12.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.1.3</version></dependency></dependencies> 在src/main/resources中建立log4j2.xml 打印日志到控制台 <?xml version="1.0" encoding="UTF-8"?><Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="error"><AppenderRef ref="Console"/></Root></Loggers></Configuration> 编写代码 在/src/main/java/cn.zcx.hdfs创建TestHDFS类 public class TestHDFS {// 创建全局变量private FileSystem fs;private Configuration conf;private URI uri;private String user;// 从本地上传文件@Testpublic void testUpload() throws IOException {fs.copyFromLocalFile(false,true,new Path("F:\\Download\\使用前说明.txt"),new Path("/testhdfs"));}/ @Before 方法在@Test方法执行之前执行 /@Beforepublic void init() throws IOException, InterruptedException {uri = URI.create("hdfs://master:8020");conf = new Configuration();user = "root";fs = FileSystem.get(uri,conf,user);}/ @After方法在@Test方法结束后执行 /@Afterpublic void close() throws IOException {fs.close();}@Testpublic void testHDFS() throws IOException, InterruptedException {//1. 创建文件系统对象/URI uri = URI.create("hdfs://master:8020");Configuration conf = new Configuration();String user = "root";FileSystem fs = FileSystem.get(uri,conf,user);System.out.println("fs: " + fs);/// 2. 创建一个目录boolean b = fs.mkdirs(new Path("/testhdfs"));System.out.println(b);// 3. 关闭fs.close();} } 参数优先级 xxx-default.xml < xxx-site.xml < IDEA中resource中创建xxx-site.xml < 在代码中通过更改Configuration 参数 文件下载 @Testpublic void testDownload() throws IOException {fs.copyToLocalFile(false,new Path("/testhdfs/使用前说明.txt"),new Path("F:\\Download\\"),true);} 文件更改移动 //改名or移动(路径改变就可以)@Testpublic void testRename() throws IOException {boolean b = fs.rename(new Path("/testhdfs/使用前说明.txt"),new Path("/testhdfs/zcx.txt"));System.out.println(b);} 查看文件详细信息 // 查看文件详情@Testpublic void testListFiles() throws IOException {RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);//迭代操作while (listFiles.hasNext()){LocatedFileStatus fileStatus = listFiles.next();//获取文件详情System.out.println("文件路径:"+fileStatus.getPath());System.out.println("文件权限:"+fileStatus.getPermission());System.out.println("文件主人:"+fileStatus.getOwner());System.out.println("文件组:"+fileStatus.getGroup());System.out.println("文件大小:"+fileStatus.getLen());System.out.println("文件副本数:"+fileStatus.getReplication());System.out.println("文件块位置:"+ Arrays.toString(fileStatus.getBlockLocations()));System.out.println("===============================");} } 文件删除 第二参数,true递归删除 //文件删除@Testpublic void testDelete() throws IOException {boolean b = fs.delete(new Path("/testhdfs/"), true);System.out.println(b);} NN与2NN工作原理 本篇文章为转载内容。原文链接:https://blog.csdn.net/Python1One/article/details/108546050。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-12-05 22:55:20
278
转载
转载文章
...互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 Lubuntu 20.04 LTS 与之前的 LTS 版本有很大的不同。它旨在给你一个更完善的体验,而不仅仅是关注旧电脑。请关于 Lubuntu 20.04 的内容。https://linux.cn/article-12242-1.html作者:Dimitrios Savvopoulos译者:qfzy1233 Lubuntu 20.04 点评:第一个基于 LXQt 的长期支持版 我在 Lubuntu 20.04 发行前几天就已经开始使用它了。我通常使用 Arch 阵营中 Manjaro 和 Cinnamon 桌面,所以使用 Lubuntu 对我来说是一个愉快的改变。 以下是我在使用 Lubuntu 20.04.时的一些感受和注记。 再见 LXDE,你好 LXQt! 长期以来,Lubuntu 都依靠 LXDE 来提供轻量级的 Linux 体验。但现在,它使用的是 LXQt 桌面环境。 LXDE 是基于 GTK(GNOME 所使用的库),更具体地说是基于 2020 年的 GTK+ 2。由于对 GTK+ 3 不满意,LXDE 开发人员 Hong Jen Yee 决定将整个桌面移植到 Qt(KDE 所使用的库)。LXDE 的 Qt 移植版本和 Razor-qt 项目合并形成 LXQt。所以现在,LXDE 和 LXQt 作为单独的项目而共存。 既然 LXDE 开发者本身专注于 LXQt,那么 Lubuntu 坚持使用三年多前上一次稳定发布版的桌面环境 LXDE 是没有意义的。 因此,Lubuntu 18.04 是使用 LXDE 的最后一个版本。幸运的是,这是一个长期支持版本。Lubuntu 团队将提供支持直到 2021 年。 不仅适于老机器 随着在 2020 年“老机器”的定义发生了变化,Lubuntu 18.04 成为了最后一个 32 位版本。现在,即使是一台 10 年前的老机器也至少有 2G 的内存和一个双核 64 位处理器。 因此,Lubuntu 团队将不再设置最低的系统需求,也不再主要关注旧硬件。尽管 LXQt 仍然是一个轻量级的、经典而不失精致的、功能丰富的桌面环境。 在 Lubuntu 20.04 LTS 发布之前,Lubuntu 的第一个 LXQt 发行版是 18.10,开发人员经历了三个标准发行版来完善 LXQt 桌面,这是一个很好的开发策略。 不用常规的 Ubiquity,Lubuntu 20.04 使用的是 Calamares 安装程序 在新版本中使用了全新的 Calamares 安装程序,取代了其它 Ubuntu 官方版本使用的 Ubiquity 安装程序。 整个安装过程在大约能在 10 分钟内完成,比之前 Lubuntu 的版本稍微快一些。 由于镜像文件附带了预先安装的基本应用程序,所以你可以很快就可以完成系统的完全配置。 不要直接从 Lubuntu 18.04 升级到 Lubuntu 20.04 通常,你可以将 Ubuntu 从一个 LTS 版本升级到另一个 LTS 版本。但是 Lubuntu 团队建议不要从 Lubuntu 18.04 升级到 20.04。他们建议重新安装,这才是正确的。 Lubuntu 18.04 使用 LXDE 桌面,20.04 使用 LXQt。由于桌面环境的巨大变化,从 18.04 升级到 20.04 将导致系统崩溃。 更多的 KDE 和 Qt 应用程序 下面是在这个新版本中默认提供的一些应用程序,正如我们所看到的,并非所有应用程序都是轻量级的,而且大多数应用程序都是基于 Qt 的。 甚至使用的软件中心也是 KDE 的 Discover,而不是 Ubuntu 的 GNOME 软件中心。 ◈ Ark – 归档文件管理器◈ Bluedevil – 蓝牙连接管理◈ Discover 软件中心 – 包管理系统◈ FeatherPad – 文本编辑器◈ FireFox – 浏览器◈ K3b – CD/DVD 刻录器◈ Kcalc – 计算器◈ KDE 分区管理器 – 分区管理工具◈ LibreOffice – 办公套件(Qt 界面版本)◈ LXimage-Qt – 图片查看器及截图制作◈ Muon – 包管理器◈ Noblenote – 笔记工具◈ PCManFM-Qt – 文件管理器◈ Qlipper – 剪贴板管理工具◈ qPDFview – PDF 阅读器◈ PulseAudio – 音频控制器◈ Qtransmission – BT 下载工具(Qt 界面版本)◈ Quassel – IRC 客户端◈ ScreenGrab – 截屏制作工具◈ Skanlite – 扫描工具◈ 启动盘创建工具 – USB 启动盘制作工具◈ Trojita – 邮件客户端◈ VLC – 媒体播放器◈ MPV 视频播放器 测试 Lubuntu 20.04 LTS LXQt 版 Lubuntu 的启动时间不到一分钟,虽然是从 SSD 启动的。 LXQt 目前需要的内存比基于 Gtk+ 2 的 LXDE 稍微多一点,但是另一种 Gtk+ 3 工具包也需要更多的内存。 在重新启动之后,系统以非常低的内存占用情况运行,大约只有 340 MB(按照现代标准),比 LXDE 多 100 MB。 LXQt 不仅适用于硬件较旧的用户,也适用于那些希望在新机器上获得简约经典体验的用户。 桌面布局看起来类似于 KDE 的 Plasma 桌面,你觉得呢? 在左下角有一个应用程序菜单,一个用于显示固定和活动的应用程序的任务栏,右下角有一个系统托盘。 Lubuntu 的 LXQt 版本可以很容易的定制,所有的东西都在菜单的首选项下,大部分的关键项目都在 LXQt “设置”中。 值得一提的是,LXQt 在默认情况下使用流行的 Openbox 窗口管理器。 与前三个发行版一样,20.04 LTS 附带了一个默认的黑暗主题 Lubuntu Arc,但是如果不适合你的口味,可以快速更换,也很方便。 就日常使用而言,事实证明,Lubuntu 20.04 向我证明,其实每一个 Ubuntu 的分支版本都完全没有问题。 结论 Lubuntu 团队已经成功地过渡到一个现代的、依然轻量级的、极简的桌面环境。LXDE 看起来被遗弃了,迁移到一个活跃的项目也是一件好事。 我希望 Lubuntu 20.04 能够让你和我一样热爱,如果是这样,请在下面的评论中告诉我。请继续关注! via: https://itsfoss.com/lubuntu-20-04-review/ 作者:Dimitrios Savvopoulos 选题:lujun9972 译者:qfzy1233 校对:wxy 本文由 LCTT 原创编译,Linux中国 荣誉推出 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_39539807/article/details/111619265。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-05-17 18:52:15
319
转载
MySQL
...资源的抽象标识符,在文中指的是MySQL进程可以同时打开的文件数量上限,默认值为1024,超出此限制会导致“Too many open files”错误,进而影响数据库正常运行。 open_files_limit , MySQL配置文件中的一个参数,用于定义单个MySQL实例可打开的最大文件描述符数量,文章中将其从默认值调整为65535以解决文件描述符不足的问题,是优化数据库性能的关键配置项。
2025-04-17 16:17:44
109
山涧溪流_
MemCache
...回超时错误的现象。在文中,这种情况常发生在高并发场景下,尤其是在MemCache服务器负载较高或网络状况不佳的情况下,客户端会因等待响应时间过长而触发超时异常。 MemCache , 一种高性能的分布式内存对象缓存系统,主要用于减轻数据库的压力并提升应用的响应速度。MemCache通过将热点数据存储在内存中,减少了对数据库的频繁访问,从而提高了系统的整体性能。在文中提到,MemCache适用于电商网站等需要快速响应用户请求的场景,但同时也需要注意其配置和使用方式,否则可能会引发诸如服务连接超时等问题。 重试机制 , 一种容错设计模式,用于在初次操作失败后自动尝试重新执行该操作。在文中,重试机制被用来解决MemCache服务连接超时的问题,通过设定最大重试次数和间隔时间,允许客户端在遇到暂时性错误时有机会恢复正常的连接状态。这种机制有助于提高系统的鲁棒性,但在实现时也需要谨慎处理,以免造成资源浪费或引发连锁反应。
2025-04-08 15:44:16
88
雪落无痕
转载文章
...互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 英特尔oneAPI——异构计算学习总结 oneAPI编程模型 多架构编程面临的挑战 SYCL DPC++ 编译和运行DPC++程序 编程实例 实现矢量加法 queue类 Parallel kernel 通用的并行编程模板 Host Accessor 矢量相加源代码 统一共享内存 (Unified Shared Memory USM) USM语法 数据依赖 wait() depends_on in_order queue property 练习1:事件依赖 练习2:事件依赖 UMS实验 oneAPI编程模型 oneAPI编程模型提供了一个全面、统一的开发人员工具组合,可用于各种硬件设备,其中包括跨多个工作负载领域的一系列性能库。这些库包括面向各目标架构而定制化代码的函数,因此相同的函数调用可为各种支持的架构提供优化的性能。DPC++基于行业标准和开放规范,旨在鼓励生态系统的协作和创新。 多架构编程面临的挑战 在以数据为中心的环境中,专用工作负载的数量不断增长。专用负载通常因为没有通用的编程语言或API而需要使用不同的语言和库进行编程,这就需要维护各自独立的代码库。 由于跨平台的工具支持不一致,因此开发人员必须学习和使用一整套不同的工具。单独投入精力给每种硬件平台开发软件。 oneAPI则可以利用一种统一的编程模型以及支持并行性的库,支持包括CPU、GPU、FPGA等硬件等同于原生高级语言的开发性能,并且可以与现有的HPC编程模型交互。 SYCL SYCL支持C++数据并行编程,SYCL和OpenCL一样都是由Khronos Group管理的,SYCL是建立在OpenCL之上的跨平台抽象层,支持用C++用单源语言方式编写用于异构处理器的与设备无关的代码。 DPC++ DPC++(Data Parallel C++)是一种单源语言,可以将主机代码和异构加速器内核写在同一个文件当中,在主机中调用DPC++程序,计算由加速器执行。DPC++代码简洁且效率高,并且是开源的。现有的CUDA应用、Fortran应用、OpenCL应用都可以用不同方式很方便地迁移到DPC++当中。 下图显示了原来使用不同架构的HPC开发人员的一些推荐的转换方法。 编译和运行DPC++程序 编译和运行DPC++程序主要包括三步: 初始化环境变量 编译DPC++源代码 运行程序 例如本地运行,在本地系统上安装英特尔基础工具套件,使用以下命令编译和运行DPC++程序。 source /opt/intel/inteloneapi/setvars.shdpcpp simple.cpp -o simple./simple 编程实例 实现矢量加法 以下实例描述了使用DPC++实现矢量加法的过程和源代码。 queue类 queue类用来提交给SYCL执行的命令组,是将作业提交到运算设备的一种机制,多个queue可以映射到同一个设备。 Parallel kernel Parallel kernel允许代码并行执行,对于一个不具有相关性的循环数据操作,可以用Parallel kernel并行实现 在C++代码中的循环实现 for(int i=0; i < 1024; i++){a[i] = b[i] + c[i];}); 在Parallel kernel中的并行实现 h.parallel_for(range<1>(1024), [=](id<1> i){A[i] = B[i] + C[i];}); 通用的并行编程模板 h.parallel_for(range<1>(1024), [=](id<1> i){// CODE THAT RUNS ON DEVICE }); range用来生成一个迭代序列,1为步长,在循环体中,i表示索引。 Host Accessor Host Accessor是使用主机缓冲区访问目标的访问器,它使访问的数据可以在主机上使用。通过构建Host Accessor可以将数据同步回主机,除此之外还可以通过销毁缓冲区将数据同步回主机。 buf是存储数据的缓冲区。 host_accessor b(buf,read_only); 除此之外还可以将buf设置为局部变量,当系统超出buf生存期,buf被销毁,数据也将转移到主机中。 矢量相加源代码 根据上面的知识,这里展示了利用DPC++实现矢量相加的代码。 //第一行在jupyter中指明了该cpp文件的保存位置%%writefile lab/vector_add.cppinclude <CL/sycl.hpp>using namespace sycl;int main() {const int N = 256;// 初始化两个队列并打印std::vector<int> vector1(N, 10);std::cout<<"\nInput Vector1: "; for (int i = 0; i < N; i++) std::cout << vector1[i] << " ";std::vector<int> vector2(N, 20);std::cout<<"\nInput Vector2: "; for (int i = 0; i < N; i++) std::cout << vector2[i] << " ";// 创建缓存区buffer vector1_buffer(vector1);buffer vector2_buffer(vector2);// 提交矢量相加任务queue q;q.submit([&](handler &h) {// 为缓存区创建访问器accessor vector1_accessor (vector1_buffer,h);accessor vector2_accessor (vector2_buffer,h);h.parallel_for(range<1>(N), [=](id<1> index) {vector1_accessor[index] += vector2_accessor[index];});});// 创建主机访问器将设备中数据拷贝到主机当中host_accessor h_a(vector1_buffer,read_only);std::cout<<"\nOutput Values: ";for (int i = 0; i < N; i++) std::cout<< vector1[i] << " ";std::cout<<"\n";return 0;} 运行结果 统一共享内存 (Unified Shared Memory USM) 统一共享内存是一种基于指针的方法,是将CPU内存和GPU内存进行统一的虚拟化方法,对于C++来说,指针操作内存是很常规的方式,USM也可以最大限度的减少C++移植到DPC++的代价。 下图显示了非USM(左)和USM(右)的程序员开发视角。 类型 函数调用 说明 在主机上可访问 在设备上可访问 设备 malloc_device 在设备上分配(显式) 否 是 主机 malloc_host 在主机上分配(隐式) 是 是 共享 malloc_shared 分配可以在主机和设备之间迁移(隐式) 是 是 USM语法 初始化: int data = malloc_shared<int>(N, q); int data = static_cast<int >(malloc_shared(N sizeof(int), q)); 释放 free(data,q); 使用共享内存之后,程序将自动在主机和运算设备之间隐式移动数据。 数据依赖 使用USM时,要注意数据之间的依赖关系以及事件之间的依赖关系,如果两个线程同时修改同一个内存区,将产生不可预测的结果。 我们可以使用不同的选项管理数据依赖关系: 内核任务中的 wait() 使用 depends_on 方法 使用 in_queue 队列属性 wait() q.submit([&](handler &h) {h.parallel_for(range<1>(N), [=](id<1> i) { data[i] += 2; });}).wait(); // <--- wait() will make sure that task is complete before continuingq.submit([&](handler &h) {h.parallel_for(range<1>(N), [=](id<1> i) { data[i] += 3; });}); depends_on auto e = q.submit([&](handler &h) { // <--- e is event for kernel taskh.parallel_for(range<1>(N), [=](id<1> i) { data[i] += 2; });});q.submit([&](handler &h) {h.depends_on(e); // <--- waits until event e is completeh.parallel_for(range<1>(N), [=](id<1> i) { data[i] += 3; });}); in_order queue property queue q(property_list{property::queue::in_order()}); // <--- this will make sure all the task with q are executed sequentially 练习1:事件依赖 以下代码使用 USM,并有三个提交到设备的内核。每个内核修改相同的数据阵列。三个队列之间没有数据依赖关系 为每个队列提交添加 wait() 在第二个和第三个内核任务中实施 depends_on() 方法 使用 in_order 队列属性,而非常规队列: queue q{property::queue::in_order()}; %%writefile lab/usm_data.cppinclude <CL/sycl.hpp>using namespace sycl;static const int N = 256;int main() {queue q{property::queue::in_order()};//用队列限制执行顺序std::cout << "Device : " << q.get_device().get_info<info::device::name>() << "\n";int data = static_cast<int >(malloc_shared(N sizeof(int), q));for (int i = 0; i < N; i++) data[i] = 10;q.parallel_for(range<1>(N), [=](id<1> i) { data[i] += 2; });q.parallel_for(range<1>(N), [=](id<1> i) { data[i] += 3; });q.parallel_for(range<1>(N), [=](id<1> i) { data[i] += 5; });q.wait();//wait阻塞进程for (int i = 0; i < N; i++) std::cout << data[i] << " ";std::cout << "\n";free(data, q);return 0;} 执行结果 练习2:事件依赖 以下代码使用 USM,并有三个提交到设备的内核。前两个内核修改了两个不同的内存对象,第三个内核对前两个内核具有依赖性。三个队列之间没有数据依赖关系 %%writefile lab/usm_data2.cppinclude <CL/sycl.hpp>using namespace sycl;static const int N = 1024;int main() {queue q;std::cout << "Device : " << q.get_device().get_info<info::device::name>() << "\n";//设备选择int data1 = malloc_shared<int>(N, q);int data2 = malloc_shared<int>(N, q);for (int i = 0; i < N; i++) {data1[i] = 10;data2[i] = 10;}auto e1 = q.parallel_for(range<1>(N), [=](id<1> i) { data1[i] += 2; });auto e2 = q.parallel_for(range<1>(N), [=](id<1> i) { data2[i] += 3; });//e1,e2指向两个事件内核q.parallel_for(range<1>(N),{e1,e2}, [=](id<1> i) { data1[i] += data2[i]; }).wait();//depend on e1,e2for (int i = 0; i < N; i++) std::cout << data1[i] << " ";std::cout << "\n";free(data1, q);free(data2, q);return 0;} 运行结果 UMS实验 在主机中初始化两个vector,初始数据为25和49,在设备中初始化两个vector,将主机中的数据拷贝到设备当中,在设备当中并行计算原始数据的根号值,然后将data1_device和data2_device的数值相加,最后将数据拷贝回主机当中,检验最后相加的和是否是12,程序结束前将内存释放。 %%writefile lab/usm_lab.cppinclude <CL/sycl.hpp>include <cmath>using namespace sycl;static const int N = 1024;int main() {queue q;std::cout << "Device : " << q.get_device().get_info<info::device::name>() << "\n";//intialize 2 arrays on hostint data1 = static_cast<int >(malloc(N sizeof(int)));int data2 = static_cast<int >(malloc(N sizeof(int)));for (int i = 0; i < N; i++) {data1[i] = 25;data2[i] = 49;}// STEP 1 : Create USM device allocation for data1 and data2int data1_device = static_cast<int >(malloc_device(N sizeof(int),q));int data2_device = static_cast<int >(malloc_device(N sizeof(int),q));// STEP 2 : Copy data1 and data2 to USM device allocationq.memcpy(data1_device, data1, sizeof(int) N).wait();q.memcpy(data2_device, data2, sizeof(int) N).wait();// STEP 3 : Write kernel code to update data1 on device with sqrt of valueauto e1 = q.parallel_for(range<1>(N), [=](id<1> i) { data1_device[i] = std::sqrt(25); });auto e2 = q.parallel_for(range<1>(N), [=](id<1> i) { data2_device[i] = std::sqrt(49); });// STEP 5 : Write kernel code to add data2 on device to data1q.parallel_for(range<1>(N),{e1,e2}, [=](id<1> i) { data1_device[i] += data2_device[i]; }).wait();// STEP 6 : Copy data1 on device to hostq.memcpy(data1, data1_device, sizeof(int) N).wait();q.memcpy(data2, data2_device, sizeof(int) N).wait();// verify resultsint fail = 0;for (int i = 0; i < N; i++) if(data1[i] != 12) {fail = 1; break;}if(fail == 1) std::cout << " FAIL"; else std::cout << " PASS";std::cout << "\n";// STEP 7 : Free USM device allocationsfree(data1_device, q);free(data1);free(data2_device, q);free(data2);// STEP 8 : Add event based kernel dependency for the Steps 2 - 6return 0;} 运行结果 本篇文章为转载内容。原文链接:https://blog.csdn.net/MCKZX/article/details/127630566。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-07-22 10:28:50
322
转载
转载文章
...互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 转于博客 https://www.cnblogs.com/huidaoli/p/7398392.html,原作者:huidaoli __ coding:UTF-8 __ import win32api import win32con import win32gui from ctypes import import time VK_CODE = { ‘backspace‘:0x08, ‘tab‘:0x09, ‘clear‘:0x0C, ‘enter‘:0x0D, ‘shift‘:0x10, ‘ctrl‘:0x11, ‘alt‘:0x12, ‘pause‘:0x13, ‘caps_lock‘:0x14, ‘esc‘:0x1B, ‘spacebar‘:0x20, ‘page_up‘:0x21, ‘page_down‘:0x22, ‘end‘:0x23, ‘home‘:0x24, ‘left_arrow‘:0x25, ‘up_arrow‘:0x26, ‘right_arrow‘:0x27, ‘down_arrow‘:0x28, ‘select‘:0x29, ‘print‘:0x2A, ‘execute‘:0x2B, ‘print_screen‘:0x2C, ‘ins‘:0x2D, ‘del‘:0x2E, ‘help‘:0x2F, ‘0‘:0x30, ‘1‘:0x31, ‘2‘:0x32, ‘3‘:0x33, ‘4‘:0x34, ‘5‘:0x35, ‘6‘:0x36, ‘7‘:0x37, ‘8‘:0x38, ‘9‘:0x39, ‘a‘:0x41, ‘b‘:0x42, ‘c‘:0x43, ‘d‘:0x44, ‘e‘:0x45, ‘f‘:0x46, ‘g‘:0x47, ‘h‘:0x48, ‘i‘:0x49, ‘j‘:0x4A, ‘k‘:0x4B, ‘l‘:0x4C, ‘m‘:0x4D, ‘n‘:0x4E, ‘o‘:0x4F, ‘p‘:0x50, ‘q‘:0x51, ‘r‘:0x52, ‘s‘:0x53, ‘t‘:0x54, ‘u‘:0x55, ‘v‘:0x56, ‘w‘:0x57, ‘x‘:0x58, ‘y‘:0x59, ‘z‘:0x5A, ‘numpad_0‘:0x60, ‘numpad_1‘:0x61, ‘numpad_2‘:0x62, ‘numpad_3‘:0x63, ‘numpad_4‘:0x64, ‘numpad_5‘:0x65, ‘numpad_6‘:0x66, ‘numpad_7‘:0x67, ‘numpad_8‘:0x68, ‘numpad_9‘:0x69, ‘multiply_key‘:0x6A, ‘add_key‘:0x6B, ‘separator_key‘:0x6C, ‘subtract_key‘:0x6D, ‘decimal_key‘:0x6E, ‘divide_key‘:0x6F, ‘F1‘:0x70, ‘F2‘:0x71, ‘F3‘:0x72, ‘F4‘:0x73, ‘F5‘:0x74, ‘F6‘:0x75, ‘F7‘:0x76, ‘F8‘:0x77, ‘F9‘:0x78, ‘F10‘:0x79, ‘F11‘:0x7A, ‘F12‘:0x7B, ‘F13‘:0x7C, ‘F14‘:0x7D, ‘F15‘:0x7E, ‘F16‘:0x7F, ‘F17‘:0x80, ‘F18‘:0x81, ‘F19‘:0x82, ‘F20‘:0x83, ‘F21‘:0x84, ‘F22‘:0x85, ‘F23‘:0x86, ‘F24‘:0x87, ‘num_lock‘:0x90, ‘scroll_lock‘:0x91, ‘left_shift‘:0xA0, ‘right_shift ‘:0xA1, ‘left_control‘:0xA2, ‘right_control‘:0xA3, ‘left_menu‘:0xA4, ‘right_menu‘:0xA5, ‘browser_back‘:0xA6, ‘browser_forward‘:0xA7, ‘browser_refresh‘:0xA8, ‘browser_stop‘:0xA9, ‘browser_search‘:0xAA, ‘browser_favorites‘:0xAB, ‘browser_start_and_home‘:0xAC, ‘volume_mute‘:0xAD, ‘volume_Down‘:0xAE, ‘volume_up‘:0xAF, ‘next_track‘:0xB0, ‘previous_track‘:0xB1, ‘stop_media‘:0xB2, ‘play/pause_media‘:0xB3, ‘start_mail‘:0xB4, ‘select_media‘:0xB5, ‘start_application_1‘:0xB6, ‘start_application_2‘:0xB7, ‘attn_key‘:0xF6, ‘crsel_key‘:0xF7, ‘exsel_key‘:0xF8, ‘play_key‘:0xFA, ‘zoom_key‘:0xFB, ‘clear_key‘:0xFE, ‘+‘:0xBB, ‘,‘:0xBC, ‘-‘:0xBD, ‘.‘:0xBE, ‘/‘:0xBF, ‘‘:0xC0, ‘;‘:0xBA, ‘[‘:0xDB, ‘\\‘:0xDC, ‘]‘:0xDD, "‘":0xDE, ‘‘:0xC0} class POINT(Structure): _fields_ = [("x", c_ulong),("y", c_ulong)] def get_mouse_point(): po = POINT() windll.user32.GetCursorPos(byref(po)) return int(po.x), int(po.y) def mouse_click(x=None,y=None): if not x is None and not y is None: mouse_move(x,y) time.sleep(0.05) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) def mouse_dclick(x=None,y=None): if not x is None and not y is None: mouse_move(x,y) time.sleep(0.05) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) def mouse_move(x,y): windll.user32.SetCursorPos(x, y) def key_input(str=‘‘): for c in str: win32api.keybd_event(VK_CODE[c],0,0,0) win32api.keybd_event(VK_CODE[c],0,win32con.KEYEVENTF_KEYUP,0) time.sleep(0.01) if __name__ == "__main__": mouse_click(500,280) str1 = ‘python‘ key_input(str1) mouse_click(1000,280) 自己增加部分部分:调用单独按键的语句: if __name__ == ‘__main__‘: win32api.keybd_event(0x12, 0, 0, 0) win32api.keybd_event(0x41, 0, 0, 0) time.sleep(1) win32api.keybd_event(0x12, 0, win32con.KEYEVENTF_KEYUP, 0) win32api.keybd_event(0x41, 0, win32con.KEYEVENTF_KEYUP, 0) 原文:https://www.cnblogs.com/lili414/p/9004108.html 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_32899685/article/details/112870402。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-06-07 19:00:58
55
转载
站内搜索
用于搜索本网站内部文章,支持栏目切换。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
env
- 列出当前环境变量及其值。
推荐内容
推荐本栏目内的其它文章,看看还有哪些文章让你感兴趣。
2023-04-28
2023-08-09
2023-06-18
2023-04-14
2023-02-18
2023-04-17
2024-01-11
2023-10-03
2023-09-09
2023-06-13
2023-08-07
2023-03-11
历史内容
快速导航到对应月份的历史文章列表。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"