前端技术
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
[MySQL中Nacos用户权限更新]的搜索结果
这里是文章列表。热门标签的颜色随机变换,标签颜色没有特殊含义。
点击某个标签可搜索标签相关的文章。
点击某个标签可搜索标签相关的文章。
转载文章
...98。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 近期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
322
转载
RabbitMQ
...地调整重试策略,不然用户可能会觉得卡顿或者直接闪退。至于那些需要应对海量并发连接的场景嘛,你就得上点“硬货”了,比如用更牛的技术来搞定负载均衡和集群管理,这样才能保证系统稳如老狗。总而言之,就是咱们得不停地试啊试的,然后就能慢慢弄出个既快又稳的分布式消息传递系统。 --- 以上就是关于RabbitMQ中如何处理连接故障的一些探讨。希望这些内容能帮助你在实际工作中更好地应对挑战,打造更加可靠的应用程序。如果你有任何疑问或想要分享自己的经验,请随时留言讨论!
2024-12-02 16:11:51
94
红尘漫步
转载文章
...83。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 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
71
转载
转载文章
...64。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 本周,跟随人事部同事,参加了公司在武汉的校园招聘会。 这是公司第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
524
转载
Gradle
...致构建失败。 3. 更新依赖 检查并更新所有依赖的版本,确保它们之间不存在冲突或兼容性问题。 4. 调整网络设置 如果错误信息指向网络问题,尝试更换网络环境或调整代理设置。 5. 验证构建脚本 审查 .gradle 文件夹下的 build.gradle 或 build.gradle.kts 文件,确保没有语法错误或逻辑上的疏漏。 6. 使用调试工具 利用 Gradle 提供的诊断工具或第三方工具(如 IntelliJ IDEA 的 Gradle 插件)来辅助定位问题。 示例代码:实践中的应用 下面是一个简单的示例,展示了如何在 Gradle 中配置依赖管理,并处理可能的构建失败情况: groovy plugins { id 'com.android.application' version '7.2.2' apply false } android { compileSdkVersion 31 buildToolsVersion "32.0.0" defaultConfig { applicationId "com.example.myapp" minSdkVersion 21 targetSdkVersion 31 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { implementation 'androidx.appcompat:appcompat:1.4.2' implementation 'com.google.android.material:material:1.4.0' } // 简单的构建任务配置,用于演示 task checkDependencies(type: Check) { description = 'Checks dependencies for any issues.' classpath = configurations.compile.get() } 在这个示例中,我们定义了一个简单的 Android 应用项目,并添加了对 AndroidX 库的基本依赖。哎呀,你这项目里的小伙伴们都还好吗?对了,咱们有个小任务叫做checkDependencies,就是专门用来查一查这些小伙伴之间是不是有啥不和谐的地方。这事儿挺重要的,就像咱们定期体检一样,能早点发现问题,比如某个小伙伴突然闹脾气不干活了,或者新来的小伙伴和老伙计们不太合拍,咱都能提前知道,然后赶紧处理,不让事情闹得更大。所以,这个checkDependencies啊,其实就是咱们的一个小预防针,帮咱们防患于未然,确保项目运行得顺溜溜的! 结语 构建过程中的挑战是编程旅程的一部分,它们不仅考验着我们的技术能力,也是提升解决问题技巧的机会。通过细致地分析错误信息、逐步排查问题,以及灵活运用 Gradle 提供的工具和资源,我们可以有效地应对构建失败的挑战。嘿!兄弟,听好了,每次你栽跟头,那都不是白来的。那是你学习、进步的机会,让咱对这个叫 Gradle 的厉害构建神器用得更溜,做出超级棒的软件产品。别怕犯错,那可是通往成功的必经之路!
2024-07-29 16:10:49
497
冬日暖阳
c++
...图解决硬件性能瓶颈及用户体验等问题。例如,某大学实验室开发了一套基于SLAM技术的室内导航系统,能够在复杂环境中实现高精度定位,为未来的智能城市建设奠定了基础。 值得注意的是,在全球范围内,各国政府都在加大对科技创新的支持力度。美国出台了多项鼓励高科技产业发展的政策,而欧盟则推出了《数字服务法案》,旨在规范互联网平台的行为,保护用户隐私权。这些举措无疑将进一步推动全球科技生态的发展,为程序员们创造更多机会。 综上所述,无论是技术创新还是政策支持,都表明当前正处于一个充满机遇的时代。对于程序员而言,保持对新技术的关注,并不断提升自身技能,将是适应未来挑战的关键所在。
2025-03-25 15:39:59
10
幽谷听泉_
Kafka
... Connect允许用户轻松地将数据源与目标连接起来,简化了数据集成流程;Kafka Streams提供了无状态流处理功能,使得构建复杂事件处理应用变得更加容易。此外,随着边缘计算和物联网设备的普及,Kafka正逐步向边缘节点扩展,以更高效地处理分布在不同地理位置的数据流。 结论 综上所述,Kafka在现代大数据处理领域扮演着不可或缺的角色,其应用范围和深度正在随着技术进步和市场需求的发展而不断拓展。然而,随着数据量的持续增长和处理需求的多样化,如何在保持性能、可靠性和安全性的同时,进一步优化Kafka的使用体验,将是未来研究和实践的重点方向。面对挑战,持续的技术创新和实践探索将成为推动Kafka乃至整个数据处理生态发展的关键力量。
2024-08-28 16:00:42
107
春暖花开
转载文章
...07。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 联通智慧足迹技术 本项目由联通智慧足迹投递并参与“数据猿年度金猿策划活动——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
343
转载
Kotlin
...能因各种原因发生,如用户输入错误、配置文件解析错误、或数据传输过程中的数据类型不匹配等。这些问题不仅影响用户体验,还可能导致应用崩溃或产生不可预测的行为。 应对策略与最佳实践 1. 输入验证:在接收外部输入时,实施严格的数据验证,确保所有参数符合预期的类型和格式。使用Kotlin的类型系统和模式匹配特性,可以实现简洁而强大的验证逻辑。 2. 类型转换与异常处理:合理利用Kotlin的类型转换和异常处理机制,如as?操作符和try-catch块,优雅地处理类型不匹配或转换失败的情况。 3. 依赖注入:采用依赖注入(DI)模式可以降低组件间的耦合度,使得在不同环境中复用代码更加容易,同时也便于进行测试和调试。 4. 单元测试与集成测试:通过编写针对不同场景的单元测试和集成测试,可以在开发早期发现并修复非法参数相关的错误,提高代码质量和稳定性。 5. 代码审查与持续集成:引入代码审查流程和自动化持续集成/持续部署(CI/CD)工具,可以帮助团队成员及时发现潜在的代码问题,包括非法参数异常的处理。 结论 在面对非法参数异常等挑战时,Kotlin提供了丰富的工具和机制,帮助开发者构建健壮、可维护的应用。通过采用上述策略和最佳实践,不仅可以有效减少错误的发生,还能提升代码的可读性和可维护性。随着Kotlin在更多领域的广泛应用,未来在处理类似问题时,开发者将能够更好地利用语言特性,实现更高的开发效率和产品质量。
2024-09-18 16:04:27
112
追梦人
Apache Solr
...能、效率和可靠性对于用户体验至关重要。Apache Solr作为一款强大的开源搜索引擎平台,近年来在企业级应用和互联网服务中扮演着越来越重要的角色。本文旨在探讨Apache Solr在现代搜索引擎架构中的应用现状与未来趋势,结合最新技术动态和行业实践,提供深入分析与展望。 当前应用案例与优势 Apache Solr以其高度可扩展性和灵活性,广泛应用于大数据处理、实时搜索、推荐系统等领域。例如,在电商平台上,Solr能够高效处理海量商品信息,支持快速、精准的搜索功能,显著提升用户体验。同时,Solr的分布式特性使其能够轻松应对高并发访问,保障服务的稳定性和可靠性。 技术趋势与创新 随着人工智能和机器学习技术的发展,Apache Solr正在融合更多智能化元素,提升搜索结果的相关性和个性化推荐能力。例如,通过引入自然语言处理(NLP)算法,Solr能够更好地理解用户查询意图,提供更加智能的搜索建议。此外,Solr还在探索与NoSQL数据库的集成,以实现更高效的数据存储和检索,满足复杂应用场景的需求。 面向未来的挑战与机遇 尽管Apache Solr展现出强大的应用潜力,但未来仍面临诸多挑战,包括如何在日益增长的数据量下保持性能,如何优化跨地域的分布式搜索体验,以及如何在隐私保护日益严格的环境下提供安全的搜索服务等。同时,这也为开发者和研究者提供了广阔的研究空间和创新机会,例如探索基于量子计算的新型搜索算法,或者开发更高效的索引和查询优化技术。 结论 Apache Solr作为现代搜索引擎架构的重要组成部分,其应用与发展趋势紧密关联着信息检索技术的进步。面对不断变化的市场需求和技术挑战,Solr将继续在性能优化、智能化搜索、分布式架构等方面寻求突破,为用户提供更加高效、智能、个性化的搜索体验。随着新技术的不断涌现,Solr有望在未来的搜索领域发挥更为重要的作用,引领搜索引擎技术的发展潮流。 通过以上分析可以看出,Apache Solr不仅在当前的搜索引擎架构中扮演着核心角色,而且在技术趋势和未来应用上展现出了巨大的潜力和可能性。随着科技的不断进步,Apache Solr的应用场景和功能将进一步拓展,为用户提供更加丰富、便捷的信息获取方式。
2024-08-08 16:20:18
137
风中飘零
Hadoop
...的数据流转机制,增强用户对数据使用的信任度,也是维护企业声誉与合规性的重要环节。 结语 HBase与NoSQL数据库的集成在现代数据管理中扮演着不可或缺的角色。面对数据量的增长、技术的迭代以及合规性要求的提升,这一集成模式需要不断适应变化,探索更高效、安全的数据处理与分析方法。未来,随着大数据、人工智能等技术的进一步发展,数据集成的边界将进一步拓宽,为各行各业提供更加智能、个性化的数据解决方案。 在这个不断演进的过程中,企业应持续关注技术创新与最佳实践,构建灵活、安全的数据生态体系,以应对未来的挑战与机遇。
2024-08-10 15:45:14
35
柳暗花明又一村
HBase
... 作为一个HBase用户或者运维人员,你是不是经常遇到这样的问题?“我的HBase集群到底跑得怎么样?”、“为什么有时候查询特别慢?”、“是不是哪里配置出问题了?”这些问题困扰着每一个对HBase有所依赖的人。 其实,HBase集群的性能检查并不复杂,只要你掌握了正确的方法和工具。就好比开车吧,谁没事不看看油还有多少,轮胎气足不足,引擎有没有毛病?这车才能跑得稳当。HBase集群也跟这差不多,咱们得时不时给它来个“体检”,确保一切正常运转。那么今天,我们就来聊聊怎么高效地检查HBase集群的性能。 --- 2. 第一步 从宏观到微观——整体性能概览 在检查HBase集群性能之前,我们需要先搞清楚几个核心指标。这些指标啊,就相当于HBase集群的“身体状况晴雨表”。只要瞅一眼这些数据,就能知道这个集群是健健康康的,还是出了啥问题。 2.1 关键指标有哪些? - 吞吐量(Throughput):每秒钟处理多少请求。 - 延迟(Latency):一次操作完成所需的时间。 - Region分布:各个RegionServer上的Region是否均匀分布。 - GC时间:垃圾回收占用的时间比例。 - CPU利用率:集群中各节点的CPU使用率。 2.2 使用JMX监控 HBase提供了丰富的JMX接口,通过这些接口我们可以获取上述指标。比如说呀,你可以用 jconsole 这个工具连到你的 HBase 节点上,看看它的内存用得怎么样,GC 日志里有没有啥问题之类的。 示例代码: java import javax.management.MBeanServer; import javax.management.ObjectName; public class HBaseJMXExample { public static void main(String[] args) throws Exception { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("Hadoop:service=HBase,name=Master,sub=MasterStatus"); Integer load = (Integer) mbs.getAttribute(name, "AverageLoad"); System.out.println("当前HBase Master的平均负载:" + load); } } 这段代码展示了如何通过Java程序读取HBase Master的负载信息。虽然看起来有点复杂,但只要理解了基本原理,后续操作就简单多了! --- 3. 第二步 深入分析——聚焦热点问题 当我们拿到整体性能数据后,接下来就需要深入分析具体的问题所在。这里我建议大家按照以下几个方向逐一排查: 3.1 Region分布不均怎么办? 如果发现某些RegionServer的压力过大,而其他节点却很空闲,这可能是由于Region分布不均造成的。解决方法很简单,调整负载均衡策略即可。 示例代码: bash hbase shell balance_switch true 上面这条命令会开启自动负载均衡功能。当然,你也可以手动执行balancer命令强制进行一次平衡操作。 3.2 GC时间过长怎么办? GC时间过长往往意味着内存不足。这时候你需要检查HBase的堆内存设置,并适当增加Xmx参数值。 示例代码: xml hbase.regionserver.heapsize 8g 将heapsize调大一些,看看是否能缓解GC压力。 --- 4. 第三步 实战演练——真实案例分享 为了让大家更直观地感受到性能优化的过程,我来分享一个真实的案例。有一天,我们团队收到用户的吐槽:“你们这个查询也太慢了吧?等得我花都谢了!”我们赶紧查看了一下情况,结果发现是RegionServer上某个Region在搞事情,一直在上演“你进我也进”的读写冲突大戏,把自己整成了个“拖油瓶”。 解决方案: 1. 首先,定位问题区域。通过以下命令查看哪些Region正在发生大量读写: sql scan 'hbase:metrics' 2. 然后,调整Compaction策略。如果发现Compaction过于频繁,可以尝试降低触发条件: xml hbase.hregion.majorcompaction 86400000 最终,经过一系列调整后,查询速度果然得到了显著提升。这种成就感真的让人欲罢不能! --- 5. 结语 保持好奇心,不断学习进步 检查HBase集群的性能并不是一件枯燥无味的事情,相反,它充满了挑战性和乐趣。每次解决一个问题,都感觉是在玩拼图游戏,最后把所有碎片拼在一起的时候,那成就感真的太爽了,简直没法用语言形容! 最后,我想说的是,无论你是刚入门的新手还是经验丰富的老手,都不要停止学习的步伐。HBase的技术栈非常庞大,每一次深入研究都会让你受益匪浅。所以,让我们一起努力吧!💪 希望这篇文章对你有所帮助,如果你还有任何疑问,欢迎随时来找我交流哦~
2025-04-14 16:00:01
63
落叶归根
Spark
...的应用就能更加可靠,用户用起来也更舒心啦!哎呀,你懂的,随着咱们每天产生的数据就像自来水一样哗哗流,那处理这些数据的大数据工具就得越来越厉害才行。特别是那些记录我们操作痕迹的日志管理系统,不仅要快得跟闪电一样,操作起来还得像玩手机游戏一样简单,最好还能自己动脑筋分析出点啥有价值的信息来。这样,未来日志记录这事儿就不仅仅是记录,还能帮我们找到问题、优化流程,简直就是一大神器嘛!所以,你看,这发展方向就是越来越智能、好用、高效,让科技真正服务于人,而不是让人被科技牵着鼻子走。 --- 通过本文的探讨,我们不仅学习了如何理解和利用Spark的日志信息来诊断问题,还了解了一些实用的调试技巧和最佳实践。希望这些内容能帮助你更有效地管理你的Spark应用程序,确保其在复杂的数据处理场景下稳定运行。
2024-09-07 16:03:18
141
秋水共长天一色
Groovy
...域特定语言)进行重大更新,进一步增强了Groovy在CI/CD领域的影响力。 此次更新引入了更强大的表达能力和更高的灵活性,使得开发者能够更高效地编写复杂的流水线作业。例如,新的DSL支持并行任务执行、条件分支以及更为直观的状态监控机制。这对于需要频繁迭代的小型团队尤为有利,他们可以通过简化的脚本来加速项目的交付周期。此外,更新还优化了内存管理策略,减少了长时间运行流水线可能引发的资源消耗问题。 与此同时,另一项值得关注的趋势是Groovy在区块链技术中的应用探索。近期,某知名金融科技公司公开了一篇关于利用Groovy构建智能合约原型的研究报告。报告指出,由于Groovy具备良好的兼容性和扩展性,它可以作为连接传统金融系统与区块链生态的重要桥梁。研究人员通过实验验证了基于Groovy实现的智能合约能够在保证安全性的前提下大幅降低开发成本,并提高了系统的可维护性。 当然,任何技术都不是完美的。尽管Groovy拥有诸多优点,但其性能瓶颈始终是一个绕不开的话题。特别是在高并发环境下,Groovy相较于Java或其他编译型语言可能会显得力不从心。为此,一些创新企业正在尝试结合Groovy与Kotlin等现代化编程语言的优势,打造混合型解决方案。这种做法既保留了Groovy的灵活性,又弥补了其在性能上的不足。 总之,无论是作为CI/CD领域的中坚力量,还是新兴技术领域的探路者,Groovy都在不断适应新的挑战并展现出旺盛的生命力。对于希望提升开发效率、优化项目管理流程的技术人员而言,深入研究Groovy的最新发展无疑具有重要意义。
2025-03-13 16:20:58
61
笑傲江湖
转载文章
...12。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 你知道程序员、高级程序员、架构师、技术经理、技术总监之间有什么区别吗?他们的工作职责又是什么? 小编带大家了解一下,不同等级的程序员之间到底有什么差别。 程序员 程序员,英文名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
755
转载
MemCache
...正在做一个电商网站,用户点击商品详情页时,如果每次都要从数据库拉取商品信息,那服务器负载肯定爆表。但如果我们将这些数据缓存在MemCache中,用户访问时直接从内存读取,岂不是快如闪电? 不过呢,事情可没那么简单。MemCache这小子虽然挺能干的,但也不是省油的灯啊!比如说吧,你老是疯狂地去请求数据,结果服务器偏偏不给面子,连个响应都没有,那它就直接给你来个“服务连接超时”的报错,气得你直跺脚。这就像你去餐厅点菜,服务员一直不在,你说能不急吗? --- 2. 服务连接超时到底是个啥? 服务连接超时,简单来说就是你的程序试图与MemCache服务器建立连接,但因为某些原因(比如网络延迟、服务器过载等),连接请求迟迟得不到回应,最终超时失败。这种错误通常会伴随着一条令人沮丧的信息:“连接超时”。 让我分享一个小故事:有一次我在调试一个项目时,发现某个接口总是返回“服务连接超时”,我当时的第一反应是“天啊,是不是MemCache崩了?”于是我赶紧登录服务器检查日志,结果发现MemCache运行正常,只是偶尔响应慢了一点。后来我才意识到,可能是客户端配置的问题。 所以,当遇到这种错误时,不要慌!我们得冷静下来,分析一下可能的原因。 --- 2.1 可能的原因有哪些? 1. 网络问题 MemCache服务器和客户端之间的网络不稳定。 2. MemCache配置不当 比如设置了太短的超时时间。 3. 服务器负载过高 MemCache服务器被太多请求压垮。 4. 客户端代码问题 比如没有正确处理异常情况。 --- 3. 如何解决服务连接超时? 接下来,咱们就从代码层面入手,看看如何优雅地解决这个问题。我会结合实际例子,手把手教你如何避免“服务连接超时”。 --- 3.1 检查网络连接 首先,确保你的MemCache服务器和客户端之间网络通畅。你可以试试用ping命令测试一下: bash ping your-memcache-server 如果网络不通畅,那就得找运维同事帮忙优化网络环境了。不过,如果你确定网络没问题,那就继续往下看。 --- 3.2 调整超时时间 很多时候,“服务连接超时”是因为你设置的超时时间太短了。默认情况下,MemCache的超时时间可能比较保守,你需要根据实际情况调整它。 在Java中,可以这样设置超时时间: java import net.spy.memcached.AddrUtil; import net.spy.memcached.MemcachedClient; public class MemCacheExample { public static void main(String[] args) throws Exception { // 创建MemCache客户端,设置超时时间为5秒 MemcachedClient memcachedClient = new MemcachedClient(AddrUtil.getAddresses("localhost:11211"), 5000); System.out.println("成功连接到MemCache服务器!"); } } 这里的关键是5000,表示超时时间为5秒。你可以根据实际情况调整这个值,比如改成10秒或者20秒。 --- 3.3 使用重试机制 有时候,一次连接失败并不代表MemCache服务器真的挂了。在这种情况下,我们可以加入重试机制,让程序自动尝试重新连接。 下面是一个简单的Python示例: python import time from pymemcache.client.base import Client def connect_to_memcache(): attempts = 3 while attempts > 0: try: client = Client(('localhost', 11211)) print("成功连接到MemCache服务器!") return client except Exception as e: print(f"连接失败,重试中... ({attempts}次机会)") time.sleep(2) attempts -= 1 raise Exception("无法连接到MemCache服务器,请检查配置!") client = connect_to_memcache() 在这个例子中,程序会尝试三次连接MemCache服务器,每次失败后等待两秒钟再重试。如果三次都失败,就抛出异常提示用户。 --- 3.4 监控MemCache状态 最后,建议你定期监控MemCache服务器的状态。你可以通过工具(比如MemAdmin)查看服务器的健康状况,包括内存使用率、连接数等指标。 如果你发现服务器负载过高,可以考虑增加MemCache实例数量,或者优化业务逻辑减少不必要的请求。 --- 4. 总结 服务连接超时不可怕,可怕的是不去面对 好了,到这里,关于“服务连接超时”的问题基本就说完了。虽然MemCache确实容易让人踩坑,但只要我们用心去研究,总能找到解决方案。 最后想说的是,技术这条路没有捷径,遇到问题不要急躁,多思考、多实践才是王道。希望我的分享对你有所帮助,如果你还有什么疑问,欢迎随时来找我讨论!😄 祝大家编码愉快!
2025-04-08 15:44:16
87
雪落无痕
RabbitMQ
...1)永远不要忽视版本更新带来的变化 很多开发者习惯于直接复制粘贴网上的代码示例,却很少去验证这些代码是否适用于当前版本。你可能不知道,有时候就算方法名一样,背后的逻辑变了,结果可能会差很多。比如说啊,在RabbitMQ的3.x版本里,你用channel.queue_declare()这个方法的时候,它返回的东西就像是个装满数据的盒子,但这个盒子是那种普通的字典格式的。可到了4.x版本呢,这玩意儿就有点变了味儿,返回的不再是那个简单的字典盒子了,而是一个“高级定制版”的对象实例,感觉像是升级成了一个有专属身份的小家伙。 因此,每次引入新工具之前,一定要先查阅官方文档,确认其最新的API规范。要是不太确定,不妨试试跑一下官方给的例程代码,看看有没有啥奇怪的表现。 (2)版本锁定的重要性 为了避免类似的问题再次发生,我在后续项目中采取了严格的版本管理策略。例如,在requirements.txt文件中明确指定依赖库的具体版本号,而不是使用通配符(如>=)。这样做的好处是,即使未来出现了更高级别的版本,也不会意外破坏现有功能。 下面是一段示例代码,展示了如何在pip中固定pika的版本为1.2.0: python requirements.txt pika==1.2.0 当然,这种方法也有缺点,那就是升级依赖时可能会比较麻烦。不过嘛,要是咱们团队人不多,但手头的项目特别讲究稳当性,那这个方法绝对值得一试! --- 4. 实战演练 修复旧代码,拥抱新世界 既然明白了问题所在,接下来就是动手解决问题了。嘿,为了让大家更清楚地知道怎么把旧版的API换成新版的,我打算用一段代码来给大家做个示范,保证一看就懂! 假设我们有一个简单的RabbitMQ生产者程序,如下所示: python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='hello') channel.basic_publish(exchange='', routing_key='hello', body='Hello World!') print(" [x] Sent 'Hello World!'") connection.close() 如果你直接运行这段代码,很可能会遇到如下警告: DeprecationWarning: This method will be removed in future releases. Please use the equivalent method on the Channel class. 这是因为queue_declare方法现在已经被重新设计为返回一个包含元数据的对象,而不是单纯的字典。我们需要将其修改为如下形式: python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() result = channel.queue_declare(queue='', exclusive=True) queue_name = result.method.queue channel.basic_publish(exchange='', routing_key=queue_name, body='Hello World!') print(" [x] Sent 'Hello World!'") connection.close() 可以看到,这里新增了一行代码来获取队列名称,同时调整了routing_key参数的赋值方式。这种改动虽然简单,但却能显著提升程序的健壮性和可读性。 --- 5. 总结与展望 从失败中学习,向成功迈进 回想起这次经历,我既感到懊恼又觉得幸运。真后悔啊,当时要是多花点时间去了解API的新变化,就不会在这上面浪费那么多精力了。不过话说回来,这次小挫折也让我学到了教训,以后会更注意避免类似的错误,而且也会更加重视代码的质量。 最后想对大家说一句:技术的世界瞬息万变,没有人能够永远站在最前沿。但只要保持好奇心和学习热情,我们就一定能找到通往成功的道路。毕竟,正如那句经典的话所说:“失败乃成功之母。”只要勇敢面对挑战,总有一天你会发现,那些曾经让你头疼不已的问题,其实都是成长路上不可或缺的一部分。 希望这篇文章对你有所帮助!如果你也有类似的经历或者见解,欢迎随时交流哦~
2025-03-12 16:12:28
105
岁月如歌
转载文章
...02。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 转于博客 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
54
转载
转载文章
...66。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 英特尔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
321
转载
Logstash
...时间戳问题依然是许多用户在使用Logstash时面临的最大挑战之一。这种现象不仅出现在传统IT行业,也在云计算、大数据分析等领域频频出现。例如,最近亚马逊云科技发布的《2023年企业日志管理现状报告》显示,超过60%的企业在日志处理过程中遇到了时间戳不一致的问题,而这直接影响了他们的业务决策效率。 与此同时,国内也有不少企业在实践中摸索出了更为高效的解决方案。以阿里巴巴集团为例,其自主研发的日志服务平台SLS(Log Service)特别针对时间戳处理进行了深度优化。该平台内置了多种时间戳解析算法,并支持用户自定义规则,极大地提升了日志处理的灵活性和准确性。此外,腾讯云也推出了类似的工具,通过引入机器学习技术,能够自动识别日志中的时间戳模式,大幅降低了人工干预的成本。 从更深层面来看,时间戳问题的背后反映了现代企业对实时数据分析需求的增长。随着物联网设备的普及以及边缘计算的兴起,未来日志数据的规模和复杂度将进一步增加。因此,如何构建更加智能、稳定的时间戳处理机制将成为技术领域的重要课题。在此背景下,开源社区的作用愈发凸显。GitHub上活跃的开发者们不断贡献新的插件和补丁,为Logstash等工具注入更多创新元素。例如,最近有人提交了一个名为“DynamicTimestamp”的插件,它可以根据上下文动态调整时间戳格式,为用户提供了一种全新的视角。 值得注意的是,时间戳问题不仅仅局限于技术层面,它还涉及到组织架构和流程设计。一些领先的企业已经开始尝试将日志管理系统与业务流程紧密结合,通过建立跨部门协作机制,确保数据采集、存储和分析的一致性。这种做法不仅提高了工作效率,也为企业的长期发展奠定了坚实的基础。总之,时间戳问题虽看似琐碎,但它却是衡量一家公司技术实力的关键指标之一。在未来,随着技术的进步和社会需求的变化,这一领域的研究必将迎来更加广阔的空间。
2025-05-13 15:58:22
25
林中小径
转载文章
...82。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 源代码:13033480群共享 无助的时候,我曾读过N遍《金刚经》,讲到《金刚经》,我必须把爱因斯坦先拿来当我的档箭牌,不然,写这么个题目,我可能会被拍死: “如果世界上有一个宗教不但不与科学相违,而且每一次的科学新发现都能够验证她的观点,这就是佛教。”《爱因斯坦文集》,第一卷。 “我不能设想真正的科学家会没有这样深挚的信仰。这情况可以用这样一个形象来比喻:科学没有宗教就象瘸子,宗教没有科学就象瞎子。”------------《爱因斯坦文集》,第三卷,商务印书馆,1979年,第182-183页。 我还要提到我们国家,有位工科出身的领导人,我印象中,他也曾有段时间,每天都读《金刚经》… 先引用一段吧: 所有一切众生之类,若卵生、若胎生、若湿生、若化生、若有色、若无色、若有想、若无想、若非有想非无想,我皆令入无余涅槃而灭度之。如是灭度无量无数无边众生,实无众生得灭度者。何以故?须菩提,若菩萨有我相、人相、众生相、寿者相,即非菩萨。 类是众生之类吗?若化生??若无想??若非有想非无想?? 我不是个无知无欲的佛教徒,写这一段,我是非常非常伤感的,因为今天,我们就要把我们刚刚认识的,刚刚喜欢的,感觉已经有了很深的情感的几个类,几个象人一样可爱的类,给“灭度”掉。 请原谅我的任性,我不知道用这个词到底确切不确切,只是想这么用,就这么用了,原谅我的无知吧…… 这几个类,早已让很多网友不耐烦了,它们是SqlConnection、SqlCommand、SqlDataReader… 让我们,慢慢地,来个《梁山伯与祝英台》中的《十八相送》?? 怕是没有多少人这么有耐心地倾听那悠悠的、凄美的爱情了,我们还是简化一下,分六步吧:…. 一相送,送到try…catch…finally结构中: using System;using System.Data;using System.Data.SqlClient;using System.Configuration;using System.Collections.Generic;using WestGarden.Model;namespace WestGarden.Web{public partial class Default1 : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){IList<CategoryInfo> catogories = new List<CategoryInfo>();string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString;string cmdText = "SELECT CategoryId, Name, Descn FROM Category";SqlCommand cmd = new SqlCommand();SqlConnection conn = new SqlConnection(connectionString);try{cmd.Connection = conn;cmd.CommandType = CommandType.Text;cmd.CommandText = cmdText;conn.Open();SqlDataReader rdr = cmd.ExecuteReader();while (rdr.Read()){CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));catogories.Add(category);}rdr.Close();}finally{conn.Close();}ddlCategories.DataSource = catogories;ddlCategories.DataTextField = "Name";ddlCategories.DataValueField = "CategoryId";ddlCategories.DataBind();} }} 二相送,送到using()结构中: using System;using System.Data;using System.Data.SqlClient;using System.Configuration;using System.Collections.Generic;using WestGarden.Model;namespace WestGarden.Web{public partial class Default2 : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){IList<CategoryInfo> catogories = new List<CategoryInfo>();string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString;string cmdText = "SELECT CategoryId, Name, Descn FROM Category";SqlCommand cmd = new SqlCommand();//简单地说,using()结构等同于前面的try...finally结构,隐式关闭了conn。using(SqlConnection conn = new SqlConnection(connectionString)){cmd.Connection = conn;cmd.CommandType = CommandType.Text;cmd.CommandText = cmdText;conn.Open();SqlDataReader rdr = cmd.ExecuteReader();while (rdr.Read()){CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));catogories.Add(category);}rdr.Close();}ddlCategories.DataSource = catogories;ddlCategories.DataTextField = "Name";ddlCategories.DataValueField = "CategoryId";ddlCategories.DataBind();} }} 三相送,送到通用的数据库访问函数中: using System;using System.Data;using System.Data.SqlClient;using System.Configuration;using System.Collections.Generic;using WestGarden.Model;namespace WestGarden.Web{public partial class Default3 : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){IList<CategoryInfo> catogories = new List<CategoryInfo>();string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString;string cmdText = "SELECT CategoryId, Name, Descn FROM Category";SqlDataReader rdr = ExecuteReader(connectionString, CommandType.Text, cmdText);while (rdr.Read()){CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));catogories.Add(category);}rdr.Close();ddlCategories.DataSource = catogories;ddlCategories.DataTextField = "Name";ddlCategories.DataValueField = "CategoryId";ddlCategories.DataBind();}public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText){SqlCommand cmd = new SqlCommand();SqlConnection conn = new SqlConnection(connectionString);try{cmd.Connection = conn;cmd.CommandType = cmdType;cmd.CommandText = cmdText;conn.Open();//如果创建了 SqlDataReader 并将 CommandBehavior 设置为 CloseConnection,//则关闭 SqlDataReader 会自动关闭此连接SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);return rdr;}catch{conn.Close();throw;}//finally//{// conn.Close();//} }} } 这个通用数据库访问函数可以进一步完善如下: using System;using System.Data;using System.Data.SqlClient;using System.Configuration;using System.Collections.Generic;using WestGarden.Model;namespace WestGarden.Web{public partial class Default4 : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){IList<CategoryInfo> catogories = new List<CategoryInfo>();string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString;string cmdText = "SELECT CategoryId, Name, Descn FROM Category";SqlDataReader rdr = ExecuteReader(connectionString, CommandType.Text, cmdText,null);while (rdr.Read()){CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));catogories.Add(category);}rdr.Close();ddlCategories.DataSource = catogories;ddlCategories.DataTextField = "Name";ddlCategories.DataValueField = "CategoryId";ddlCategories.DataBind();}public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters){SqlCommand cmd = new SqlCommand();SqlConnection conn = new SqlConnection(connectionString);try{//cmd.Connection = conn;//cmd.CommandType = cmdType;//cmd.CommandText = cmdText;//conn.Open();PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);//如果创建了 SqlDataReader 并将 CommandBehavior 设置为 CloseConnection,//则关闭 SqlDataReader 会自动关闭此连接。SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);cmd.Parameters.Clear();return rdr;}catch{conn.Close();throw;}//finally//{// conn.Close();//} }private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms){if (conn.State != ConnectionState.Open)conn.Open();cmd.Connection = conn;cmd.CommandText = cmdText;if (trans != null)cmd.Transaction = trans;cmd.CommandType = cmdType;if (cmdParms != null){foreach (SqlParameter parm in cmdParms)cmd.Parameters.Add(parm);} }} } 因为重点在过程,在结构,代码都比较简单,唯一值得一提的是SqlConnection的关闭问题,在最后比较完善的数据库访问函数中(这是SQLHelper中的源代码),没有使用using()结构,也没有显示关闭,主要原因是调用ExecuteReader方法时,使用了参数 CommandBehavior 并将其设置为 CloseConnection: SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 根据MSDN的说法:如果创建了 SqlDataReader 并将 CommandBehavior 设置为 CloseConnection,则关闭 SqlDataReader 会自动关闭此连接。 参考网址:http://msdn.microsoft.com/zh-cn/library/y6wy5a0f(v=vs.80).aspx 版权所有©2012,WestGarden.欢迎转载,转载请注明出处.更多文章请参阅博客http://www.cnblogs.com/WestGarden/ 转载于:https://www.cnblogs.com/WestGarden/archive/2012/06/04/2533560.html 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_33697898/article/details/94471782。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-03-18 20:09:36
89
转载
转载文章
...00。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 前言 投入同样的时间和精力,你使用不同的途径来成长,收获是不一样的。 关于721法则有两种不同的理解。 理解1: 通过实践,我们可以吸收其中的70%,通过与他人交流,我们可以吸收其中的20%,通过读书和培训,可以吸收其中的10%。 理解2: 一生而言,我们70%的经验来之实践,20%来之与他人交流,10%来之读书和培训。 【----帮助Python学习,以下所有学习资料文末免费领!----】 不管你如何理解,这个721法则都告诉我们:我们都要勇敢地去实践。 实践中我们可以出错,可以不满意,可以有失去,但那都是我们的财富。 不去实践,我们永远站在原地,实践了,那就是希望的开始。 下图是我百度所得: 下面是我用matplotlib画的: 我还有另外一种理解:如果你想有所产出,10%靠运气,20%靠自己,更多的是要靠团队。 我将70%赋予了灰色,这是一种冷色调,代表理性、努力和恒心。其它两种颜色为亮色,表示我们赤诚的心和坚定不移的方向。 如果你感兴趣,可以将下面代码复制到IDLE或者Spyder或者Pycharm,轻轻一点,属于你的图就成了。 第一个图from matplotlib import pyplot as plt 调节图形大小,宽,高plt.figure(figsize=(6,9))定义饼状图的标签,标签是列表labels = [ '实践与经验','交流与反馈','培训与学习']每个标签占多大,会自动去算百分比sizes = [70,20,10]colors = ['red','yellowgreen','lightskyblue']colors = ['gray','00FFFF','FF1493']灰、粉、蓝绿将某部分爆炸出来, 使用括号,将第一块分割出来,数值的大小是分割出来的与其他两块的间隙explode = (0.05,0.05,0)patches,l_text,p_text = plt.pie(sizes,explode=explode,labels=labels,colors=colors,labeldistance = 1.1,autopct = '%3.1f%%',shadow = False,startangle = 90,pctdistance = 0.6)labeldistance,文本的位置离远点有多远,1.1指1.1倍半径的位置autopct,圆里面的文本格式,%3.1f%%表示小数有三位,整数有一位的浮点数shadow,饼是否有阴影startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看pctdistance,百分比的text离圆心的距离patches, l_texts, p_texts,为了得到饼图的返回值,p_texts饼图内部文本的,l_texts饼图外label的文本改变文本的大小方法是把每一个text遍历。调用set_size方法设置它的属性for t in l_text:t.set_size(25)for t in p_text:t.set_size(20) 设置x,y轴刻度一致,这样饼图才能是圆的plt.axis('equal')plt.legend(loc="upper left",frameon=False,fontsize=20,borderaxespad=-5)plt.title('721法则', y=-0.1,fontsize=30,loc="center")plt.savefig("721法则.png")plt.show() 下图还是我画的,当然,没有上面那个美观。 第二个图import matplotlib.pyplot as pltplt.rcParams['font.family']='SimHei'plt.figure(figsize=(6, 9))labels = '实践与经验','交流与反馈','培训与学习'sizes = [70.0,20.0,10.0]explode = (0.1,0,0)colors = ['gray','00FFFF','FF1493']plt.pie(sizes,explode=explode,labels=labels,colors=colors,labeldistance=1.1,\autopct='%d%%',shadow=True,counterclock=False)plt.legend(loc="upper left",frameon=False,fontsize=18,borderaxespad=-5)plt.axis('equal')plt.title('721法则', y=-0.1,fontsize=18)plt.savefig("721法则.png")plt.show() 结论:我们不但要会画,还要学着画得尽可能美,实践是唯一的途径。 Python入门教程 如果你现在还是不会Python也没关系,下面我会给大家免费分享一份Python全套学习资料, 包含视频、源码、课件,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,可以和我一起来学习交 流。 ① Python所有方向的学习路线图,清楚各个方向要学什么东西 ② 600多节Python课程视频,涵盖必备基础、爬虫和数据分析 ③ 100多个Python实战案例,含50个超大型项目详解,学习不再是只会理论 ④ 20款主流手游迫解 爬虫手游逆行迫解教程包 ⑤ 爬虫与反爬虫攻防教程包,含15个大型网站迫解 ⑥ 爬虫APP逆向实战教程包,含45项绝密技术详解 ⑦ 超300本Python电子好书,从入门到高阶应有尽有 ⑧ 华为出品独家Python漫画教程,手机也能学习 ⑨ 历年互联网企业Python面试真题,复习时非常方便 👉Python学习视频600合集👈 观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。 👉实战案例👈 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。 👉100道Python练习题👈 检查学习结果。 👉面试刷题👈 资料领取 上述这份完整版的Python全套学习资料已经上传CSDN官方,朋友们如果需要可以微信扫描下方CSDN官方认证二维码输入“领取资料” 即可领取 好文推荐 了解python的前景:https://blog.csdn.net/weixin_49891576/article/details/127187029 了解python的兼职:https://blog.csdn.net/weixin_49891576/article/details/127125308 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_49891576/article/details/130861900。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-06-04 23:38:21
105
转载
站内搜索
用于搜索本网站内部文章,支持栏目切换。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
watch -n 5 command
- 每隔5秒执行一次指定命令并更新输出。
推荐内容
推荐本栏目内的其它文章,看看还有哪些文章让你感兴趣。
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
历史内容
快速导航到对应月份的历史文章列表。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"