前端技术
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
[自定义JavaScript日期格式化函数...]的搜索结果
这里是文章列表。热门标签的颜色随机变换,标签颜色没有特殊含义。
点击某个标签可搜索标签相关的文章。
点击某个标签可搜索标签相关的文章。
ZooKeeper
...在复杂的分布式环境下实现高效协作。文中提到,ZooKeeper内部存在一个请求队列,当队列满时会触发CommitQueueFullException。 异步API , ZooKeeper提供的两种API之一,允许客户端在发起请求后无需等待立即响应即可继续执行后续操作。这种方式可以减少请求等待时间,从而降低队列满的风险。文中举例说明了使用异步API创建节点的过程,展示了其与同步API的区别在于不阻塞主线程,适合高并发场景。
2025-03-16 15:37:44
10
林中小径
ElasticSearch
...rk配置项正是用来定义这些阈值的,默认值分别为85%、90%和95%。合理设置这些参数能够有效预防磁盘空间耗尽引发的NodeNotActiveException,从而保障集群的稳定运行。
2025-03-14 15:40:13
64
林中小径
转载文章
...数)。 【注意:此处定义与X轴平行的那组边为长边,与Y轴平行的那组边为宽边】 请编写一个程序计算这两张卡片叠加后所形成的绿色区域的面积。 输入 单组输入。 第1行输入四个整数,分别表示蓝色长方形透明卡片的左上角坐标(X坐标和Y坐标)、长和宽。两两之间用英文空格隔开。 第2行输入四个整数,分别表示黄色长方形透明卡片的左上角坐标(X坐标和Y坐标)、长和宽。两两之间用英文空格隔开。 两张长方形透明卡片的X坐标和Y坐标的取值范围为[-1000, 1000],长和宽的取值范围为[1,200]。 输出 输出一个非负整数,表示两张卡片叠加后所形成的绿色区域的面积。 思维题 画个图自己推公式就行,我这不是最简做法 给出下图,可以参考我的做法 include <bits/stdc++.h>using namespace std;int main(){int x,y,xx,yy,a,b,aa,bb;int i,j;scanf("%d%d%d%d",&x,&y,&a,&b);scanf("%d%d%d%d",&xx,&yy,&aa,&bb);int dx=abs(x-xx);int dy=abs(y-yy);if(x<=xx){i=min(aa,a-dx);}else i=min(a,aa-dx);if(y>=yy){j=min(bb,b-dy);}else j=min(b,bb-dy);if(i<=0||j<=0)puts("0");else printf("%d\n",ij);return 0;} B: 勤劳的老杨 题目描述 勤劳的老杨最近收到了一个任务清单,在这个清单上有N项不同的工作任务。对于每一项任务都给出了两个时间[X, Y],其中X表示任务的起始时间(任务从第X天开始,包含第X天),Y表示任务的结束时间(任务到第Y天结束,包含第Y天)。 认真的老杨对待每一项任务都是一心一意的。一旦他决定做某一项任务,在该任务没有完成之前他不会同时再做另一项任务,也就是说在任意时刻老杨手头最多只有一项任务。 假设完成每一项任务所获得的报酬都是相等的。那么,老杨应该如何来安排自己的时间才可以得到最多的报酬呢? 请你编写一个程序帮老杨计算出他最多可以完成的任务数量。保证至少能完成一项任务。 输入 单组输入。 第1行输入一个正整数N表示任务清单上任务的总数。(N<=1000) 第2行到第N行每一行包含两个正整数,分别表示每一项任务的开始时间和结束时间,两个正整数之间用空格隔开。 输出 输出老杨最多可以完成的任务数量。 贪心 include<bits/stdc++.h>using namespace std;struct node{int a;int b;}ans[1005];bool cmp(const node q,const node p){return q.b<p.b;}int main(){int n;cin>>n;for(int i=0;i<n;i++){cin>>ans[i].a;cin>>ans[i].b;}sort(ans,ans+n,cmp);//按结束时间从小到大大排序int cou=0;int end=-1;for(int i=0;i<n;i++)if(ans[i].a>end){//注意时间不能重叠cou++;end=ans[i].b;}cout<<cou<<endl;return 0;} C: 秘密大厦的访客 题目描述 Kimi最近在负责一栋秘密大厦的安保工作,他的工作是记录大厦的来访者情况。 每个来访者都有一个与之对应的唯一编号,在每一条到访记录中记录了该来访者的编号。 现在Kimi需要统计每一条记录中的来访者是第几次光临秘密大厦。 输入 单组输入,每组两行。 第1行包含一个正整数n,表示记录的条数,n不超过1000; 第2行包含n个正整数,依次表示Kimi的记录中每位来访者的编号,两两之间用空格隔开。 输出 输出1行,包含n个正整数,两两之间用空格隔开,依次表示每条记录中的来访者编号是第几次出现。 签到题 直接模拟,做法很多 include<bits/stdc++.h>using namespace std;define ll long longint main(){int n,m;scanf("%d",&n);map<int,int>mp;for(int i=1;i<=n;i++){scanf("%d",&m);mp[m]++;printf("%d%c",mp[m],i==n ? '\n':' ');}return 0;} D: 最大能量 题目描述 一年一度的宇宙超级运动会在宇宙奥特英雄体育场隆重举行。X星人为这场运动会准备了很长时间,他大显身手的时刻终于到了! 为了保持良好的竞技状态和充沛的体能,X星人准备了N种不同的能量包。 虽然每种能量包都有无限个,但是因为同一种能量包使用太多会带来副作用,因此同样的能量包不能同时使用超过两个,也就是说最多同时可以使用两个相同的能量包。 每种能量包都有一个重量值和能量值。由于这些能量包的特殊性,必须要完整地使用一个能量包才能够发挥功效,否则将失去对应的能量值。 考虑到竞赛的公平性,竞赛组委会规定每个人赛前补充的能量包的总重量不能超过W。 现在需要你编写一个程序计算出X星人能够拥有的最大能量值是多少? 输入 单组输入。 第1行包含两个正整数N和W,其中N<=10^ 3,W<=10^ 3。 第2行到第N+1行,每一行包含两个正整数,分别表示每一种能量包的重量和能量值,两个正整数之间用空格隔开。每一种能量包的重量和能量值都是小于等于100的正整数。 输出 输出X星人能够拥有的最大能量值。 背包 可以看成每个物品个数为2的多重背包,用多重背包的方法做;也可以看成总共有2n个物品,用一般背包的方法做 //方法1include <bits/stdc++.h>using namespace std;int c[1005],w[1005];//重量 能量int f[10005];int main(){int n,m;cin>>n>>m;for(int i=1;i<=n;i++)cin>>c[i]>>w[i];for(int i=1;i<=n;i++)for(int j=m;j>=c[i];--j){for(int k=1;k<=2&&kc[i]<=j;k++){f[j]=max(f[j],f[j-c[i]k]+w[i]k);} }cout<<f[m]<<endl;return 0;}//方法2include<bits/stdc++.h>using namespace std;const int N=1e3+5;int a[2N],b[2N],dp[N],n,m;int main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i]>>b[i];a[i+n]=a[i],b[i+n]=b[i];}for(int i=1;i<=2n;i++){for(int j=m;j>=a[i];j--){dp[j]=max(dp[j],dp[j-a[i]]+b[i]);} }cout<<dp[m]<<'\n';return 0;} E: 最大素数 题目描述 输入一个数字字符串,从中删除若干个(包含0个)数字后可以得到一个素数,请编写一个程序求解删除部分数字之后能够得到的最大素数。 例如,输入“1234”,删除1和4,可以得到的最大素数为23。 输入 输入一个数字字符串,从中删除若干个(包含0个)数字后可以得到一个素数,请编写一个程序求解删除部分数字之后能够得到的最大素数。 例如,输入“1234”,删除1和4,可以得到的最大素数为23。 输出 输入一个数字字符串,从中删除若干个(包含0个)数字后可以得到一个素数,请编写一个程序求解删除部分数字之后能够得到的最大素数。 例如,输入“1234”,删除1和4,可以得到的最大素数为23。 搜索 这里用的bfs,优先搜索当前最大的数,如果这个数已经是素数那么就是答案 我说不清楚,参考代码吧 include <bits/stdc++.h>using namespace std;bool isprime(int n){//素数判断if(n<2)return 0;for(int i=2;i<=(int)sqrt(n);++i)if(n%i==0)return 0;return 1;}struct node {string s;int len;bool operator<(const node &q)const{if(len!=q.len)return len<q.len;return s<q.s;} };bool check(string str){int m=0;for(int i=0;i<str.size();i++){m=m10+str[i]-'0';}return isprime(m);}bool flag;map<string,bool>vis;string s;void bfs(){priority_queue<node>q;q.push({s,s.size()});while(!q.empty()){node k=q.top();q.pop();if(vis[k.s])continue;vis[k.s]=1;if(check(k.s)){cout<<k.s<<endl;flag=1;return ;}for(int i=0;i<k.s.size();i++){//去掉第i个字符string s1=k.s.substr(0,i)+k.s.substr(i+1);q.push({s1,s1.size()});} }}int main(){cin>>s;bfs();if(!flag)puts("No result.");return 0;} F: 最大计分 题目描述 小米和小花在玩一个删除数字的游戏。 游戏规则如下: 首先随机写下N个正整数,然后任选一个数字作为起始点,从起始点开始从左往右每次可以删除一个数字,但是必须满足下一个删除的数字要小于上一个删除的数字。每成功删除一个数字计1分。 请问对于给定的N个正整数,一局游戏过后可以得到的最大计分是多少? 输入 单组输入。 第1行输入一个正整数N表示数字的个数(N<=10^3)。 第2行输入N个正整数,两两之间用空格隔开。 输出 对于给定的N个正整数,一局游戏过后可以得到的最大计分值。 最长下降子序列 将数组逆转就等价于求最长上升子序列长度 include <bits/stdc++.h>using namespace std;int arr[1005];int main(){int n;cin>>n;for(int i=0;i<n;i++)cin>>arr[i];reverse(arr,arr+n);vector<int>stk;stk.push_back(arr[0]);for (int i = 1; i < n; ++i) {if (arr[i] > stk.back())stk.push_back(arr[i]);elselower_bound(stk.begin(), stk.end(), arr[i]) = arr[i];}cout << stk.size() << endl;return 0;} G: 密钥 题目描述 X星人又截获了Y星人的一段密文。 破解这段密文需要使用一个密钥,而这个密钥存在于一个正整数N中。 聪明的X星人终于找到了获取密钥的方法:这个正整数的最后一位是一个非零数K(K>=2),需要将正整数N切分成K个小的整数,并且要使得这K个较小整数的乘积达到最大。而所得到的最大乘积就是破解密文所需的密钥。 你能否帮X星人编写一段程序来得到密钥呢? 输入 X星人又截获了Y星人的一段密文。 破解这段密文需要使用一个密钥,而这个密钥存在于一个正整数N中。 聪明的X星人终于找到了获取密钥的方法:这个正整数的最后一位是一个非零数K(K>=2),需要将正整数N切分成K个小的整数,并且要使得这K个较小整数的乘积达到最大。而所得到的最大乘积就是破解密文所需的密钥。 你能否帮X星人编写一段程序来得到密钥呢? 输出 将N划分为K个整数后的最大乘积。 搜索 include <bits/stdc++.h>using namespace std;define ll long longll n;ll ans;void dfs(ll sum,ll m,int res){if(res==1){ans=max(ans,summ);return ;}int num=(int)log10(m)+1;//m的位数int k=10;for(int i=1;i<=num-res+1;i++){//保证剩余的数至少还有res-1位dfs(sum(m%k),m/k,res-1);k=10;}return ;}int main(){cin>>n;dfs(1ll,n,n%10);cout<<ans<<endl;return 0;} H: X星大学 题目描述 X星大学新校区终于建成啦! 新校区一共有N栋教学楼和办公楼。现在需要用光纤把这N栋连接起来,保证任意两栋楼之间都有一条有线网络通讯链路。 已知任意两栋楼之间的直线距离(单位:千米)。为了降低成本,要求两栋楼之间都用直线光纤连接。 光纤的单位成本C已知(单位:X星币/千米),请问最少需要多少X星币才能保证任意两栋楼之间都有光纤直接或者间接相连? 注意:如果1号楼和2号楼相连,2号楼和3号楼相连,则1号楼和3号楼间接相连。 输入 单组输入。 第1行输入两个正整数N和C,分别表示楼栋的数量和光纤的单位成本(单位:X星币/千米),N<=100,C<=100。两者之间用英文空格隔开。 接下来N(N-1)/2行,每行包含三个正整数,第1个正整数和第2个正整数表示楼栋的编号(从1开始一直到N),编号小的在前,编号大的在后,第3个正整数为两栋楼之间的直线距离(单位:千米)。 输出 输出最少需要多少X星币才能保证任意两栋楼之间都有光纤直接或者间接相连。 最小生成树模板题 //prim()最小生成树include <bits/stdc++.h>using namespace std;define ll long longdefine INF 0x3f3f3f3fint n,c;int dist[105];bool vis[105];int a[105][105];ll prim(int pos){memset(dist,INF,sizeof(dist));dist[pos]=0;ll sum=0;for(int i=1;i<=n;i++){int cur=-1;for(int j=1;j<=n;j++){if(!vis[j]&&(cur==-1||dist[j]<dist[cur]))cur=j;}if(dist[cur]>=INF)return INF;sum+=dist[cur];vis[cur]=1;for(int l=1;l<=n;l++)if(!vis[l])dist[l]=min(dist[l],a[cur][l]);}return sum;}int main() {scanf("%d%d",&n,&c);int x,y,z;memset(a,INF,sizeof(a));for(int i=1;i<=n;i++)a[i][i]=0;for(int i=1;i<=n(n-1)/2;i++){scanf("%d%d%d",&x,&y,&z);a[x][y]=min(a[x][y],z);a[y][x]=a[x][y];}printf("%lld\n",prim(1)c);return 0;}//Kruskal()最小生成树include<bits/stdc++.h>using namespace std;struct node {int x,y,z;}edge[10005];bool cmp(node a,node b) {return a.z < b.z;}int fa[105];int n,m,c;long long sum;int get(int x) {return x == fa[x] ? x : fa[x] = get(fa[x]);}int main() {scanf("%d%d",&n,&c);m=n(n-1)/2;for(int i = 1; i <= m; i ++) {scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].z);}for(int i = 0; i <= n; i ++) {fa[i] = i;}sort(edge + 1,edge + 1 + m,cmp);// 每次加入一条最短的边for(int i = 1; i <= m; i ++) {int x = get(edge[i].x);int y = get(edge[i].y);if(x == y) continue;fa[y] = x;sum += edge[i].z;}printf("%lld\n",sumc);return 0;} 本篇文章为转载内容。原文链接:https://blog.csdn.net/qq_52139055/article/details/123284091。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2024-01-20 16:20:26
468
转载
Ruby
...程(Thread)来实现这一点。比如说啊,你正在倒腾一堆数据的时候,完全可以把它切成一小块一小块的,然后让每个线程去负责一块,这样一来,效率直接拉满,干活儿的速度蹭蹭往上涨! 但是,问题来了:并发编程虽然强大,但它并不是万能药。哎呀,经常会有这样的情况呢——自个儿辛辛苦苦改代码,还以为是在让程序变得更好,结果一不小心,又给它整出了新麻烦,真是“好心办坏事”的典型啊!接下来,我们来看几个具体的例子。 --- 3. 示例一 共享状态的混乱 场景描述: 假设你正在开发一个电商网站,需要统计用户的购买记录。你琢磨着干脆让多线程上阵,给这个任务提速,于是打算让每个线程各管一拨用户的活儿,分头行动效率肯定更高!看起来很合理对不对? 问题出现: 问题是,当你让多个线程共享同一个变量(比如一个全局计数器),事情就开始变得不可控了。Ruby 的线程可不是完全分开的,这就有点像几个人共用一个记事本,大家都能随便写东西上去。结果就是,这本子可能一会儿被这个写点,一会儿被那个划掉,最后你都不知道上面到底写了啥,数据就乱套了。 代码示例: ruby 错误的代码 counter = 0 threads = [] 5.times do |i| threads << Thread.new do 100_000.times { counter += 1 } end end threads.each(&:join) puts "Counter: {counter}" 分析: 这段代码看起来没什么问题,每个线程都只是简单地增加计数器。但实际情况却是,输出的结果经常不是期望的500_000,而是各种奇怪的数字。这就好比说,counter += 1 其实不是一步到位的简单操作,它得先“读一下当前的值”,再“给这个值加1”,最后再“把新的值存回去”。问题是,在这中间的每一个小动作,都可能被别的线程突然插队过来捣乱! 解决方案: 为了避免这种混乱,我们需要使用线程安全的操作,比如Mutex(互斥锁)。Mutex可以确保每次只有一个线程能够修改某个变量。 修正后的代码: ruby 正确的代码 require 'thread' counter = 0 mutex = Mutex.new threads = [] 5.times do |i| threads << Thread.new do 100_000.times do mutex.synchronize { counter += 1 } end end end threads.each(&:join) puts "Counter: {counter}" 总结: 这一段代码告诉我们,共享状态是一个雷区。如果你非要用共享变量,记得给它加上锁,不然后果不堪设想。 --- 4. 示例二 死锁的诅咒 场景描述: 有时候,我们会遇到更复杂的情况,比如两个线程互相等待对方释放资源。哎呀,这种情况就叫“死锁”,简直就像两只小猫抢一个玩具,谁都不肯让步,结果大家都卡在那里动弹不得,程序也就这样傻乎乎地停在原地,啥也干不了啦! 问题出现: 想象一下,你有两个线程,A线程需要获取锁X,B线程需要获取锁Y。想象一下,A和B两个人都想打开两把锁——A拿到了锁X,B拿到了锁Y。然后呢,A心想:“我得等B先把他的锁Y打开,我才能继续。”而B也在想:“等A先把她的锁X打开,我才能接着弄。”结果俩人就这么干等着,谁也不肯先放手,最后就成了“死锁”——就像两个人在拔河,谁都不松手,僵在那里啥也干不成。 代码示例: ruby 死锁的代码 lock_a = Mutex.new lock_b = Mutex.new thread_a = Thread.new do lock_a.synchronize do puts "Thread A acquired lock A" sleep(1) lock_b.synchronize do puts "Thread A acquired lock B" end end end thread_b = Thread.new do lock_b.synchronize do puts "Thread B acquired lock B" sleep(1) lock_a.synchronize do puts "Thread B acquired lock A" end end end thread_a.join thread_b.join 分析: 在这段代码中,两个线程都在尝试获取两个不同的锁,但由于它们的顺序不同,最终导致了死锁。运行这段代码时,你会发现程序卡住了,没有任何输出。 解决方案: 为了避免死锁,我们需要遵循“总是按照相同的顺序获取锁”的原则。比如,在上面的例子中,我们可以强制让所有线程都先获取锁A,再获取锁B。 修正后的代码: ruby 避免死锁的代码 lock_a = Mutex.new lock_b = Mutex.new thread_a = Thread.new do [lock_a, lock_b].each do |lock| lock.synchronize do puts "Thread A acquired lock {lock.object_id}" end end end thread_b = Thread.new do [lock_a, lock_b].each do |lock| lock.synchronize do puts "Thread B acquired lock {lock.object_id}" end end end thread_a.join thread_b.join 总结: 死锁就像一只隐形的手,随时可能掐住你的喉咙。记住,保持一致的锁顺序是关键! --- 5. 示例三 不恰当的线程池 场景描述: 线程池是一种管理线程的方式,它可以复用线程,减少频繁创建和销毁线程的开销。但在实际使用中,很多人会因为配置不当而导致性能下降甚至崩溃。 问题出现: 假设你创建了一个线程池,但线程池的大小设置得不合理。哎呀,这就好比做饭时锅不够大,菜都堆在那儿煮不熟,菜要是放太多呢,锅又会冒烟、潽得到处都是,最后饭也没做好。线程池也一样,太小了任务堆成山,程序半天没反应;太大了吧,电脑资源直接被榨干,啥事也干不成,还得收拾烂摊子! 代码示例: ruby 线程池的错误用法 require 'thread' pool = Concurrent::FixedThreadPool.new(2) 20.times do |i| pool.post do sleep(1) puts "Task {i} completed" end end pool.shutdown pool.wait_for_termination 分析: 在这个例子中,线程池的大小被设置为2,但有20个任务需要执行。哎呀,这就好比你请了个帮手,但他一次只能干两件事,其他事儿就得排队等着,得等前面那两件事儿干完了,才能轮到下一件呢!这种情况下,整个程序的执行时间会显著延长。 解决方案: 为了优化线程池的性能,我们需要根据系统的负载情况动态调整线程池的大小。可以使用Concurrent::CachedThreadPool,它会根据当前的任务数量自动调整线程的数量。 修正后的代码: ruby 使用缓存线程池 require 'concurrent' pool = Concurrent::CachedThreadPool.new 20.times do |i| pool.post do sleep(1) puts "Task {i} completed" end end sleep(10) 给线程池足够的时间完成任务 pool.shutdown pool.wait_for_termination 总结: 线程池就像一把双刃剑,用得好可以提升效率,用不好则会成为负担。记住,线程池的大小要根据实际情况灵活调整。 --- 6. 示例四 忽略异常的代价 场景描述: 并发编程的一个常见问题是,线程中的异常不容易被察觉。如果你没有妥善处理这些异常,程序可能会因为一个小错误而崩溃。 问题出现: 假设你有一个线程在执行某个操作时抛出了异常,但你没有捕获它,那么整个线程池可能会因此停止工作。 代码示例: ruby 忽略异常的代码 threads = [] 5.times do |i| threads << Thread.new do raise "Error in thread {i}" if i == 2 puts "Thread {i} completed" end end threads.each(&:join) 分析: 在这个例子中,当i == 2时,线程会抛出一个异常。哎呀糟糕!因为我们没抓住这个异常,程序直接就挂掉了,别的线程啥的也别想再跑了。 解决方案: 为了防止这种情况发生,我们应该在每个线程中添加异常捕获机制。比如,可以用begin-rescue-end结构来捕获异常并进行处理。 修正后的代码: ruby 捕获异常的代码 threads = [] 5.times do |i| threads << Thread.new do begin raise "Error in thread {i}" if i == 2 puts "Thread {i} completed" rescue => e puts "Thread {i} encountered an error: {e.message}" end end end threads.each(&:join) 总结: 异常就像隐藏在暗处的敌人,稍不注意就会让你措手不及。学会捕获和处理异常,是成为一个优秀的并发编程者的关键。 --- 7. 结语 好了,今天的分享就到这里啦!并发编程确实是一项强大的技能,但也需要谨慎对待。大家看看今天这个例子,是不是觉得有点隐患啊?希望能引起大家的注意,也学着怎么避开这些坑,别踩雷了! 最后,我想说的是,编程是一门艺术,也是一场冒险。每次遇到新挑战,我都觉得像打开一个神秘的盲盒,既兴奋又紧张。不过呢,光有好奇心还不够,还得有点儿耐心,就像种花一样,得一点点浇水施肥,不能急着看结果。相信只要我们不断学习、不断反思,就一定能写出更加优雅、高效的代码! 祝大家编码愉快!
2025-04-25 16:14:17
32
凌波微步
Spark
...象转换为紧凑的二进制格式,以减少内存占用并加快数据传输速度。文章提到两种常见的序列化方式。 缓存时机 , 缓存时机是指决定何时将数据加载到内存中的策略。文章指出,缓存时机的选择直接影响内存利用率和任务执行效率。如果在任务启动初期盲目缓存数据,可能导致内存资源浪费或后期真正需要缓存的数据无法获得足够空间。合理的缓存时机应该根据任务需求动态调整,例如在某阶段即将开始前再调用.cache()方法,确保数据能及时加载到内存中。正确把握缓存时机能够最大化分布式缓存的优势,同时避免不必要的性能损失。
2025-05-02 15:46:14
81
素颜如水
转载文章
...及其在ROS环境下的实现之后,我们还可以关注更多关于VIO技术的最新进展和应用案例。近期,一项名为“Visual-Inertial Re-localization and Mapping in Dynamic Environments”的研究(来源:IEEE Robotics and Automation Letters, 2023)提出了一种能够适应动态环境变化的新型VIO定位与建图算法,它结合深度学习方法提升了在复杂场景中的重定位精度和鲁棒性。 同时,在自动驾驶领域,Waymo等公司在其无人驾驶车辆上广泛采用了基于视觉惯性导航的技术,并不断优化以提高实时定位和姿态估计的准确性。例如,一篇发布于《Nature》子刊《Machine Intelligence》上的文章揭示了他们如何将VIO与高精地图信息深度融合,以应对城市道路中的各种挑战。 此外,对于学术界和工业界来说,开源项目如OpenVINS、OKVIS以及本文提及的VINS-Fusion等持续迭代更新,不仅推动了VIO技术的发展,也为广大研究者提供了宝贵的实验平台。这些项目通过融合多传感器数据,实现了在无人机、机器人以及其他移动设备上的高效稳定定位导航。 总的来说,随着硬件性能的提升和算法优化的深化,视觉惯性里程计正逐渐成为自主导航系统中不可或缺的核心组件。在未来,我们期待看到更多创新性的研究成果和技术突破,进一步提升VIO在复杂环境下的适用性和可靠性。
2023-09-13 20:38:56
310
转载
Kafka
...者组的设计理念是为了实现负载均衡和故障恢复。比如说,如果有两个小伙伴在一个小组里,系统就会帮他们自动分配任务(也就是主题的分区),这样大家就不会抢来抢去,重复干同样的活儿啦!而且呢,要是有个消费者挂掉了或者出问题了,其他的消费者就会顶上来,接手它负责的那些分区,接着干活儿,完全不受影响。 --- 3. 组织结构 Kafka的大脑与四肢 3.1 集群(Cluster):Kafka的心脏 Kafka集群是由多个Broker组成的,Broker是Kafka的核心组件,负责存储和转发消息。一个Broker就是一个节点,多个Broker协同工作,形成一个分布式的系统。 java // 启动Kafka Broker nohup kafka-server-start.sh config/server.properties & Broker的数量决定了系统的容错能力和性能。其实啊,通常咱们都会建议弄三个Broker,为啥呢?就怕万一有个家伙“罢工”了,比如突然挂掉或者出问题,别的还能顶上,整个系统就不耽误干活啦!不过,Broker的数量也不能太多,否则会增加管理和维护的成本。 3.2 Zookeeper:Kafka的大脑 Zookeeper是Kafka的协调器,它负责管理集群的状态和配置。没有Zookeeper,Kafka就无法正常运作。比如说啊,新添了个Broker(也就是那个消息中转站),Zookeeper就会赶紧告诉其他Broker:“嘿,快看看这位新伙伴,更新一下你们的状态吧!”还有呢,要是某个分区的老大换了(Leader切换了),Zookeeper也会在一旁默默记好这笔账,生怕漏掉啥重要信息似的。 java // 启动Zookeeper nohup zookeeper-server-start.sh config/zookeeper.properties & 虽然Zookeeper很重要,但它也有一定的局限性。比如,它可能会成为单点故障,影响整个系统的稳定性。因此,近年来Kafka也在尝试去掉对Zookeeper的依赖,开发了自己的内部协调机制。 3.3 日志(Log):Kafka的四肢 日志是Kafka存储消息的地方,每个分区对应一个日志文件。嘿,这个日志设计可太聪明了!它用的是顺序写入的方法,就像一条直线往前跑,根本不用左顾右盼,写起来那叫一个快,效率直接拉满! java // 查看日志路径 cat config/server.properties | grep log.dirs 日志的大小可以通过参数log.segment.bytes来控制。默认值是1GB,你可以根据实际情况调整。要是日志文件太大了,查个东西就像在大海捞针一样慢吞吞的;但要是弄得太小吧,又老得换新的日志文件,麻烦得很,还费劲。 --- 4. 实战演练 从零搭建一个Kafka环境 说了这么多理论,咱们来实际操作一下吧!假设我们要搭建一个简单的Kafka环境,用来收集用户的登录日志。 4.1 安装Kafka和Zookeeper 首先,我们需要安装Kafka和Zookeeper。可以从官网下载最新的二进制包,解压后按照文档配置即可。 bash 下载Kafka wget https://downloads.apache.org/kafka/3.4.0/kafka_2.13-3.4.0.tgz 解压 tar -xzf kafka_2.13-3.4.0.tgz 4.2 创建主题和消费者 接下来,我们创建一个名为login_logs的主题,并启动一个消费者来监听消息。 bash 创建主题 bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic login_logs 启动消费者 bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic login_logs --from-beginning 4.3 生产消息 最后,我们可以编写一个简单的Java程序来生产消息。 java import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord; import java.util.Properties; public class KafkaProducerExample { public static void main(String[] args) { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); KafkaProducer producer = new KafkaProducer<>(props); for (int i = 0; i < 10; i++) { producer.send(new ProducerRecord<>("login_logs", "key" + i, "value" + i)); } producer.close(); } } 这段代码会向login_logs主题发送10条消息,每条消息都有一个唯一的键和值。 --- 5. 总结 Kafka的魅力在于细节 好了,到这里咱们的Kafka之旅就告一段落了。通过这篇文章,我希望大家能更好地理解Kafka的命名规范和组织结构。Kafka为啥这么牛?因为它在设计的时候真是把每个小细节都琢磨得特别透。就像给主题起名字吧,分个区啦,还有消费者组怎么配合干活儿,这些地方都能看出人家确实是下了一番功夫的,真不是随便凑合出来的! 当然,Kafka的学习之路还有很多内容需要探索,比如监控、调优、安全等等。其实我觉得啊,只要你把命名的规矩弄明白了,东西该怎么放也心里有数了,那你就算是走上正轨啦,成功嘛,它就已经在向你招手啦!加油吧,朋友们! --- 希望这篇文章对你有所帮助,如果有任何疑问,欢迎随时交流哦!
2025-04-05 15:38:52
95
彩虹之上
转载文章
...划算。这些都是源码的实现细节,大家在阅读源码时需要细细斟酌。 本篇文章为转载内容。原文链接:https://blog.csdn.net/qq_16500963/article/details/132133125。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-12-16 20:37:50
246
转载
转载文章
...该IP地址进行连接,实现远程查看和操作A电脑桌面的功能。这一技术广泛应用于远程办公、技术支持、服务器管理等领域。 QoS数据计划程序(Quality of Service Data Plan Policy) , QoS数据计划程序是Windows操作系统中的一种网络服务质量保证机制,它可以根据不同的网络流量需求为其分配优先级,确保关键业务或应用程序有足够的带宽资源。在本文中,通过组策略编辑器调整QoS数据计划程序,可以限制某些进程占用的网络带宽,从而优化整体网络使用情况。 SoftwareDistribution文件夹 , SoftwareDistribution文件夹是Windows操作系统中用于存储Windows Update服务下载的更新文件及其相关临时文件的目录。当用户遇到Windows Update更新失败时,通常会建议清理这个文件夹中的内容,以便于重新下载更新包,解决由于旧的或损坏的更新文件导致的更新失败问题。
2023-02-16 16:18:33
136
转载
转载文章
...一个大概的模板,注意格式、内容以及邮件的标题等(例如XX大学-XXX-保研申请)。建议夏令营前或者初审过了及时联系自己喜欢的老师。 以上只是对各方面的简单介绍,每个方面详细的注意点网上好多资料,多多搜集就好。 PS:以上个人简历/个人陈述/老师推荐信模板如果有需要的私信我分享给你! 建议把以上材料都提前收集整理好,保研结束后发现我的材料文件夹3个多G...... 一年多来整理的保研资料 四、上科大信息学院夏令营(7.3-7.6) 本来没有打算报名上科大,一个同学把上科大宣传单给了我一份,看后感觉上科大实力比较强(虽然不是982/211)就报名了。 校园环境 上科大3号报到,4号-6号有开营活动、参观、自己联系老师面试(后来才知道即使拿到优营九月份也要再来面试,也就是说上科大夏令营拿到优营只是免去了九月预推免面试的初审,但是如果你足够优秀,老师比较中意,九月份就是来走一下过场。) 我参加了三个老师的面试。YY老师只是简单问了几个问题,有点水;HXM老师有一轮笔试(考的概率论比较多,编译原理、操作系统、计网也有涉及)+面试;YJY老师的一轮面试是课题组的学长学姐面的(自我介绍+项目),二轮面试和老师聊。 上科大给我的感觉就是学校小而精;老师比较好(比如YJY/GSH/TKW)、科研氛围浓厚、硬件设施完善(双人宿舍,独立卫浴,中央空调;学校地下全是停车场,下雨不用打伞可以直接走地下),但是由于建立才几年的时间,知名度不高。 学生宿舍 五、北理计算机夏令营(7.8-7.10) 北理今年入营的基本都是985和顶尖211,夏令营去了基本都能拿到优营!入营290+,夏令营参营240+,优营220+。 在北理主楼俯瞰 8号报到,领取宿舍钥匙、校园卡(北理夏令营包括食宿,每人发了一张100元的校园卡,可以在食堂、超市消费)。北理校园比较小、路比较窄;研究生宿舍三栋高层,有电梯,四人间,宿舍空间小、比较挤,大多数宿舍有空调(据说是宿舍的同学自己买或者租的),每一层有一个公共洗澡间。 9号上午宣讲,下午机试。机试两道题目难度不大,老师手动输入三个样例给分(4+3+3,每道题目满分10分)。下午机试结束我找到提前联系的LX老师聊了一个小时,老师人很nice,专心学术(据说她的研究生大都有一篇顶会论文)。 10号上午自己找老师面试。我又参加了院长实验室的面试,比较简单。下午正式面试,分了十多个组一起面试,总共四个小时。面试包括英文自我介绍、项目、研究生规划、是否打算读博、基础知识等,每人大概5-7分钟。面试结束就可以离校了。 六、北航计算机夏令营(7.11-7.14) 北航是不包含食宿的,所以入营人数较多,有600+。北航7.11上午报到+宣讲,下午机试分两组。北航机试类似CSP,可以多次提交,以最后一次为准,但是提交后不能实时出成绩。机试两个小时,包括两道题目,第一道题目比较简单,第二道题目稍微难一些,我第二道题目没有写完但是也过了机试,第二道题目即使没有写完也要能写多少写多少,把代码的思路写出来(有可能会人工判)。北航机试可以用CSP成绩代替,基本250分及以上就没问题,每年具体的情况不一样。11号晚上出机试通过名单(大概500+进340+)。 12号分组面试,每人20分钟,从上午八点一直面试到下午三点。面试包括抽取一道政治题谈看法、抽取一段英文读并翻译、基础知识(数学知识+计算机知识)、项目。政治题和英文翻译感觉大家都差不多(除非你英语特别差),主要的是基础知识面试,北航比较爱问数学问题线代、概率论、离散、高数;如果你的项目比较好的话,老师会着重问你的项目。问到我的问题有梯度、可微和可导、大数定理+中心极限定理等。12号晚上出优营名单,大概340+进180。北航是根据夏令营面试排名来定学硕和专硕的,大概有40个学硕的名额,其他都是专硕,不过北航学硕和专硕培养方式没有区别。 这是在我前面面试同学被问到的部分问题 13号领导师意向表,找导师签字,如果没有找到暑假期间或者九月份也可以再联系老师。 14号校医院体检,夏令营结束。 七、计算所(7.13-7.16) 计算所入营还是比较有难度的,但是即使没入营也可以自己联系老师,如果老师同意可以来参加面试,只是夏令营包括食宿,没入营的不包括食宿。计算所是分实验室面试的,可以参加多个实验室的面试,我参加了网数和智信的笔试+机试+面试。 智信12号笔试,14号机试+面试。笔试包括英文论文理解翻译、概率论题、计算机基础知识题目(操作系统,计网等)、CV题目(智信主要是做CV)。机试五道题目,一个小时,题目代码已经写好了,只需你补全,类似LeetCode,在学长的电脑上完成,有C++和Python可选,两种编程语言题目不同。C++用的是VS2017,会由人给你记每道题目完成的时间,会让你演示调试,结束后打包发送到一个邮箱里。 网数只有机试和面试,13号上午机试,15号面试。机试一个小时七道题目,在自己电脑上写然后拷到老师的优盘上。考察了包括链表、二叉树、图等,偏向于工程,据说今年的题目是计算所一个工程博士出的。机试70人,进入面试60人。面试每人15分钟,包括自我介绍,专业知识,是否读博,项目等。 计算所环境 八、一些建议和感想 一些建议: 提前准备,给自己定位,有针对性的准备,多在网上找经验贴;多和本校保研的学长学姐交流,多和同学交流,多搜集信息; 4月份前把简历、推荐信、个人陈述等写好,再不断修改完善; 最好能提前联系一个老师,以免拿到优营而没有找到好老师; 准备好专业知识,线代、概率论、数据结构、计网、计组、操作系统等; 如果编程能力不是特别强,最好大三开始就刷题,LeetCode的中档题难度基本就够用了; 一些体会与感想: 机会是留给有准备的人的,越努力越幸运! 做最坏的打算,做最好的准备。 保研是一场马拉松,坚持到底就是胜利。 遵道而行,但到半途需努力;会心不远,欲登绝顶莫辞劳。 也送给自己一句话:流年笑掷,未来可期! 以上仅代表个人观点与感想,如果对你有帮助记得点赞哦~如有问题,可以关注我的公主号【驭风者小窝】,我会尽我最大的努力帮助你! 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_28983299/article/details/118319985。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-05-02 23:03:36
120
转载
转载文章
...lQieHuan类在实现动态面板切换和响应事件方面扮演了重要角色。为了进一步提升GUI设计的专业性和效率,开发者可以关注以下最新的技术和实践: 1. JavaFX替代Swing的探讨:随着Oracle将重心转向JavaFX,许多开发者开始考虑从Swing迁移到JavaFX以获得更现代化、高性能且易于维护的UI体验。JavaFX提供了丰富的图形效果、CSS样式支持以及与Web技术更好的集成能力。 2. 现代Java GUI框架介绍:除了官方推荐的JavaFX外,还有诸如TornadoFX(基于JavaFX的声明式MVVM框架)、 Griffon(Groovy为基础的桌面应用框架)等新兴框架,它们为开发者提供了更简洁直观的API和强大的功能集。 3. 跨平台UI工具包Qt Jambi:尽管Java Swing是纯Java环境下的GUI解决方案,但也有其他跨平台工具包值得关注,例如Qt Jambi,它允许开发者使用Java编写原生速度和外观的应用程序,并兼容多种操作系统。 4. 无障碍性设计原则在Swing中的应用:针对日益增长的无障碍需求,开发者应了解并遵循WCAG标准,在Swing应用程序中实施无障碍设计,如提供键盘导航支持、可调整的文字大小及高对比度模式等。 5. Swing组件最佳实践分享:查阅最新的开发者博客和论坛讨论,可以发现众多关于如何优化Swing组件性能、处理并发问题以及改善用户体验的实际案例和建议,这些都能帮助你更好地运用Swing进行复杂GUI的设计与实现。 综上所述,不断跟进最新的GUI开发趋势和技术发展,结合实际项目需求,灵活运用和扩展Swing或其他相关框架,将有助于打造更为出色和易用的桌面应用程序。
2023-01-18 08:36:23
525
转载
转载文章
...请插入当前时间或具体日期)国际软件测试大会(ISTQB)发布了最新的软件测试认证标准更新,强调了敏捷开发环境下的测试实践和人工智能在自动化测试中的应用,为测试工程师提供了与时俱进的指导框架(来源:[相关链接])。此外,知名测试工具提供商如Tricentis和Micro Focus持续优化其产品功能,以应对云原生应用、大数据系统以及区块链等新兴技术领域的测试挑战(参见:[相关新闻链接])。 同时,在学术研究领域,《计算机科学》杂志最近刊发了一篇关于“基于机器学习的软件缺陷预测模型”的论文,通过大数据分析有效提升了软件测试的效率和精准度(来源:[期刊链接])。另外,美国国家标准技术研究院(NIST)正在推动一项名为“软件工程实践成熟度评估”的新项目,旨在构建一套更为全面和灵活的质量保障体系(详情:[NIST官网链接])。 综上所述,软件测试与质量保证是一个快速演进的领域,不断涌现出新的理论研究、技术创新及最佳实践案例。关注这些前沿动态,对于从事该行业的专业人士来说至关重要,能够帮助他们不断提升自身技能,确保软件产品的高质量交付。
2023-08-29 09:17:46
134
转载
转载文章
...资自己,通过不断学习实现职业生涯的可持续发展。 同时,心理学专家也强调,保持积极心态是中年人应对职场挑战的关键要素之一。正如美国心理学家卡罗尔·德韦克提出的“成长思维模式”,鼓励人们以开放的态度看待困难和挑战,相信能力可以通过努力得以提升,这对于中年职场人士打破现状、激发潜力具有深远意义。 综上所述,面对日新月异的社会变迁和职场环境,中年群体需树立长期职业规划意识,提高实际行动力,强化个人核心竞争力,并始终保持与时俱进的学习态度和积极进取的心态,以此来应对职业道路上的各种挑战,实现职业生涯的二次腾飞。
2023-06-29 14:16:29
119
转载
转载文章
...力,还积极助力各行业实现数字化转型,如为教育、金融等行业提供了基于云服务的一站式证件照生成平台,用户只需上传原始照片即可快速获得满足各类规范要求的证件照,大大简化了传统流程,提高了工作效率。 综上所述,随着深度学习技术的不断迭代和云服务生态的完善,图像分割在证件照生成领域的应用正逐步走向成熟,并展现出巨大的市场潜力和社会价值。而作为行业领导者之一的阿里云,将持续引领技术创新,推动相关应用场景的落地与发展。
2023-07-11 23:36:51
131
转载
转载文章
...数据、用户数据等信息实现智能派单,逐步替代调度员的大部分工作。智能派单系统整体全面上线后将释放90%以上人工派单的人力,每年节省人力支出预计超过亿元。 饿了么的IT系统架构伴随业务量飙升,进行了三次重大升级。 1)起步期(2009至2013年):饿了么由上海交通大学创始团队起家,发展至35人规模,日订单量维持在十万量级,由“IDC+Python”技术组合支撑业务运营,但面临Python人才难觅等困扰。 2)成长期(2014年至2015年):14年8至9月短短2个月内日均订单量增长10倍,从10万迅猛飙升至100万,业务规模主攻全国200个城市,原有IT系统架构压力极大,依靠人肉运维举步维艰,故障波动影响业务,创始人与核心技术团队坚守机房运维一线,才勉强扛住100万量级业务订单。开始借鉴阿里淘宝架构模式,人员团队也涨至500人,技术生态从Python扩展至“Java+Python”开发体系,从“人肉”支撑百万订单运营到自动化运维,并筹备同城异地容灾体系。 3)规模期(2015年至2017年):2015年7至8月,日均订单量从200万翻倍,以往积压的问题都暴露出来,技术架构面临大考验,坚定了架构上云的方案,团队扩展至1000人,架构要承载数百万量级业务时,出现峰值成本、灾备切换、IDC远程运维等种种挑战,全面战略转型采用“IDC+云计算”的混合云架构。在2016年12月25日圣诞节日订单量迎来前所未有的900万单,因此在技术架构上探索多活部署等创新性研发。 为什么选择架构转型上云?据饿了么CTO张雪峰先生所说,技术架构从IDC经典模式发展至混合云模式,主要原因是三个关键因素让管理层下定决心上云: 1) 脉冲计算:从技术架构配套业务发展分析,网络订餐业务具有明显的“脉冲计算”特征,在每日上午10:00至13:00、晚间16:00至19:00业务高峰值出现,而其他时间则业务量很低,暑假是业务高峰季,2016年5.17大促,饿了么第一次做“秒杀”,一秒订单15000笔,巨大的波峰波谷计算差异,引发了自建数据中心容量不可调和的两难处境,如果大规模投入服务器满足6小时的高峰业务量,则其余18个小时的业务低谷计算资源闲置,若满足平均业务量,则无法跟上业务快速发展节奏,落后于竞争对手;搞电商大促时,计算资源投入巨大,大促之后计算峰值下降,采用自建机房利用率仅10%,所以技术团队摸索出用云计算扛营销大促峰值的新模式,采用混合云架构满足 “潮汐业务”峰值计算,阿里云海量云计算资源弹性随需满足巨大的脉冲计算力缺口,这与每年“双11” 淘宝引入阿里云形成全球最大混合云架构具有异曲同工的创新价值。 2) 数据量爆炸:伴随饿了么近五年业务量呈几何级数的爆发式发展,数据量增速更加令人吃惊,是业务量增速的5倍,每日增量数据接近100TB,2015年短短2个月内业务量增长10倍,数据量增长了50倍,上海主生产机房不堪重负。30GB的DDoS攻击对业务系统造成较大风险,上云成为承载大数据、抗网络攻击的好方法。 3) 高可用性挑战:众所周知,IDC自建系统运维要承担从底层硬件到上层应用的“全栈运维”运营能力与维修能力,当2015年夏天上海数据中心故障发生,主核心交换机宕机时,备核心交换机Bug同时被触发,从事故发生到硬件厂商携维修设备打车赶往现场维修的整个过程中,饥饿的消费者无法订餐吃饭,技术团队第一次经历业务中断而束手无策,才下定决心大笔投入混合云灾备的建设,“吃一堑,长一智”,持续向淘宝学习电商云生产与灾备架构,以自动化运维替代人肉运维,从灾备向多活演进,成为饿了么企业架构转型的必经之路。 4) 大数据精益运营:不论网络打车还是网络订餐,共享服务平台脱颖而出的关键成功要素是智能调度算法,以大数据训练算法提升调度效率,饿了么在高峰时段内让百万“骑士”(送餐快递员)完成更多订单是算法持续优化的目标,而这背后隐藏着诸多复杂因素,包括考虑餐厅、骑士、消费者三者的实时动态位置关系,把新订单插入现有“骑士”的行进路线中,估计每家餐厅出餐时间,每个骑手的行进速度、道路熟悉程度各不相同,新老消费者获客成本、高价低价订单的优先级皆不相同。种种考量因素合并到一起,对于人类调度员来说,每天中午和晚上的高峰都是巨大的挑战。以上海商城路配送站为例,一个调度员每6秒钟就要调度1单,他需要考虑骑手已有订单量、路线熟悉度等。因此可以说,这份工作已经完全不适合人类。但对人工智能而言,阿里云ET则非常擅长处理这类超复杂、大规模、实时性要求高的“非人”问题。 饿了么是中国最大的在线外卖和即时配送平台,日订单量900万单、180万骑手、100万家餐饮店,既是史无前例的计算存储挑战,又是人无我有的战略发展机遇。饿了么携手阿里云人工智能团队,通过海量数据训练优化全球最大实时智能调度系统。在基础架构层,云计算解决弹性支撑业务量波动的基础生存问题,在数据智能层,利用大数据训练核心调度算法、提升餐饮店的商业价值,才是业务决胜的“技术神器”。 在针对大数据资源的“专家+机器”运营分析中,不断发现新的特征: 1) 区域差异性:饿了么与阿里云联合研发小组测试中发现有2个配送站点出现严重超时问题。后来才知道:2个站点均在成都,当地人民喜欢早、中餐一起吃,高峰从11点就开始了。习惯了北上广节奏的ET到成都就懵了。据阿里云人工智能专家闵万里分析:“不存在一套通用的算法可以适配所有站点,所以我们需要让ET自己学习或者向人类运营专家请教当地的风土人情、饮食习惯”。除此之外,饿了么覆盖的餐厅不仅有高大上的连锁店,还有大街小巷的各类难以琢磨的特色小吃,难度是其他智能调度业务的数倍。 2) 复杂路径规划:吃一口热饭有多难?送餐路径规划比驾车出行路径规划难度更高,要考虑“骑士”地图熟悉程度、天气状况、拼单效率、送餐顺序、时间对客户满意度影响、送达写字楼电梯等待时间等各种实际情况,究竟ET是如何实现智能派单并确保效率最优的呢?简单来说,ET会将配送站新接订单插入到每个骑手已有的任务中,重新规划一轮最短配送路径,对比哪个骑手新增时间最短。为了能够准确预估新增时间,ET需要知道全国100万家餐厅的出餐速度、超过180万骑手各自的骑行速度、每个顾客坐电梯下楼取餐的时间。一般来说,餐厅出餐等待时间占到了整个送餐时间的三分之一。ET要想提高骑手效率,必须准确预估出餐时间以减少骑手等待,但又不能让餐等人,最后饭凉了。饿了么旗下蜂鸟配送“准时达”服务单均配送时长缩短至30分钟以内。 3) 天气特殊影响:天气等环境因素对送餐响应时间影响显著,要想计算骑手的送餐路程时间,ET需要知道每个骑手在不同区域、不同天气下的送餐速度。如果北京雾霾,ET能看见吗?双方研发团队为ET内置了恶劣天气的算法模型。通常情况下,每逢恶劣天气,外卖订单将出现大涨,对应的餐厅出餐速度和骑手骑行速度都将受到影响,这些ET都会考虑在内。如果顾客在下雪天点个火锅呢?ET也知道,将自动识别其为大单,锁定某一个骑手专门完成配送。 4) 餐饮营销顾问:饿了么整体业务涉及C端(消费者)、B端(餐饮商户)、D端(物流配送)、BD端(地推营销),以往区域业务开拓考核新店数量,现在会重点关注餐饮外卖“健康度”,对于营业额忽高忽低、在线排名变化的餐饮店,都需要BD专家根据大数据帮助餐饮店经营者找出原因并给出解决建议,避免新店外卖刚开始就淹没在区域竞争中,销量平平的新店会离开平台,通过机器学习把餐饮运营专家的经验、以及人看不到的隐含规律固化下来,以数据决策来发现餐饮店经营问题、产品差异定位,让餐饮商户尝到甜头,才愿意继续经营。举个例子,饿了么员工都喜欢楼下一家鸡排店的午餐,但大数据发现这家店的外卖营收并不如实体店那么火爆,9元“鸡排+酸梅汁”是所有人都喜欢的爆款产品,可为什么同样菜品遭遇“线下火、线上冷”呢?数据预警后,BD顾问指出线上外卖鸡排产品没有写明“含免费酸梅汁一杯”的关键促销内容,导致大多数外卖消费者订一份鸡排一杯酸梅汁,却收到一份鸡排两杯酸梅汁,体验自然不好。 饿了么是数据驱动、智能算法调度的自动化生活服务平台,通过O2O数据的在线实时分析,与阿里云人工智能团队不断改进算法,以“全局最优”取代“局部最优”,保证平台上所有餐饮商户都能享受到数据智能的科技红利。 “上云用数”的外部价值诸多,从饿了么内部反馈来看,上云不仅没有让运维团队失去价值,反而带来了“云原生应用”(Cloud Native Application)、“云上多活”、“CDN云端压测”、“安全风控一体化”等创新路径与方案,通过敏捷基础设施(IaaS)、微服务架构(PaaS和SaaS)、持续交付管理、DevOps等云最佳实践,摆脱“人肉”支撑的种种困境,进而实现更快的上线速度、细致的故障探测和发现、故障时能自动隔离、故障时能够自动恢复、方便的水平扩容。饿了么CTO张雪峰先生说:“互联网平台型组织,业务量涨数倍,企业人数稳定降低,才是技术驱动的正确商业模式。” 在不久的将来,你每天订餐、出行、娱乐、工作留下的大数据,会“驯养”出无处不在、无所不能的智能机器人管家,家庭助理帮你点菜,无人机为你送餐,聊天机器人接受你的投诉……当然这个无比美妙的“未来世界”背后,皆有阿里云的数据智能母体“ET”。 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_34126557/article/details/90592502。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-01-31 14:48:26
343
转载
转载文章
...的最简单模型及其编程实现》,可能用C++,也可能用Java,Python,看作者的心情吧。预计近几个月出吧,快则个把月,多则不知道了,毕竟作者本身还是比较忙的,忙七忙八也不知道在忙什么,嗯,就这样。 小号:在有多个游戏账号的前提下,等级高的号叫作大号,等级较低或者新创建的号叫作小号。 ↩︎ https://baijiahao.baidu.com/s?id=1586028525096880374&wfr=spider&for=pc. ↩︎ http://tieba.baidu.com/p/5127924201. ↩︎ http://tieba.baidu.com/p/5127924201. ↩︎ http://www.lwlm.com/sixiangzhexue/201704/840820.htm. ↩︎ 详细讨论请参见:《未来简史:从智人到智神》第三章:人类的特质。 ↩︎ “Unconscious determinants of free decisions in the human brain” in nature neuroscience, http://www.rifters.com/real/articles/NatureNeuroScience_Soon_et_al.pdf. ↩︎ 本篇文章为转载内容。原文链接:https://blog.csdn.net/qq_39384184/article/details/79288150。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-01-02 11:30:59
620
转载
转载文章
...时长、流程复杂,无法实现原位检测或远程快速检测。使用激光诱导击穿光谱(LIBS)可以有效改善上述问题,但是其准确率低,存在相邻特征谱线干扰。激光诱导击穿光谱联合激光诱导荧光技术(LIBS-LIF)则是对LIBS技术的进一步强化升级,满足了检测需求。文章首先介绍了LIBS技术以及LIBS-LIF技术的基本原理;接着简要介绍LIBS-LIF技术在土壤监测的应用情况,介绍了技术的应用起源和研究进展;然后介绍LIBS技术和LIBS-LIF技术在水质监测方面的应用,由于液体检测中对于预处理的方式最为重要,因此此处简要归纳了液体检测样品预处理的方法,最后对LIBS-LIF技术在环境方面的应用做出总结和展望。LIBS-LIF技术具有着传统实验室检测无法比拟的优势,也正处于热门研究方向,未来潜力无限。 关键词: 激光诱导击穿光谱(LIBS);激光诱导击穿光谱联合激光诱导荧光技术(LIBS-LIF);环境监测;土壤监测;水质监测 Elemental Analysis Application of Laser Induced Breakdown Spectroscopy assisted with Laser Induced fluorescence(LIBS-LIF) Technology in Environmental Monitoring Abstract: The importance of environmental monitoring is becoming more and more significant under the background of increasingly prominent environmental problems. Among the environmental problems, soil problem and water quality problem is one of the very important topics. Element analysis is often used for soil monitoring and water quality monitoring. Although the traditional laboratory detection method has high accuracy and good accuracy, it takes a long time and the process is complex, so it is impossible to realize in-situ detection or remote rapid detection. Laser induced breakdown spectroscopy (LIBS) can effectively improve the above problems, but its accuracy is low and there is interference between adjacent characteristic lines. Laser-induced breakdown spectroscopy assisted with laser-induced fluorescence (LIBS-LIF) is a further enhancement and upgrade of LIBS technology to meet the detection needs. This paper first introduces the basic principles of LIBS technology and LIBS-LIF technology, then briefly introduces the application of LIBS-LIF technology in soil monitoring, and introduces the application origin and research progress of LIBS-LIF technology. Then it introduces the application of LIBS technology and LIBS-LIF technology in water quality monitoring. Because the way of pretreatment is the most important in liquid detection, the pretreatment methods of liquid testing samples are briefly summarized here. Finally, the application of LIBS-LIF technology in the environment is summarized and prospected. LIBS-LIF technology has incomparable advantages over traditional laboratory testing, and it is also in a hot research direction, with unlimited potential in the future. Keywords: Laser induced breakdown spectroscopy(LIBS); Laser induced breakdown spectroscopy assisted with Laser Induced fluorescence(LIBS-LIF); Environmental monitoring; Soil monitoring; Water quality monitoring Completion time: 2021-11 目录 0. 引言 1. 技术简介 1.1 LIBS技术简介 1.1.1 LIBS技术的基本原理 1.1.2 LIBS技术的定量分析 1.1.3 LIBS技术的优缺点 1.2 LIBS-LIF技术 1.2.1 LIF技术的基本原理 1.2.2 Co原子的LIBS-LIF增强原理 2. LIBS-LIF技术用于土壤监测 2.1 早期研究 2.2 近期研究现状 3. LIBS及LIBS-LIF技术用于水质监测 3.1液体直接检测 3.2液固转换检测 3.2.1吸附法 3.2.2成膜法 3.2.3微萃取法 3.2.4冷冻法 3.2.5电沉积法 3.3液气转换检测 4. 总结与展望 参考文献 0. 引言 随着经济的发展,人们物质生活水平提高的同时,环境的问题也愈发突出,其中,土壤问题和水体问题十分突出。 土壤是包括人类在内的一切生物体生存的载体,土壤的质量与农作物的生长息息相关,而农作物的收成则是人类发展的基石。在工业化发展的影响下,土壤重金属污染和积累成为了一个世界性的问题,尤其在中国特别是长三角地区尤为严重[1]。 水是生命之源,水体问题直接关系到所有生物体的生存。环境中的水体问题,主要集中在工业废水的治理与监测上。工业废水中含有大量重金属元素,其难以生物降解,重金属元素会随着水体流动而扩散。 物质元素分析在土壤分析和水质分析上是常用的方式。传统的分析方法是基于实验室的元素光谱分析法,其具有高精度、高稳定的特点,如:原子吸收光谱法(Atomic absorption spectrometry, AAS)、电感耦合等离子体质谱法(Inductively coupled plasma mass spectrometry, ICP-MS)、电感耦合等离子体原子发射光谱法(Inductively coupled plasma atomic emission spectrometry, ICP-AES)等,但是此类光谱的检测样品预处理复杂、检测操作难度高、需要庞大复杂的实验设备,且对样品造成损坏,有所不便[2,3]。 激光诱导击穿光谱(Laser induced breakdown spectroscopy,LIBS)是一种基于原子光谱分析技术,与传统的光谱分析技术相比,其实验装置简单便携、操作简便、应用广泛、可远程测量,同时有在简单预处理样品或根本不预处理的情况下进行现场测量的潜力。因此,其满足在环境监测中,特别是土壤监测和水质监测此类希望可以在现场检测、快速便捷检测,同时精度较高的需求。LIBS技术很容易与其他技术如激光诱导荧光技术(Laser induced fluorescence, LIF)、拉曼光谱(Raman)等技术联用,进一步提高了 LIBS技术的检测准确度和竞争力[4]。 1. 技术简介 1.1 LIBS技术简介 LIBS技术最早可以追溯到20世纪60年代Brech, F.和Cross, L.所做的激光诱导火花散射实验,其中的一项实验使用红宝石激光器产生的激光照射材料后产生等离子体羽流。经过了几十年的发展,LIBS技术得到了显著发展,其在环境检测、文物保护鉴定、岩石检测、宇宙探索等领域中被广泛应用。 1.1.1 LIBS技术的基本原理 LIBS技术的装置主要由脉冲激光器、光谱仪、样品装载平台和计算机组成,光谱仪和计算机之间常常由光电倍增管或CCD等光电转换器件连接,如图 1所示[3]。 图 1 LIBS实验装置图[3] 首先,通过脉冲激光器产生强脉冲激光后由透镜聚焦到样品上,被聚焦区域的样品吸收,产生初始自由电子,并在持续的激光脉冲作用下加速。初始自由电子获取到足够高的能量之后,会轰击原子电离产生新的自由电子。随着激光脉冲作用的持续,自由电子和原子的作用如此往复碰撞,在短时间内形成等离子体,形成烧蚀坑。接着,激光脉冲结束,等离子体温度逐渐降低,产生连续背景辐射并产生原子或离子的发射光谱。通过光谱仪采集信号,在计算机上分析特征谱线的波长和强度信息就可以对样本中的元素进行定性和定量分析[2]。 1.1.2 LIBS技术的定量分析 由文献[2]可知,LIBS技术的定量分析方法通常有外标法、内标法和自由校准法(CF)。其中,最简单方便的是外标法。 外标法由光谱分析基本定量公式Lomakin-Scheibe公式 I=aCb(1)I=aC^b \tag{1} I=aCb(1) 式中III为光谱强度,aaa为比例系数,CCC为元素浓度,bbb为自吸收系数。自吸收系数bbb会随着元素浓度CCC的减小而增大,当元素浓度CCC很小时,b=1b=1b=1。使用同组仪器测量时aaa和bbb的值为定值。 将式(1)左右两边取对数,得 lgI=blgC+lga(2)lgI=blgC+lga \tag{2} lgI=blgC+lga(2) 由式(2)可知,当b=1时,光谱强度和元素浓度呈线性关系。因此,可以通过检验一组标准样品的元素浓度和对应的光谱强度,绘制出对应的标准曲线,从而根据曲线的得到未知样品的浓度值。 如图 2 (a)(b)所示,通过使用LIBS技术多次测定一系列含有Co元素的标准样品的光谱强度后取平均可以绘制出图 2 (b)所示的校正曲线[5]。同时可以计算出曲线的相关系数R^2、交叉验证均方差(RMSECV)和样品中Co元素的检出限(LOD)。 图 2 用LIBS和LIBS-LIF技术测定有效钴元素的光谱和校准曲线[5] (a) (b)使用LIBS技术测定,(c) (d)使用LIBS-LIF技术测定 1.1.3 LIBS技术的优缺点 随着LIBS技术的提高和广泛应用,其自身独特的优势也显示出来,其主要优点主要如下[6]: (1)样品不需要进行预处理或只需要稍微预处理。 (2)样品检测时间短,相较于传统的AAS、ICP-AES等技术检测需要几分钟到几小时的时间相比,LIBS技术检测只需要3-60秒。 (3)样品的检出限LOD高,对于低浓度样品检测更加灵敏精确。 (4)实验装置结构简单,便携性高。 (5)可用于远程遥感监测 (6)对于检测样品的损伤基本没有,十分适合对于文物遗迹等方面进行应用 LIBS技术也有着自身的缺陷,其中问题最大的就是相较于传统的AAS、ICP-AES等技术来说,LIBS的检测准确性低,只有5-20%。 但LIBS还有一个优点在于很容易与其他技术如激光诱导荧光技术(Laser induced fluorescence, LIF)、拉曼光谱(Raman)等技术联用,可以弥补LIBS技术的检测准确率低的缺陷,同时结合其他技术的优势提高竞争力[7]。 1.2 LIBS-LIF技术 LIBS技术常常与LIF技术联合使用,即LIBS-LIF技术。通过LIF技术对特征曲线信号的选择性加强作用,有效的提高了检测的准确率,改善了单独使用LIBS检测准确率低的缺陷。 LIBS-LIF技术在1979年由Measures, R. M.和Kwong, H. S.首次使用,用于各种样品中微量铬元素的选择性激发。 1.2.1 LIF技术的基本原理 LIF技术,是通过激光辐射激发原子或者分子,之后被照射的原子或分子自发发射出的荧光。 首先,调节入射激光的波长,从而改变入射激光的能量。之后,当入射激光的能量与检测区域中的气态分子或原子的能级差相同时,分子或原子将被激光共振激发跃迁至激发态,但是这种激发态并不稳定,会通过自发辐射释放出另一个光子能量并向下跃迁,同时发射出分子或原子荧光,这便是激光诱导荧光。 其中,分子或原子发射荧光的跃迁过程主要有共振荧光、直越线荧光、阶跃线荧光和多光子荧光四种,如图3所示[2]。元素被激发的直跃线荧光往往强度大,散射光干扰弱,故被常用。 图 3 分子或原子发射荧光的跃迁过程[2] 1.2.2 Co原子的LIBS-LIF增强原理 下面将以Co元素为例,说明LIBS-LIF技术的原理。 Co元素直跃线荧光的产生原理图如图 4所示[5]。波长为304.40nm的激光能量刚好等于Co原子基态到高能态(4.07eV)的能级差,Co原子被304.40nm的激发照射后跃迁至该能级。随后,该能级上的Co原子通过自发辐射释放能量跃迁至低能态(0.43eV),同时发出波长为304.51nm的荧光。因此,采用LIF的激发波长为304.40nm,光谱仪对应的检测波长为304.51nm。 图 4 Co元素直跃线荧光产生原理图[5] LIBS-LIF技术的装置如图 5所示[5],与LIBS装置不同的是其增加了一台可调激光器,如染料激光器、OPO激光器等。其用于激发特定元素的被之前LIBS激发出的等离子体。该激光平行于样品表面照射,不会对样品产生损伤。 图 5 LIBS-LIF实验装置图[5] 在本次Co元素的检测中,OPO激光器的波长为304.40nm。样品首先通过脉冲激光器垂直照射后产生等离子体,原理和LIBS技术一致。之后使用OPO激光器产生的304.40nm的激光照射等离子体,激发荧光信号,增强特征谱线的强度。最后通过光谱仪采集信号,在计算机上分析特征谱线。 LIBS-LIF技术对Co原子测定的光谱和校正曲线如图 2 (c)(d)所示。通过与(a)(b)图对可得到,使用LIBS-LIF技术明显增强了Co原子的特征谱线强度,同时定量分析得到的校正曲线的相关系数R^2、交叉验证均方差(RMSECV)和样品中Co元素的检出限(LOD)数值都有很好的改善。 2. LIBS-LIF技术用于土壤监测 土壤监测是LIBS-LIF技术的最传统应用方向之一。土壤成分复杂,蕴含多种微量元素,这些元素必须维持在合理的范围内。若如铬等相关微量元素过低,则会对作物的生长产生影响;而若铅等重金属元素过高,则表明土地受到了污染,种植出的作物可能存在重金属残留的问题。 2.1 早期研究 LIBS-LIF技术用于大气压下的土壤元素检测可以最早追溯到1997年Gornushkin等人使用LIBS技术联合大气紫外线测定石墨、土壤和钢中钴元素的可行性[8],其紫外线即起到作为LIF光源的作用。 之后,为了评估该技术在现场快速检测分析中的可行性,其使用了可以同时检测分析22种元素的Paschen-Runge光谱仪以发挥LIBS技术可以快速检测多种元素的优势。同时使用染料激光器作为LIF光源,使用LIBS-LIF技术对Cd和TI元素进行了信号选择性增强测量,排除了邻近元素谱线的干扰。但是对于Pb元素还无法检测[9]。 2.2 近期研究现状 华中科技大学GAO等人在2018年对土壤中难以检测的Sb元素使用LIBS-LIF技术进行检验,排除了检验Sb元素时邻近Si元素的干扰,并探讨了使用常规LIBS时在287nm-289nm的波长下不同的ICCD延时长度对信号强度的影响,以及使用LIBS-LIF技术时作为LIF光源的OPO激光器激光能量对Sb元素特征谱线信号强度与信噪比的影响、激光光源脉冲间延时长度对Sb元素特征谱线信号强度与信噪比的影响,由相关结果得到了最优实验条件[10],如图 6至图 8所示。 图 6 不同ICCD延迟时间下样品在287.0-289.0 nm波段的光谱 图 7 LIBS-LIF和常规LIBS得到的光谱比较 图 8 Sb特征谱线的强度和信噪比曲线 (A)Sb特征谱线的强度和信噪比随OPO激光能量的变化关系;(B)Sb特征谱线的强度和信噪比随两个激光器之间脉冲延迟的变化关系 近期,该实验室研究了利用LIBS-LIF测定土壤中的有效钴含量。该实验着重于研究检测土壤中能被植物吸收的元素,即有效元素,强化研究的实际意义;利用DPTA提取样品,增大检测浓度;使用LIBS-LIF测定有效钴含量,排除了相邻元素的干扰。 3. LIBS及LIBS-LIF技术用于水质监测 LIBS及LIBS-LIF技术用于水质检测的原理和流程土壤检测基本一致,但是面临着更多的挑战。在水样的元素定量测定中,水的溅射会干扰到光的传播和收集,从而降低采集的灵敏度;由于水中羟基(OH)的猝灭作用会使得激发的等离子体寿命较短,因此等离子体的辐射强度低,进而影响分析灵敏度[2]。同时,由于部分实验方式造成使用LIBS-LIF技术不太方便,只能使用传统LIBS技术。 因此,在使用LIBS技术进行检验时还需要做相关改进。最常见的就是进行样品的预处理,在样品制备上进行改进。 由文献[11]整理可知,样品的预处理主要可以分为液体直接检测、液固转换检测、液气转换检测三种。 3.1液体直接检测 液体直接检测主要有两种方式:将光聚焦在静态液体测量和将光聚焦在流动的液体测量两种。 最早期使用LIBS技术进行检验的就是直接将光聚焦在静态液体表面测量。但其精确度和灵敏度往往比将光聚焦在流动的液体测量低。Barreda等人比较了在静态、液体喷射态和液体流动态下硅油中的铂元素使用LIBS进行检测,最后液体喷射态和液体流动态下的LOD比静态下降低了7倍[12]。 但上述实验是在有气体保护下进行的结果。总体上看,液体直接检测并不是一个很好的选择。 图 9 液体分析的三种不同实验装置图[12] a液体喷射分析,b静态液体分析,c通道流动液体分析 3.2液固转换检测 液固转换法是检测中最常用的方法,其主要可以分为以下几类: 3.2.1吸附法 吸附法是最常用的预处理方式,利用可吸附材料吸收液体中的微量元素。常用的材料有碳平板、离子交换聚合物膜,或者滤纸、竹片等将液体转换为固体,从而进行分析。 2008年,华南理工大学Chen等人以木片作为基底吸附水溶液的方式测定了Cr、Mn、Cu、Cd、Pb五种金属元素在微量浓度下的校正曲线,其检出限比激光聚焦在页面上直接分析高出2-3个数量级[13]。之后2017年,同实验室的Kang等人以木片作为基底吸附水溶液的方式,使用LIBS-LIF技术对水中的痕量铅进行了高灵敏度测量,最后得到的铅元素的LOD为~0.32ppb,超过了传统实验室检测技术ICP-AES的检测方式,为国际领先水平[14]。 3.2.2成膜法 与吸附法相反,成膜法是将水样滴在非吸水性衬底上,如Si+SiO2衬底和多空电纺超细纤维等,然后干燥成膜,从而转化为固体进行分析。 3.2.3微萃取法 微萃取法是利用萃取剂和溶液中的微量元素化学反应来实现富集。其中,分散液液体微萃取(Dispersion liquid-liquid microextraction, DLLME)是一种简单、经济、富集倍数高、萃取效率高的方法,被广泛使用。 3.2.4冷冻法 将液体冷冻成为冰是液固转化的一种直接预处理方式,冰的消融可以防止液体飞溅和摇晃,从而改善液体分析性能。 3.2.5电沉积法 电沉积法是利用电化学反应,将液体中的样品转化为固体样品并进行预浓缩,之后用于检测。该方法可以使得灵敏度大大提高,但是实验设备也变得复杂,预处理工作量也有变大。 3.3液气转换检测 将液体转化为气溶胶可以使得样品更加稳定,从而产生更稳定的检测信号。可以使用超声波雾化器和膜干燥器等产生气溶胶,再进行常规的LIBS-LIF检测。 Aras等人使用超声波雾化器和薄膜干燥器单元产生亚微米级的气溶胶,实现了液气体转换,并在实际水样上测试了该超声雾化-LIBS系统的适用性,相关实验装置如图 10、图 11所示[15]。 图 10 用于金属气溶胶分析的LIBS实验装置图[15] M:532 nm反射镜,L:聚焦准直透镜,W:石英,P:泵浦,BD:光束转储 图 11 样品导入部分结构图[15] (A)与薄膜干燥器相连的USN颗粒发生器去溶装置(加热器和冷凝器);(B)与5个武装聚四氟乙烯等离子电池相连的薄膜干燥器。G:进气口,DU:脱溶装置,W:废料,MD:薄膜干燥机,L:激光束方向,C:样品池,M:反射镜,F.L.:聚焦透镜 4. 总结与展望 本文简要介绍了LIBS和LIBS-LIF的原理,并对LIBS-LIF在环境监测中的土壤监测和水质检测做了简要的介绍和分类。 LIBS-LIF在土壤监测的技术已经逐渐成熟,基本实现了土壤的快速检测,同时也有相关便携式设备的研究正在进行。对于水质监测方面,使用LIBS-LIF检测往往集中在液固转换法的使用上,对于气体和液体直接检测,由于部分实验装置的限制,联用LIF技术往往比较困难,只能使用传统的LIBS技术。 LIBS-LIF技术快速检测、不需要样品预处理或只需要简单处理、可以实现就地检测等优势与传统实验室检测相比有着独到的优势,虽然目前由于技术限制精度还不够高,但是在当前该领域的火热研究趋势下,相信未来该技术必定可以大放异彩,为绿色中国奉献光学领域的智慧。 参考文献 [1] Hu B, Jia X, Hu J, et al.Assessment of Heavy Metal Pollution and Health Risks in the Soil-Plant-Human System in the Yangtze River Delta, China[J].International Journal of Environmental Research and Public Health,2017, 14 (9): 1042. [2] 康娟. 基于激光剥离的物质元素高分辨高灵敏分析的新技术研究[D]. 华南理工大学,2020. [3] 马菲, 周健民, 杜昌文.激光诱导击穿原子光谱在土壤分析中的应用[J].土壤学报: 1-11. [4] Gaudiuso R, Dell'aglio M, De Pascale O, et al.Laser Induced Breakdown Spectroscopy for Elemental Analysis in Environmental, Cultural Heritage and Space Applications: A Review of Methods and Results[J].Sensors,2010, 10 (8): 7434-7468. [5] Zhou R, Liu K, Tang Z, et al.High-sensitivity determination of available cobalt in soil using laser-induced breakdown spectroscopy assisted with laser-induced fluorescence[J].Applied Optics,2021, 60 (29): 9062-9066. [6] Hussain Shah S K, Iqbal J, Ahmad P, et al.Laser induced breakdown spectroscopy methods and applications: A comprehensive review[J].Radiation Physics and Chemistry,2020, 170. [7] V S D, George S D, Kartha V B, et al.Hybrid LIBS-Raman-LIF systems for multi-modal spectroscopic applications: a topical review[J].Applied Spectroscopy Reviews,2020, 56 (6): 1-29. [8] Gornushkin I B, Kim J E, Smith B W, et al.Determination of Cobalt in Soil, Steel, and Graphite Using Excited-State Laser Fluorescence Induced in a Laser Spark[J].Applied Spectroscopy,1997, 51 (7): 1055-1059. [9] Hilbk-Kortenbruck F, Noll R, Wintjens P, et al.Analysis of heavy metals in soils using laser-induced breakdown spectrometry combined with laser-induced fluorescence[J].Spectrochimica Acta Part B-Atomic Spectroscopy,2001, 56 (6): 933-945. [10] Gao P, Yang P, Zhou R, et al.Determination of antimony in soil using laser-induced breakdown spectroscopy assisted with laser-induced fluorescence[J].Appl Opt,2018, 57 (30): 8942-8946. [11] Zhang Y, Zhang T, Li H.Application of laser-induced breakdown spectroscopy (LIBS) in environmental monitoring[J].Spectrochimica Acta Part B: Atomic Spectroscopy,2021, 181: 106218. [12] Barreda F A, Trichard F, Barbier S, et al.Fast quantitative determination of platinum in liquid samples by laser-induced breakdown spectroscopy[J].Anal Bioanal Chem,2012, 403 (9): 2601-10. [13] Chen Z, Li H, Liu M, et al.Fast and sensitive trace metal analysis in aqueous solutions by laser-induced breakdown spectroscopy using wood slice substrates[J].Spectrochimica Acta Part B: Atomic Spectroscopy,2008, 63 (1): 64-68. [14] Kang J, Li R, Wang Y, et al.Ultrasensitive detection of trace amounts of lead in water by LIBS-LIF using a wood-slice substrate as a water absorber[J].Journal of Analytical Atomic Spectrometry,2017, 32 (11): 2292-2299. [15] Aras N, Yeşiller S Ü, Ateş D A, et al.Ultrasonic nebulization-sample introduction system for quantitative analysis of liquid samples by laser-induced breakdown spectroscopy[J].Spectrochimica Acta Part B: Atomic Spectroscopy,2012, 74-75: 87-94. 本篇文章为转载内容。原文链接:https://blog.csdn.net/yyyyang666/article/details/129210164。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-08-13 12:41:47
360
转载
站内搜索
用于搜索本网站内部文章,支持栏目切换。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
curl -I http://example.com
- 获取HTTP头部信息。
推荐内容
推荐本栏目内的其它文章,看看还有哪些文章让你感兴趣。
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
历史内容
快速导航到对应月份的历史文章列表。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"