首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10000篇文章
优秀的个人博客,低调大师

1.python爬虫基础——正则表达式

#python网络爬虫 #通用网络爬虫(没有目的,爬去所有的URL) 聚焦网络爬虫(过滤无关的链接) #python数据分析与挖掘实战的正则表达式 #正则表达式 世界上信息非常多,而我们关注的信息有限。假如我们希望只提取出关注数据,此时可以通过一些表达式进行提取,正则表达式就是其中一种进行数据筛选的表达式。 #原子 #原子是正则表达式中最基本的组成单位,每个正则表达式中至少要包含一个原子。 #常见的原子类型有:普通字符作为原子,非打印字符作为原子,通用字符作为原子,原子表 import re pat="yue" #普通字符作为原子 string="http://yum.iqianyue.com" rst=re.search(pat,string) print(rst) pat1="\n" #\n \t #非打印字符作为原子 string1='''dsfjsdjf sdfsdfsdfsdf''' rst1=re.search(pat1,string1) print(rst1) pat2="\w\dpython\w" #\w 通用字符,匹配任意字母,数字,下划线 #\d 匹配任意一个十进制数 #\S 除了十进制数的任意 #|s 匹配空白字符 #\S 除了空白字符的任意字符 #\W 匹配任意一个除了字母,数字,下划线的东西 string2="hsdlfsga7pythonkdfshdskjf" rst2=re.search(pat2,string2) print(rst2) pat3="pyth[jsz]n" #原子表 定义一组平等的字符 string3="fsdjfpythjnjslkdfpythsnjfsjpythjsnfsd" rst3=re.search(pat3,string3) print(rst3) #元字符 #正则表达式中具有一些特殊含义的字符,比如重复N次前面的字符等 #. 匹配任意字符 #^ 匹配字符串中的开始位置 #$ 匹配字符串中结束的位置 #* 匹配0次 1次或者多次的前面的原子 #?匹配0次或者1次前面的原子 #+ 匹配一次或多次前面的原子 #{3} 前面的原子恰好出现了3次 并且连在一起的 #{n} 出现了n次 #{4,7} 至少出现4次 之多出现7次 {4,} #t|s 出现t或者s #() 提取某一个内容 pat4=".python..." string4="sjslkdjfpythonslfjshf" rst4=re.search(pat4,string4) print(rst4) pat5="python|php" string5="jfsdjphpjsljfspythonfsd" rst5=re.search(pat5,string5) print(rst5) #模式修正符 #可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能 #I 使正则表达式不区分大小写 #M 多行匹配 #L 本地化识别匹配 #U 根据Unicode解析字符 #S 让点也能匹配包括换行符 pat6="python" pat7="python" string6="sjljfaljafPythonsfjlsjfssfs" rst6=re.search(pat6,string6) print(rst6) rst7=re.search(pat7,string6,re.I) #模式修正符实例,不区分大小写 print(rst7) #贪婪模式和懒惰模式 #贪婪模式尽可能的多的去匹配 #懒惰模式尽可能少的去匹配 pat8="p.*y" #贪婪模式 更多的去覆盖 pat9="p.*?y" #懒惰模式 更精准的定位 string8="jlsjfhspythonslfjshdpy" rst8=re.search(pat8,string8) rst9=re.search(pat9,string8) print(rst8) print(rst9) #正则表达式函数 #正则表达式函数有re.match()函数,re.search()函数,全局匹配函数,re.sub()函数 #re.search() 从字符串中搜索出来 #re.match() 从头开始匹配,如果一开始没有,那么就返回None #全局匹配函数 #re.sub() 主要用于替换 string10="phskfhskjhfkjshfjksgjfyskjhfksdh" rst10=re.match(pat8,string10) print(rst10) rst11=re.compile(pat8).findall(string10) #全局搜索函数 显示所有满足条件的 后面用的最多 print(rst11) #常见正则表达式实例 #匹配.com .cn网址 pat="[a-zA-Z]+://[^\s]*[.com|.cn]" string='<a href="http://www.baidu.com">fjsljflds</a>' rst=re.compile(pat).findall(string) print(rst) #简单的爬虫,如何爬取csdn某个课程页面上的QQ群 pat="<p>(\d*?)</p>" import urllib.request data=urllib.request.urlopen("http://edu.csdn.net/huiyiCourse/detail/215").read() rst=re.compile(pat).findall(str(data)) print(rst) #作业:如何爬取豆瓣出版社列表并写入文件中 #豆瓣网址:https://read.douban.com/provider/all import urllib.request import re data=urllib.request.urlopen("https://read.douban.com/provider/all").read() data=data.decode("utf-8") pat='<div class="name">(.*?)</div>' mydata=re.compile(pat).findall(data) print(mydata) fh=open("/Users/xubin/myapp/pythonfile/出版社file4.txt","w") for i in range(0,len(mydata)): fh.write(mydata[i]+"\n") fh.close()

优秀的个人博客,低调大师

redis的使用和安装,redis基础和高级部分

在后端开发中,为了提高性能,对于一些经常查询但是又不太变化的内容会使用redis,比如前端的列表展示项等,如果数据有变化也可以清空缓存,让前端查一次数据库,所以使用redis相对高效和灵活.本文主要对于redis在linux上的使用和安装进行说明。 1.redis的安装 2.redis常用的命令 3.在阿里云上面安装redis 4.在vwmare上安装redis 5.利用jedis连接redis进行存入和输出 6.redis的高可用,哨兵机制,主从复制(安装三台redis服务器,一台主redis) 7.redis常见错误 8.redis持久化(AOF与RDB区别) 1.首先通过shell连接到阿里云服务器。 image.png 2.输入 yum -y install gcc 进行安装redis 3.输入命令: wget http://download.redis.io/releases/redis-3.2.9.tar.gz image.png 4.输入命令: tar xzf redis-3.2.9.tar.gz cd redis-3.2.9 make MALLOC=libc image.png 5.启动Redis服务 在redis安装目录下的redis.conf文件中的如下内容:默认安装路径是在/root/redis-3.2.9 下面 1、注释掉redis安装目录下的redis.conf文件中的如下数据:bind 127.0.0.1,修改后为#bind 127.0.0.1 2、修改保护模式为非:默认为protected-mode yes ,修改后为protected-mode no 3、设置redis连接密码:找到#requirepass foobared ,在下面添加requirepass 123456 然后启动redis server:输入指令src/redis-server redis.conf image.png 还需要把阿里云上的redis的6379的端口打开 image.png 常用指令 在以上过程中可能会需要重启redis server,终止和重启的命令如下: 1、终止,通过杀死redis的进程 kill -9 进程ID (解释:-9的含义是强制杀死) 进程ID可以通过如下命令查询: ps -ef | grep 'redis' ps aux | grep '6379' --- 查询端口 kill -15 9886 --- 杀死重置 kill -9 9886 --- 强制杀死 在服务器开启后可以开启客户端进行测试 启动客户端并测试 src/redis-cli 带密码的启动方式 ./redis-cli -h 127.0.0.1 -p 6379 -a 123456 -h 是主机IP地址 -p 是端口号 -a 是密码 也可以直接通过代码进行测试 6.通过jedis连接redis,通过java代码实现存储redis,并从redis当中取值 需要在marven当中加入 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> 然后直接写个测试类测试一下 image.png 测试代码 package com.winter.utils.redis; import org.junit.Test; import redis.clients.jedis.Jedis; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; public class TestRedis { private Jedis jedis; // @Before public void setup() { jedis = new Jedis("192.168.184.128", 6379);//连接服务器 jedis.auth("123456");//密码 // } @Test public void test哨兵机制(){ Jedis jedis = new Jedis("192.168.184.128", 6379); // //权限认证,密码设置的是123456 jedis.auth("123456"); jedis.set("name","我是192.168.184.128存在主服务器"); Jedis jedis1 = new Jedis("192.168.184.136", 6379); // //权限认证,密码设置的是123456 jedis1.auth("123456"); String name1 = jedis1.get("name"); System.out.println("我是136从机"+name1); Jedis jedis2 = new Jedis("192.168.184.135", 6379); // //权限认证,密码设置的是123456 jedis2.auth("123456"); String name2 = jedis2.get("name"); System.out.println("我是135从机"+name2); System.out.println("测试从机是否可写"); try { jedis1.set("name2","测试从机是否可写"); jedis2.set("name2","测试从机是否可写"); System.out.println("测试不成功,135从机可以写"); }catch (Exception e){ System.out.println("说明从机没有写的权限"); System.out.println("输出结果"+e.getMessage()); } } /** * redis存储字符串 */ @Test public void testString() { jedis.set("name", "xinxin");//向key-->name中放入了value-->xinxin System.out.println(jedis.get("name"));//执行结果:xinxin jedis.append("name", " is my lover"); //拼接 System.out.println(jedis.get("name")); jedis.del("name"); //删除某个键 System.out.println(jedis.get("name")); //设置多个键值对 jedis.mset("name", "liuling", "age", "23", "qq", "476777XXX"); jedis.incr("age"); //进行加1操作 System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("qq")); } /** * redis操作Map */ @Test public void testMap() { //-----添加数据---------- Map<String, String> map = new HashMap<String, String>(); map.put("name", "xinxin"); map.put("age", "22"); map.put("qq", "123456"); jedis.hmset("user", map); //取出user中的name,执行结果:[minxr]-->注意结果是一个泛型的List //第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数 List<String> rsmap = jedis.hmget("user", "name", "age", "qq"); System.out.println(rsmap); //删除map中的某个键值 jedis.hdel("user", "age"); System.out.println(jedis.hmget("user", "age")); //因为删除了,所以返回的是null System.out.println(jedis.hlen("user")); //返回key为user的键中存放的值的个数2 System.out.println(jedis.exists("user"));//是否存在key为user的记录 返回true System.out.println(jedis.hkeys("user"));//返回map对象中的所有key System.out.println(jedis.hvals("user"));//返回map对象中的所有value Iterator<String> iter = jedis.hkeys("user").iterator(); while (iter.hasNext()) { String key = iter.next(); System.out.println(key + ":" + jedis.hmget("user", key)); } } /** * jedis操作List */ @Test public void testList() { //开始前,先移除所有的内容 jedis.del("java framework"); System.out.println(jedis.lrange("java framework", 0, -1)); //先向key java framework中存放三条数据 jedis.lpush("java framework", "spring"); jedis.lpush("java framework", "struts"); jedis.lpush("java framework", "hibernate"); //再取出所有数据jedis.lrange是按范围取出, // 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有 System.out.println(jedis.lrange("java framework", 0, -1)); jedis.del("java framework"); jedis.rpush("java framework", "spring"); jedis.rpush("java framework", "struts"); jedis.rpush("java framework", "hibernate"); System.out.println(jedis.lrange("java framework", 0, -1)); } /** * jedis操作Set */ @Test public void testSet() { //添加 jedis.sadd("user", "liuling"); jedis.sadd("user", "xinxin"); jedis.sadd("user", "ling"); jedis.sadd("user", "zhangxinxin"); jedis.sadd("user", "who"); //移除noname jedis.srem("user", "who"); System.out.println(jedis.smembers("user"));//获取所有加入的value System.out.println(jedis.sismember("user", "who"));//判断 who 是否是user集合的元素 System.out.println(jedis.srandmember("user")); System.out.println(jedis.scard("user"));//返回集合的元素个数 } @Test public void test() throws InterruptedException { //jedis 排序 //注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的) jedis.del("a");//先清除数据,再加入数据进行测试 jedis.rpush("a", "1"); jedis.lpush("a", "6"); jedis.lpush("a", "3"); jedis.lpush("a", "9"); System.out.println(jedis.lrange("a", 0, -1));// [9, 3, 6, 1] System.out.println(jedis.sort("a")); //[1, 3, 6, 9] //输入排序后结果 System.out.println(jedis.lrange("a", 0, -1)); } // @Test // public void testRedisPool() { // RedisUtil.getJedis().set("newname", "中文测试"); // System.out.println(RedisUtil.getJedis().get("newname")); // } } application.yml server: port: 8081 spring: datasource: name: test url: jdbc:mysql://127.0.0.1:3306/mytest?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull username: root password: root # 使用druid数据源 # type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver filters: stat maxActive: 20 initialSize: 1 maxWait: 60000 minIdle: 1 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: select 'x' testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxOpenPreparedStatements: 20 redis: database: 0 host: 101.132.191.77 port: 6379 password: 123456 pool: max-idle: 8 min-idle: 0 max-active: 8 max-wait: -1 timeout: 5000 mybatis: mapper-locations: classpath:mapping/*.xml type-aliases-package: com.winter.model #pagehelper pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql ######################################################## ###Redis (RedisConfiguration) ######################################################## ###spring.redis.database=0 ###spring.redis.host=127.0.0.1 ###spring.redis.port=6379 ###spring.redis.password=123456 ###spring.redis.pool.max-idle=8 ###spring.redis.pool.min-idle=0 ###spring.redis.pool.max-active=8 ###spring.redis.pool.max-wait=-1 ###spring.redis.timeout=5000 demo地址 redis的主从复制是什么? redis的主从复制主要还是读写分离,一台主redis有读和写的权限,其他从机redis只有读的权限,这样做的好处是为了减轻redis主机的压力。 redis的哨兵机制? 例:有3台redis,一台是主redis,2台是从机,开启哨兵机制后,3台redis开启后会发送心跳包到哨兵这里。如果主机挂了,那么哨兵会从另外2台从机这里选出一台作为主机(从原来只有读权限升级为读写权限) 那如果3台都挂了怎么办呢,一般企业会有备用机,或者利用keepalive的监听重启服务器。 哨兵的功能+keepalive重启服务器功能=redis的高可用 image.png 为了进行redis的集群操作,需要安装vwmare,然后安装linux 64位系统进行测试。 这个安装就不详说了。安装vwmare以后下载linux 64位镜像,然后导入镜像即可。说下我遇到的坑以及看到的有帮助网址。 Could not connect to '10.7.100.182' (port 22): Connection failedXshell远程连接Linux服务器出错——Could not connect to '114.214.166.5' (port 22): Connection failed. 主要问题可能为两个:(1)sshd服务器没有启动;(2)防火墙问题 并且需要永久开启sshd和关闭防火墙 步骤一:启动sshd服务器 1,sshd服务安装 2,[root@localhost /]# vi /etc/ssh/sshd_config Port 22 Protocol 2 PermitRootLogin yes 去掉这三行的注释 最后一个重要!因为它是允许root用户直接使用sshd服务登录服务器的! 3,重新启动sshd服务 [root@localhost /]# service sshd restart 4,设置sshd为系统自动启动 chkconfig iptables off 永久性生效 chkconfig ip6tables off 防火墙还需要关闭ipv6的防火墙: 步骤二:关闭防火墙 chkconfig iptables off 永久性生效 image.png 虚拟机安装以后可以进行克隆(需要先把服务器给关掉后才可以克隆) image.png image.png 原理就是主redis开启以后保存内存快照发送到从服务器,因此从服务器里面就会有主服务器的数据 image.png 7.如何设置主redis和从redis? 修改从服务器redis中的 redis.conf文件 slaveof 192.168.33.130 6379 这个是主服务器的地址和端口,就是把从的和主的进行关联 masterauth 123456--- 主redis服务器配置了密码,则需要配置 通过redis-cli连接后输入info命令查看role:master,role:slave可以查看主服务器和从服务器 到redis目录下修改sentinel.conf(这个是哨兵的配置文件) 1.修改sentinel monitor mymaster 192.168.184.128 6379 1 这里的128是主redis,6379是端口号,1是投票,哨兵根据投票数选取一个从redis作为主服务器,一般都是设置为1. 不需要在主redis当中配置哨兵 2.sentinel down-after-milliseconds mymaster 5000 心跳检测,5秒钟没访问到就换服务器 3.sentinel parallel-syncs mymaster 2 最多有2个子节点,就是备份服务器 4.启动的时候src/redis-server redis.conf 然后开启客户端sentinel.conf --sentinel & 要将redis,redis配置文件还有哨兵都开开来 image.png 8.redis事务 redis也有事务,就是主redis要提交以后,才能从从机上查到redis,redis事务平时用的极少 9.Redis持久化 什么是Redis持久化 什么是Redis持久化,就是将内存数据保存到硬盘。 Redis 持久化存储 (AOF 与 RDB 两种模式) RDB 默认开启,redis.conf 中的具体配置参数如下;主要是修改save这里 #dbfilename:持久化数据存储在本地的文件 dbfilename dump.rdb #dir:持久化数据存储在本地的路径,如果是在/redis/redis-3.0.6/src下启动的redis-cli,则数据会存储在当前src目录下 dir ./ ##snapshot触发的时机,save ##如下为900秒后,至少有一个变更操作,才会snapshot ##对于此值的设置,需要谨慎,评估系统的变更操作密集程度 ##可以通过“save “””来关闭snapshot功能 #save时间,以下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改10000个key60s进行存储。 save 900 1 save 300 10 save 60 10000 ##当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等 stop-writes-on-bgsave-error yes ##是否启用rdb文件压缩,默认为“yes”,压缩往往意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间 rdbcompression yes AOF持久化 AOF 默认关闭,开启方法,修改配置文件 reds.conf:appendonly yes ##此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能 ##只有在“yes”下,aof重写/文件同步等特性才会生效 appendonly yes ##指定aof文件名称 appendfilename appendonly.aof ##指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec appendfsync everysec ##在aof-rewrite期间,appendfsync是否暂缓文件同步,"no"表示“不暂缓”,“yes”表示“暂缓”,默认为“no” no-appendfsync-on-rewrite no ##aof文件rewrite触发的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才会触发rewrite,默认“64mb”,建议“512mb” auto-aof-rewrite-min-size 64mb ##相对于“上一次”rewrite,本次rewrite触发时aof文件应该增长的百分比。 ##每一次rewrite之后,redis都会记录下此时“新aof”文件的大小(例如A),那么当aof文件增长到A*(1 + p)之后 ##触发下一次rewrite,每一次aof记录的添加,都会检测当前aof文件的尺寸。 auto-aof-rewrite-percentage 100 AOF与RDB区别 RDB是要输入一定次数时间才会存储,速度快,但是可能会有漏的,不安全,AOF属于String的append,每次存储都会存在本地,不会漏,但是效率慢,安全 10.redis订阅频道 redis订阅频道的原理与我之前做的极光推送比较类似,原理就是前端有个频道号和后端的频道后一一匹配,然后后端把消息发送给极光服务器,告诉极光要发送消息给哪些有订阅的手机。像极光的话还会把后端传给他的消息推送到苹果推送服务器上,再由苹果服务器将消息推送给用户。 image.png 孙坚.gif

优秀的个人博客,低调大师

C++学习笔记第一天:基础

前言 N年前学的C,经过VB、JAVA、JS、C#等后辈的轮番蹂躏,当初学的那点儿东西早就还给老师了 现在有了在桌面端实现 Native + Web 的初衷,需要利用CEF开源组件来封装这个Native 所以,还是要对C++有个基本的认识,否则连Debug都找不到入口 开始 首先,菜鸟教程走起:http://www.runoob.com/cplusplus/cpp-tutorial.html 从头开始:基本语法、数据类型、变量类型、各种运算符、循环语句、分支语句。。。一路学习 教程里写的很细了,没必要再搬过来一次,只挑自己认为比较特殊的点摘出来,重点记忆 基本数据类型 类型 关键字 布尔型 bool 字符型 char 整型 int 单精度浮点型 float 双精度浮点型 double 无类型 void 宽字符型 wchar_t 一些基本类型可以使用一个或多个类型修饰符进行修饰: signed unsigned short long 给类型起名字 这个挺好玩的,可以用 typedef 为一个已有的类型取一个新的名字。 例如,下面的语句会告诉编译器,feet 是 int 的另一个名称: typedef int feet; feet distance; // 跟 int distance 的作用相同 枚举类型 定义枚举的一般形式: enum 枚举名{ 标识符[=整型常数], 标识符[=整型常数], ... 标识符[=整型常数]} 枚举变量; 例如: enum color { red, green, blue } c; c = blue; 定义常量 在 C++ 中,有两种简单的定义常量的方式: 1、使用 #define 预处理器 #define LENGTH 10 #define WIDTH 5#define NEWLINE '\n' 2、使用 const 关键字 const int LENGTH = 10;const int WIDTH = 5;const char NEWLINE = '\n'; 数组 double balance[10]; //声明数组 double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0}; //声明并初始化数组 字符串 1、C风格字符串 char greeting[] = "Hello"; //来自:char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; 2、C++ 引入的 string 类类型 #include <string> string str1 = "Hello";string str2 = "World"; 一些疑惑 1、C++的namespace跟JAVA的package根本不是一回事,需要详细了解,尤其是那个官方的std; 2、头文件(*.h)和源文件(*.cpp)的模式还不太理解,需要深入学习; 3、extern:在声明变量或函数时的一个关键字,一般用在头文件(*.h)里,意思是其声明的函数或变量可以在全局使用。具体含义暂不理解,挂起待查。 下一步 除了上面的三点疑惑以外,下一步就要学习C++的杀手锏 -- 指针与引用了! 总结 通过第一天的初步了解,个人感觉,相比于JAVA的有迹可循,C++实在顽固了些,另外VS用起来也感觉没有Eclipse顺手,还需要慢慢习惯 对我这样更偏重于Web前端的人来说,实在不喜欢这种体验,但既然开始了就要坚持下去,期待下一天吧 宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒

优秀的个人博客,低调大师

Android开发16——获取网络资源之基础应用

一、项目背景在Android开发中有一项非常广泛的应用:Android项目获取另一个web项目的资源或者返回的数据。本博文介绍了获取另一个web项目的资源。有一个web项目,在其WebRoot文件夹下有一个静态页面test.html。现有一个Android项目要获取到该页面的html代码显示在TextView中。 二、实例代码 publicclassMainActivityextendsActivity { privateEditTexttxtPath; privateButtonbtnShowHtml; privateTextViewtxtViewHtml; @Override publicvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txtPath=(EditText)this.findViewById(R.id.txtPath); btnShowHtml=(Button)this.findViewById(R.id.btnShowHtml); txtViewHtml=(TextView)this.findViewById(R.id.txtViewHtml); btnShowHtml.setOnClickListener(newShowHtmlListener()); } privatefinalclassShowHtmlListenerimplementsView.OnClickListener { @Override publicvoidonClick(Viewv) { Stringpath=txtPath.getText().toString(); try { Stringhtml=HtmlService.getHtml(path); txtViewHtml.setText(html); } catch(Exceptione) { Toast.makeText(MainActivity.this,"获取网页元素失败",Toast.LENGTH_SHORT).show(); } } } } packagecn.xy.html.service; importjava.io.InputStream; importjava.net.HttpURLConnection; importjava.net.URL; importcn.xy.html.util.IOUtils; /** *Html获取业务类 *@author徐越 */ publicclassHtmlService { /** *获取网页html源代码 *@parampath *@return */ publicstaticStringgetHtml(Stringpath)throwsException { Stringhtml=""; //把路径包装成URL对象 URLurl=newpath); //基于http协议的连接对象 HttpURLConnectionconn=(HttpURLConnection)url.openConnection(); //超时时间5s conn.setReadTimeout(5000); //获取传输方式 conn.setRequestMethod("GET"); //若响应码为200说明请求成功 if(200==conn.getResponseCode()) { InputStreaminstream=conn.getInputStream(); byte[]data=IOUtils.read(instream); //真实情况是读出请求头的charset值 html=newString(data,"UTF-8"); } returnhtml; } } packagecn.xy.html.util; importjava.io.ByteArrayOutputStream; importjava.io.IOException; importjava.io.InputStream; /** *IO操作工具类 *@author徐越 */ publicclassIOUtils { /** *获取输入流的方法 */ publicstaticbyte[]read(InputStreaminstream)throwsIOException { ByteArrayOutputStreambos=newByteArrayOutputStream(); byte[]buffer=newbyte[1024]; intlen=0; while((len=instream.read(buffer))!=-1) { bos.write(buffer,0,len); } returnbos.toByteArray(); } } <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="网络页面路径" /> <!--网址输入不能使localhost或127.0.0.1--> <!--因为android是一个操作系统,输入localhost或127.0.0.1会到本操作系统下去找某web应用,所以要使用局域网的ip--> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/txtPath" android:text="http://xxx.xxx.xxx.xxx:8080/ad_20_web/test.html" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="获取html" android:id="@+id/btnShowHtml" /> <ScrollViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/txtViewHtml"/> </ScrollView> ScrollView标签为TextView增加滚动条。 当然不能忘记访问网络需要权限 <!--访问网络权限--> <uses-permissionandroid:name="android.permission.INTERNET"/> 三、总结HtmlService中的方法其实可以获取任意类型的数据,因为其中一个环节是获取了byte[],拿到这个字节数组后我们可以根据不同类型的数据进行不同的操作。比如拿到一个图片byte[],就需要使用Bitmap工厂将其转化为Bitmap然后赋给ImageView控件。所以我们要熟悉获取网络资源的一般步骤。 本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1087182如需转载请自行联系原作者 woshixuye111

优秀的个人博客,低调大师

java获取http:图片下载代码——android基础

大家肯定很奇怪,为什么我写一编文章,原因是这样,android双向通信会用到协议,有http:协议, ftp: 协议,tip/ip 协议 所以我写一个JAVA小程序,让大家有所了解一下获取的流程。 packagecom.smart.test; importjava.io.ByteArrayOutputStream; importjava.io.File; importjava.io.FileOutputStream; importjava.io.InputStream; importjava.net.HttpURLConnection; importjava.net.URL; importorg.junit.Test; publicclassInternetTest{ //读取的方法 publicbyte[]readStream(InputStreaminStream)throwsException{ ByteArrayOutputStreamoutstream=newByteArrayOutputStream(); byte[]buffer=newbyte[1024];//用数据装 intlen=-1; while((len=inStream.read(buffer))!=-1){ outstream.write(buffer,0,len); } outstream.close(); inStream.close(); //关闭流一定要记得。 returnoutstream.toByteArray(); } @Test publicvoidgetImage()throwsException{ //要下载的图片的地址, StringurlPath="http://t2.gstatic.com/images?q=tbn:9g03SOE7gW2gEM:http://dev.10086.cn/cmdn/supesite"; URLurl=newURL(urlPath);//获取到路径 //http协议连接对象 HttpURLConnectionconn=(HttpURLConnection)url.openConnection(); conn.setRequestMethod("GET");//这里是不能乱写的,详看API方法 conn.setConnectTimeout(6*1000); //别超过10秒。 System.out.println(conn.getResponseCode()); if(conn.getResponseCode()==200){ InputStreaminputStream=conn.getInputStream(); byte[]data=readStream(inputStream); Filefile=newFile("smart.jpg");//给图片起名子 FileOutputStreamoutStream=newFileOutputStream(file);//写出对象 outStream.write(data);//写入 outStream.close();//关闭流 } } } 本文转自 llb988 51CTO博客,原文链接:http://blog.51cto.com/llb988/491055,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android基础:android - SpannableString或SpannableStringBuilder以及string.xml...

转载地址:http://blog.csdn.net/fengkuanghun/article/details/7904284 背景介绍 在开发应用过程中经常会遇到显示一些不同的字体风格的信息犹如默认的LockScreen上面的时间和充电信息。对于类似的情况,可能第一反应就是用不同的多个TextView来实现,对于每个TextView设置不同的字体风格以满足需求。 这里推荐的做法是使用android.text.*;和 android.text.style.*;下面的组件来实现RichText:也即在同一个TextView中设置不同的字体风格。对于某些应用,比如文本编辑,记事本,彩信,短信等地方,还必须使用这些组件才能达到想到的显示效果。 主要的基本工具类有android.text.Spanned; android.text.SpannableString; android.text.SpannableStringBuilder;使用这些类来代替常规String。SpannableString和 SpannableStringBuilder可以用来设置不同的Span,这些Span便是用于实现Rich Text,比如粗体,斜体,前景色,背景色,字体大小,字体风格等等,android.text.style.*中定义了很多的Span类型可供使用。 这是相关的API的Class General Hierarchy: 因为Spannable等最终都实现了CharSequence接口,所以可以直接把SpannableString和SpannableStringBuilder通过TextView.setText()设置给TextView。 使用方法 当要显示Rich Text信息的时候,可以使用创建一个SpannableString或SpannableStringBuilder,它们的区别在于 SpannableString像一个String一样,构造对象的时候传入一个String,之后再无法更改String的内容,也无法拼接多个 SpannableString;而SpannableStringBuilder则更像是StringBuilder,它可以通过其append()方法来拼接多个String: SpannableString word = new SpannableString("The quick fox jumps over the lazy dog"); SpannableStringBuilder multiWord = new SpannableStringBuilder(); multiWord.append("The Quick Fox"); multiWord.append("jumps over"); multiWord.append("the lazy dog"); 创建完Spannable对象后,就可以为它们设置Span来实现想要的Rich Text了,常见的Span有: AbsoluteSizeSpan(int size) ---- 设置字体大小,参数是绝对数值,相当于Word中的字体大小 RelativeSizeSpan(float proportion) ---- 设置字体大小,参数是相对于默认字体大小的倍数,比如默认字体大小是x, 那么设置后的字体大小就是x*proportion,这个用起来比较灵活,proportion>1就是放大(zoom in), proportion<1就是缩小(zoom out) ScaleXSpan(float proportion) ---- 缩放字体,与上面的类似,默认为1,设置后就是原来的乘以proportion,大于1时放大(zoon in),小于时缩小(zoom out) BackgroundColorSpan(int color) ----背景着色,参数是颜色数值,可以直接使用android.graphics.Color里面定义的常量,或是用Color.rgb(int, int, int) ForegroundColorSpan(int color) ----前景着色,也就是字的着色,参数与背景着色一致 TypefaceSpan(String family) ----字体,参数是字体的名字比如“sans", "sans-serif"等 StyleSpan(Typeface style) -----字体风格,比如粗体,斜体,参数是android.graphics.Typeface里面定义的常量,如Typeface.BOLD,Typeface.ITALIC等等。 StrikethroughSpan----如果设置了此风格,会有一条线从中间穿过所有的字,就像被划掉一样 对于这些Sytle span在使用的时候通常只传上面所说明的构造参数即可,不需要设置其他的属性,如果需要的话,也可以对它们设置其他的属性,详情可以参见文档。 SpannableString和SpannableStringBuilder都有一个设置上述Span的方法: /** * Set the style span to Spannable, such as SpannableString or SpannableStringBuilder * @param what --- the style span, such as StyleSpan * @param start --- the starting index of characters to which the style span to apply * @param end --- the ending index of characters to which the style span to apply * @param flags --- the flag specified to control */ setSpan(Object what, int start, int end, int flags); 其中参数what是要设置的Style span,start和end则是标识String中Span的起始位置,而 flags是用于控制行为的,通常设置为0或Spanned中定义的常量,常用的有: Spanned.SPAN_EXCLUSIVE_EXCLUSIVE --- 不包含两端start和end所在的端点 Spanned.SPAN_EXCLUSIVE_INCLUSIVE--- 不包含端start,但包含end所在的端点 Spanned.SPAN_INCLUSIVE_EXCLUSIVE--- 包含两端start,但不包含end所在的端点 Spanned.SPAN_INCLUSIVE_INCLUSIVE--- 包含两端start和end所在的端点 这里理解起来就好像数学中定义区间,开区间还是闭区间一样的。还有许多其他的Flag,可以参考这里。这里要重点说明下关于参数0,有很多时候,如果设置了上述的参数,那么Span会从start应用到Text结尾,而不是在start和end二者之间,这个时候就需要使用Flag 0。 Linkify 另外,也可以对通过TextView.setAutoLink(int)设置其Linkify属性,其用处在于,TextView会自动检查其内容,会识别出phone number, web address or email address,并标识为超链接,可点击,点击后便跳转到相应的应用,如Dialer,Browser或Email。Linkify有几个常用选项,更多的请参考文档: Linkify.EMAIL_ADDRESS -- 仅识别出TextView中的Email在址,标识为超链接,点击后会跳到Email,发送邮件给此地址 Linkify.PHONE_NUMBERS-- 仅识别出TextView中的电话号码,标识为超链接,点击后会跳到Dialer,Call这个号码 Linkify.WEB_URLS-- 仅识别出TextView中的网址,标识为超链接,点击后会跳到Browser打开此URL Linkify.ALL -- 这个选项是识别出所有系统所支持的特殊Uri,然后做相应的操作 权衡选择 个人认为软件开发中最常见的问题不是某个技巧怎么使用的问题,而是何时该使用何技巧的问题,因为实现同一个目标可能有N种不同的方法,就要权衡利弊,选择最合适的一个,正如常言所云,没有最好的,只有最适合的。如前面所讨论的,要想用不同的字体展现不同的信息可能的解法,除了用Style Span外还可以用多个TextView。那么就需要总结下什么时候该使用StyleSpan,什么时候该使用多个TextView: 如果显示的是多个不同类别的信息,就应该使用多个TextView,这样也方便控制和改变各自的信息,例子就是默认LockScreen上面的日期和充电信息,因为它们所承载不同的信息,所以应该使用多个TextView来分别呈现。 如果显示的是同一类信息,或者同一个信息,那么应该使用StyleSpan。比如,短信息中,要把联系人的相关信息突出显示;或是想要Highlight某些信息等。 如果要实现Rich text,没办法,只能使用Style span。 如果要实现某些特效,也可以考虑使用StyleSpan。设置不同的字体风格只是Style span的初级应用,如果深入研究,可以发现很多奇妙的功效。 实例1 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/text_view_font_1" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/text_view_font_2" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/text_view_font_3" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/text_view_font_4" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/text_view_font_5" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> </ScrollView> </LinearLayout> Source code: package com.android.effective; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.app.Activity; import android.graphics.Color; import android.graphics.Typeface; import android.os.Bundle; import android.text.Spannable; import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.style.AbsoluteSizeSpan; import android.text.style.BackgroundColorSpan; import android.text.style.ForegroundColorSpan; import android.text.style.QuoteSpan; import android.text.style.RelativeSizeSpan; import android.text.style.ScaleXSpan; import android.text.style.StrikethroughSpan; import android.text.style.StyleSpan; import android.text.style.TypefaceSpan; import android.text.style.URLSpan; import android.text.util.Linkify; import android.widget.TextView; public class TextViewFontActivity extends Activity { @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.textview_font_1); // Demonstration of basic SpannableString and spans usage final TextView textWithString = (TextView) findViewById(R.id.text_view_font_1); String w = "The quick fox jumps over the lazy dog"; int start = w.indexOf('q'); int end = w.indexOf('k') + 1; Spannable word = new SpannableString(w); word.setSpan(new AbsoluteSizeSpan(22), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE); word.setSpan(new StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE); word.setSpan(new BackgroundColorSpan(Color.RED), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE); textWithString.setText(word); // Demonstration of basic SpannableStringBuilder and spans usage final TextView textWithBuilder = (TextView) findViewById(R.id.text_view_font_2); SpannableStringBuilder word2 = new SpannableStringBuilder(); final String one = "Freedom is nothing but a chance to be better!"; final String two = "The quick fox jumps over the lazy dog!"; final String three = "The tree of liberty must be refreshed from time to time with " + "the blood of patroits and tyrants!"; word2.append(one); start = 0; end = one.length(); word2.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); word2.append(two); start = end; end += two.length(); word2.setSpan(new ForegroundColorSpan(Color.CYAN), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); word2.append(three); start = end; end += three.length(); word2.setSpan(new URLSpan(three), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); textWithBuilder.setText(word2); // Troubleshooting when using SpannableStringBuilder final TextView textTroubles = (TextView) findViewById(R.id.text_view_font_3); SpannableStringBuilder word3 = new SpannableStringBuilder(); start = 0; end = one.length(); // Caution: must first append or set text to SpannableStringBuilder or SpannableString // then set the spans to them, otherwise, IndexOutOfBoundException is thrown when setting spans word3.append(one); // For AbsoluteSizeSpan, the flag must be set to 0, otherwise, it will apply this span to until end of text word3.setSpan(new AbsoluteSizeSpan(22), start, end, 0);//Spannable.SPAN_INCLUSIVE_INCLUSIVE); // For BackgroundColorSpanSpan, the flag must be set to 0, otherwise, it will apply this span to end of text word3.setSpan(new BackgroundColorSpan(Color.DKGRAY), start, end, 0); //Spannable.SPAN_INCLUSIVE_INCLUSIVE); word3.append(two); start = end; end += two.length(); word3.setSpan(new TypefaceSpan("sans-serif"), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // TODO: sometimes, flag must be set to 0, otherwise it will apply the span to until end of text // which MIGHT has nothing to do with specific span type. word3.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, end, 0);//Spannable.SPAN_INCLUSIVE_INCLUSIVE); word3.setSpan(new ScaleXSpan(0.618f), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE); word3.setSpan(new StrikethroughSpan(), start, end, 0);//Spannable.SPAN_INCLUSIVE_INCLUSIVE); word3.setSpan(new ForegroundColorSpan(Color.CYAN), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE); word3.setSpan(new QuoteSpan(), start, end, 0); //Spannable.SPAN_INCLUSIVE_INCLUSIVE); word3.append(three); start = end; end += three.length(); word3.setSpan(new RelativeSizeSpan((float) Math.E), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE); word3.setSpan(new ForegroundColorSpan(Color.BLUE), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE); textTroubles.setText(word3); // Highlight some patterns final String four = "The gap between the best software engineering " + "practice and the average practice is very wide¡ªperhaps wider " + " than in any other engineering discipline. A tool that disseminates " + "good practice would be important.¡ªFred Brooks"; final Pattern highlight = Pattern.compile("the"); final TextView textHighlight = (TextView) findViewById(R.id.text_view_font_4); SpannableString word4 = new SpannableString(four); Matcher m = highlight.matcher(word4.toString()); while (m.find()) { word4.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); word4.setSpan(new ForegroundColorSpan(Color.RED), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); word4.setSpan(new StrikethroughSpan(), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); } textHighlight.setText(word4); // Set numbers, URLs and E-mail address to be clickable with TextView#setAutoLinkMask final TextView textClickable = (TextView) findViewById(R.id.text_view_font_5); final String contact = "Email: mvp@microsoft.com\n" + "Phone: +47-24885883\n" + "Fax: +47-24885883\n" + "HTTP: www.microsoft.com/mvp.asp"; // Set the attribute first, then set the text. Otherwise, it won't work textClickable.setAutoLinkMask(Linkify.ALL); // or set 'android:autoLink' in layout xml textClickable.setText(contact); } } The results: 示例2 一:TextView组件改变部分文字的颜色: TextView textView = (TextView)findViewById(R.id.textview); //方法一:textView.setText(Html.fromHtml("<font color=\"#ff0000\">红色</font>其它颜色")); //方法二: String text = "获得银宝箱!"; SpannableStringBuilder style=new SpannableStringBuilder(text); style.setSpan(new BackgroundColorSpan(Color.RED),2,5,Spannable.SPAN_EXCLUSIVE_INCLUSIVE); //设置指定位置textview的背景颜色 style.setSpan(new ForegroundColorSpan(Color.RED),0,2,Spannable.SPAN_EXCLUSIVE_INCLUSIVE); //设置指定位置文字的颜色 textView.setText(style); 二:android string.xml文件中的整型和string型代替: String text = String.format(getResources().getString(R.string.baoxiang), 2,18,"银宝箱"); 对应的string.xml文件参数: <string name="baoxiang">您今天打了%1$d局,还差%2$d局可获得%3$s!</string> %1$d表达的意思是整个name=”baoxiang”字符串中,第一个整型 在项目开发者,经常需要把以上两者结合起来使用。可以避免很多textview的拼接,如下所示: TextView textView = (TextView)findViewById(R.id.testview); String text = String.format(getResources().getString(R.string.baoxiang), 2,18,"银宝箱"); int index[] = new int[3]; index[0] = text.indexOf("2"); index[1] = text.indexOf("18"); index[2] = text.indexOf("银宝箱"); SpannableStringBuilder style=new SpannableStringBuilder(text); style.setSpan(new ForegroundColorSpan(Color.RED),index[0],index[0]+1,Spannable.SPAN_EXCLUSIVE_INCLUSIVE); style.setSpan(new ForegroundColorSpan(Color.RED),index[1],index[1]+2,Spannable.SPAN_EXCLUSIVE_INCLUSIVE); style.setSpan(new BackgroundColorSpan(Color.RED),index[2],index[2]+3,Spannable.SPAN_EXCLUSIVE_INCLUSIVE); textView.setText(style); 本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/archive/2012/12/12/2814173.html如需转载请自行联系原作者 demoblog

优秀的个人博客,低调大师

Mocha BSM基础架构管理——灵活的网络拓扑展现

业务需求与挑战 企业的网络拓扑结构与设备时常变化,人工往往难以维护网络拓扑。尤其对于上千台设备的大型网络来说情况更为复杂。 当用户网络设备大量增加后,网络结构异常复杂,用户的网络拓扑很难在一个屏幕上展现或者很难找到要查阅的网络拓扑。 由于有些网络存在某些租用的线路,拓扑生成发现不到这些节点之前的实际链路。除此之外,企业的外部设备,或与企业网络关联的第三方网络由于防火墙等因素影响,也可能无法发现。 网络管理成本随网络设备的更替与增多而过快增长。 关键功能与亮点 自动发现与生成拓扑 自动发现 第二层和第三层网络设备,网络协议(TCP/IP、Ethernet、FDDI、ATM、帧中继、令牌环等),设备包含信息(如网卡、接口、IP和MAC),设备之间的物理和逻辑关系、设备连接信息(如电缆、中继、网络连接和VLAN)。 • 网络设备状态、链路状态、接口状态监控与报警 • 支持创建资源组 • 编辑拓扑 自定义拓扑 • 简单而强大的绘图工具 使用基本的线、图形、文本、插图、背景色、背景图(地图)等简单工具,就能够绘制出当前各种类型的拓扑与设备的监控图。以下图形都可快速的画出: • 与实际资源关联 自定义拓扑不仅可以是静态图,也可以是具有实际设备状态、链路状态、接口状态的动态图。 • 图库管理 考虑到编辑拓扑时需要用到各种图标、背景,除了系统提供的默认图库外,用户也可以上传图片。 导入、导出拓扑 可将自动拓扑、自定义拓扑导出为XML文件,在需要时导入XML文件,恢复拓扑。 权限控制 网络拓扑管理员可分配用户对自动拓扑和自定义拓扑的编辑权限、浏览权限。 网络设备管理 在对网络设备的可用性监控以红、黄、绿、灰状态灯展示的同时,也对网络设备的接口信息,包括操作状态、管理状态、接口发送/接收速率等具体指标也进行实时的监测。管理员可以一目了然地看到发生故障的接口及当前接口的性能。 网络维护工具 系统中还提供了MIB、Telnet、搜索、设备定位、导航等专业的网络维护手段。 我们给客户带来什么 提高维护工作效率 在网络拓扑可视化管理中,用户只需输入核心交换机的IP地址,系统将自动发现企业的整个网络拓扑,以生动的图形展现出来,并能够立刻开始监控所有已发现网络资源的状态和链路的状态,并定时自动更新。使网络管理员能够快速的掌握企业最新的、客观的网络结构与资源状况。 一人即可轻松管理大量网络资源 为使网络的展现和管理更适用,支持网络资源组功能。管理员可以对拓扑图的节点进行分区域,组或网段的管理,比如按照不同地区,组或网段将设备划分到不同资源组中。同时,对不同资源组可控制浏览权限。 协助网络管理员监控各种特性的网络 网络管理员能够根据实际情况对自动拓扑进行编辑,也可以完全脱离自动拓扑,随心所欲的绘制各种类型的拓扑监控图,并与实际设备、链路、接口关联。 可视化监控,一目了然的监控 可视化监控提供一目了然的监控,降低对管理员的要求,并且降低了管理员的学习门槛。无需掌握复杂的路由器、交换机等设备的维护命令,只需点击鼠标与查看,即可获取设备信息。 更多相关信息,请点击 [url]http://www.mochabsm.com[/url] 本文转自赖永锋51CTO博客,原文链接:http://blog.51cto.com/mochasoft/86452 ,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册