- Redis学习总结(15)——Redis 基本数据类型使用场景
一杯甜酒
RedisRedis基本数据类型使用场景
一、StringStrings数据结构是简单的key-value类型,value其实不仅是String,也可以是数字.常用命令:set,get,decr,incr,mget等。应用场景:String是最常用的一种数据类型,普通的key/value存储都可以归为此类.即可以完全实现目前Memcached的功能,并且效率更高。还可以享受Redis的定时持久化,操作日志及Replication等功能。除
- QT读写excel
FlechazoCLF
嵌入式软件开发代码库qtexcel单片机
最近呢在做一个生产工具,这样的需要将这表格里的元素存下来,支持导入导出首先需要这几个头文件#include"QFileDialog"#include"QAxObject"#include#include"QFile"读取excel//读取excelvoidMainWindow::vexcelReadInfo(QStringbutton){staticQStringstrFile=QFileDial
- qt曲线绘制
wushuang443
qt
#ifndefCSENSORLINE_H#defineCSENSORLINE_H#include#include#include#include#include#include#include#include#include#include#include#include#include#includeenumLINE_TYPE{LINE_TYPE_ONE,LINE_TYPE_TWO,LINE_T
- 【pycharm专业版】【如何远程配置Python解释器】【SSH】
资源存储库
pythonpycharm
Wejustlookedatconfiguringalocalinterpreter.Butwedon’talwayshavea“local”environment.Sometimes–andincreasinglyoften–ourenvironmentisoverthere.我们刚刚看了配置本地解释器。但我们并不总是有一个“本地”的环境。有时候–而且越来越多的时候–我们的环境就在那里。Let’
- Nginx反向代理、使用OneinStack配置Nginx、多网站配置、多域名配置
2401_86637663
nginx运维
cdoneinstacksudoshvhost.sh如果出现以下异常:vhost.sh:23:pushd:notfoundvhost.sh:40:./include/check_os.sh:[[:notfoundvhost.sh:40:./include/check_os.sh:vhost.sh:40:./include/check_os.sh:^RedHat$:notfound^Rocky:no
- C++ Vector的使用(上)
叶羽西
C++c++开发语言
注:这里以C++11版本为基础,简单介绍vector的特性和常见使用。目录vector简介vector特性vector的定义vector对象的构造和初始化1.构造一个空的vector2.构造一个容量大小为n的vector3.构造一个vector,初始值为指定的数据片段4.拷贝构造一个vector对象5.移动构造一个vector对象6.直接使用列表初始化&构造vector对象vector中元素的遍历
- uptime命令详解
半桶水专家
运维linux网络
uptime是Linux/Unix系统中的一个非常常用的命令,用于显示系统的运行时间、当前时间、登录用户数以及系统负载(loadaverage)。下面是对uptime命令的详细解释。一、基本语法uptime[参数]常用参数:参数说明无显示当前时间、系统运行时间、用户数、平均负载-p只显示系统已运行的时间(pretty格式)-s显示系统最近的启动时间(since)-h显示帮助信息二、命令输出详解示例
- Apache Seata < 2.3.0 raft反序列化漏洞
墨菲安全
ApacheSeata反序列化漏洞CVE-2025-32897
【高危】ApacheSeata<2.3.0raft反序列化漏洞漏洞描述ApacheSeata(incubating)是一款开源的分布式事务解决方案,用于在微服务架构下提供高性能和简单易用的分布式事务服务。受影响版本中,SeataServer的Raft模块的CustomDeserializer直接通过Class.forName()加载用户可控的类名,未做安全校验,攻击者可借此利用服务端已有的恶意链实
- C语言强制类型转换
事后不诸葛
编程语言(C)c++c语言强制转换
目录整数提升常用的算术转换强制类型转换是把变量从一种类型转换为另一种数据类型。例如,如果想存储一个long类型的值到一个简单的整型中,需要把long类型强制转换为int类型。可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型,如下所示:(type_name)expression请看下面的实例,使用强制类型转换运算符把一个整数变量除以另一个整数变量,得到一个浮点数:#includein
- Flutter:fl_chart 曲线图
sunly_
Flutter:布局组件flutter
#图表fl_chart:^0.69.0//示例数据//prices=[1.05,1.05,1.05,1.051.05,1.05,1.05,1.05]//资产曲线图Widget_buildAssetsCurve(){returnbuildLineChart(Get.context!,item.prices??[],item.increaseStr??'');}//资产曲线图方法,参考CoinPage
- Kotlin 细节三:集合与泛型
假笑骑士
Kotlin基础
Kotlin的Collections与Java的关系Kotlin通过typealias关键字将Kotlin的集合映射为java的集合。目的是:为了以后在更多的平台上运行。只提供接口,具体实现依赖于平台。@SinceKotlin("1.1")publicactualtypealiasRandomAccess=java.util.RandomAccess@SinceKotlin("1.1")publi
- PAT.1143 Lowest Common Ancestor
PAT.1143LowestCommonAncestor题目链接给定一棵BST的前序遍历,根据若干查询给出两节点的最低公共祖先(LowestCommonAncestor)。还是一贯的套路,根据前序中序建树,然后从根开始同时搜索两个节点,找到分叉点即可。一些尝试按照上面的思路,建树->判断->搜索,最终测试点2答案错误,关于测试点2的问题下面会讲。以下代码得分29/30。#includeusingn
- 代码制作数字流星雨_C语言实现流星雨
初酿乖乖
代码制作数字流星雨
#include/***********************宏定义**********************/#definePI3.1415926//圆周率#defineWIDTH200//屏幕宽度,流星出生区域#defineHEIGHT150//屏幕高度,流星出生区域#defineV20//流星速度,单次移动的像素数#defineLENGTH20//流星字符数#defineDELAY30/
- python学智能算法(十五)|机器学习朴素贝叶斯方法进阶-CountVectorizer多文本处理
西猫雷婶
人工智能机器学习python学习笔记机器学习python人工智能深度学习scikit-learn
【1】引言前序学习进程中,已经学习CountVectorizer文本处理的简单技巧,先相关文章链接为:python学智能算法(十四)|机器学习朴素贝叶斯方法进阶-CountVectorizer文本处理简单测试-CSDN博客此次继续深入,研究多文本的综合处理。【2】代码测试首先相对于单文本测试,直接将文本改成多行文本:#引入必要的模块fromsklearn.feature_extraction.te
- PAT A 1057 Stack
Stackisoneofthemostfundamentaldatastructures,whichisbasedontheprincipleofLastInFirstOut(LIFO).Thebasicoper‐ationsincludePush(insertinganelementontothetopposition)andPop(deletingthetopelement).Nowyouar
- linux系统编程 进程间互斥锁
码农第n+1号
c语言
1/*2头文件:#include34获取定义互斥锁的属性:5intpthread_mutexattr_getpshared(constpthread_mutexattr_t*restrictattr,int*restrictpshared);67设置互斥锁的属性:8intpthread_mutexattr_setpshared(pthread_mutexattr_t*attr,intpshared
- 【验证码注册和登录表设计以及流程】
岁月玲珑
数据库微服务数据库
验证码登录注册功能表设计针对手机/邮箱验证码登录和注册功能,我设计了以下表结构:--验证码表(love_auth_code_t)CREATETABLElove_auth_code_t(idBIGINTAUTO_INCREMENTPRIMARYKEYCOMMENT'验证码ID,主键',accountVARCHAR(100)NOTNULLCOMMENT'账号(手机号或邮箱)',codeVARCHAR(
- MySQL自增约束
@一叶之秋
MySQL理论学习
1、自增约束特点:(1)一个表只能有一个自增约束因为一个表只有一个维护自增值的变量。(2)自增约束的列只能是整数列(3)自增约束的列必须是键列(主键,唯一键,外键),实际中一般是主键自增最多2、如何在建表时指定某个列自增createtable【数据库名.】表名称(字段名1xxIntprimarykeyauto_increment,字段名2数据类型【uniquekey】【notnull】defaul
- Linux 系统运行单例模式
weixin_40723768
Linuxlinux
#include#include#include#include#include#include#include#defineLOCK_FILE"./App.pid"intmain(void){charstr[20]={0};intfd;/*openfile*/fd=open(LOCK_FILE,O_WRONLY|O_CREAT,666);if(-1==fd){perror("openerror"
- 【蓝牙】Linux Qt4查看已经配对的蓝牙信息
漫步企鹅
qtlinux蓝牙配对
在Linux系统中使用Qt4查看已配对的蓝牙设备信息,可以基于DBus与BlueZ(Linux下的蓝牙协议栈)进行交互。以下是一个实现方案:1.引入必要的库和头文件确保项目中包含DBus相关的头文件,并链接QtDBus模块:cpp#include#include#include#include2.定义DBus常量用于连接BlueZ服务的DBus接口、服务名和路径:cpp#defineBLUEZ_D
- Linux进程单例模式运行
bantinghy
代码片段linux单例模式javascript
Linux进程单例模式运行#include#include#include#include#include#include#include#includeintwrite_pid(constchar*pidFile){charstr[32]={0};intfd=open(pidFile,O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR);if(fd<0){print
- 刷题巩固-----DAY6(最长上升子序列和)
一颗铜豌豆
刷题巩固算法c++
题目链接活动-AcWing本课程系统讲解常用算法与数据结构的应用方式与技巧。https://www.acwing.com/problem/content/1018/这道题是最后一道刷的lis题,下周开始刷背包九讲这道题的题目虽然有最长上升子序列,但是却不是用最长上升子序列的办法来做的,因为要求从一个上升子序列的和最大,感觉更像01背包的做法解题代码为#includeusingnamespacest
- vue2 keep-alive不生效
Hong.1948
前端vue.js
问题描述路由中配置keepAlive、组件name唯一、标签包裹、路由嵌套,都检查了,keep-alive还是不生效,花了我两三个小时的时间折腾原因全局搜索标签,才发现居然有人在layout--componets--AppMain.vue里写了include……骚操作代码如下::include="['page1','page2','page3']"藏这么深的缓存写法,哎。解决方式include删掉
- 【vue】warning:Avoid mutating a prop directly
Hong.1948
vue.js前端javascript
Avoidmutatingapropdirectlysincethevaluewillbeoverwrittenwhenevertheparentcomponentre-renders.Instead,useadataorcomputedpropertybasedontheprop’svalue.Propbeingmutated:“placement”某天,发现项目中某个页面一直有这个warnin
- springboot项目中构建树结构数据返回
两点王爷
java数据结构数据处理springbootjava树结构
需要构建一个树结构返回(ID,PID),具体示例如下1、创建实体数据表--测试省份数据表DROPTABLEIFEXISTStest_province;CREATETABLEIFNOTEXISTStest_province(idBIGINT(32)NOTNULLAUTO_INCREMENTPRIMARYKEYCOMMENT'表ID',pidBIGINT(32)COMMENT'父级ID',nameVA
- 【一文搞清楚指针结构体还有单链表】
DevangLic
数据结构c++学习链表C
可直接使用测试,开车稳稳的数据结构基础指针结构体链表//结构体与指针-油门踩到底,一口气讲他个水落石出#include#include#includestruct{charname[50];intage;}boy,girl;structPerson{charname[50];intage;floatheight;};typedefstructStudent{charname[50];intage;
- Java 程序员必备的 26 个 Linux 命令,常用 + 面试两手抓
库库林_沙琪马
Linuxlinux面试运维
有人问我:日常开发中最常用的Linux命令有哪些?我不假思索地就列出了26个,涵盖开发、调试、运维场景,每一个都值得收藏+实战。内容速览26个高频Linux命令详解面试官常问的重点命令实操建议&学习指引一、开发者高频使用的26个Linux命令1️⃣cd-切换目录cd/usr/local/bincd..cd~Tips:~表示当前用户主目录,..表示上级目录。2️⃣mkdir-创建目录mkdirmyd
- 数据类型:String
绵阳的脑内SSD
#redis------redis分专栏数据库redis
String目录SetGetMsetMgetIncrIncrbySubstrGetrangeSetrangeString是字符串类型,redis给我们提供了String类型的value,但是内部的实现一共有三种:int、embstr、raw;三种的不同之处在于当value长度较小的时候使用embstr和int,当value长度较大的时候使用raw;另外,当value长度较小的时候,如果是一个数字,
- python里面的全局变量和局部变量的区别(很好的一篇文章,找不到出处,原作者看到请联系,我会署上名字)
scuter_yu
全局变量与局部变量的区别python
python中,对于变量作用域的规定有些不一样。在诸如C/C++、java等编程语言中,默认在函数的内部是可以直接访问在函数外定义的全局变量的,但是这一点在python中就会有问题,下面是一个例子。[plain]viewplaincopy在CODE上查看代码片派生到我的代码片test.py:#!/usr/bin/pythonCOUNT=1deffunc():COUNT=COUNT+1func()P
- 基于OpenCv的运动物体检测算法
Liu_LongPo
计算机视觉OpenCv运动物体检测
基于一个实现的基于OpenCv的运动物体检测算法,可以用于检测行人或者其他运动物体。#include#include#include#includeintmain(intargc,char**argv){//声明IplImage指针IplImage*pFrame=NULL;IplImage*pFrImg=NULL;IplImage*pBkImg=NULL;CvMat*pFrameMat=NULL;
- ASM系列五 利用TreeApi 解析生成Class
lijingyao8206
ASM字节码动态生成ClassNodeTreeAPI
前面CoreApi的介绍部分基本涵盖了ASMCore包下面的主要API及功能,其中还有一部分关于MetaData的解析和生成就不再赘述。这篇开始介绍ASM另一部分主要的Api。TreeApi。这一部分源码是关联的asm-tree-5.0.4的版本。
在介绍前,先要知道一点, Tree工程的接口基本可以完
- 链表树——复合数据结构应用实例
bardo
数据结构树型结构表结构设计链表菜单排序
我们清楚:数据库设计中,表结构设计的好坏,直接影响程序的复杂度。所以,本文就无限级分类(目录)树与链表的复合在表设计中的应用进行探讨。当然,什么是树,什么是链表,这里不作介绍。有兴趣可以去看相关的教材。
需求简介:
经常遇到这样的需求,我们希望能将保存在数据库中的树结构能够按确定的顺序读出来。比如,多级菜单、组织结构、商品分类。更具体的,我们希望某个二级菜单在这一级别中就是第一个。虽然它是最后
- 为啥要用位运算代替取模呢
chenchao051
位运算哈希汇编
在hash中查找key的时候,经常会发现用&取代%,先看两段代码吧,
JDK6中的HashMap中的indexFor方法:
/**
* Returns index for hash code h.
*/
static int indexFor(int h, int length) {
- 最近的情况
麦田的设计者
生活感悟计划软考想
今天是2015年4月27号
整理一下最近的思绪以及要完成的任务
1、最近在驾校科目二练车,每周四天,练三周。其实做什么都要用心,追求合理的途径解决。为
- PHP去掉字符串中最后一个字符的方法
IT独行者
PHP字符串
今天在PHP项目开发中遇到一个需求,去掉字符串中的最后一个字符 原字符串1,2,3,4,5,6, 去掉最后一个字符",",最终结果为1,2,3,4,5,6 代码如下:
$str = "1,2,3,4,5,6,";
$newstr = substr($str,0,strlen($str)-1);
echo $newstr;
- hadoop在linux上单机安装过程
_wy_
linuxhadoop
1、安装JDK
jdk版本最好是1.6以上,可以使用执行命令java -version查看当前JAVA版本号,如果报命令不存在或版本比较低,则需要安装一个高版本的JDK,并在/etc/profile的文件末尾,根据本机JDK实际的安装位置加上以下几行:
export JAVA_HOME=/usr/java/jdk1.7.0_25  
- JAVA进阶----分布式事务的一种简单处理方法
无量
多系统交互分布式事务
每个方法都是原子操作:
提供第三方服务的系统,要同时提供执行方法和对应的回滚方法
A系统调用B,C,D系统完成分布式事务
=========执行开始========
A.aa();
try {
B.bb();
} catch(Exception e) {
A.rollbackAa();
}
try {
C.cc();
} catch(Excep
- 安墨移动广 告:移动DSP厚积薄发 引领未来广 告业发展命脉
矮蛋蛋
hadoop互联网
“谁掌握了强大的DSP技术,谁将引领未来的广 告行业发展命脉。”2014年,移动广 告行业的热点非移动DSP莫属。各个圈子都在纷纷谈论,认为移动DSP是行业突破点,一时间许多移动广 告联盟风起云涌,竞相推出专属移动DSP产品。
到底什么是移动DSP呢?
DSP(Demand-SidePlatform),就是需求方平台,为解决广 告主投放的各种需求,真正实现人群定位的精准广
- myelipse设置
alafqq
IP
在一个项目的完整的生命周期中,其维护费用,往往是其开发费用的数倍。因此项目的可维护性、可复用性是衡量一个项目好坏的关键。而注释则是可维护性中必不可少的一环。
注释模板导入步骤
安装方法:
打开eclipse/myeclipse
选择 window-->Preferences-->JAVA-->Code-->Code
- java数组
百合不是茶
java数组
java数组的 声明 创建 初始化; java支持C语言
数组中的每个数都有唯一的一个下标
一维数组的定义 声明: int[] a = new int[3];声明数组中有三个数int[3]
int[] a 中有三个数,下标从0开始,可以同过for来遍历数组中的数
- javascript读取表单数据
bijian1013
JavaScript
利用javascript读取表单数据,可以利用以下三种方法获取:
1、通过表单ID属性:var a = document.getElementByIdx_x_x("id");
2、通过表单名称属性:var b = document.getElementsByName("name");
3、直接通过表单名字获取:var c = form.content.
- 探索JUnit4扩展:使用Theory
bijian1013
javaJUnitTheory
理论机制(Theory)
一.为什么要引用理论机制(Theory)
当今软件开发中,测试驱动开发(TDD — Test-driven development)越发流行。为什么 TDD 会如此流行呢?因为它确实拥有很多优点,它允许开发人员通过简单的例子来指定和表明他们代码的行为意图。
TDD 的优点:
&nb
- [Spring Data Mongo一]Spring Mongo Template操作MongoDB
bit1129
template
什么是Spring Data Mongo
Spring Data MongoDB项目对访问MongoDB的Java客户端API进行了封装,这种封装类似于Spring封装Hibernate和JDBC而提供的HibernateTemplate和JDBCTemplate,主要能力包括
1. 封装客户端跟MongoDB的链接管理
2. 文档-对象映射,通过注解:@Document(collectio
- 【Kafka八】Zookeeper上关于Kafka的配置信息
bit1129
zookeeper
问题:
1. Kafka的哪些信息记录在Zookeeper中 2. Consumer Group消费的每个Partition的Offset信息存放在什么位置
3. Topic的每个Partition存放在哪个Broker上的信息存放在哪里
4. Producer跟Zookeeper究竟有没有关系?没有关系!!!
//consumers、config、brokers、cont
- java OOM内存异常的四种类型及异常与解决方案
ronin47
java OOM 内存异常
OOM异常的四种类型:
一: StackOverflowError :通常因为递归函数引起(死递归,递归太深)。-Xss 128k 一般够用。
二: out Of memory: PermGen Space:通常是动态类大多,比如web 服务器自动更新部署时引起。-Xmx
- java-实现链表反转-递归和非递归实现
bylijinnan
java
20120422更新:
对链表中部分节点进行反转操作,这些节点相隔k个:
0->1->2->3->4->5->6->7->8->9
k=2
8->1->6->3->4->5->2->7->0->9
注意1 3 5 7 9 位置是不变的。
解法:
将链表拆成两部分:
a.0-&
- Netty源码学习-DelimiterBasedFrameDecoder
bylijinnan
javanetty
看DelimiterBasedFrameDecoder的API,有举例:
接收到的ChannelBuffer如下:
+--------------+
| ABC\nDEF\r\n |
+--------------+
经过DelimiterBasedFrameDecoder(Delimiters.lineDelimiter())之后,得到:
+-----+----
- linux的一些命令 -查看cc攻击-网口ip统计等
hotsunshine
linux
Linux判断CC攻击命令详解
2011年12月23日 ⁄ 安全 ⁄ 暂无评论
查看所有80端口的连接数
netstat -nat|grep -i '80'|wc -l
对连接的IP按连接数量进行排序
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
查看TCP连接状态
n
- Spring获取SessionFactory
ctrain
sessionFactory
String sql = "select sysdate from dual";
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
String[] names = wac.getBeanDefinitionNames();
for(int i=0; i&
- Hive几种导出数据方式
daizj
hive数据导出
Hive几种导出数据方式
1.拷贝文件
如果数据文件恰好是用户需要的格式,那么只需要拷贝文件或文件夹就可以。
hadoop fs –cp source_path target_path
2.导出到本地文件系统
--不能使用insert into local directory来导出数据,会报错
--只能使用
- 编程之美
dcj3sjt126com
编程PHP重构
我个人的 PHP 编程经验中,递归调用常常与静态变量使用。静态变量的含义可以参考 PHP 手册。希望下面的代码,会更有利于对递归以及静态变量的理解
header("Content-type: text/plain");
function static_function () {
static $i = 0;
if ($i++ < 1
- Android保存用户名和密码
dcj3sjt126com
android
转自:http://www.2cto.com/kf/201401/272336.html
我们不管在开发一个项目或者使用别人的项目,都有用户登录功能,为了让用户的体验效果更好,我们通常会做一个功能,叫做保存用户,这样做的目地就是为了让用户下一次再使用该程序不会重新输入用户名和密码,这里我使用3种方式来存储用户名和密码
1、通过普通 的txt文本存储
2、通过properties属性文件进行存
- Oracle 复习笔记之同义词
eksliang
Oracle 同义词Oracle synonym
转载请出自出处:http://eksliang.iteye.com/blog/2098861
1.什么是同义词
同义词是现有模式对象的一个别名。
概念性的东西,什么是模式呢?创建一个用户,就相应的创建了 一个模式。模式是指数据库对象,是对用户所创建的数据对象的总称。模式对象包括表、视图、索引、同义词、序列、过
- Ajax案例
gongmeitao
Ajaxjsp
数据库采用Sql Server2005
项目名称为:Ajax_Demo
1.com.demo.conn包
package com.demo.conn;
import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;
//获取数据库连接的类public class DBConnec
- ASP.NET中Request.RawUrl、Request.Url的区别
hvt
.netWebC#asp.nethovertree
如果访问的地址是:http://h.keleyi.com/guestbook/addmessage.aspx?key=hovertree%3C&n=myslider#zonemenu那么Request.Url.ToString() 的值是:http://h.keleyi.com/guestbook/addmessage.aspx?key=hovertree<&
- SVG 教程 (七)SVG 实例,SVG 参考手册
天梯梦
svg
SVG 实例 在线实例
下面的例子是把SVG代码直接嵌入到HTML代码中。
谷歌Chrome,火狐,Internet Explorer9,和Safari都支持。
注意:下面的例子将不会在Opera运行,即使Opera支持SVG - 它也不支持SVG在HTML代码中直接使用。 SVG 实例
SVG基本形状
一个圆
矩形
不透明矩形
一个矩形不透明2
一个带圆角矩
- 事务管理
luyulong
javaspring编程事务
事物管理
spring事物的好处
为不同的事物API提供了一致的编程模型
支持声明式事务管理
提供比大多数事务API更简单更易于使用的编程式事务管理API
整合spring的各种数据访问抽象
TransactionDefinition
定义了事务策略
int getIsolationLevel()得到当前事务的隔离级别
READ_COMMITTED
- 基础数据结构和算法十一:Red-black binary search tree
sunwinner
AlgorithmRed-black
The insertion algorithm for 2-3 trees just described is not difficult to understand; now, we will see that it is also not difficult to implement. We will consider a simple representation known
- centos同步时间
stunizhengjia
linux集群同步时间
做了集群,时间的同步就显得非常必要了。 以下是查到的如何做时间同步。 在CentOS 5不再区分客户端和服务器,只要配置了NTP,它就会提供NTP服务。 1)确认已经ntp程序包: # yum install ntp 2)配置时间源(默认就行,不需要修改) # vi /etc/ntp.conf server pool.ntp.o
- ITeye 9月技术图书有奖试读获奖名单公布
ITeye管理员
ITeye
ITeye携手博文视点举办的9月技术图书有奖试读活动已圆满结束,非常感谢广大用户对本次活动的关注与参与。 9月试读活动回顾:http://webmaster.iteye.com/blog/2118112本次技术图书试读活动的优秀奖获奖名单及相应作品如下(优秀文章有很多,但名额有限,没获奖并不代表不优秀):
《NFC:Arduino、Andro