第一章
DataModel的概念
通过各种关系连接起来的表群。其中的关键点在于关系 和表群 。
为什么要用表群 如果可以只适用一个表就不行么?这样的话就不用考虑各种表之间的关系,也更利于数据的计算和分析。 把所有的字段放在一个表,肯定是可以的,但是显而易见的是这样会增加表的体积。假设原来的主数据只有10行,交易数据有1000行,如果强行合并,肯定是需要把主数据的各个字段扩展到1000行。另外,如果是两个交易的表的情况下呢,比如销售类的数据和出库类的数据,这样强行整合为一个大表的话,肯定会有很多无用的数据重复多次。现今,内存虽然便宜,但是还没有便宜到可以随意浪费的地步。 所以不严谨的说数据仓库发展到现在,为了跟快的反馈查询结果,一直在重复的就是选择时间换空间还是选择空间换时间 。
关系 当决定通过关系把所有的表链接起来的话,各个表之间的关系就会变得微妙起来。表的连接方式无非就是1:1或1:N或M:N。1:1的情况下表的联动是最简单的是对等的,如果是1:N或者M:N的情况下就需要考虑一个问题就是两个表之间是如何联动的,即如何追溯和回溯?如从一个表如何过滤另外一张表的数据,如果使用两个表的字段计算一个新的字段。这是最需要关注的一点。
单向关系和双向关系
单向和双向的关系,单向双向影响的是维度表之间的跨表的计算,所有的维度表是与事实表进行关联,那么维度表就通过事实表进行间接的关联,这个时候单向和双向在统计这种间接关联的维度表中的数据的时候,会发生差异。 下图中,参与计算的除了事实表中的数量,还有维度表中的产品(进行了count计算)。Calendar Year来源于Date维度表,Product来源于Product维度表,分别与Sales表进行1:N的链接。 对于1:N的关系,书中说到过滤总是从1到N的方向进行过滤,这里的过滤可以理解为切片,比如表中添加了Year这个维度,相当于这个表使用Year对数据进行了切片,那么N方向的事实表的数据,就会按照这个切片进行分类汇总。如图中的数量字段按照年进行汇总。 跨表过滤(cross filter)- 间接过滤 ,单双向的差别在这里会出现差异,如下图中Product Name的计数是不一样的。原因在于单向的情况下,过滤(切片)总是从1到N的,这种情况下,年的切片其实是没有办法传递到Product维度表中的,即年的切片是对Product中字段的计算是不起作用的,因此Product Name的计数是对整个Product表中的Priduct Name进行计数汇总,然后显示在每一年下边。因此看到的是年由原来的三个变成了七个,2517是Product为维度表的product name的计数总和,重复的显示在了每一个年份中。 现在去掉这个Product Name的计数,同时添加Product中一个属性到这个表中,结果就相当于Date维度表和Product维度表同时对Sales事实表进行过滤(切片)。这种情况下其实单双向没任何区别,因为不涉及到过滤的传递,而只是同时过滤。
Other Point
In DAX, relationships are part of the model, and they are all LEFT OUTER JOINs. 对于这句话,有两个疑问,第一以什么为主表的左连?怎么确定这个主表呢?第二,如果两个以上的事实表的话,是如何处理的?比如库存和销售。
DAX is a function language. In DAX, every expression is a function call. Function parameters can be other function calls. 对应于函数式编程?
Tips
DAX中没有loop / Do循环 SUM(表达式) 对行计算 SUMX(表,表达式) 按行循环
第二章
注释:单行 -- // 多行 /* ... */
计算列和指标
计算列:依附于某个表,作为表的一个列,因此于此表有着同样的行,也就是说计算列是按照每一行的数据进行计算并存储在内存中的,是占用了空间的,可以认为是表的一部分。当数据抽取的时候发生的,而非在查询的时候才计算出来,因此占用的是抽取时间而非查询时间。 当创建计算列的时候,这个列的维度或者说颗粒度已经确定了,这里的每行就是最细的颗粒度。 指标:首先是不是依附于某一个具体的表,可以认为是基于整个模型的,因此他是没有具体的行的概念,也不是提前计算出来的。而是当你使用的时候根据当前可视化区域的切片/维度进行临时计算出来的结果。 指标创建的时候,并没有制定维度或者说颗粒度,他的结果或者他的颗粒度是根据报表中显示的维度而确定的,从而基于此颗粒度进行最终结果的计算。 -- 这样的理解貌似有点问题。 首先指标的创建也是选中某一个表然后进行创建的,所以应该还是依附于某一个表的。在创建指标的时候,首选是要选择汇总的类型,比如选择SUM然后才能跳出来字段以供选择,否则是没有办法创建指标的。 即先定义指标的汇总方式,然后决定按照什么样的颗粒度进行汇总,而计算列的话是先定义颗粒度(或者说默认颗粒度就是所在表的行级别),然后再使用的时候再定义汇总类型。 计算列和指标的图标是完全不一样的。
也可以简单的从以下角度理解两者的区别,计算列就是相当于从数据源选择数据的时候,新增的一列。即select calculate* as B from ***。进入到PBI的之后,就完全可以看作是一个表的列,这个列与其他的列没有什么本质的区别。而指标,就相当于一个管道/漏斗,他只会把你给的东西汇总起来,当你把某个字段拉到报表中显示的时候,这个漏斗就根据这个字段把所有的数据分别汇总并输送到不同的目的地。
计算列就相当于一个括号, 当计算只涉及到加减的时候,这个括号其实是没有什么作用的; 当计算开始涉及到乘除的时候,这个括号的作用就开始显现出来,因为加减乘除会根据这个括号调整计算的优先级。 比如:毛利率 SUM(Margin/Sales) SUM(Margin)/SUM(Sales)
简而言之: 计算列:无需定义汇总类型,颗粒度为行级别,表更新的时候直接创建,占用内存空间,不受用户过滤的影响,相当于固定计算出一列值并存储在表中; 指标:先定义汇总类型,颗粒度按照使用图表的颗粒度,使用的时候临时计算,不存储,受用户过滤器的影响,相当于一个动态的函数计算值,随选择变动; 应该跟tableau中的LOD比较一下。 如何选择,两个应该基本都可以实现相同的功能,因此由时间换空间还是空间换时间决定;官方推荐用指标。 :-)
变量
用Var定义,用Return返回计算的值。 变量全部都是本地变量,没有全局变量,即变量值在定义的那个地方(定义时候的那个公示栏中)被使用,不能跨指标调用。 -- 那就把本地变量变成指标,不就成为全局变量了么。 同时变量在被用到的时候才会被检验同时被计算,只需要计算一次可以在多个地方使用。
BLANK () = 0 -- Always returns TRUE
BLANK () = "" -- Always returns TRUE
BLANK () = 0 = FALSE
BLANK () + BLANK () = BLANK ()
BLANK () / BLANK () = BLANK ()
10 * BLANK () = BLANK ()
BLANK () / 3 = BLANK ()
4 / BLANK () = Infinity
0 / BLANK () = NaN
When using variables, errors must be checked at the time of variable definition rather than where we use them. DAX engine cannot use optimized paths in its code when errors happen.
DAX formatter
SUM, AVERAGE, MIN, MAX... -- 一步操作,列行为,对某列进行操作,只接受值,不接受表达式;所以复杂操作必须引入计算列; 需要验证,逻辑上来讲汇总细化到操作层面也是行的行为,最后在进行汇总操作,只是这个行行为是直接由函数定死的,无法进行双重操作,因为必须传入的是值而非表达式。 Aggregators are just a syntax-sugared version of iterators。 SUMX, AVERAGEX, MINX, MAXX...--两步操作,行行为,之后按照汇总类型进行汇总,接受值和表达式;复杂计算可以直接使用多重表达式嵌套。 COUNTA, AVERAGEA, MINA, MAXA...these functions are useful only for columns containing Boolean values,Text columns are always considered 0。
the functions ISNUMBER, ISTEXT, and ISNONTEXT always return TRUE or FALSE depending on the data type of the column and on the empty condition of each cell.根据定义的列的类型,所以这几个函数没什么用。除非先用Value进行转换,然后再做判定。
Related返回一个值,RelatedTable返回多个值组成一个表。
第三章
如果定义了多个表变量,其数据分别来源于不同的表,那么这个时候使用的连接还是原先定义的链接? 两个表的字段相乘? 如果新建一个calculatedTable,那么会复制源表的所有内容,如果原表有计算列,那么复制过来的就变成了值列了,即看不到原来的计算公式。
所有带All的函数,无视所有的切片/过滤器 All可以得到输入字段或者表的最细维度的值清单; Value可以得到输入列或者表的值清单,但是多了一个空值(当事实表中的维度值不存在于维度表的时候,才会多一个空值去存储所有不存在于维度表的值,如果都存在的话,不会多一个空值); Distinct可以得到输入列或者表的值清单,不包含空值;
SELECTEDVALUE ('Product'[Brand], "Multiple brands" ) CONCATENATEX (VALUES ( 'Product'[Brand] ),'Product'[Brand],", ")
第四章
The filter context filters; the row context iterates. This means that the row context does not filter, and the filter context does not iterate. 第四章最重要的两句话。
第五章
理解CALCULATE和CALCULATETABLE CALCULATE中引用的过滤条件,可以直接使用相关联表中的字段,不必要使用related去获取相对应的关系,也就是说,他只是起了一个过滤的作用,并且这个过滤相当于报表层面的过滤,其中间的连接关系使用已经定义好的对应关系。同时可以理解calculate不参与行计算,因此不需要根据每一行的内容去获取相关维度表中的内容以进行判断,只是起了一个过滤器的作用。 Before evaluating the expression, CALCULATE computes the filter arguments and uses them to manipulate the filter context。 即先过滤在计算 ,相当于在后边条件下的表中进行前边的计算。
同时,calculate中的过滤器会覆盖其他地方的过滤器,并且有一种ALL的感觉在里边。
关键点是,calcualte只覆盖前一层的过滤,只追溯一层。
覆盖了Brand的过滤器,没有覆盖Category的过滤器,否则应该所有的category是一样的数据
或者应该理解为,calculate中用到的过滤取的维度都会被覆盖。但不会影响到未在Calculate中使用到的维度的过滤器。
看完这些,然后就轮到KEEPFILTERS出场拯救世界了。
context transition Sum Num Of Sales := SUMX ( Sales, COUNTROWS (Sales ) ),需要好好的理解下这个指标最终给出的结果是什么。
这里说的重点是如果Calcualte函数第二个参数如果是空的,那么会默认在计算所依存的那个表中添加一个默认的过滤器,然后再遍历每行进行计算。如下图中M_Qty与Qty的不同之处。如果依存表中不存在两行一模一样的数据的话,那么结果如上图,与平常的计算是一致的,因为过滤器每次过滤都是一行数据。
Sales Amount := SUMX( Sales, CALCULATE( SUM( Sales[Quantity] ) ) )
简单理解的话可以理解为loop中套select;
loop sales condition X
select prod sum(qty)
from sales
where Condition X
endloop
在什么地方做什么事情
开始一层一层分析,假设这里的Sales表就是上图中5行的那个Prod,Qty表;
SUMX的逻辑是遍历第一个参数的每一行,总共遍历5次;在什么地方 ,
遍历Sales的每一行,首先取第一行;Prod=A,Qty=10;
第二个参数开始做计算;做什么事情
Calculate(SUM(Quantity))
2.0 Calculate的计算顺序是反过来的,从后向前,所以第一步是过滤数据,这里没有传入参数,那么就相当于先把外层的表复制过来,然后每一列都添加上过滤器,也可以理解为把所有列Combine起来作为一个过滤字段。 2.1 开始取第一个合并的key,然后执行过滤,过滤条件就是外侧的那个Prod=A,Qty=5,这里可以过滤出来两行;在什么地方 ; 2.2 回到第一个参数进行计算,这里就是SUM计算了,第一步获得了两行Prod=A,Qty=10,汇总起来就是20,即Prod=A,Qty=20;做什么事情 。 结束,跳出
执行第二行的,同样得到的也是Prod=A,Qty=20; 这两行的结果汇总起来就变成了Prod=A,Qty=40。
相当于下边这样
总结
Context transition is expensive. 这里理解的expense不是loop套select的那种每次开关数据库连接的expense,而是两个循环互相嵌套的问题,即loop中套loop的那种内存开销,相当于要做两个表的行数相乘次的操作,所以会比较耗费内存和时间。
Context transition does not only filter one row.
Context transition is invoked whenever there is a row context. 意思就是loop中套的是一个select,这个select的结果可能是一条记录,但绝对不会一直是一条记录;
Context transition uses columns that are not present in the formula. 如果默认过滤参数,那么所有的列合并起来会作为一个过滤的条件;
Context transition creates a filter context out of a row context.
Context transition transforms all the row contexts.
Context transition invalidates the row contexts. 这里说的意思应该是select是from那个表,而不是loop传进来的那一条记录;
是不是可以说: calculate(var) 等于 measure, measure是天然带着calculate的var,var是天然去掉calculate的measure,带不带calculate意味着是否进行语境传递? 计算列的话就是就是一个语境,但是是否使用这个语境要看使用什么样的汇总方式,是两列相乘,还是sum(),或是sumx();
第六章
Var...Return; 变量一经计算,结果便不能够在更改,哪怕对其重新计算重新调整过滤范围;这句话说的有点问题,变量什么时候计算呢?变量是包含在计算指标中的,那么计算指标在什么时候用呢?用的时候是什么样的context呢?如果计算指标被用在两个不同context的地方,那么这个变量的值是一样的么? 变量是定义的时候做校验; 表变量代表的是原表的一个子集,所以使用字段的时候还是需要引用原表的字段,而非引用表变量的字段。
第七章
DAX逻辑基础 row context / filter context / context transaction 报表层面的汇总,同一context下的内容直接计算就结束了,不同context下的内容的交叉计算是重点所在。
循环套循环一般会存在性能问题,所以开发过程中一般不使用循环套循环。 PBI中如果出现循环套循环的情况,只有里边的循环会被优化,外边的循环无法被优化。同时会把内循环的结果作为一个临时表存在内存中。因此会降低性能并占用过高的内存。
Rankx RANKX (
, [, ] [, ] [, ] )
第一个参数和第二个参数构成一个lookup表,然后使用第三个参数在lookup表中寻找,最后返回查找到的顺序(index?)。如果第三个参数省略,那么就使用第二个参数作为lookup的输入参数。比如SaleQty按照品牌排序,第一个参数就是所有的或者所有选择的品牌表,然后在这个表中添加SalesQty进行累计汇总,以便构建lookup表,之后使用context的SalesQty在lookup表中寻找,最后返回排位。 Rankx(All(Product[Brand]),SaleQty,SalesQty)简化为Rankx(All(Product[Brand]),SaleQty)
如果排位不是按照汇总的SalesQty进行累计,比如销售总体分为5档,然后计算每个品牌的销售分别属于五档中的哪一档。这个时候第一个参数使用的不再是按照品牌进行累计的汇总表,而是使用的分档的销售额表,第二个参数就是这个分档的销售额表中的销售额,第三个参数即lookup的参数就是SalesQty,即需要排序的参数。 Rankx(档位,档位[销售额],SaleQty) 最后一个参数的意思是,如果两个品牌的销售额一样,那么怎么排序呢?这个时候这两个品牌的排位顺序肯定是一致的,比如都是第5位。最后一个参数的区别就在一这个第5位之后应该是第6位还是第7位。最后一个参数是Skip或者Dense,如果选择Skip的话,那么下一位就是第7位,如果使用Dense的话,下一位就是第6位。 即:
第八章
DAX Date table template https://github.com/sql-bi/DaxDateTemplate
Part 1
Sales Amount YTD =
VAR LastVisibleDate = MAX ( 'Date'[Date] )
VAR CurrentYear = YEAR ( LastVisibleDate )
VAR SetOfDateesYtd =
FILTER (
ALL ( 'Date' ),
AND (
'Date'[Date] <= LastVisibleDate,
YEAR ( 'Date'[Date] ) = CurrentYear
)
)
VAR Result =
CALCULATE (
SUMX ( Sales, Sales[Net Price] * Sales[Quantity] ),
SetOfDateesYtd
)
RETURN
Result
Part 2
Sales Amount YTD2 =
VAR LastVisibleDate = MAX ( 'Date'[Date] )
VAR CurrentYear = YEAR ( LastVisibleDate )
VAR SetOfDateesYTD =
FILTER (
ALL ( 'Date'[Date]),
AND (
'Date'[Date] <= LastVisibleDate,
YEAR ( 'Date'[Date] ) = CurrentYear
)
)
VAR Result =
CALCULATE (
SUMX ( Sales, Sales[Net Price] * Sales[Quantity] ),
SetOfDateesYTD
)
RETURN
Result
唯一的差别在于All('Date')和All('Date'[Date]),当使用的key是datekey连接的时候确实结果不一样。
原因在于All(Date[Date])只是去掉了Date这个字段的过滤,并没有去掉Year和Month上边的过滤器,而All(Date)是去掉了Date这个表上的所有过滤器;也就是说对于4月份那一行来说,默认的过滤器为年=2017,月=4,All(Date[Date])是没有办法去掉这个过滤器的,也就导致了Sales Amount YTD2计算的仍然是4月份的数据,而Sales Amount YTD是把Date上的所有过滤去给去掉之后计算的,因此能够得到YTD的数据。
count1 = CALCULATE(COUNT('Date'[Date]),ALL('Date'[Date]))
count2 = CALCULATE(COUNT('Date'[Date]),ALL('Date'))
count3 = CALCULATE(COUNT('Date'[Date]))
按照逻辑来讲,如果这个时候把Date表变成日期表,那么上边这个count的结果应该一样的,但事实并非如此,等等在研究吧。
DaxDateTemplate Date相关的函数及逻辑
第九章 Calculation Group
不好用,等待集成到PBI中再说吧。
第十章 Working with filter context
PRODUCTX ( Years, 1 + Inflation ) 这个挺有意思的。
VALUES vs FILTERS 对于只有一个filter的情况下,两个返回的值是一样的,但是当有多个filter存在,并且是对于其他字段进行过滤的条件下,VALUES返回的是这多个过滤条件联合作用下,当前字段还拥有的值。而FILTERS返回的是对于当前字段所添加的过滤选择。或者可以说VALUES是对事实的统计,而FILTERS是对动作的统计. 比如字段A和B,现在对A进行过滤,但是对B进行Values和Filters检验,这种情况下,Values是返回在对A进行过滤之后B还剩下的值,而Filters只是检验B上边是否添加了filter,所以这个时候不管A做了任何的过滤,Filters显示的是B所有的值。 HASONEVALUE VS HASONEFILTER同样的道理.
ALLEXPECT VS ALL/VALUE 从这里开始会比较容易的发现,其实PBI的复杂之处都是在一些细枝末节,大的方向其实学习起来会很简单,但是对于细枝末节的东西或者说隐藏于其中的东西有太多了.如果稍微不注意,真的是很容易导致结果的错误,所以相对的后期的学习曲线还是比较陡的,对于IT可能需要很长时间的学习和分辨,但是对于用户,还真是一个比较难得问题.
第十一章 Handling Hierarchy
ISINSCOPE (),返回值为Ture或者False,用来判断给定的列是否是层次结构中的当前层。 该章节其他内容主要讲的就是如何从一个平面表重构出一个层次结构,主要逻辑就是利用父节点和子节点编号的对应关系,从而构建出具体层级节点的名称。但是有一点无奈的就是需要指定最深的层数,也就是说需要提前计算好层数,然后根据层数添加对应的层级列到主数据表中。 剩下的主要是在讨论,当层次结构不满的时候,下层的信息要如何正确的隐藏掉。 主要用到的函数有, PATH(, ) ,用户构建从根节点到叶节点的全路径; LOOKUPVALUE(, ,),根据指定的值获取对应列的相对应内容,相当于VLOOPUP; PATHITEM(, [, ]) ,获取指定层数的节点名称; PATHLENGTH() ,获取层级的长度,用于计算某层级是否是满层级,从而隐藏掉多余的重复信息; 其中比较绕的一点就是如果不只是叶节点带数据,层次节点也带数据的时候,需要注意不能把这些数据给丢掉。判断的逻辑是用最大节点+1的节点是否有数据,同时该节点是否是最终叶节点来最终获得这个层次节点的数据。
第十二章 Working with Tables
Filter和Calculate的区别 FILTER(
,) CALCULATE([, [, [, …]]]) CALCULATETABLE([, [, [, …]]]) Filter的逻辑是返回指定表的子集,如果表部分的参数是一个表达式的话,那肯定是先计算出这个表达式的结果,之后在这个结果进行过滤以获取部分数据。 Calculate以及Calculate Table的逻辑是在后边的过滤逻辑之上,Evaluate前边的表达式以计算对应的结果。 不从是否传递Context Filter的层面,但从计算逻辑层面来讲,两者的计算逻辑就是不一致的,所以结果大部分情况下应该也是不一致的。
这个逻辑理解起来是没有问题,但是比较有意思地方在于如果就是想用Filter的情况下,如何得到与Calculate Table一样的结果呢。 书中提供的解决方式是引用Calculate,下边的公式可以直接返回一个表,这个表中包含了所有的颜色,以及对应的count数。
ADDCOLUMNS (VALUES ( 'Product'[Color] ),"Num of Products", CALCULATE (COUNTROWS ('Product' ) ))
但是对于这个公式,就出现了一个新问题,有没有其他办法获取颜色列以及对应的行数呢? https://www.sqlbi.com/articles/best-practices-using-summarize-and-addcolumns/ 这个链接中给出了一定的比较和解释,其中关键的一点应该是两个表没有关联关系。 但是对于下边的公式,是否还有其他解决方案?目前水平不够,还没想出其他方法。
ADDCOLUMNS (VALUES ( 'Product'[Color] ),"Num of Products",COUNTROWS ('Product' ))
这里的Running Total还有点想不通。。。
VAR TotalSales = [Sales Amount]
VAR ProdsWithSales =
ADDCOLUMNS (
VALUES ( 'Product'[Product Name] ),
"ProductSales", [Sales Amount]
)
VAR ProdsWithRT =
ADDCOLUMNS (
ProdsWithSales,
"RunningTotal",
VAR SalesOfCurrentProduct = [ProductSales]
RETURN
SUMX (
FILTER (
ProdsWithSales,
[ProductSales] >= SalesOfCurrentProduct
--关键之处,如过换成<=的话就是从小到大的汇总,但如果是空白的话=>的情况下会有值,<=的情况下为空,
--因为小于等于空白的还是空白,而大于等于空白的就相当于所有的汇总
--高明。。。
),
[ProductSales]
)
)
VAR Top15Percent =
FILTER (
ProdsWithRT,
[RunningTotal] / TotalSales <= 0.15
--这里的TotalSales是总的Sales,不是Measure自动引入Calcualte么?为什么会变成总sales?
--同样是[Sales Amount],只不过一个是定义在外边的,一个是在里边直接引用的
--难道是因为定义的变量是在最外边的,所以的得到的就是汇总的?而变量内部引用的虽然也是[Sales Amount],但是会传递context?
)
RETURN Top15Percent
FIND is case-sensitive, while SEARCH is not.x
你可能感兴趣的:(The Definitive Guide to DAX 2nd学习笔记)
Unity学习笔记1
zy_777
通过一个星期的简单学习,初步了解了下unity,unity的使用,以及场景的布局,UI,以及用C#做一些简单的逻辑。好记性不如烂笔头,一些关键帧还是记起来比较好,哈哈,不然可能转瞬即逝了,(PS:纯小白观点,unity大神可以直接忽略了)一:MonoBehaviour类的初始化1,Instantiate()创建GameObject2,通过Awake()和Start()来做初始化3,Update、L
Django学习笔记(一)
学习视频为:pythondjangoweb框架开发入门全套视频教程一、安装pipinstalldjango==****检查是否安装成功django.get_version()二、django新建项目操作1、新建一个项目django-adminstartprojectproject_name2、新建APPcdproject_namedjango-adminstartappApp注:一个project
python学习笔记(汇总)
朕的剑还未配妥
python学习笔记整理 python 学习 开发语言
文章目录一.基础知识二.python中的数据类型三.运算符四.程序的控制结构五.列表六.字典七.元组八.集合九.字符串十.函数十一.解决bug一.基础知识print函数字符串要加引号,数字可不加引号,如print(123.4)print('小谢')print("洛天依")还可输入表达式,如print(1+3)如果使用三引号,print打印的内容可不在同一行print("line1line2line
【Druid】学习笔记
fixAllenSun
学习 笔记 oracle
【Druid】学习笔记【一】简介【1】简介【2】数据库连接池(1)能解决的问题(2)使用数据库连接池的好处【3】监控(1)监控信息采集的StatFilter(2)监控不影响性能(3)SQL参数化合并监控(4)执行次数、返回行数、更新行数和并发监控(5)慢查监控(6)Exception监控(7)区间分布(8)内置监控DEMO【4】Druid基本配置参数介绍【5】Druid相比于其他数据库连接池的优点
java学习笔记8
幸福,你等等我
学习 笔记 java
一、异常处理Error:错误,程序员无法处理,如OOM内存溢出错误、内存泄漏...会导出程序崩溃1.异常:程序中一些程序自身处理不了的特殊情况2.异常类Exception3.异常的分类:(1).检查型异常(编译异常):在编译时就会抛出的异常(代码上会报错),需要在代码中编写处理方式(和程序之外的资源访问)直接继承Exception(2).运行时异常:在代码运行阶段可能会出现的异常,可以不用明文处理
2025 最强 Agent 智能体 学习笔记 (71)
一刀7段
学习 笔记 人工智能
Agent智能体的系统学习与职业发展核心内容概览本集是《2025最强Agent智能体全套教程》的第72集,聚焦Agent智能体领域的系统学习方法与职业发展路径,系统梳理了从入门到专家的能力体系、关键学习资源、职业方向选择及行业发展机遇。内容结合技术趋势与职场需求,为不同背景的学习者(学生、开发者、转行人士)提供清晰的成长蓝图,帮助其在Agent智能体领域高效成长,实现职业目标。系统学习的能力体系与
【学习笔记】CBT工作坊第二天:动机驱动行为
花团与芥末
什么叫动机?在认知行为疗法中,动机是引导我们行为的各种外在和内在的力量,唤起行为起始的力量,朝着一定目标与方向进行的力量,维持或停止的力量。也就是说,在我们的所有行为包括没有做的行为背后,都隐藏着某种动机。那么,动机一般有哪些呢?大家一般听说过的,是马斯洛的需求层次理论。在他的金字塔理论中,将动机需求分为了6个层次,从初级到高级分别是:生存(活着的必须条件)--安全(活下去)--爱--尊重--自我
图解系统的学习笔记--硬件结构
什么蜜桃绵绵冰
操作系统 学习 笔记
CPU是如何执行程序的?图灵机的工作方式图灵机的基本组成纸带:纸带由一个个连续的格子组成,每个格子可以写入字符,纸带就好比内存,而纸带上的格子的字符就好比内存中的数据或程序读写头:可以读取只带上任意格子的字符,也可以把字符写入到纸带的格子读写头上的部件-存储单元、控制单元、运算单元存储单元用于存放数据控制单元用于识别字符是数据还是指令、以及控制程序的流程等预算单元用于执行运算指令冯诺依曼模型计算机
Spring学习笔记07——SpringBoot中关于接口文档管理的注解
Shaoxi Zhang
Java spring 学习 笔记
一、Lombok注解@Data:生成所有字段的getter/setter、toString()、equals()和hashCode()。@Getter/@Setter:单独为所有字段或指定字段生成getter/setter。importlombok.Data;@DatapublicclassUser{privateLongid;privateStringname;}编译后,Lombok会为id和n
零基础入门uniapp Vue3组合式API版本
鹤早早
uni-app
前言:小程序学习笔记,课程来源up主咸虾米_。仅记录笔记,大家想学习可以去关注他。1.已安装HBuiderX(目前是4.36版本),微信开发者工具(但还没注册小程序码),相关配置OK了。1.16相关架构学习1.pages-index-index.vuebox1box2.layout{border:1pxsolidred;.box1{border:1pxsolidgreen;}.box2{borde
JavaWeb(苍穹外卖)--学习笔记14
哈哈哈哈哈0627
学习 笔记
前言终于开始学习做项目了,本篇文章是学习B站黑马程序员苍穹外卖的学习笔记。我的学习路线是Java基础语法-JavaWeb-做项目,管理端的功能学习完之后,就进入到了用户端微信小程序的开发,这篇文章是把我觉得JavaWeb的学习中比较重要的内容写一个总结(其实因为学到下单支付太难了我复习复习前面的)Controller层(这里只讲讲几个需要注意的注解)管理服务端的动态资源:SpringFramewo
streamline 这是个组合词,能猜出大概意思,组织
董八七
title:streamlinedate:2018-08-2117:03:19NO_sents:76NO_references:58streamlinestreamlinedstreamlines组织一些流程(process)AlthoughfixedguidelineswouldsimplifyGWASPAsubstantiallybyprovidinganalytictoolsthatstre
Langchain学习笔记(十):文档加载与处理详解
注:本文是Langchain框架的学习笔记;不是教程!不是教程!内容可能有所疏漏,欢迎交流指正。后续将持续更新学习笔记,分享我的学习心得和实践经验。前言在构建基于大语言模型的应用时,文档处理是一个至关重要的环节。无论是构建RAG(检索增强生成)系统,还是进行知识库问答,我们都需要将各种格式的文档转换为模型可以理解和处理的形式。Langchain提供了强大的文档加载和处理功能,支持多种文件格式,并提
Langchain学习笔记(十二):Memory机制与对话管理
zhangsan0933
LangChain langchain 学习 笔记
注:本文是Langchain框架的学习笔记;不是教程!不是教程!内容可能有所疏漏,欢迎交流指正。后续将持续更新学习笔记,分享我的学习心得和实践经验。前言在构建智能对话系统时,记忆功能是至关重要的。想象一下,如果每次与AI对话都像第一次见面一样,无法记住之前的交流内容,这样的体验将是多么糟糕。LangChain的Memory机制正是为了解决这个问题而设计的,它让AI能够"记住"对话历史,从而提供更加
开源TTS
vanloswang
综合 TTS
Ekhohttp://sourceforge.net/projects/e-guidedog/files/Ekho/http://www.eguidedog.net/ekho.phpflitehttp://www.speech.cs.cmu.edu/flite/
OkHttp学习笔记5--Events
雪晨杰
EventsEventsallowyoutocapturemetricsonyourapplication’sHTTPcalls.Useeventstomonitor:事件允许您捕获应用程序HTTP调用的度量。使用事件来监控:ThesizeandfrequencyoftheHTTPcallsyourapplicationmakes.Ifyou’remakingtoomanycalls,oryour
CTF-Web学习笔记:SQL注入篇
编程到天明
CTF sql 网络安全
目录引言一、SQL注入的基础概念1.什么是SQL注入?2.SQL注入的成因二、CTF中常见的SQL注入类型1.按参数类型分类2.按注入方式分类3.其他进阶类型三、CTF实战技巧:从找注入点到拿Flag1.如何判断是否存在注入?2.快速确定数据库类型3.常用工具辅助4.绕过WAF(Web应用防火墙)四、CTF题目示例:一道报错注入实战题目背景解题步骤五、总结与提升引言在CTF(CaptureTheF
Linux驱动开发学习笔记-设备树
1、设备树1)将描述板级硬件信息的内容都从Linux内中分离开来,用一个专属的文件格式来描述,这个专属的文件就叫做设备树,文件扩展名为.dts。一个SOC可以作出很多不同的板子,这些不同的板子肯定是有共同的信息,将这些共同的信息提取出来作为一个通用的文件,其他的.dts文件直接引用这个通用文件即可,这个通用文件就是.dtsi文件,类似于C语言中的头文件。.dts描述板级信息(也就是开发板上有哪些I
使用memory_profiler 与 cProfile ,line_profiler 优化Python程序运行时间和内存消耗实例
NG7711
Python python 优化
背景一个用来分析log(XML格式)的程序,运行起来时间很长,有时候内存消耗也会很高。使用pythonprofiler工具来分析使用memory_profiler分析内存消耗运行profiler按照memory_profilerguide,给有可能消耗内存的函数加上decorator@profile开始profiler:mprofrunxxx|tee$(date+“%Y%m%d%I%M_%p”).
进阶向:基于Python的本地文件内容搜索工具
超级小识
Python进阶 有趣的项目 python 开发语言
概述大家好!今天我们将一起学习如何用Python创建一个简单但强大的本地文件内容搜索工具。这个工具特别适合处理大量文本文件时的快速检索需求。为什么要学习这个工具如果你刚接触编程,完全不用担心!我会从零开始讲解,确保每一步都清晰易懂。想象一下这个常见场景:你有一个装满各种文档的文件夹(可能是工作文档、学习笔记或项目文件),现在想快速找到所有包含"重要笔记"或"项目需求"等关键字的文件。手动逐个打开文
Freertos学习笔记(一)-----FreeRTOS基本知识
努力搬砖的扁鱼
嵌入式开发 学习 笔记
RTOS“realtime”(实时)指的是系统对外部事件能够在规定的、可预测的时间内作出响应。具体含义如下:确定性(Determinism):FreeRTOS强调事件响应的可预测性。无论系统有多少任务,关键操作(比如任务切换、中断处理)都能在已知的最坏情况下完成。这意味着开发者可以预估任务的最大响应延迟。任务优先级与抢占:FreeRTOS支持任务优先级和抢占调度。高优先级任务可以在更低优先级任务运
# Linux学习笔记 - 4
Norvyn_7
Linux学习 linux 学习 笔记
Linux学习笔记-4本篇将介绍Linux中root用户管理、用户与用户组操作、权限控制信息以及chmod/chown命令的使用。1.root用户(超级管理员)root用户拥有最大的系统操作权限,可执行所有操作。1.1su和exitsu命令:切换用户语法:su[-][用户名]-表示切换后加载目标用户的环境变量(建议添加)。不加用户名时默认切换到root用户。示例:su-root#切换到root用户
动态链接库(Dynamic Link Library)学习笔记
peixian2003
编程
经常忘记http://blog.csdn.net/yxin1322/article/details/638156动态链接库(DynamicLinkLibrary)学习笔记作者:yxin1322blog:http://blog.csdn.net/yxin1322转载请注明出处我对动态链接和动态链接库的概念并不陌,但一直以来就停留在概念的层面上,没有更深入的了解。今天抽空看了一下有关动态链接和动态链接
QFramework V1.0 GUIDE 架构篇
WX呦
架构 unity c# 游戏引擎
QFrameworkV1.0GUIDE:架构篇1.QFramework架构简介定义QFramework是一个专为Unity游戏开发设计的渐进式快速开发框架。优势提高开发效率:提供一套完整的架构和工具集。代码质量:基于MVC架构,实现数据、操作、视图的解耦分层。灵活性:支持不同规模的项目,从小型到大型商业项目。应用场景适用于任何规模的Unity游戏项目。2.QFramework的MVC定义Model
2022-10-28晨间日记
明心279
今天是什么日子起床:6.00就寝:天气:多云心情:开心纪念日:任务清单昨日完成的任务,最重要的三件事:改进:习惯养成:周目标·完成进度学习·信息·阅读八字笔记整理紫微斗数学习笔记健康·饮食·锻炼耳功八法81站桩35早上小米醪糟汤圆荷包蛋中午馒头蔬菜汤晚上煮泡面人际·家人·朋友工作·思考最美好的三件事1.我是最善良,最可爱,最大度,最宽容,最仁慈,最宽厚,最有魅力的优雅知性女子。我每天都很开心,都很
java23种设计模式-外观模式
千里码!
设计模式 设计模式 外观模式
外观模式(FacadePattern)学习笔记定义外观模式属于结构型设计模式,提供一个统一的接口来访问子系统中的多个接口。它通过定义一个高层接口简化客户端与复杂子系统的交互。适用场景为复杂子系统提供简单入口解耦客户端与子系统分层构建系统(各层通过外观类交互)遗留系统重构(用外观类封装旧接口)模式结构类图ClientFacade-subsystemA:SubsystemA-subsystemB:Su
语言合成模型Spark-TTS-0.5B学习笔记
tutgxuzyj
spark 学习 笔记
语言合成模型Spark-TTS-0.5B学习笔记语言合成是通过计算机技术将文字信息转换为自然流畅的语音输出,模拟人类语音。一、下载Spark-TTS-0.5B项目下载链接:https://github.com/SparkAudio/Spark-TTS.git注:需要科学网络。进入Spark-TTS文件夹,启动命令行窗口。创建Conda环境:condacreate-nsparktts-ypython
编程与数学 03-002 计算机网络 10_应用层协议
明月看潮生
编程与数学 第03阶段 计算机网络 编程与数学 青少年编程
编程与数学03-002计算机网络10_应用层协议一、常见的网络应用(一)Web应用(二)电子邮件(三)文件传输二、Web应用协议(HTTP/HTTPS)(一)HTTP协议的请求与响应格式(二)HTTPS的安全机制三、电子邮件协议(SMTP、POP3、IMAP)(一)邮件发送与接收的协议工作原理(二)各协议的功能特点四、总结摘要:本文是计算机网络课程中关于应用层协议的学习笔记。应用层协议是计算机网络
泷羽sec专题课笔记-- Linux作业--开机自启动方法以及破解
grrrr_1
笔记 web安全 网络
本笔记为泷羽sec《红队全栈课程》学习笔记,课程请可自行前往B站学习,课程/笔记主要涉及网络安全相关知识、系统以及工具的介绍等,请使用该课程、本笔记以及课程和笔记中提及工具的读者,遵守网络安全相关法律法规,切勿进行违法违规违纪的操作。写在最前面的话,我们为什么要学习网络安全这门技术:维护国家安全防范网络攻击:网络安全威胁已成为国家安全的重要挑战。学习网络安全有助于识别和防范来自国内外的网络攻击,防
编程与数学 03-002 计算机网络 07_路由算法
明月看潮生
编程与数学 第03阶段 计算机网络 算法 智能路由器 青少年编程 编程与数学
编程与数学03-002计算机网络07_路由算法一、静态路由算法(一)手工配置路由表的方法(二)静态路由的优缺点二、动态路由算法原理(一)距离矢量算法(如贝尔曼-福特算法)(二)链路状态算法(如迪杰斯特拉算法)三、路由算法的性能比较(一)收敛速度(二)开销(三)适用场景四、总结摘要:本文是计算机网络课程中关于路由算法的学习笔记。路由算法是网络层的重要组成部分,用于选择最佳路径将数据包从源节点传输到目
jquery实现的jsonp掉java后台
知了ing
java jsonp jquery
什么是JSONP?
先说说JSONP是怎么产生的:
其实网上关于JSONP的讲解有很多,但却千篇一律,而且云里雾里,对于很多刚接触的人来讲理解起来有些困难,小可不才,试着用自己的方式来阐释一下这个问题,看看是否有帮助。
1、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准;
2、
Struts2学习笔记
caoyong
struts2
SSH : Spring + Struts2 + Hibernate
三层架构(表示层,业务逻辑层,数据访问层) MVC模式 (Model View Controller)
分层原则:单向依赖,接口耦合
1、Struts2 = Struts + Webwork
2、搭建struts2开发环境
a>、到www.apac
SpringMVC学习之后台往前台传值方法
满城风雨近重阳
springMVC
springMVC控制器往前台传值的方法有以下几种:
1.ModelAndView
通过往ModelAndView中存放viewName:目标地址和attribute参数来实现传参:
ModelAndView mv=new ModelAndView();
mv.setViewName="success
WebService存在的必要性?
一炮送你回车库
webservice
做Java的经常在选择Webservice框架上徘徊很久,Axis Xfire Axis2 CXF ,他们只有一个功能,发布HTTP服务然后用XML做数据传输。
是的,他们就做了两个功能,发布一个http服务让客户端或者浏览器连接,接收xml参数并发送xml结果。
当在不同的平台间传输数据时,就需要一个都能解析的数据格式。
但是为什么要使用xml呢?不能使json或者其他通用数据
js年份下拉框
3213213333332132
java web ee
<div id="divValue">test...</div>测试
//年份
<select id="year"></select>
<script type="text/javascript">
window.onload =
简单链式调用的实现技术
归来朝歌
方法调用 链式反应 编程思想
在编程中,我们可以经常遇到这样一种场景:一个实例不断调用它自身的方法,像一条链条一样进行调用
这样的调用你可能在Ajax中,在页面中添加标签:
$("<p>").append($("<span>").text(list[i].name)).appendTo("#result");
也可能在HQ
JAVA调用.net 发布的webservice 接口
darkranger
webservice
/**
* @Title: callInvoke
* @Description: TODO(调用接口公共方法)
* @param @param url 地址
* @param @param method 方法
* @param @param pama 参数
* @param @return
* @param @throws BusinessException
Javascript模糊查找 | 第一章 循环不能不重视。
aijuans
Way
最近受我的朋友委托用js+HTML做一个像手册一样的程序,里面要有可展开的大纲,模糊查找等功能。我这个人说实在的懒,本来是不愿意的,但想起了父亲以前教我要给朋友搞好关系,再加上这也可以巩固自己的js技术,于是就开始开发这个程序,没想到却出了点小问题,我做的查找只能绝对查找。具体的js代码如下:
function search(){
var arr=new Array("my
狼和羊,该怎么抉择
atongyeye
工作
狼和羊,该怎么抉择
在做一个链家的小项目,只有我和另外一个同事两个人负责,各负责一部分接口,我的接口写完,并全部测联调试通过。所以工作就剩下一下细枝末节的,工作就轻松很多。每天会帮另一个同事测试一些功能点,协助他完成一些业务型不强的工作。
今天早上到公司没多久,领导就在QQ上给我发信息,让我多协助同事测试,让我积极主动些,有点责任心等等,我听了这话,心里面立马凉半截,首先一个领导轻易说
读取android系统的联系人拨号
百合不是茶
android sqlite数据库 内容提供者 系统服务的使用
联系人的姓名和号码是保存在不同的表中,不要一下子把号码查询来,我开始就是把姓名和电话同时查询出来的,导致系统非常的慢
关键代码:
1, 使用javabean操作存储读取到的数据
package com.example.bean;
/**
*
* @author Admini
ORACLE自定义异常
bijian1013
数据库 自定义异常
实例:
CREATE OR REPLACE PROCEDURE test_Exception
(
ParameterA IN varchar2,
ParameterB IN varchar2,
ErrorCode OUT varchar2 --返回值,错误编码
)
AS
/*以下是一些变量的定义*/
V1 NUMBER;
V2 nvarc
查看端号使用情况
征客丶
windows
一、查看端口
在windows命令行窗口下执行:
>netstat -aon|findstr "8080"
显示结果:
TCP 127.0.0.1:80 0.0.0.0:0 &
【Spark二十】运行Spark Streaming的NetworkWordCount实例
bit1129
wordcount
Spark Streaming简介
NetworkWordCount代码
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
Struts2 与 SpringMVC的比较
BlueSkator
struts2 spring mvc
1. 机制:spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同。 2. 性能:spring会稍微比struts快。spring mvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring
Hibernate在更新时,是可以不用session的update方法的(转帖)
BreakingBad
Hibernate update
地址:http://blog.csdn.net/plpblue/article/details/9304459
public void synDevNameWithItil()
{Session session = null;Transaction tr = null;try{session = HibernateUtil.getSession();tr = session.beginTran
读《研磨设计模式》-代码笔记-观察者模式
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
/**
* “观
重置MySQL密码
chenhbc
mysql 重置密码 忘记密码
如果你也像我这么健忘,把MySQL的密码搞忘记了,经过下面几个步骤就可以重置了(以Windows为例,Linux/Unix类似):
1、关闭MySQL服务
2、打开CMD,进入MySQL安装目录的bin目录下,以跳过权限检查的方式启动MySQL
mysqld --skip-grant-tables
3、新开一个CMD窗口,进入MySQL
mysql -uroot
 
再谈系统论,控制论和信息论
comsci
设计模式 生物 能源 企业应用 领域模型
再谈系统论,控制论和信息论
偶然看
oracle moving window size与 AWR retention period关系
daizj
oracle
转自: http://tomszrp.itpub.net/post/11835/494147
晚上在做11gR1的一个awrrpt报告时,顺便想调整一下AWR snapshot的保留时间,结果遇到了ORA-13541这样的错误.下面是这个问题的发生和解决过程.
SQL> select * from v$version;
BANNER
-------------------
Python版B树
dieslrae
python
话说以前的树都用java写的,最近发现python有点生疏了,于是用python写了个B树实现,B树在索引领域用得还是蛮多了,如果没记错mysql的默认索引好像就是B树...
首先是数据实体对象,很简单,只存放key,value
class Entity(object):
'''数据实体'''
def __init__(self,key,value)
C语言冒泡排序
dcj3sjt126com
算法
代码示例:
# include <stdio.h>
//冒泡排序
void sort(int * a, int len)
{
int i, j, t;
for (i=0; i<len-1; i++)
{
for (j=0; j<len-1-i; j++)
{
if (a[j] > a[j+1]) // >表示升序
自定义导航栏样式
dcj3sjt126com
自定义
-(void)setupAppAppearance
{
[[UILabel appearance] setFont:[UIFont fontWithName:@"FZLTHK—GBK1-0" size:20]];
[UIButton appearance].titleLabel.font =[UIFont fontWithName:@"FZLTH
11.性能优化-优化-JVM参数总结
frank1234
jvm参数 性能优化
1.堆
-Xms --初始堆大小
-Xmx --最大堆大小
-Xmn --新生代大小
-Xss --线程栈大小
-XX:PermSize --永久代初始大小
-XX:MaxPermSize --永久代最大值
-XX:SurvivorRatio --新生代和suvivor比例,默认为8
-XX:TargetSurvivorRatio --survivor可使用
nginx日志分割 for linux
HarborChung
nginx linux 脚本
nginx日志分割 for linux 默认情况下,nginx是不分割访问日志的,久而久之,网站的日志文件将会越来越大,占用空间不说,如果有问题要查看网站的日志的话,庞大的文件也将很难打开,于是便有了下面的脚本 使用方法,先将以下脚本保存为 cutlog.sh,放在/root 目录下,然后给予此脚本执行的权限
复制代码代码如下:
chmo
Spring4新特性——泛型限定式依赖注入
jinnianshilongnian
spring spring4 泛型式依赖注入
Spring4新特性——泛型限定式依赖注入
Spring4新特性——核心容器的其他改进
Spring4新特性——Web开发的增强
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Spring4新特性——Groovy Bean定义DSL
Spring4新特性——更好的Java泛型操作API
Spring4新
centOS安装GCC和G++
liuxihope
centos gcc
Centos支持yum安装,安装软件一般格式为yum install .......,注意安装时要先成为root用户。
按照这个思路,我想安装过程如下:
安装gcc:yum install gcc
安装g++: yum install g++
实际操作过程发现,只能有gcc安装成功,而g++安装失败,提示g++ command not found。上网查了一下,正确安装应该
第13章 Ajax进阶(上)
onestopweb
Ajax
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/
How to determine BusinessObjects service pack and fix pack
blueoxygen
BO
http://bukhantsov.org/2011/08/how-to-determine-businessobjects-service-pack-and-fix-pack/
The table below is helpful. Reference
BOE XI 3.x
12.0.0.
y BOE XI 3.0 12.0.
x.
y BO
Oracle里的自增字段设置
tomcat_oracle
oracle
大家都知道吧,这很坑,尤其是用惯了mysql里的自增字段设置,结果oracle里面没有的。oh,no 我用的是12c版本的,它有一个新特性,可以这样设置自增序列,在创建表是,把id设置为自增序列
create table t
(
id number generated by default as identity (start with 1 increment b
Spring Security(01)——初体验
yang_winnie
spring Security
Spring Security(01)——初体验
博客分类: spring Security
Spring Security入门安全认证
首先我们为Spring Security专门建立一个Spring的配置文件,该文件就专门用来作为Spring Security的配置