首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

酷瓜云课堂(内网版)v1.0.0 发布,内网学习不打样

更新内容 完成后台功能 完成点播功能 完成直播功能 完成专栏功能 完成问答功能 完成群组功能 完成微聊功能 完成积分功能 完成用户功能 系统介绍 酷瓜云课堂内网版,采用C扩展框架Phalcon开发,使用本地基础服务,无营销相关功能,主要适用于公司,学校等内部网络环境使用。 系统功能 实现了点播、直播、专栏、问答、群组、微聊、积分等。 友情提示: 演示系统配置低,带宽有限,切莫压测 课程数据来源于网络(无实质内容) 管理后台已禁止数据提交,私密配置已过滤 系统演示: 前台演示 后台演示 演示账号:100015@163.com / 123456 (前后台通用) 项目组件 后台框架:phalcon 3.4.5 前端框架:layui 2.6.8, layim 3.9.8(已授权) 全文检索:xunsearch 1.4.9 即时通讯:workerman 3.5.22 基础依赖:php7.3, mysql5.7, redis5.0 项目文档 运行环境搭建 系统服务配置 客户终端配置

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

每日学习总结:局部变量、成员变量、嵌套for循环、方法(Day04)

2 --> 1 变量 1.1 概念 一般通过“变量类型 变量名 = 变量值 ;”这三部分来描述一个变量。如:int a = 3 ;变量的使用原则:就近原则,即尽量控制变量的使用范围到最小。 1.2 局部变量 位置: 定义在方法里或者局部代码块中 注意: 必须手动初始化/赋值来分配内存.如:int i = 5;或者int i; i = 5; 作用域: 也就是方法里或者局部代码块中,方法运行完内存就释放了 注意事项:变量的使用原则,成员变量与局部变量同名时,使用近的局部变量 1.2 成员变量 位置: 定义在类里方法外 注意: 不用初始化,也会自动被初始化成默认值 作用域: 整个类中,类消失了,变量才会释放 public class TestVariable2 { /** 本类测试成员变量与局部变量 */ /** 创建成员变量 * 1.位置:类里方法外 * 2.注意:无需手动初始化,会自动赋予对应类型的默认值 * 3.作用域:在整类里都生效,类消失,变量才消失 * */ int count; static int sum; public static void main(String[] args) { /**创建局部变量, * 1.位置:方法里/局部代码块里 * 2.注意:使用时必须手动初始化 * 3.作用域:当方法里/局部代码块执行完毕,变量就释放 * */ int sum = 100; System.out.println(sum); TestVariable2 test2 = new TestVariable2(); System.out.println(test2.count); /**变量:变量的使用原则,就近原则,当成员变量与局部变量同名时,使用局部变量*/ System.out.println(sum); } } 默认值: 基本类型 默认值 boolean false char ‘\u0000’ (null) byte (byte)0 short (short)0 int 0 long 0L float 0.0f double 0.0d public class TestVariable1 { /** 本类用于测试各种类型变量的默认值 */ //定义各种类型的成员变量,测试变量的默认值 byte b; short s; int i; long l; float f; char a; double d; boolean t; String x; public static void main(String[] args) { TestVariable1 test = new TestVariable1(); System.out.println(test.b); System.out.println(test.s); System.out.println(test.i); System.out.println(test.l); System.out.println(test.f); System.out.println(test.d); System.out.println(test.a); System.out.println(test.t); System.out.println(test.x); } } 2 嵌套for循环 2.1 概述 存在至少2层for循环,根据外层的条件,判断里层能否执行如果能执行,就把里层代码都循环完毕后,再继续判断是否执行外层循环的下一次循环 2.2 嵌套for循环的形式 2.2.1 练习:嵌套for循环,入门案例 总结1:外循环执行1次,内循环执行多次总结2:外循环控制行,内循环控制列 public class TestForDemo { /** 本类用于测试嵌套for循环的入门案例 */ public static void main(String[] args) { /** 外层执行一次,内层执行多次 * 外层控制的是轮数,内存控制的是每轮执行的次数 * */ for(int i = 1; i<=3; i++){ //内存循环 System.out.println("外层循环第:"+i+"轮"); for (int j = 1; j<=5 ;j++){ //外层循环 System.out.println("内层循环第第:"+j+"次"); } } System.out.println("···································"); /** 打印一个由 * 组成的矩形 */ for(int i = 1; i<=3; i++){ //内存循环 for (int j = 1; j<=5 ;j++){ //外层循环 System.out.print("*"); } System.out.println(); //空白行用来换行 } } } 2.2.2 练习2:打印直角三角形 public class TestForTriangles { /** 利用for循环打印一个左直角三角形 * * * * ** * *** * **** * ***** * ****** * */ public static void main(String[] args) { for (int i = 1; i<=6;i++){ /** 此处列数要随着行数而变化,列数最大值就是行数 */ for(int j = 1 ; j<=i;j++){ System.out.print("*");//在同一轮/同一行打印不换行 } System.out.println();//空白行用来换行 } } } 2.2.3 练习:打印99乘法表 public class TestFor99Excel { /** 打印99乘法表 */ public static void main(String[] args) { for (int i = 1;i<=9;i++){ //控制行数,打印9行 for (int j= 1; j<=i;j++){ //控制列数,i行打印i列 //拼接打印算式,后面拼接一个"\t"表示这是表格格式,\t也被称作制表符 System.out.print(j+"*"+i+"="+(j*i)+"\t"); } System.out.println( ); } } } 3 break与continue 3.1 概念 break: 直接结束当前循环,跳出循环体,简单粗暴 break以后的循环体中的语句不会继续执行,循环体外的会执行注意如果是嵌套for循环,在内层循环遇到了break,只会跳出当前这一层内循环哦 continue: 跳出本轮循环,继续下一轮循环 continue后本轮循环体中的语句不会继续执行,但是会继续执行下轮循环,循环体外的也会执行 3.2练习:测试Break与Continue import java.util.Scanner; /**需求:找数字88 * 提示并接受用户输入100次数字,如果不是88,则继续输入,找到88就结束*/ public class TestBreakAndContinue { public static void main(String[] args) { //循环体可以帮助我们执行重复的事情,控制for循环执行100次 for(int i = 1;i <= 100; i++) { //在每一次循环中都要提示并接收用户输入的数字 System.out.println("请输入数字:"); int input = new Scanner(System.in).nextInt(); if(input != 88) {//用户输入的不是88 continue;//直接继续输入 /**注意,不管是不是加continue,都可以在猜不对的情况下继续输入 * 只不过加了continue后效率更高,只要数据不等于88,就无需执行后面的代码 * 直接进行下一轮的猜数字即可* */ /**break或者continue之后都不允许写代码,都是不可到达的代码*/ //System.out.println(0);//Unreachable code } System.out.println("我是用来测试continue有没有跳过循环后半部分代码的哦"); if(input == 88) {//找到88了 System.out.println("恭喜您,猜对了!"); break;//结束程序 //System.out.println(0);//Unreachable code } } } } 4 循环结构2 : while 4.1 形式(先判断,再执行) 4 循环结构3 : do-while 4.2形式(先执行,再判断,循环体代码保证最少执行一次) 4.3 练习:猜数字之while与do-while练习 import java.util.Random; import java.util.Scanner; /** * 本类用于练习while循环 * 需求: 产生一个随机数,和用户一直在输入的数字做比较,直到用户猜对 * */ public class TestWhile { public static void main(String[] args) { int r = createNum();//调用可以生成随机数的方法,并且接收生成的随机数 System.out.println("打个小抄:"+r); //调用猜数字方法1--while //guessNum1(r); //调用猜数字方法2--do-while guessNum2(r); } public static void guessNum2(int r) { do {//先执行一次 //2.接收用户输入的值 System.out.println("猜猜看~"); int input = new Scanner(System.in).nextInt(); //3.判断是否猜对(拿用户猜的数字与生成的随机数做比较) if(input > r) { System.out.println("猜大了,继续猜猜看"); }else if(input < r) { System.out.println("猜小了,继续努力"); }else if(input == r) { System.out.println("猜对了!"); //一定注意:要设置程序出口!!! break; } }while(true); } //创建猜数字的方法 public static void guessNum1(int r) { //1.写一个死循环 while(true) {//死循环--需要设置程序的出口 //2.接收用户输入的值 System.out.println("猜猜看~"); int input = new Scanner(System.in).nextInt(); //3.判断是否猜对(拿用户猜的数字与生成的随机数做比较) if(input > r) { System.out.println("猜大了,继续猜猜看"); }else if(input < r) { System.out.println("猜小了,继续努力"); }else if(input == r) { System.out.println("猜对了!"); //一定注意:要设置程序出口!!! break; } } } //创建一个用来生成随机数的方法 public static int createNum() { //让程序产生一个随机数 //java.util.Random,注意导包,快捷键:Ctrl+Shift+O int random = new Random().nextInt(100);//参数100是自定义的,此时生成的随机数范围是[0,100)的整数 return random; } } 4.4 拓展:三种循环的区别 for:知道循环次数 while/do while:当循环次数不确定时 while:先判断,不符合规则,不执行代码 do while:代码最少被执行一次,再去判断,符合规则,再次执行代码 循环之间都可以互相替代,但是一般最好选择合适的循环结构来完成代码哦~ 5 方法 5.1 概述 被命名的代码块,方法可以含参数可以不含参数,可以提高代码的复用性。 5.2 方法定义的格式 5.3 方法调用顺序图 顺序执行代码,调用指定方法,执行完毕,返回调用位置 5.4 练习:测试方法的调用顺序/参数/返回值 public class TestMethod { //1.创建程序的入口函数main() public static void main(String[] args) { System.out.println(1); /**2.我们通过方法名+参数列表的方式来调用方法的功能*/ method1();//调用method1() System.out.println(2); method2(3);//调用method2() int result = method3(1,2);//调用method3() System.out.println(result); } /**3.如果方法想要返回值,必须修改返回值类型 * 并且return对应类型的结果 * 如果方法的返回值类型是void,不允许有返回值 * */ /*本方法用来测试方法的返回值类型*/ public static int method3(int i, int j) { /**4.通过return关键字将方法结果返回到调用位置*/ return i+j; } /**1.方法的修饰符 方法的返回值类型 方法名(方法参数){方法体}*/ /*method1()想测试方法的调用顺序*/ public static void method1() { System.out.println(5); System.out.println(6); System.out.println(7); } /*本方法用来测试方法的参数,参数的位置在小括号里*/ public static void method2(int a) { System.out.println("海绵宝宝今年:"+ a +"岁啦~"); } }

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

时序数据库Influx-IOx源码学习十一(SQL的解析)

InfluxDB是一个由InfluxData开发的开源时序数据库,专注于海量时序数据的高性能读、写、高效存储与实时分析等,在DB-Engines Ranking时序型数据库排行榜上常年排名第一。 InfluxDB可以说是当之无愧的佼佼者,但 InfluxDB CTO Paul 在 2020/12/10 号在博客中发表一篇名为:Announcing InfluxDB IOx – The Future Core of InfluxDB Built with Rust and Arrow的文章,介绍了一个新项目 InfluxDB IOx,InfluxDB 的下一代时序引擎。 接下来,我将连载对于InfluxDB IOx的源码解析过程,欢迎各位批评指正,联系方式见文章末尾。 上一章介绍了查询的主流程,详情见: https://my.oschina.net/u/3374539/blog/5034513 这章记录一下SQL的解析过程。 Influx Iox 使用了 Fusion 作为sql的查询引擎(Funsion目前是apache arrow的一个子项目)。整体查询架构如图所示: 我在网上找了找Fusion相关的文档,没有找到比较详细一些的说明,所以只能自己总结了。 通常来讲,sql的语句解析分为两个大的步骤,分别是: 逻辑执行计划(LogicPlan) 物理执行计划(PhysicalPlan) 逻辑执行计划(LogicPlan) LogicPlan主要是用来描述用户输入的SQL都包含了一些什么内容,例如: selet * from table where a = 1 ,要转换到类能解释的模型上就会成为: class SelectClass{ path : "*", from: "table", where: eq(a , 1) } 这是非常简单的情况,sql中还会掺杂大量的关键字,比如SUM、JOIN、ORDER BY等等,如果需要把所有东西都记录下来,可能类图看起来就像是这样: 在Fusion中,有一个名为parser.rs的解析器他的主要工作就是将纯SQL解析为一个程序基本可以理解的结构。主要过程有: 定义所有的关键词,能够识别出来在sql语句中的含义。比如 SELECT、INSERT 等等 遍历sql语句每个空格或者遇到表达式切分一次,然后在定义的关键词里查找是否为关键字 使用一个名叫TOKEN的枚举来表示每个节点不同的含义,比如EQ,NEQ,COMMA等等 最后存储到一个数组当中,数据结构大致如下: Ok([Word(Word { value: "select", quote_style: None, keyword: SELECT }), Whitespace(Space), Mult, Whitespace(Space), Word(Word { value: "from", quote_style: None, keyword: FROM }), Whitespace(Space), Word(Word { value: "table1", quote_style: None, keyword: NoKeyword }), Whitespace(Space), Word(Word { value: "where", quote_style: None, keyword: WHERE }), Whitespace(Space), Word(Word { value: "a", quote_style: None, keyword: NoKeyword }), Whitespace(Space), Eq, Whitespace(Space), Number("1", false)]) 按照不同的开头关键字去执行不同的分支。比如CREATE 和 SELECT 肯定后面的解析方式不一样。 封装成不同的LogicPlan子类。 pub enum LogicalPlan { //基本就是纯select Projection { ... 省略 }, //带有filter的 Filter { ... 省略 }, //是聚合的 Aggregate { ... 省略 }, //带排序的 Sort { ... 省略 }, ... 省略 } 逻辑执行计划的优化 在用户输入一段sql之后,往往他并不会意识到自己是否真的输入了非常有意义的东西,并且他也不会清楚程序到底用什么样的组织方式会让程序执行的更快,所以一般来讲,用户输入的sql是最不可信的,还需要再次执行优化。 举个简单的例子,假如用户输入select * from table where is_valid = true and is_valid !=false ,很明显可以在执行前优化成 select * from table where is_valid = true,从而减少在实际执行时,对数据库的操作。 从图中可以看到Fusion提供了5种优化,有兴趣的的可以自己了解,或者以后再做分析。 物理执行计划 物理执行计划,我理解就是将用户输入的文字性描述的信息专为真正的资源来存储,比如用户写入的是from t1,那么t1作为一个字符串存在于logic阶段,但是到物理阶段的时候,要从内存或者磁盘上取来真正指向物理资源的一个类型,存储到计划里,以备后用。 例如下面的示例当中,就是一段物理执行计划,他从上面的Projection存储的各种字符串,转换到了存储表对应的schema,以及RBChunk类型。 pub(crate) struct IOxReadFilterNode<C: PartitionChunk + 'static> { table_name: Arc<String>, schema: SchemaRef, chunk_and_infos: Vec<ChunkInfo<C>>, predicate: Predicate, } 物理执行计划的优化 对于物理计划Fasion中提供了3种优化方式,如下图: 分别是批处理、分区合并、并行度优化。主要是为了在实际实行的过程中,减少因为通讯、调用、单机等造成的响应缓慢。 在文章的最后展示一下一个物理执行之计划都包含了哪些信息: ProjectionExec { expr: [ (Column { name: "fieldKey" }, "fieldKey"), (Column { name: "tag1" }, "tag1"), (Column { name: "tag2" }, "tag2"), (Column { name: "time" }, "time")], schema: Schema { fields: [Field { name: "fieldKey", data_type: Utf8, nullable: true, dict_id: 0, dict_is_ordered: false, metadata: None }, Field { name: "tag1", data_type: Dictionary(Int32, Utf8), nullable: true, dict_id: 0, dict_is_ordered: false, metadata: None }, Field { name: "tag2", data_type: Dictionary(Int32, Utf8), nullable: true, dict_id: 0, dict_is_ordered: false, metadata: None }, Field { name: "time", data_type: Timestamp(Nanosecond, None), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: None }], metadata: {} }, input: RepartitionExec { input: IOxReadFilterNode { table_name: "myMeasurement", schema: Schema { fields: [Field { name: "fieldKey", data_type: Utf8, nullable: true, dict_id: 0, dict_is_ordered: false, metadata: None }, Field { name: "tag1", data_type: Dictionary(Int32, Utf8), nullable: true, dict_id: 0, dict_is_ordered: false, metadata: None }, Field { name: "tag2", data_type: Dictionary(Int32, Utf8), nullable: true, dict_id: 0, dict_is_ordered: false, metadata: None }, Field { name: "time", data_type: Timestamp(Nanosecond, None), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: None }], metadata: {} }, chunk_and_infos: [ChunkInfo { chunk_table_schema: Schema { inner: Schema { fields: [Field { name: "fieldKey", data_type: Utf8, nullable: true, dict_id: 0, dict_is_ordered: false, metadata: None }, Field { name: "tag1", data_type: Dictionary(Int32, Utf8), nullable: true, dict_id: 0, dict_is_ordered: false, metadata: None }, Field { name: "tag2", data_type: Dictionary(Int32, Utf8), nullable: true, dict_id: 0, dict_is_ordered: false, metadata: None }, Field { name: "time", data_type: Timestamp(Nanosecond, None), nullable: false, dict_id: 0, dict_is_ordered: false, metadata: None }], metadata: {"tag2": "iox::column_type::tag", "time": "iox::column_type::timestamp", "fieldKey": "iox::column_type::field::string", "tag1": "iox::column_type::tag"} } }, chunk: MutableBuffer { 。。。省略MBChunk数据 } } 就到这里,祝玩儿的开心。 欢迎关注微信公众号: 或添加微信好友: liutaohua001

资源下载

更多资源
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文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册