第一章
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学习笔记)
【一起学Rust | 设计模式】习惯语法——使用借用类型作为参数、格式化拼接字符串、构造函数
广龙宇
一起学Rust # Rust设计模式 rust 设计模式 开发语言
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、使用借用类型作为参数二、格式化拼接字符串三、使用构造函数总结前言Rust不是传统的面向对象编程语言,它的所有特性,使其独一无二。因此,学习特定于Rust的设计模式是必要的。本系列文章为作者学习《Rust设计模式》的学习笔记以及自己的见解。因此,本系列文章的结构也与此书的结构相同(后续可能会调成结构),基本上分为三个部分
四章-32-点要素的聚合
彩云飘过
本文基于腾讯课堂老胡的课《跟我学Openlayers--基础实例详解》做的学习笔记,使用的openlayers5.3.xapi。源码见1032.html,对应的官网示例https://openlayers.org/en/latest/examples/cluster.htmlhttps://openlayers.org/en/latest/examples/earthquake-clusters.
你可能遗漏的一些C#/.NET/.NET Core知识点
追逐时光者
C# .NET DotNetGuide编程指南 c# .net .netcore microsoft
前言在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NETCore拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。拾遗补漏GitHub开源地址https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/D
语文主题教学学习笔记之87
东哥杂谈
“语文主题教学”学习笔记之八十七(0125)今天继续学习小学语文主题教学的实践样态。板块三:教学中体现“书艺”味道。作为四大名著之一的《水浒传》,堪称我国文学宝库之经典。对从《水浒传》中摘选的单元,教师就要了解其原生态,即评书体特点。这也要求教师要了解一些常用的评书行话术语,然后在教学时适时地加入一些,让学生体味其文本中原有的特色。学生也要尽可能地通过朗读的方式,而不单是分析讲解的方式进行学习。细
《转介绍方法论》学习笔记
小可乐的妈妈
一、高效转介绍的流程:价值观---执行----方案一)转介绍发生的背景:1、对象:谁向谁转介绍?全员营销,人人参与。①员工的激励政策、客户的转介绍诱因制作客户画像:a信任;支付能力;意愿度;便利度(根据家长具备四个特征的个数分为四类)B性格分类C职业分类D年龄性别②执行:套路,策略,方法,流程2、诱因:为什么要转介绍?认同信任;多方共赢;传递美好;零风险承诺打动人心,超越期待。选择做教育,就是选择
JAVA学习笔记之23种设计模式学习
victorfreedom
Java技术 设计模式 android java 常用设计模式
博主最近买了《设计模式》这本书来学习,无奈这本书是以C++语言为基础进行说明,整个学习流程下来效率不是很高,虽然有的设计模式通俗易懂,但感觉还是没有充分的掌握了所有的设计模式。于是博主百度了一番,发现有大神写过了这方面的问题,于是博主迅速拿来学习。一、设计模式的分类总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器
新能源汽车 BMS 学习笔记篇—BMS 基本定义及分类
WPG大大通
其他 笔记 汽车 BMS 经验分享 新能源 电池
一、BMS定义1、概念:BMS(BatteryManagementSystem)即电池管理系统,其管理对象是二次电池(充电电池或蓄电池),其主要目的是电池的利用率,防止电池出现过度充电和过度放电,可应用于电动汽车、电瓶车、机器人、无人机等图片来源:腾讯网https://new.qq.com《标准普尔警告,电动汽车电池生产面临供应链和地缘政治风险》2、四大功能①感知和测量:检测电池的电压、电流、温度
吴恩达深度学习笔记(30)-正则化的解释
极客Array
正则化(Regularization)深度学习可能存在过拟合问题——高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据,这是非常可靠的方法,但你可能无法时时刻刻准备足够多的训练数据或者获取更多数据的成本很高,但正则化通常有助于避免过拟合或减少你的网络误差。如果你怀疑神经网络过度拟合了数据,即存在高方差问题,那么最先想到的方法可能是正则化,另一个解决高方差的方法就是准备更多数据,这也是非常
个人学习笔记7-6:动手学深度学习pytorch版-李沐
浪子L
深度学习 深度学习 笔记 计算机视觉 python 人工智能 神经网络 pytorch
#人工智能##深度学习##语义分割##计算机视觉##神经网络#计算机视觉13.11全卷积网络全卷积网络(fullyconvolutionalnetwork,FCN)采用卷积神经网络实现了从图像像素到像素类别的变换。引入l转置卷积(transposedconvolution)实现的,输出的类别预测与输入图像在像素级别上具有一一对应关系:通道维的输出即该位置对应像素的类别预测。13.11.1构造模型下
golang学习笔记--MPG模型
xxzed
golang # 学习笔记 学习 笔记 golang
MPG模式:M(Machine):操作系统的主线程P(Processor):协程执行需要的资源(上下文context),可以看作一个局部的调度器,使go代码在一个线程上跑,他是实现从N:1到N:M映射的关键G(Goroutine):协程,有自己的栈。包含指令指针(instructionpointer)和其它信息(正在等待的channel等等),用于调度。一个P下面可以有多个G1、当前程序有三个M,
碎片化学习笔记分享
剑客写作
现在生活节奏很快,学习力成为了我们拥有的最大财富。碎片化学习是最好的。首先,不要太过自信,学会虚心学习,是我们面对现实的好方法,才能够常保新鲜。平时我们要拥有什么工具呢?1.思维导图2.写在印象笔记里3.听书,消燥耳机4.教学输出5.录音笔里面最好的方式就是教学输出法,记忆里最好。当输出时我们集中精力记忆里最好。有人认为缩短睡眠时间来学习,其实最好的方式是保持最好的睡眠,记忆力会更好。剥夺睡眠,会
《随园诗话》学习笔记三百零六
飞鸿雪舞
卷五凡诗之传者,都在灵性五、五斗米与诗【原文】丁丑,余觅一抄书人,或荐黄生,名之纪,号星岩者,人甚朴野。偶过其案头,得句云;“破庵僧卖临街瓦,独井人争向晚泉。”余大奇之,即饷米五斗。自此欣然大用力于诗。五言句云:“云开日脚直,雨落水纹圆。竹锐穿泥壁,蝇酣落酒尊。钓久知鱼性,樵多识树名。笔残芦并用,墨尽指同磨。"七言云:"小窗近水寒偏觉,古木遮天曙不知。旧生萍处泥犹绿,新落花时水亦香。旧甓恐闲都贮水
D15 论语学习笔记
许小兔Angelina
悟:上级对下级的宽容:凡事成定局,就不你说了;已接近完结的事,也没必要匡正和挽回了;既然是过去的事,也没必要追究得失和责任了。对待孩子教育也是,不用“问责制”,这样容易让孩子因为害怕担责而说谎。应当循循善诱,避免再犯错才是最重要的。3.16:【原文】子曰:“射不主皮,为力不同科,古之道也。”【译文】孔子说:“射箭比赛不以射透为主,而主要看是否射得准确,因为人的力量不同,自古如此。”3.17:【原文
greenplum资源队列
李春田
文章来源https://www.cnblogs.com/pl-boke/p/9852439.html官方文档:https://gpdb.docs.pivotal.io/6-8/admin_guide/workload_mgmt.html1、创建资源队列语法Command:CREATERESOURCEQUEUEDescription:createanewresourcequeueforworkloa
网络工程师学习笔记(一)
专业白嫖怪
网络工程师学习笔记 学习 笔记 网络
为了备战下半年的软考——网络工程师,利用每天的下班的闲暇时间看书听课,然后自己手敲整理的系列资料。希望能够对你们有所帮助第一章__计算机网络概述计算机网络的定义:将分散的具有独立运算功能的计算机系统,通过通信线路和通信设备进行连接起来的实现资源的共享。ARPAnet网络的特征:资源共享、分散控制、分组交换1946年第一台通用计算机—埃尼亚克能够相互连通进行数据交换。1960年提出巨型网络,出现了对
基于深度学习的文本引导的图像编辑
SEU-WYL
深度学习dnn 深度学习 人工智能
基于深度学习的文本引导的图像编辑(Text-GuidedImageEditing)是一种通过自然语言文本指令对图像进行编辑或修改的技术。它结合了图像生成和自然语言处理(NLP)的最新进展,使用户能够通过描述性文本对图像内容进行精确的调整和操控。1.文本引导的图像编辑的挑战文本和图像之间的对齐:如何将文本中的语义信息准确地映射到图像中的特定区域或元素是一个关键挑战。这涉及到多模态数据的对齐和理解。编
K8S学习笔记02——K8S组件
沉淅尘
# Docker # K8S kubernetes
Kubernetes组件一、控制平面组件(ControlPlaneComponents)(1)kube-apiserver(2)etcd(3)kube-scheduler(4)kube-controller-manager(5)cloud-controller-manager二、Node组件1.kubelet2.kube-proxy3.容器运行时(ContainerRuntime)三、插件(Add
python工程打包成whl文件
机灵巢穴_WitNest
python python 开发语言
资料:PackagingPythonProjects—PythonPackagingUserGuide6.Modules—Python3.11.4documentation步骤1.安装打包工具python3-mpipinstallsetuptoolswheeltwine2.更新pip工具python3-mpipinstall--upgradepip3.创建工程结构python_test_packa
「Python」2020.04.08学习笔记 | 第六章文件(a+)模式+把随机手机号写入文件小练习
Yetta的书影屋
学习测试开发的Day97,真棒!学习时间为40M第九次全天课(下午视频二20M-50M)>>>fp.seek(0)0>>>fp.read()'你好11你好12你好13你好14你好15\n你好16\n你好17\n你好18\n'>>>fp.seek(0,0)0>>>fp.write("*********************************\n")34>>>fp.seek(0,0)0>>>f
《金文成〈中庸〉学习笔记401。2020-2-24》
金吾生
《金文成〈中庸〉学习笔记401。2020-2-24》今天是庚子年戊寅月丁酉日,二月初二,2020年2月24日星期一。二月二龙抬头。第二十二章【唯天下至诚,为能尽其性;能尽其性,则能尽人之性;能尽人之性,则能尽物之性;能尽物之性,则能赞天地之化育;能赞天地之化育,则可以与天地参矣。】上一节,船山讲解说,性作为天用之本体,于圣人和匹夫匹妇而言并无二致,区别来自于诚。诚的区别来自于纯粹与掺杂。掺杂什么呢
CDGA学习笔记三-《数据安全》
zy_chris
网络 安全
七、数据安全7.1引言数据安全包括安全策略和过程的规划、建立与执行,为数据和信息资产提供正确的身份验证、授权、访问和审计。要求来自以下方面:(1)利益相关方(2)政府法规(3)特定业务关注点(4)合法访问需求(5)合同义务7.1.1业务驱动因素1、降低风险信息安全首先对组织数据进行分级分类,对组织数据进行分类分级的整个流程:1)识别敏感数据资产并分类分级2)在企业中查找敏感数据3)确定保护每项资产
vue学习笔记——关于对Vue3 ref(), toRef(), toRefs(), unref(), isRef(), reactive()方法的理解。
chen_sir_sh
vue学习笔记 javascript 前端 vue
VUE3出现了很多新的API,下面是自己的一些理解进行的总结。欢迎大家一起交流补充。ref()使用ref创建一个数据类型,ref有value这个属性constname1={age:"14",name:"bob1"};constname2=ref({name:"bob2"});//使用ref创建一个数据类型相对于reactive,ref有value属性name2.value="bob3"consol
遇到僵尸进程,怎么处理---学习笔记
summer@彤妈
性能优化 linux
僵尸进程解释当iowait升高时,进程很可能因为得不到硬件的响应,而长时间处于不可中断状态。从ps或者top命令的输出中,你可以发现它们都处于D状态,也就是不可中断状态(UninterruptibleSleep)。既然说到了进程的状态,进程有哪些状态你还记得吗?我们先来回顾一下。top和ps是最常用的查看进程状态的工具,我们就从top的输出开始。下面是一个top命令输出的示例,S列(也就是Stat
C++学习笔记----6、内存管理(五)---- 智能指针(3)
王俊山IT
c++ 学习 笔记 开发语言
2、shared_ptr有时候吧,有些对象或者一部分代码需要同一个指针的拷贝。那么unique_ptr不能被拷贝,因此就不能用于些场景。这样的话,std::shared_ptr就是一个支持能够被拷贝的拥有共享属主的智能指针。但是,如果有指向同一个资源的多个shared_ptr实例,那么怎么知道什么时候去释放资源呢?这可以通过对于引用记数来解决,这个我们以后再聊。首先,让我们看一下怎么构造与使用sh
【学习笔记】武志红心理学—潜意识决定命运
万万千千
冰山一角什么构成了我们的命运?命运是由我们的显意识和潜意识来决定的。我们可以用一张图做一个比喻。看过“冰山一角”图片的都知道,潜意识就是水面以下的部分,显意识是水面以上的部分,从体积来看,潜意识占了大部分,而显意识只是冰山一角,纵向来看,庞大的潜意识支撑着冰山一角的显意识,才得以让冰山漂浮在水面。延伸到我们的人生,我们对自己显意识层面的想法很容易感知到,所以我们会说这是“我”自己做的选择。而潜意识
Prism 教程
yang_B621
Prism IOC
http://t.csdnimg.cn/VXSSvhttps://blog.csdn.net/u010476739/article/details/119341731Prism-随笔分类-Hello——寻梦者!-博客园(cnblogs.com)C#IoC学习笔记-缥缈的尘埃-博客园(cnblogs.com)WPF_SchuylerEX的博客-CSDN博客
绘本讲师训练营【第30期】2/21阅读原创《绘本之力》学习笔记2
郑贤钰
30028郑贤钰今天读了绘本之力《留在灵魂里的东西》读了心里有非常大的感触!两个年幼什么都不懂的孩子,为了自己心爱的东西,攒下来自己的零花钱,却买了一个自己不知道怎么用的东西,当他们觉得这个东西根本就不好,准备扔掉的时候,这是故事中的有趣有爱的老爷爷出现了,帮助孩子们再一次发现之前别人拉出优美的音乐,原来自己买的这一个琴,自认为没用的琴也能够经过老爷爷熟练的演奏也能拉出这样优美的声音,这让孩子们十
仿老师悟
耕海者
毕业十年了,今天去拜访老师,看到老师的学习笔记,看到老师努力学习,积极提高的状态,我觉着自己真是有些懈怠了,孩子们,老师的老师都在孜孜不倦,我们岂能偷懒!
C++学习笔记----7、使用类与对象获得高性能(一)---- 书写类(2)
王俊山IT
c++ 学习 笔记 开发语言
2.2、定义成员函数前面对SpreadsheetCell类的定义足以让你生成类的对象。然而,如果想调用setValue()或者getValue()成员函数,连接器就会抱怨这些函数没有定义。这是因为到目前为止,这些成员函数只有原型,而还没有实现。通常,类的定义会在模块接口文件。对于成员函数的定义,你有一个选择:可以在模块定义文件或者在模块实现文件。下面是SpreadsheetCell类,在类内对成员
Spring6学习笔记4:事务
·云扬·
SSM Java # Spring 学习 笔记 spring
1JdbcTemplate1.1简介Spring框架对JDBC进行封装,使用JdbcTemplate方便实现对数据库操作准备工作①搭建子模块搭建子模块:spring-jdbc-tx②加入依赖org.springframeworkspring-jdbc6.0.2mysqlmysql-connector-java8.0.30com.alibabadruid1.2.15③创建jdbc.propertie
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的配置