Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
KevinBlandy committed Feb 2, 2024
1 parent a5241c3 commit 659be91
Show file tree
Hide file tree
Showing 6 changed files with 139 additions and 23 deletions.
6 changes: 3 additions & 3 deletions Css/css-布局-flex.css
Original file line number Diff line number Diff line change
Expand Up @@ -231,14 +231,14 @@ Flex
# flex-grow
* 定义项目的放大比例, 非负数, 整数。
* 每个 item 的 flex-basis 计算出来后(加上子元素之间的外边距), 占据的空间可能不会占满容器宽度(剩余空间,放大)
* 默认为 0,即如果存在剩余空间,也不放大
* '默认为 0',即如果存在剩余空间,也不放大
* 如果所有项目的 flex-grow 属性都为 1,则它们将等分剩余空间(如果有的话)
* 如果一个项目的 flex-grow 属性为 2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍

# flex-shrink
* 项目的缩小比例,默认为1,即如果空间不足,该项目将缩小, 值越大, 收缩越大。
* 项目的缩小比例'默认为1',即如果空间不足,该项目将缩小, 值越大, 收缩越大。
* 每个 item 的 flex-basis 计算出来后(加上子元素之间的外边距), 占据的空间可能会超出容器宽度(空间不足,缩小)
* 如果所有项目的 flex-shrink 属性都为1,当空间不足时,都将等比例缩小
* 如果所有项目的 flex-shrink 属性都为1当空间不足时都将等比例缩小(默认情况下,空间不足都会等比例缩小)
* 如果一个项目的 flex-shrink 属性为 0,其他项目都为1,则空间不足时,前者不缩小(值越大,缩小程度越大)
* 负值对该属性无效

Expand Down
38 changes: 18 additions & 20 deletions Css/css-布局-grid.css
Original file line number Diff line number Diff line change
Expand Up @@ -48,18 +48,18 @@ grid 基本概念

# 行和列的划分
grid-template-columns
* 属性定义每一列的列宽
* 属性定义每一列的 '列宽'
grid-template-columns: 200px 200px;
grid-template-rows
* 定义每一行的行高
* 定义每一行的 '行高'
grid-template-rows: 200px 200px;


* 除了使用绝对单位,也可以使用百分比。
grid-template-rows: 33.33% 33.33% 33.33%;

* 有时候,重复写同样的值非常麻烦,尤其网格很多时。
* 可以使用repeat()函数,简化重复的值。
* 可以使用 repeat() 函数,简化重复的值。
grid-template-columns: repeat(3, 33.33%); /* 第一个参数表示重复几次, 第二个参数表示重复的值 */
grid-template-columns: repeat(2, 100px 20px 80px) /* 相当于: 100px 20px 80px 100px 20px 80px */

Expand All @@ -69,11 +69,11 @@ grid 基本概念
grid-template-columns: repeat(auto-fill, 100px); /* 每列宽度100px,然后自动填充,直到容器不能放置更多的列 */


* 如果要限制每一列的最大/最小宽度值, 用minmax函数
* 如果要限制每一列的最大/最小宽度值, 用 minmax 函数
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));/* 每一行尽量容纳更多的列。每一列最低100PX,最高1fr */

* 如果网格元素不够填满所有网格轨道,auto-fill就会导致一些空的网格轨道
* 如果不希望出现空的网格轨道,可以使用 auto-fit 关键字代替auto-fill, 它会让非空的网格轨道扩展,填满可用空间
* 如果网格元素不够填满所有网格轨道,auto-fill 就会导致一些空的网格轨道
* 如果不希望出现空的网格轨道,可以使用 auto-fit 关键字代替 auto-fill, 它会让非空的网格轨道扩展,填满可用空间

* 按照比例的划分
* 为了方便表示比例关系,网格布局提供了fr关键字(fraction 的缩写,意为"片段"
Expand All @@ -89,7 +89,7 @@ grid 基本概念
grid-template-columns: 1fr 1fr minmax(100px, 1fr); /* 表示列宽不小于100px,不大于1fr。 */


* auto关键字表示由浏览器自己决定长度
* auto 关键字表示由浏览器自己决定长度
grid-template-columns: 100px auto 100px; /* 第二列的宽度,基本上等于该列单元格的最大宽度,除非单元格内容设置了min-width,且这个值大于最大宽度。 */


Expand All @@ -100,21 +100,18 @@ grid 基本概念


# 间隔
grid-row-gap
row-gap
* 设置行与行的间隔(行间距)
grid-row-gap: 20px;
grid-column-gap
column-gap
* 设置列与列的间隔(列间距)
grid-column-gap: 20px;

grid-gap
gap
* 行列间距的简写
grid-gap: <grid-row-gap> <grid-column-gap>;
* 如果省略了第二个值,浏览器认为第二个值等于第一个值。

* 根据最新标准,这三个属性名的grid-前缀已经删除
* grid-column-gap和grid-row-gap写成column-gap和row-gap,grid-gap写成gap。


# 区域
* 网格布局允许指定"区域"(area),一个区域由单个或多个单元格组成
Expand All @@ -139,7 +136,7 @@ grid 基本概念


* 区域的命名会影响到网格线。每个区域的起始网格线,会自动命名为:区域名-start,终止网格线自动命名为:区域名-end。
* 比如,区域名为header,则起始位置的水平网格线和垂直网格线叫做header-start,终止位置的水平网格线和垂直网格线叫做header-end。
* 比如,区域名为 header,则起始位置的水平网格线和垂直网格线叫做 header-start,终止位置的水平网格线和垂直网格线叫做 header-end。

# 摆放方式
* 划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格
Expand All @@ -154,11 +151,12 @@ grid 基本概念
* 从上往下竖着放, 放不下了放到下一列

row dense
* 先行后列,尽可能紧密填满,尽量不出现空格

* 表示 '先行后列',尽可能紧密填满,尽量不出现空格
* 先列后行,并且尽量填满空格

* 这两个值主要用于,某些项目指定位置以后,剩下的项目怎么自动放置。

column dense
* 表示 '先列后行',并且尽量填满空格。


# 单元格内容的水平位置
Expand Down Expand Up @@ -217,9 +215,9 @@ grid 基本概念

# 属性的简写
grid-template
* grid-template-columns、grid-template-rows和grid-template-areas这三个属性的合并简写形式
* grid-template-columns、grid-template-rows 和 grid-template-areas 这三个属性的合并简写形式
grid
* grid-template-rows、grid-template-columns、grid-template-areas、 grid-auto-rows、grid-auto-columns、grid-auto-flow这六个属性的合并简写形式
* grid-template-rows、grid-template-columns、grid-template-areas、 grid-auto-rows、grid-auto-columns、grid-auto-flow 这六个属性的合并简写形式


--------------------
Expand Down Expand Up @@ -267,7 +265,7 @@ grid 基本概念
* grid-row-start属性和grid-row-end的合并简写形式
grid-row: 1 / 2;

* 也可以使用span关键字,表示跨越多少个网格。
* 也可以使用 span 关键字,表示跨越多少个网格。
grid-column: 1 / span 2;
grid-row: 1 / span 2;

Expand Down
62 changes: 62 additions & 0 deletions Go/练习/解析Java生成的RSA密钥对.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package main

import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"fmt"
)

func main() {

// Java KeyPairGenerator 生成的密钥对
publicKeyStr := "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvyKd9UmWRG1/maRgYhdaetwWcRZ/TQMVeI/dL4/dqmVqWgv5VQ8r97thDxyrVyqQBWxfut1yOwc9HA10T62tuxD1x/MD9uU4pGgk5CbiGMEYylJ3OJWVzFGpcSlCuc52ZB95o+Ao2UPxn5t5Fd4ulOC4uLPBrWI2pnZo80iU13YfWPVZNTnqAMQuJhsF9G8wrpTPP5a/92+AJLj6/sQC5AdLZRr8sHp9LQ7hU6Nk8nPM9S/4ciXrJFRcx6+NHAzo6c0geDMzjb/enzDaICaWujXkrljCPRCOaXdgjU7PTMNQjvhEWX7jK9hvcBztgPwsmysJOoDUtebzsEpEJJwrFwIDAQAB"
privateKeyStr := "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC/Ip31SZZEbX+ZpGBiF1p63BZxFn9NAxV4j90vj92qZWpaC/lVDyv3u2EPHKtXKpAFbF+63XI7Bz0cDXRPra27EPXH8wP25TikaCTkJuIYwRjKUnc4lZXMUalxKUK5znZkH3mj4CjZQ/Gfm3kV3i6U4Li4s8GtYjamdmjzSJTXdh9Y9Vk1OeoAxC4mGwX0bzCulM8/lr/3b4AkuPr+xALkB0tlGvywen0tDuFTo2Tyc8z1L/hyJeskVFzHr40cDOjpzSB4MzONv96fMNogJpa6NeSuWMI9EI5pd2CNTs9Mw1CO+ERZfuMr2G9wHO2A/CybKwk6gNS15vOwSkQknCsXAgMBAAECggEAGVjK38NxdQOcX1CoI3n7Wr2jED4uhZT6HPHfIDaQ687lKqnZ18jaSNEFjw57PmT7kmyLyWkig+dy2CyElyhuGJeoMGruxKgjOdJByivJ4gSBeBs1ikB0DBNsSABzw9Y4ZxCxfeT1JdLX0RW6GgdL4BxpAr172rVij/K1+kVOz7+0kWQ+07i8fOKvgPm6onby0AtKwkJ2XCLxPE/UZTKuEK8BCB0/HvZ4WicsfWFO33TM04fNsqCewSSZVXbs4gh28SM/wdJ9JajZRZqhFKj2cJ5Zyc3/3T58B950B/7cIo+KxTVHztHppOSC35n8qb/f0tik2DrAwXm2EeaB5azI8QKBgQDvKtqMy4pWGv8zY4dBCdU0+p130fv7xjdB0kBs1dWghJtj8+fNkiRjPTYh/JjH42uCn/lpfy5HBH4xDVM4gytYFO//zjhmeFKOjE2e2U0mEm/OREspBDEtjoRFv4FDO+uiv2BtuVRYJE+Q63dcP8DIe//CK72yPd/6CTdTAsfxLwKBgQDMllqm8jJa6Wq3MtOF4BkbKXZNOF8Zp72jOueGFpP6DycLfhfmrj1g77aeZGQQLcOt+NJBO2tNePWWCCzWaPJElQ6WP9BbNA+lPxqHf+7wmBR8nwVUygy7a9uSjszdpVanKUjO4DYTeWfxzvAzVAJJ+ShIPVf5m2PNvtt0BzXamQKBgQDB6H2/b3seas8ETCqp+Z3qUVMAhbiGnmPIsv3W/9wvQ7R06pjDHDzyVPuhvJnmXqWZB7kA5sOPgr4JaSNTC05GINuhDALAWcedmXWJV+dr+cC6fLZvb92rcQQfRLA54cgfcIhvDbarq+zys2ZX3byhD6ACPtKTRAVnRLedTwDqswKBgHqWGOlxtDR/Kl9tSAsutTxuQqGQhoNT3DCDahkRTEeIbsfXHTEu9D4yRIVx9/ctxNNohWtq1CfOs7DbYypyJcBsZBopUIpljn5gamAIiz6Ekbn+eu5MRwbCYQXXJPAmUt7EwQiclipjE6Jzcb//tYNnlPh8MUuyDUJJ+yrx6xX5AoGAUgozGJsnDtE8qWMIDhbY7J7di0CsSMsFiWR3roJCgH3KkyftXGNtOwOjlyn6POeXbemFKE9ESGqVjTHZ7wuGO6tDB7gqJ3+cBFaRq2B827OvJ7W1DUo2gMfa1w7kIPwz4AfLaQ/wnpqx7O1kcNfeYAn/5Lf5bX+abjutRTYGdCA="

// Base64 解码
publicKeyBytes, err := base64.StdEncoding.DecodeString(publicKeyStr)
if err != nil {
fmt.Printf("解码公钥失败 err=%s\n", err.Error())
return
}

privateKeyBytes, err := base64.StdEncoding.DecodeString(privateKeyStr)
if err != nil {
fmt.Printf("解码私钥失败 err=%s\n", err.Error())
return
}

// 解析为 RSA 公钥 & 私钥
publicKey, err := x509.ParsePKIXPublicKey(publicKeyBytes)
if err != nil {
fmt.Printf("解析公钥失败 err=%s\n", err.Error())
return
}

rsaPublicKey := publicKey.(*rsa.PublicKey)

privateKey, err := x509.ParsePKCS8PrivateKey(privateKeyBytes)
if err != nil {
fmt.Printf("解析公钥失败 err=%s\n", err.Error())
return
}
rsaPrivateKey := privateKey.(*rsa.PrivateKey)

// 公钥加密 & 私钥解密

cypher, err := rsa.EncryptPKCS1v15(rand.Reader, rsaPublicKey, []byte("Hello World"))
if err != nil {
fmt.Printf("公钥加密失败 err=%s\n", err.Error())
return
}
fmt.Printf("密文:%s\n", base64.StdEncoding.EncodeToString(cypher))

raw, err := rsa.DecryptPKCS1v15(rand.Reader, rsaPrivateKey, cypher)
if err != nil {
fmt.Printf("私钥解密失败 err=%s\n", err.Error())
return
}

fmt.Printf("原文:%s\n", string(raw))
}
36 changes: 36 additions & 0 deletions Java/jdbc/java-jdbc-流式读取.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package app.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class ApplicationMainTest {

public static void main(String[] args) throws Exception {


// 注意,流式查询,连接对象不能公用,也就是说在迭代期间,不能把连接用于其他查询
try (Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true", "root", "root")) {

// 设置查询语句,和 ResultSet 设置
// ResultSet.TYPE_FORWARD_ONLY:只允许结果集的游标向下移动。
// ResultSet.CONCUR_READ_ONLY:游标只读
PreparedStatement statement = connection.prepareStatement("SELECT * FROM sku ORDER BY id", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);

// 一定要把 FetchSize 设置为 nteger.MIN_VALUE, 在执行 ResultSet.next() 方法时, 会通过数据库连接一条一条的返回, 这样也不会大量占用客户端的内存.
// MySQL 驱动实现做了特殊的判断
statement.setFetchSize(Integer.MIN_VALUE);


// 开始流式查询,迭代每一条记录
try(ResultSet resultSet = statement.executeQuery()){
while (resultSet.next()) {
Long id = resultSet.getLong("id");
System.out.println(id);
}
}
}
}
}
10 changes: 10 additions & 0 deletions Mybatis/MyBatis-流式读取.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---------------------------
流式读取
---------------------------


@Select("select * from xxx order by xx desc")
@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = Integer.MIN_VALUE)
@ResultType(XxxObject.class)
void queryStreamResult(ResultHandler<XxxObject> handler);

10 changes: 10 additions & 0 deletions Spring-boot/jpa/jpa-检索-流式检索.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
------------------------
流式检索
------------------------

import static org.hibernate.jpa.QueryHints.HINT_FETCH_SIZE;

// AvailableHints.HINT_FETCH_SIZE
@QueryHints(value = @QueryHint(name = HINT_FETCH_SIZE, value = "" + Integer.MIN_VALUE))
@Query(value = "select t from Todo t")
Stream<Todo> streamAll();

0 comments on commit 659be91

Please sign in to comment.