From 7300643a6cb3ca9685078c0e654fb4771723a363 Mon Sep 17 00:00:00 2001 From: wangduwei Date: Tue, 9 Jul 2024 15:05:52 +0800 Subject: [PATCH] Site updated: 2024-07-09 15:05:51 --- 2021/08/index.html | 6 +- 2021/09/index.html | 6 +- 2021/10/index.html | 6 +- 2021/11/index.html | 6 +- 2021/12/index.html | 6 +- 2021/index.html | 6 +- 2021/page/2/index.html | 6 +- 2021/page/3/index.html | 6 +- 2022/01/index.html | 6 +- 2022/04/index.html | 6 +- 2022/05/index.html | 6 +- 2022/06/index.html | 6 +- 2022/10/index.html | 6 +- 2022/index.html | 6 +- 2022/page/2/index.html | 6 +- 2023/03/index.html | 6 +- 2023/06/index.html | 6 +- 2023/07/index.html | 6 +- 2023/08/index.html | 6 +- 2023/10/index.html | 6 +- 2023/11/index.html | 6 +- 2023/index.html | 6 +- 2024/04/index.html | 6 +- 2024/05/index.html | 6 +- 2024/07/index.html | 465 ++++++ 2024/index.html | 46 +- ...aven-publish\346\217\222\344\273\266.html" | 4 +- about/index.html | 4 +- admob-init-performance-test.html | 630 ++++++++ android-aosp-event-loop.html | 4 +- android-basic-constraintlayout.html | 4 +- android-github-source-retrofit.html | 4 +- android-github-source-spacex.html | 4 +- android-github-source-workmanager.html | 4 +- android-jetpack-compose-sideeffect.html | 4 +- android-jetpack-compose-state-management.html | 4 +- android-jetpack-startup.html | 549 +++++++ android-library-room-7-tips.html | 4 +- android-scoped-storage.html | 4 +- android-target-30.html | 4 +- archives/index.html | 559 +++---- archives/page/2/index.html | 558 +++---- archives/page/3/index.html | 787 ++++----- archives/page/4/index.html | 1415 +++++++++-------- archives/page/5/index.html | 485 +++++- atom.xml | 99 +- baidusitemap.xml | 22 +- base-economic-concept.html | 4 +- basic-encryption-algorithm.html | 4 +- categories/Reading/index.html | 4 +- categories/index.html | 4 +- .../\345\267\245\344\275\234/index.html" | 4 +- .../index.html" | 4 +- .../index.html" | 4 +- .../page/2/index.html" | 4 +- .../page/3/index.html" | 4 +- .../page/4/index.html" | 4 +- cpu-cache-overview.html | 4 +- cpu-pipline-overview.html | 4 +- cs-operating-systems-file-system.html | 4 +- css/main.css | 2 +- econonmics-roa-roe-roic-roce.html | 4 +- ep-good-developer-manifesto.html | 4 +- file-format-class.html | 4 +- file-format-elf-relocation.html | 4 +- file-format-elf.html | 4 +- flutter-state-bloc.html | 4 +- flutter-state-provider.html | 4 +- flutter-widget-row.html | 4 +- images/ad/mediator_failure.png | Bin 0 -> 20625 bytes images/ad/mediator_success.png | Bin 0 -> 21819 bytes .../android/android-contentprovider-start.png | Bin 0 -> 74989 bytes images/books/jing_ji_si_xiang_shi.jpg | Bin 0 -> 127597 bytes images/books/renzhitianxing.jpg | Bin 0 -> 68792 bytes index.html | 89 +- java-multithreading-synchronized.html | 4 +- java-object-layout.html | 4 +- kotlin-coroutine-deep-recursion.html | 4 +- kotlin-lang-flow-under-the-hood.html | 4 +- kotlin-lang-flow.html | 4 +- kotlin-lang-inline-func-param.html | 4 +- kotlin-lang-jvm-annotation.html | 4 +- kotlin-lang-jvmstatic-with-interface.html | 4 +- kotlin-lang-sequence.html | 4 +- kotlin-lang-use-dsl.html | 4 +- kotlin-lang-use-mutable-collection.html | 4 +- leetcode-list-add.html | 4 +- leetcode-reverse-list.html | 4 +- model-csp-deadlocks.html | 4 +- my-work-of-this-week-01.html | 4 +- page/2/index.html | 89 +- page/3/index.html | 89 +- page/4/index.html | 86 +- page/5/index.html | 46 +- principles-of-economics.html | 4 +- search.xml | 527 +++--- sitemap.xml | 102 +- tags/Android/index.html | 4 +- tags/C-C/index.html | 4 +- tags/CPU/index.html | 4 +- tags/Compose/index.html | 4 +- tags/Concurrency/index.html | 4 +- tags/Economics/index.html | 4 +- tags/File/index.html | 4 +- tags/Flutter/index.html | 4 +- tags/JVM/index.html | 4 +- tags/Java/index.html | 4 +- tags/Kotlin/index.html | 4 +- tags/LeetCode/index.html | 4 +- tags/Linux/index.html | 4 +- tags/List/index.html | 4 +- tags/Reading/index.html | 4 +- tags/View/index.html | 4 +- tags/cryptography/index.html | 4 +- tags/index.html | 4 +- .../index.html" | 4 +- "tags/\345\267\245\344\275\234/index.html" | 4 +- .../index.html" | 4 +- "tags/\346\236\266\346\236\204/index.html" | 4 +- "tags/\347\256\227\346\263\225/index.html" | 4 +- .../index.html" | 4 +- .../index.html" | 4 +- .../index.html" | 4 +- "tags/\351\223\276\350\241\250/index.html" | 4 +- ...\347\244\272\345\275\225\343\200\213.html" | 42 +- ...44\270\216\346\225\260\345\255\22713.html" | 4 +- ...\346\200\235\350\200\203\343\200\213.html" | 4 +- ...\350\200\203\346\263\225\343\200\213.html" | 4 +- 128 files changed, 4631 insertions(+), 2516 deletions(-) create mode 100644 2024/07/index.html create mode 100644 admob-init-performance-test.html create mode 100644 android-jetpack-startup.html create mode 100644 images/ad/mediator_failure.png create mode 100644 images/ad/mediator_success.png create mode 100644 images/android/android-contentprovider-start.png create mode 100644 images/books/jing_ji_si_xiang_shi.jpg create mode 100644 images/books/renzhitianxing.jpg diff --git a/2021/08/index.html b/2021/08/index.html index 8cd1b9eb..e4d43b76 100644 --- a/2021/08/index.html +++ b/2021/08/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -431,13 +431,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2021/09/index.html b/2021/09/index.html index 6cbfef5c..25a2830e 100644 --- a/2021/09/index.html +++ b/2021/09/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -431,13 +431,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2021/10/index.html b/2021/10/index.html index 2ba9ea6a..9caf2fd6 100644 --- a/2021/10/index.html +++ b/2021/10/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -391,13 +391,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2021/11/index.html b/2021/11/index.html index e1dc1513..ce7c8099 100644 --- a/2021/11/index.html +++ b/2021/11/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -411,13 +411,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2021/12/index.html b/2021/12/index.html index 2d009004..495d1900 100644 --- a/2021/12/index.html +++ b/2021/12/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -371,13 +371,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2021/index.html b/2021/index.html index 3d8a8834..d75056b4 100644 --- a/2021/index.html +++ b/2021/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -514,13 +514,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2021/page/2/index.html b/2021/page/2/index.html index d8c9be80..ed2d1706 100644 --- a/2021/page/2/index.html +++ b/2021/page/2/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -514,13 +514,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2021/page/3/index.html b/2021/page/3/index.html index 538217a4..b2ed95e5 100644 --- a/2021/page/3/index.html +++ b/2021/page/3/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -394,13 +394,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2022/01/index.html b/2022/01/index.html index 82819247..69b8caf5 100644 --- a/2022/01/index.html +++ b/2022/01/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -331,13 +331,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2022/04/index.html b/2022/04/index.html index 96b1ff25..32a42523 100644 --- a/2022/04/index.html +++ b/2022/04/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -331,13 +331,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2022/05/index.html b/2022/05/index.html index afe8734e..c00780b8 100644 --- a/2022/05/index.html +++ b/2022/05/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -411,13 +411,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2022/06/index.html b/2022/06/index.html index 1fc48a5d..c4174e2a 100644 --- a/2022/06/index.html +++ b/2022/06/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -351,13 +351,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2022/10/index.html b/2022/10/index.html index 143c2db7..c6c54481 100644 --- a/2022/10/index.html +++ b/2022/10/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -351,13 +351,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2022/index.html b/2022/index.html index cd3d7aaf..8114c5d4 100644 --- a/2022/index.html +++ b/2022/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -514,13 +514,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2022/page/2/index.html b/2022/page/2/index.html index e3807e77..cef25bc5 100644 --- a/2022/page/2/index.html +++ b/2022/page/2/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -334,13 +334,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2023/03/index.html b/2023/03/index.html index a0d016bd..ff9f083e 100644 --- a/2023/03/index.html +++ b/2023/03/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -331,13 +331,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2023/06/index.html b/2023/06/index.html index c1983112..d76ecff3 100644 --- a/2023/06/index.html +++ b/2023/06/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -331,13 +331,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2023/07/index.html b/2023/07/index.html index fae05d44..a03e5e43 100644 --- a/2023/07/index.html +++ b/2023/07/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -331,13 +331,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2023/08/index.html b/2023/08/index.html index 451accf8..5750c7c2 100644 --- a/2023/08/index.html +++ b/2023/08/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -331,13 +331,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2023/10/index.html b/2023/10/index.html index 10409d0b..98753923 100644 --- a/2023/10/index.html +++ b/2023/10/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -331,13 +331,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2023/11/index.html b/2023/11/index.html index a775936f..d7cda349 100644 --- a/2023/11/index.html +++ b/2023/11/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -331,13 +331,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2023/index.html b/2023/index.html index e8720eb7..423e6dfa 100644 --- a/2023/index.html +++ b/2023/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -431,13 +431,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2024/04/index.html b/2024/04/index.html index ad81da7b..2e8b834f 100644 --- a/2024/04/index.html +++ b/2024/04/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -331,13 +331,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2024/05/index.html b/2024/05/index.html index 62d84574..9fdd8570 100644 --- a/2024/05/index.html +++ b/2024/05/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -351,13 +351,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52
diff --git a/2024/07/index.html b/2024/07/index.html new file mode 100644 index 00000000..0c9ab1d3 --- /dev/null +++ b/2024/07/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 归档 | 蓝色的笔记本 + + + + + + + + + + + + + + +
+
+ +
+
+ + +
+ + + +

蓝色的笔记本

+ +
+

记录学习内容

+
+ + +
+ + + + + + + + +
+ +
+ +
+
+ + +
+ + 0% +
+ + +
+
+
+ + +
+ + + + + +
+
+
+ + 还行! 目前共计 46 篇日志。 继续努力。 +
+ + +
+ 2024 +
+ + + + + + +
+
+ + + + + + + + +
+ + + + +
+ + + + + + + + +
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2024/index.html b/2024/index.html index 10023962..9701f4bb 100644 --- a/2024/index.html +++ b/2024/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -198,6 +198,46 @@

蓝色的笔记本

2024
+
+
+ + + +
+ +
+ +
+
+ +
+
+ + + +
+ +
+ +
+
+
@@ -371,13 +411,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52 diff --git "a/Android\347\232\204maven\346\217\222\344\273\266\345\222\214maven-publish\346\217\222\344\273\266.html" "b/Android\347\232\204maven\346\217\222\344\273\266\345\222\214maven-publish\346\217\222\344\273\266.html" index 55c17e40..ac3e0d87 100644 --- "a/Android\347\232\204maven\346\217\222\344\273\266\345\222\214maven-publish\346\217\222\344\273\266.html" +++ "b/Android\347\232\204maven\346\217\222\344\273\266\345\222\214maven-publish\346\217\222\344\273\266.html" @@ -438,13 +438,13 @@

- 120k + 123k - 1:50 + 1:52 diff --git a/about/index.html b/about/index.html index 52b951ee..f8b04e2c 100644 --- a/about/index.html +++ b/about/index.html @@ -324,13 +324,13 @@

关于 - 120k + 123k - 1:50 + 1:52 diff --git a/admob-init-performance-test.html b/admob-init-performance-test.html new file mode 100644 index 00000000..26a2ce0d --- /dev/null +++ b/admob-init-performance-test.html @@ -0,0 +1,630 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Admob的初始化过程 | 蓝色的笔记本 + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + +
+ +
+ +
+
+ + +
+ + 0% +
+ + +
+
+
+ + +
+ + + + + +
+ + + + + +
+

+ Admob的初始化过程 +

+ + +
+ + + + +
+ + +

在接入Google Admob时,依据官方文档 或 依据开发习惯,我们一般先对Admob SDK进行初始化,然后进行广告加载:

+
1
2
3
4
5
6
7
8
// first init the admob sdk
MobileAds.initialize(context) {
//init successful
}

//second load Ad
val adRequest = AdRequest.Builder().build()
adView.loadAd(adRequest)
+ +

那么,多思考一下,我们有个疑问:

+

1、一定要先初始化,才能加载广告吗❓

实验设计:不执行初始化操作,直接请求广告。

+
1
2
val adRequest = AdRequest.Builder().build()
adView.loadAd(adRequest)
+ +

实验结论:不初始化SDK也能成功加载到广告。

+

2、为什么不初始化也能加载广告呢❓

猜想:
1、初始化和加载有关联性:加载广告时,发现没有初始化,先进行了初始化,再执行广告加载操作。
2、初始化和加载无关联系:加载广告不需要SDK初始化,两者无关联。

+

设:广告初始化耗时m毫秒,广告加载耗时n毫秒,总耗时m+n毫秒。

+

实验设计:
A组:执行初始化,同时执行广告加载。
若初始化和加载有关联性,广告加载时长约等于m+n。
若初始化和加载无关联性,广告加载时长约等于n。

+

日志输出示例:

+
1
2
3
4
2024-07-06 10:10:06.061 23555-23555 InitAndLoad     com...oid.gms.example.bannerexample  D  call init....
2024-07-06 10:10:06.224 23555-23555 InitAndLoad com...oid.gms.example.bannerexample D start load....
2024-07-06 10:10:07.401 23555-23555 InitAndLoad com...oid.gms.example.bannerexample D after init = 1340
2024-07-06 10:10:08.416 23555-23555 InitAndLoad com...oid.gms.example.bannerexample D onAdLoaded...cost = 2192
+ +

初始化耗时 m=1340ms
加载耗时 n=2192ms

+

B组:延迟10s执行初始化。立即执行广告加载。

+

日志输出示例:

+
1
2
3
4
2024-07-06 13:23:42.675 27481-27481 DelayInitAndLoad    com...oid.gms.example.bannerexample  D  start load....
2024-07-06 13:23:43.453 27481-27481 DelayInitAndLoad com...oid.gms.example.bannerexample D call init....
2024-07-06 13:23:46.208 27481-27481 DelayInitAndLoad com...oid.gms.example.bannerexample D onAdLoaded...cost = 3532
2024-07-06 13:23:53.486 27481-27481 DelayInitAndLoad com...oid.gms.example.bannerexample D after init = 24
+ +

初始化耗时 m=24ms
加载耗时 n=3532ms

+

结论:由于广告加载成功后,才调用初始化逻辑,因此初始化时长大幅降低。故:初始化和加载有关联性。

+

3、聚合的SDK初始化了吗❓

实验设计:
A:不初始化SDK,加载广告后,打开AdInspector。
B:初始化SDK,加载广告后,打开AdInspector。

+ + + + + +
+ +

实验结论:不初始化只能加载Admob自身的广告,初始化后可以加载聚合源的广告。

+

3、初始化成功后再加载广告 VS 直接加载广告 加载速度的对比

直接加载:

+ + + + + + + + + + + + + + + + + +
第一组第二组第三组第四组第五组
2915ms1581ms1435ms1621ms1581ms
+

初始化后加载:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
第一组第二组第三组第四组第五组
初始化2373ms2374246324272298
加载1468ms1386150524981250
日志总耗时38433762397049273550
+

结论:初始化后才加载广告慢于直接加载广告。

+

4、一种开屏广告的优化方案

不初始化SDK也能加载到Admob广告,且加载速度较快,但是没有参与bidding,价格较低。
初始化之后,加载聚合源广告,速度较慢,但经过bidding后,价格会高一点。

+

结合两个加载方式,闪屏时段内加载广告,闪屏n秒时长内,加载到bidding类型则展示bidding类型。没加载到,则展示Admob类型。

+ +
+ + + + +
+
赏你一杯咖啡
+ + +
+ + + +
+ +
+ + + + +
+ + + + + + +
+ + + + +
+ + + + + + + + +
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android-aosp-event-loop.html b/android-aosp-event-loop.html index 34f48d64..6bdaa351 100644 --- a/android-aosp-event-loop.html +++ b/android-aosp-event-loop.html @@ -486,13 +486,13 @@

- 120k + 123k - 1:50 + 1:52 diff --git a/android-basic-constraintlayout.html b/android-basic-constraintlayout.html index 31b1a60f..e52662cb 100644 --- a/android-basic-constraintlayout.html +++ b/android-basic-constraintlayout.html @@ -762,13 +762,13 @@

- 120k + 123k - 1:50 + 1:52 diff --git a/android-github-source-retrofit.html b/android-github-source-retrofit.html index f527483f..0d724149 100644 --- a/android-github-source-retrofit.html +++ b/android-github-source-retrofit.html @@ -463,13 +463,13 @@

- 120k + 123k - 1:50 + 1:52 diff --git a/android-github-source-spacex.html b/android-github-source-spacex.html index bacdccf5..d8075caf 100644 --- a/android-github-source-spacex.html +++ b/android-github-source-spacex.html @@ -473,13 +473,13 @@

- 120k + 123k - 1:50 + 1:52 diff --git a/android-github-source-workmanager.html b/android-github-source-workmanager.html index 5075743d..e2120965 100644 --- a/android-github-source-workmanager.html +++ b/android-github-source-workmanager.html @@ -484,13 +484,13 @@

- 120k + 123k - 1:50 + 1:52 diff --git a/android-jetpack-compose-sideeffect.html b/android-jetpack-compose-sideeffect.html index adb60b8e..3b387882 100644 --- a/android-jetpack-compose-sideeffect.html +++ b/android-jetpack-compose-sideeffect.html @@ -489,13 +489,13 @@

- 120k + 123k - 1:50 + 1:52 diff --git a/android-jetpack-compose-state-management.html b/android-jetpack-compose-state-management.html index a6a058d5..8f01c459 100644 --- a/android-jetpack-compose-state-management.html +++ b/android-jetpack-compose-state-management.html @@ -484,13 +484,13 @@

- 120k + 123k - 1:50 + 1:52 diff --git a/android-jetpack-startup.html b/android-jetpack-startup.html new file mode 100644 index 00000000..e3a3be82 --- /dev/null +++ b/android-jetpack-startup.html @@ -0,0 +1,549 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android jetpack startup | 蓝色的笔记本 + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + +
+ +
+ +
+
+ + +
+ + 0% +
+ + +
+
+
+ + +
+ + + + + +
+ + + + + +
+

+ android jetpack startup +

+ + +
+ + + + +
+ + +

概述

源码

+

startup库是一个极简启动优化库,可以解决启动中的依赖顺序问题。

+

基本使用

1.1 实现Initializer接口

+
1
2
3
4
5
6
7
8
9
10
class LoggerInitializer : Initializer<Logger> {
override fun create(context: Context): Logger {
Logger.init(context)
return Logger
}

override fun dependencies(): List<Class<out Initializer<*>>> {
return emptyList()
}
}
+ +

1.2 AndroidManifest.xml中声明

+
1
2
3
4
5
6
7
8
9
10
<provider>
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">

<meta-data
android:name="me.xxx.demo.LoggerInitializer"
android:value="androidx.startup"/>
</provider>
+ + +

源码分析

1、默认由ContentProvider onCreate中获取AppInitializer单例
2、调用AppInitializer单例的discoverAndInitialize,解析Manifest里面的mate
3、解析完后放入Set<Class>>中
4、遍历Set,调用doInitialize进行初始化
4.1 检查循环依赖问题
4.2 找到此项的所有依赖项,递归调用doInitialize
4.3 此项依赖初始化完成

+

缺点

    +
  • 不支持线程控制和等待
  • +
+

其他相关库

android-startup

+ +
+ + + + +
+
赏你一杯咖啡
+ + +
+ + + +
+ +
+ + + + +
+ + + + + + +
+ + + + +
+ + + + + + + + +
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android-library-room-7-tips.html b/android-library-room-7-tips.html index 1d88abe8..8e586acf 100644 --- a/android-library-room-7-tips.html +++ b/android-library-room-7-tips.html @@ -510,13 +510,13 @@

- 120k + 123k - 1:50 + 1:52 diff --git a/android-scoped-storage.html b/android-scoped-storage.html index 0939aad0..89369db3 100644 --- a/android-scoped-storage.html +++ b/android-scoped-storage.html @@ -540,13 +540,13 @@

- 120k + 123k - 1:50 + 1:52 diff --git a/android-target-30.html b/android-target-30.html index 09a005a7..06ed29fa 100644 --- a/android-target-30.html +++ b/android-target-30.html @@ -525,13 +525,13 @@

- 120k + 123k - 1:50 + 1:52 diff --git a/archives/index.html b/archives/index.html index 8aa2e46f..87df8ec6 100644 --- a/archives/index.html +++ b/archives/index.html @@ -185,6 +185,251 @@

蓝色的笔记本

+
+ + + + + +
+

+ + +

+ + +
+ + + + +
+ + +

概述

源码

+

startup库是一个极简启动优化库,可以解决启动中的依赖顺序问题。

+

基本使用

1.1 实现Initializer接口

+
1
2
3
4
5
6
7
8
9
10
class LoggerInitializer : Initializer<Logger> {
override fun create(context: Context): Logger {
Logger.init(context)
return Logger
}

override fun dependencies(): List<Class<out Initializer<*>>> {
return emptyList()
}
}
+ +

1.2 AndroidManifest.xml中声明

+
1
2
3
4
5
6
7
8
9
10
<provider>
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">

<meta-data
android:name="me.xxx.demo.LoggerInitializer"
android:value="androidx.startup"/>
</provider>
+ + +

源码分析

1、默认由ContentProvider onCreate中获取AppInitializer单例
2、调用AppInitializer单例的discoverAndInitialize,解析Manifest里面的mate
3、解析完后放入Set<Class>>中
4、遍历Set,调用doInitialize进行初始化
4.1 检查循环依赖问题
4.2 找到此项的所有依赖项,递归调用doInitialize
4.3 此项依赖初始化完成

+

缺点

    +
  • 不支持线程控制和等待
  • +
+

其他相关库

android-startup

+ + +
+ + + + +
+
+
+
+ + + + + + + +
+ + + + + +
+

+ + +

+ + +
+ + + + +
+ + +

在接入Google Admob时,依据官方文档 或 依据开发习惯,我们一般先对Admob SDK进行初始化,然后进行广告加载:

+
1
2
3
4
5
6
7
8
// first init the admob sdk
MobileAds.initialize(context) {
//init successful
}

//second load Ad
val adRequest = AdRequest.Builder().build()
adView.loadAd(adRequest)
+ +

那么,多思考一下,我们有个疑问:

+

1、一定要先初始化,才能加载广告吗❓

实验设计:不执行初始化操作,直接请求广告。

+
1
2
val adRequest = AdRequest.Builder().build()
adView.loadAd(adRequest)
+ +

实验结论:不初始化SDK也能成功加载到广告。

+

2、为什么不初始化也能加载广告呢❓

猜想:
1、初始化和加载有关联性:加载广告时,发现没有初始化,先进行了初始化,再执行广告加载操作。
2、初始化和加载无关联系:加载广告不需要SDK初始化,两者无关联。

+

设:广告初始化耗时m毫秒,广告加载耗时n毫秒,总耗时m+n毫秒。

+

实验设计:
A组:执行初始化,同时执行广告加载。
若初始化和加载有关联性,广告加载时长约等于m+n。
若初始化和加载无关联性,广告加载时长约等于n。

+

日志输出示例:

+
1
2
3
4
2024-07-06 10:10:06.061 23555-23555 InitAndLoad     com...oid.gms.example.bannerexample  D  call init....
2024-07-06 10:10:06.224 23555-23555 InitAndLoad com...oid.gms.example.bannerexample D start load....
2024-07-06 10:10:07.401 23555-23555 InitAndLoad com...oid.gms.example.bannerexample D after init = 1340
2024-07-06 10:10:08.416 23555-23555 InitAndLoad com...oid.gms.example.bannerexample D onAdLoaded...cost = 2192
+ +

初始化耗时 m=1340ms
加载耗时 n=2192ms

+

B组:延迟10s执行初始化。立即执行广告加载。

+

日志输出示例:

+
1
2
3
4
2024-07-06 13:23:42.675 27481-27481 DelayInitAndLoad    com...oid.gms.example.bannerexample  D  start load....
2024-07-06 13:23:43.453 27481-27481 DelayInitAndLoad com...oid.gms.example.bannerexample D call init....
2024-07-06 13:23:46.208 27481-27481 DelayInitAndLoad com...oid.gms.example.bannerexample D onAdLoaded...cost = 3532
2024-07-06 13:23:53.486 27481-27481 DelayInitAndLoad com...oid.gms.example.bannerexample D after init = 24
+ +

初始化耗时 m=24ms
加载耗时 n=3532ms

+

结论:由于广告加载成功后,才调用初始化逻辑,因此初始化时长大幅降低。故:初始化和加载有关联性。

+

3、聚合的SDK初始化了吗❓

实验设计:
A:不初始化SDK,加载广告后,打开AdInspector。
B:初始化SDK,加载广告后,打开AdInspector。

+ + + + + +
+ +

实验结论:不初始化只能加载Admob自身的广告,初始化后可以加载聚合源的广告。

+

3、初始化成功后再加载广告 VS 直接加载广告 加载速度的对比

直接加载:

+ + + + + + + + + + + + + + + + + +
第一组第二组第三组第四组第五组
2915ms1581ms1435ms1621ms1581ms
+

初始化后加载:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
第一组第二组第三组第四组第五组
初始化2373ms2374246324272298
加载1468ms1386150524981250
日志总耗时38433762397049273550
+

结论:初始化后才加载广告慢于直接加载广告。

+

4、一种开屏广告的优化方案

不初始化SDK也能加载到Admob广告,且加载速度较快,但是没有参与bidding,价格较低。
初始化之后,加载聚合源广告,速度较慢,但经过bidding后,价格会高一点。

+

结合两个加载方式,闪屏时段内加载广告,闪屏n秒时长内,加载到bidding类型则展示bidding类型。没加载到,则展示Admob类型。

+ + +
+ + + + +
+
+
+
+ + + + + + +
@@ -212,6 +457,13 @@

+

- - - - - - - -
- - - - - -
-

- - -

- - -
- - - - -
- - -

本章包含三节:

-
    -
  • 是什么让你相信了那些荒谬之辞
  • -
  • 光环效应与群体智慧
  • -
  • 眼见为实的想法往往让我们仓促作出决定
  • -
-

开篇

- -
- -
-

“同样的形状在字母的环境下就容易被看做是字母,在数字的环境下就容易被看做是数字”

-
-
-

“你过早地对它的“身份”下了结论,并且根本意识不到你已经赋予了某种歧义以解释。”

-
-
-

“你作了一个确切的选择,但自己却没有意识到自己这样做了”

-
-

是什么让你相信了那些荒谬之辞

-

联想记忆的运作是导致“确认偏误”的原因之一

-
-

“你试试他给出的例子:“白鱼吃糖果。”
你有可能意识到一个关于鱼和糖果的模糊印象,这个印象的产生过程,就是联想记忆自动搜索“鱼”和“糖果”这两个概念之间各种联系的过程,这一过程会使这种很荒唐的说法看起来竟有些道理了。

-

光环效应与群体智慧

“如果你赞同一个总统的政见,你可能也会喜爱他的声音及着装。喜爱(或讨厌)某个人就会喜爱(或讨厌)这个人的全部—包括你还没有观察到的方面—这种倾向就叫做光环效应”

-

Alan:聪明—勤奋—冲动—爱挑剔—固执—忌妒心强
Ben:忌妒心强—固执—爱挑剔—冲动—勤奋—聪明

-

“光环效应注重第一印象,而后续信息在很大程度上都被消解掉了”

-

眼见为实的想法往往让我们仓促作出决定

“所有受试者都充分了解了整个过程,那些只听到其中一方辩词的受试者能够很轻松地为另一方写出辩词。然而,片面的证据陈述对判断有着重大影响。
另外,只掌握一方证据的受试者比掌握了双方证据的受试者更有自信。”

-

“这正说明人们根据已有信息“勾勒出的故事的连贯性增强了他们的自信心。一个好故事最重要的是信息的前后一致性,而不是其完整性。
的确,你常会发现:知道得很少反而可以把已知的所有事物都囊括进连贯的思维模式中。

-

“眼见即为事实的理念有助于达成连贯性和认知放松的状态,从而使我们相信某个陈述是真实的。这一理念解释了我们能够快速思考的原因,解释了我们是如何弄清楚一个复杂领域中那些信息片段的含义的。很多时候,我们拼凑出的连贯情节与事实是无限接近的,完全可以用来支持理性活动”

- - -
- - - - -
-
-
-
- - - -

- - - - @@ -514,13 +517,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52 diff --git a/page/4/index.html b/page/4/index.html index 3ca96c26..e8476cf0 100644 --- a/page/4/index.html +++ b/page/4/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -198,6 +198,46 @@

蓝色的笔记本

2021
+ + + +
@@ -358,46 +398,6 @@

蓝色的笔记本

- - - - @@ -514,13 +514,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52 diff --git a/page/5/index.html b/page/5/index.html index bbf645f6..d6138136 100644 --- a/page/5/index.html +++ b/page/5/index.html @@ -190,7 +190,7 @@

蓝色的笔记本

- 还行! 目前共计 44 篇日志。 继续努力。 + 还行! 目前共计 46 篇日志。 继续努力。
@@ -198,6 +198,46 @@

蓝色的笔记本

2021
+ + + +
@@ -394,13 +434,13 @@

蓝色的笔记本

- 120k + 123k - 1:50 + 1:52 diff --git a/principles-of-economics.html b/principles-of-economics.html index 3734dc40..32b769f1 100644 --- a/principles-of-economics.html +++ b/principles-of-economics.html @@ -469,13 +469,13 @@
- 120k + 123k - 1:50 + 1:52 diff --git a/search.xml b/search.xml index e94a17aa..0c16daf6 100644 --- a/search.xml +++ b/search.xml @@ -17,6 +17,100 @@

参考资料

maven插件 和 maven-publish 插件的区别
Maven 插件与 Maven-Publish 插件的差异

+]]> + + + Admob的初始化过程 + /admob-init-performance-test.html + 在接入Google Admob时,依据官方文档 或 依据开发习惯,我们一般先对Admob SDK进行初始化,然后进行广告加载:

+
// first init the admob sdk
MobileAds.initialize(context) {
//init successful
}

//second load Ad
val adRequest = AdRequest.Builder().build()
adView.loadAd(adRequest)
+ +

那么,多思考一下,我们有个疑问:

+

1、一定要先初始化,才能加载广告吗❓

实验设计:不执行初始化操作,直接请求广告。

+
val adRequest = AdRequest.Builder().build()
adView.loadAd(adRequest)
+ +

实验结论:不初始化SDK也能成功加载到广告。

+

2、为什么不初始化也能加载广告呢❓

猜想:
1、初始化和加载有关联性:加载广告时,发现没有初始化,先进行了初始化,再执行广告加载操作。
2、初始化和加载无关联系:加载广告不需要SDK初始化,两者无关联。

+

设:广告初始化耗时m毫秒,广告加载耗时n毫秒,总耗时m+n毫秒。

+

实验设计:
A组:执行初始化,同时执行广告加载。
若初始化和加载有关联性,广告加载时长约等于m+n。
若初始化和加载无关联性,广告加载时长约等于n。

+

日志输出示例:

+
2024-07-06 10:10:06.061 23555-23555 InitAndLoad     com...oid.gms.example.bannerexample  D  call init....
2024-07-06 10:10:06.224 23555-23555 InitAndLoad com...oid.gms.example.bannerexample D start load....
2024-07-06 10:10:07.401 23555-23555 InitAndLoad com...oid.gms.example.bannerexample D after init = 1340
2024-07-06 10:10:08.416 23555-23555 InitAndLoad com...oid.gms.example.bannerexample D onAdLoaded...cost = 2192
+ +

初始化耗时 m=1340ms
加载耗时 n=2192ms

+

B组:延迟10s执行初始化。立即执行广告加载。

+

日志输出示例:

+
2024-07-06 13:23:42.675 27481-27481 DelayInitAndLoad    com...oid.gms.example.bannerexample  D  start load....
2024-07-06 13:23:43.453 27481-27481 DelayInitAndLoad com...oid.gms.example.bannerexample D call init....
2024-07-06 13:23:46.208 27481-27481 DelayInitAndLoad com...oid.gms.example.bannerexample D onAdLoaded...cost = 3532
2024-07-06 13:23:53.486 27481-27481 DelayInitAndLoad com...oid.gms.example.bannerexample D after init = 24
+ +

初始化耗时 m=24ms
加载耗时 n=3532ms

+

结论:由于广告加载成功后,才调用初始化逻辑,因此初始化时长大幅降低。故:初始化和加载有关联性。

+

3、聚合的SDK初始化了吗❓

实验设计:
A:不初始化SDK,加载广告后,打开AdInspector。
B:初始化SDK,加载广告后,打开AdInspector。

+ + + + + +
+ +

实验结论:不初始化只能加载Admob自身的广告,初始化后可以加载聚合源的广告。

+

3、初始化成功后再加载广告 VS 直接加载广告 加载速度的对比

直接加载:

+ + + + + + + + + + + + + + + + + +
第一组第二组第三组第四组第五组
2915ms1581ms1435ms1621ms1581ms
+

初始化后加载:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
第一组第二组第三组第四组第五组
初始化2373ms2374246324272298
加载1468ms1386150524981250
日志总耗时38433762397049273550
+

结论:初始化后才加载广告慢于直接加载广告。

+

4、一种开屏广告的优化方案

不初始化SDK也能加载到Admob广告,且加载速度较快,但是没有参与bidding,价格较低。
初始化之后,加载聚合源广告,速度较慢,但经过bidding后,价格会高一点。

+

结合两个加载方式,闪屏时段内加载广告,闪屏n秒时长内,加载到bidding类型则展示bidding类型。没加载到,则展示Admob类型。

]]>
@@ -592,6 +686,25 @@ Android + + android jetpack startup + /android-jetpack-startup.html + 概述

源码

+

startup库是一个极简启动优化库,可以解决启动中的依赖顺序问题。

+

基本使用

1.1 实现Initializer接口

+
class LoggerInitializer : Initializer<Logger> {
override fun create(context: Context): Logger {
Logger.init(context)
return Logger
}

override fun dependencies(): List<Class<out Initializer<*>>> {
return emptyList()
}
}
+ +

1.2 AndroidManifest.xml中声明

+
<provider>
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">

<meta-data
android:name="me.xxx.demo.LoggerInitializer"
android:value="androidx.startup"/>
</provider>
+ + +

源码分析

1、默认由ContentProvider onCreate中获取AppInitializer单例
2、调用AppInitializer单例的discoverAndInitialize,解析Manifest里面的mate
3、解析完后放入Set<Class>>中
4、遍历Set,调用doInitialize进行初始化
4.1 检查循环依赖问题
4.2 找到此项的所有依赖项,递归调用doInitialize
4.3 此项依赖初始化完成

+

缺点

    +
  • 不支持线程控制和等待
  • +
+

其他相关库

android-startup

+]]> + Room数据库酷七条 /android-library-room-7-tips.html @@ -1336,6 +1449,27 @@ 经济学 + + 开发者七条 + /ep-good-developer-manifesto.html + 软件开发不只是API调用和基础语法,以下是应用开发的全貌:

+

一、相信数据

如果你觉得系统正常运转,你应该拿出数据支撑你的想法。更重要的是,当研究证明你是错的时,你应该欣然接受实事。
这就需要做测试来验证你的代码,也需要一些流程来生成对应的数据。
你做的任何事都需要数据来辅助你下一步的决策。否则你将不知道自己做的事是对还是错。

+

二、软件开发不只是编码

除了编码,开发人员还需要协调、沟通、分析、设计、测试、项目管理等

+

三、代码就是和人沟通

如果我们真的只是“为计算机编程”,那么我们都将编写字节码。计算机最能理解它。但我们用的是一种“折衷”语言,这种语言其他人可以理解,也可以翻译成计算机可以理解的东西。

+

好的软件开发是一个交流的过程。这是为了确保人们理解你在做什么。你的工作是与下一个阅读它的人交流。找到最好的表达方式可能需要同理心。

+

四、好的流程很重要

康威定律预言,你的软件注定要反映你的团队及其沟通结构。流程是沟通的结构。

+

想象一下一架起飞的飞机:飞行员、副驾驶、机组人员和空中交通管制人员之间有一段非常有条理的对话。这确保了每个人都关注关键问题,每个人都有发言权。“机翼还在飞机上吗?””“检查。“没有别的飞机挡住我们的去路吗?”“可以起飞了。”

+

五、用结果证明自己,而不是身份低位

最糟糕的开发组织要么等级森严,要么每个开发人员有太多老板。这通常反映了管理者对地位的渴望。

+

考虑“角色”,而不是“地位”。我工作过的最好的组织都首先认可那些推动事情的人,而不管他们在组织中扮演什么角色。

+

六、每个人都能从别人那学到

如果您认为人们的种族、性别或其他因素是判断他们的技能或他们必须教给您的东西的好方法,那么您就限制了自己作为软件开发人员的发展。

+

七、测试你所有的猜想,并随时准备改变这些猜想

当指导年轻的开发者时,我总是强调你不应该证明自己是对的,而应该证明自己是错的。我还鼓励他们用证明自己正确的热情去做这件事。

+

逻辑理论往往有一种方法可以证明你是错的。如果没有,这可能不是一个很好的理论。如果你不能证明它是错的,那么,只有那时,也许你可以试着证明它是对的。这与“相信数据”类似,但这不仅仅是关于数据,还有你使用数据的方式。

+

参考来源

+]]>
+ + 软件哲学 + +
Class文件的存储格式 /file-format-class.html @@ -1450,27 +1584,6 @@ File - - 开发者七条 - /ep-good-developer-manifesto.html - 软件开发不只是API调用和基础语法,以下是应用开发的全貌:

-

一、相信数据

如果你觉得系统正常运转,你应该拿出数据支撑你的想法。更重要的是,当研究证明你是错的时,你应该欣然接受实事。
这就需要做测试来验证你的代码,也需要一些流程来生成对应的数据。
你做的任何事都需要数据来辅助你下一步的决策。否则你将不知道自己做的事是对还是错。

-

二、软件开发不只是编码

除了编码,开发人员还需要协调、沟通、分析、设计、测试、项目管理等

-

三、代码就是和人沟通

如果我们真的只是“为计算机编程”,那么我们都将编写字节码。计算机最能理解它。但我们用的是一种“折衷”语言,这种语言其他人可以理解,也可以翻译成计算机可以理解的东西。

-

好的软件开发是一个交流的过程。这是为了确保人们理解你在做什么。你的工作是与下一个阅读它的人交流。找到最好的表达方式可能需要同理心。

-

四、好的流程很重要

康威定律预言,你的软件注定要反映你的团队及其沟通结构。流程是沟通的结构。

-

想象一下一架起飞的飞机:飞行员、副驾驶、机组人员和空中交通管制人员之间有一段非常有条理的对话。这确保了每个人都关注关键问题,每个人都有发言权。“机翼还在飞机上吗?””“检查。“没有别的飞机挡住我们的去路吗?”“可以起飞了。”

-

五、用结果证明自己,而不是身份低位

最糟糕的开发组织要么等级森严,要么每个开发人员有太多老板。这通常反映了管理者对地位的渴望。

-

考虑“角色”,而不是“地位”。我工作过的最好的组织都首先认可那些推动事情的人,而不管他们在组织中扮演什么角色。

-

六、每个人都能从别人那学到

如果您认为人们的种族、性别或其他因素是判断他们的技能或他们必须教给您的东西的好方法,那么您就限制了自己作为软件开发人员的发展。

-

七、测试你所有的猜想,并随时准备改变这些猜想

当指导年轻的开发者时,我总是强调你不应该证明自己是对的,而应该证明自己是错的。我还鼓励他们用证明自己正确的热情去做这件事。

-

逻辑理论往往有一种方法可以证明你是错的。如果没有,这可能不是一个很好的理论。如果你不能证明它是错的,那么,只有那时,也许你可以试着证明它是对的。这与“相信数据”类似,但这不仅仅是关于数据,还有你使用数据的方式。

-

参考来源

-]]>
- - 软件哲学 - -
重定位 /file-format-elf-relocation.html @@ -1505,45 +1618,6 @@ C/C++ - - flutter状态管理之BloC - /flutter-state-bloc.html - -

一、概述

Bloc = Business Logic Component

-
- -
- - -

二、结构

BloC本身是一个独立的package、flutter-bloc基于BloC和Provider实现,其结构如下图所示:

-
- -
- -

三、 实现

3.1 BloC是基于dart的Stream API实现的发布订阅模式。
    -
  • 通过on方法订阅事件并提供处理函数,收到Event再将Event转换成State返回给Bloc
  • -
  • 通过add方法发布事件
  • -
-
abstract class Bloc<Event, State> extends BlocBase<State>
implements BlocEventSink<Event> {
//所有的订阅者
final _subscriptions = <StreamSubscription<dynamic>>[];

final _eventController = StreamController<Event>.broadcast();

//添加订阅者
void on<E extends Event>(
EventHandler<E, State> handler, {
EventTransformer<E>? transformer,
}) {
//这里开始了listen
final subscription = xxx.listen(null);
_subscriptions.add(subscription);
}

@override
void add(Event event) {
try {
onEvent(event);
_eventController.add(event);
} catch (error, stackTrace) {
onError(error, stackTrace);
rethrow;
}
}

}
- -
- -
- - -
3.1 事件和状态之间的转换
    -
  • 转换逻辑有业务层通过on()注入
  • -
  • 内部的核心是_Emitter以及 _eventController_stateController
  • -
-
(dynamic event) {
void onEmit(State state) {
if (isClosed) return;
if (this.state == state && _emitted) return;
onTransition(Transition(
currentState: this.state,
event: event as E,
nextState: state,
));
emit(state);
}

final emitter = _Emitter(onEmit);
final controller = StreamController<E>.broadcast(
sync: true,
onCancel: emitter.cancel,
);

void handleEvent() async {
void onDone() {
emitter.complete();
_emitters.remove(emitter);
if (!controller.isClosed) controller.close();
}

try {
_emitters.add(emitter);
//交给外部实现转换事件和状态
await handler(event as E, emitter);
} catch (error, stackTrace) {
onError(error, stackTrace);
rethrow;
} finally {
onDone();
}
}

handleEvent();
return controller.stream;
}
- - -

四、参考

主要参考和debug了bloc仓库里面examples中login的例子:
这里

-]]>
- - Flutter - -
ELF文件的结构 /file-format-elf.html @@ -1760,6 +1834,45 @@ File + + flutter状态管理之BloC + /flutter-state-bloc.html + +

一、概述

Bloc = Business Logic Component

+
+ +
+ + +

二、结构

BloC本身是一个独立的package、flutter-bloc基于BloC和Provider实现,其结构如下图所示:

+
+ +
+ +

三、 实现

3.1 BloC是基于dart的Stream API实现的发布订阅模式。
    +
  • 通过on方法订阅事件并提供处理函数,收到Event再将Event转换成State返回给Bloc
  • +
  • 通过add方法发布事件
  • +
+
abstract class Bloc<Event, State> extends BlocBase<State>
implements BlocEventSink<Event> {
//所有的订阅者
final _subscriptions = <StreamSubscription<dynamic>>[];

final _eventController = StreamController<Event>.broadcast();

//添加订阅者
void on<E extends Event>(
EventHandler<E, State> handler, {
EventTransformer<E>? transformer,
}) {
//这里开始了listen
final subscription = xxx.listen(null);
_subscriptions.add(subscription);
}

@override
void add(Event event) {
try {
onEvent(event);
_eventController.add(event);
} catch (error, stackTrace) {
onError(error, stackTrace);
rethrow;
}
}

}
+ +
+ +
+ + +
3.1 事件和状态之间的转换
    +
  • 转换逻辑有业务层通过on()注入
  • +
  • 内部的核心是_Emitter以及 _eventController_stateController
  • +
+
(dynamic event) {
void onEmit(State state) {
if (isClosed) return;
if (this.state == state && _emitted) return;
onTransition(Transition(
currentState: this.state,
event: event as E,
nextState: state,
));
emit(state);
}

final emitter = _Emitter(onEmit);
final controller = StreamController<E>.broadcast(
sync: true,
onCancel: emitter.cancel,
);

void handleEvent() async {
void onDone() {
emitter.complete();
_emitters.remove(emitter);
if (!controller.isClosed) controller.close();
}

try {
_emitters.add(emitter);
//交给外部实现转换事件和状态
await handler(event as E, emitter);
} catch (error, stackTrace) {
onError(error, stackTrace);
rethrow;
} finally {
onDone();
}
}

handleEvent();
return controller.stream;
}
+ + +

四、参考

主要参考和debug了bloc仓库里面examples中login的例子:
这里

+]]>
+ + Flutter + +
Flutter状态管理之Provider /flutter-state-provider.html @@ -1925,6 +2038,101 @@ Flutter + + 对象的内存布局 + /java-object-layout.html + 一、概述

很多时候我们都有一个疑问:一个对象在内存中占用多大的空间呢?

+
script
$ jdk8-64/java -jar jol-cli.jar internals java.lang.Object
# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.

Instantiated the sample instance via default constructor.

java.lang.Object object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 05 00 00 00 # Mark word
4 4 (object header) 00 00 00 00 # Mark word
8 4 (object header) 00 10 00 00 # (not mark word)
12 4 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
+ +

通过OpenJDK的Java-Object-Layout我们看到java.lang.Object的一个实例占用16 bytes。

+

同样的java.lang.Boolean类型占用的字节数:

+
script
java.lang.Boolean object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 12 (object header) N/A
12 1 boolean Boolean.value N/A
13 3 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total
+ +
script
[HEADER: 12 bytes]  12 
[value: 1 byte ] 13
[padding: 3 bytes] 16
+ +

其实一个对象通常由三块组成,分别是:对象头、实例数据和对齐填充。

+

二、对象头(object header)

在前面通过JOL打印输出的关于java.lang.Object信息中,我们看到object header占用12字节,但是输出并没有包含详细的结构信息,我们可以通过Hotspot的源码了解到对象头包含两个部分:mark wordclass word

+
2.1 mark word

mark word在32位和64位机分别占32位和64位,当其中锁标志位的值不同时,它前面的bit存储不同的含义。

+
    +
  • 存储对象的gc年龄信息
  • +
  • 存储Hashcode
  • +
  • 存储锁信息
  • +
+
+ +
+ +
2.2 class word:

代码运行的时候,对象只是一串字节,我们可以通过class-word获取一些对象的元信息,它存储指向方法区中表示对象类型的指针,比如以下使用场景:

+
    +
  • 运行时类型检查
  • +
  • 决定对象大小
  • +
  • 计算接口调用的目标类
  • +
+
2.3 数组长度:

如果是数组类型,对象头会额外存储数组的长度信息。

+
    +
  • 快速计算对象的大小
  • +
  • 数组边界检查
  • +
+

三、实例数据和对齐填充

实例数据即我们在代码中声明的变量等信息,它的存储受到一些规则的约束以及虚拟机参数的控制。

+
3.1 没有属性的类的内存布局
+

规则一:每个对象都是八字节对齐。

+
+

从前面Object的输出中,我们看到,当一个对象只有头部信息时占用16byte,刚好是8的整数倍。

+
3.2 Object子类的内存布局

跟在对象头后面的类属性按照它们的大小在内存中排序,例如:int是4字节、long是8字节。采用字节对齐可以提高性能,因为从内存读取4字节到4字节的寄存器性能更好。

+

为了节约内存,Sun的虚拟机在分配对象字段的时候和它们声明的顺序不同,有如下顺序规则:

+

1、double和long类型
2、int和float
3、short和char
4、boolean和byte
5、reference

+

为什么可以优化内存呢?我们看一下这个例子:

+
class MyClass {
byte a;
int c;
boolean d;
long e;
Object f;
}
+ +

它的对象布局如下:

+
script
[HEADER:  8 bytes]  8
[a: 1 byte ] 9
[padding: 3 bytes] 12
[c: 4 bytes] 16
[d: 1 byte ] 17
[padding: 7 bytes] 24
[e: 8 bytes] 32
[f: 4 bytes] 36
[padding: 4 bytes] 40
+

总共使用了40字节内存,其中14个用于内存对齐而浪费掉。如果重排顺序则:

+
script
[HEADER:  8 bytes]  8
[e: 8 bytes] 16
[c: 4 bytes] 20
[a: 1 byte ] 21
[d: 1 byte ] 22
[padding: 2 bytes] 24
[f: 4 bytes] 28
[padding: 4 bytes] 32
+ +

经过优化后只有6个字节用于对齐填充,总内存也只有32byte。

+
3.3 子类的内存布局
+

规则三:继承结构中属于不同类的字段不混合在一起。父类优先,子类其次。

+
+
class A {
long a;
int b;
int c;
}

class B extends A {
long d;
}
+

B类的布局如下:

+
script
[HEADER:  8 bytes]  8
[a: 8 bytes] 16
[b: 4 bytes] 20
[c: 4 bytes] 24
[d: 8 bytes] 32
+ +

如果父类的字段不符合4字节对齐。

+
+

规则四:父类的最后一个字段和子类第一个字段之间必须4字节对齐。

+
+
class A {
byte a;
}

class B {
byte b;
}
+ +
script
[HEADER:  8 bytes]  8
[a: 1 byte ] 9
[padding: 3 bytes] 12
[b: 1 byte ] 13
[padding: 3 bytes] 16
+

a后面的3个字节就是为了使其4字节对齐。这3个字节只能浪费不能给B使用。

+

最后一个规则可以用于节约一些内存空间:当子类的第一个属性是long或者double类型且父类没有以8字节边界结束。

+
+

规则五:子类的第一个字段是doubel或long且父类没有以8字节边界结束,JVM打破2的规则,先存储int、short、byte、reference来填补空缺。

+
+

例如:

+
class A {
byte a;
}

class B {
long b;
short c;
byte d;
}
+ +

内存布局如下:

+
script
[HEADER:  8 bytes]  8
[a: 1 byte ] 9
[padding: 3 bytes] 12
[c: 2 bytes] 14
[d: 1 byte ] 15
[padding: 1 byte ] 16
[b: 8 bytes] 24
+ +

在字节12的位置,A类结束了。JVM打破2的规则放入short和byte类型,节约了4字节中的3个字节,否则将浪费掉。

+
3.4 数组的内存布局

数组类型有一个额外的头部字段保存数组的长度,接下来是数组的元素,数组作为普通对象也是8字节对齐的。

+

这是byte[3]的布局:

+
script
[HEADER:  12 bytes] 12
[[0]: 1 byte ] 13
[[1]: 1 byte ] 14
[[2]: 1 byte ] 15
[padding: 1 byte ] 16
+ +

这是long[3]的布局:

+
script
[HEADER:  12 bytes] 12
[padding: 4 bytes] 16
[[0]: 8 bytes] 24
[[1]: 8 bytes] 32
[[2]: 8 bytes] 40
+ +
3.5 内部类的内存布局

非静态内部类有一个额外的隐藏字段,持有外部类的引用。这个字段是一个常规的引用,它符合对象在内存布局的规则。内部类因此有4字节额外的开销。

+]]>
+ + 计算机 + + + Java + JVM + +
Java synchronized /java-multithreading-synchronized.html @@ -2042,101 +2250,6 @@ Kotlin - - 对象的内存布局 - /java-object-layout.html - 一、概述

很多时候我们都有一个疑问:一个对象在内存中占用多大的空间呢?

-
script
$ jdk8-64/java -jar jol-cli.jar internals java.lang.Object
# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.

Instantiated the sample instance via default constructor.

java.lang.Object object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 05 00 00 00 # Mark word
4 4 (object header) 00 00 00 00 # Mark word
8 4 (object header) 00 10 00 00 # (not mark word)
12 4 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
- -

通过OpenJDK的Java-Object-Layout我们看到java.lang.Object的一个实例占用16 bytes。

-

同样的java.lang.Boolean类型占用的字节数:

-
script
java.lang.Boolean object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 12 (object header) N/A
12 1 boolean Boolean.value N/A
13 3 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total
- -
script
[HEADER: 12 bytes]  12 
[value: 1 byte ] 13
[padding: 3 bytes] 16
- -

其实一个对象通常由三块组成,分别是:对象头、实例数据和对齐填充。

-

二、对象头(object header)

在前面通过JOL打印输出的关于java.lang.Object信息中,我们看到object header占用12字节,但是输出并没有包含详细的结构信息,我们可以通过Hotspot的源码了解到对象头包含两个部分:mark wordclass word

-
2.1 mark word

mark word在32位和64位机分别占32位和64位,当其中锁标志位的值不同时,它前面的bit存储不同的含义。

-
    -
  • 存储对象的gc年龄信息
  • -
  • 存储Hashcode
  • -
  • 存储锁信息
  • -
-
- -
- -
2.2 class word:

代码运行的时候,对象只是一串字节,我们可以通过class-word获取一些对象的元信息,它存储指向方法区中表示对象类型的指针,比如以下使用场景:

-
    -
  • 运行时类型检查
  • -
  • 决定对象大小
  • -
  • 计算接口调用的目标类
  • -
-
2.3 数组长度:

如果是数组类型,对象头会额外存储数组的长度信息。

-
    -
  • 快速计算对象的大小
  • -
  • 数组边界检查
  • -
-

三、实例数据和对齐填充

实例数据即我们在代码中声明的变量等信息,它的存储受到一些规则的约束以及虚拟机参数的控制。

-
3.1 没有属性的类的内存布局
-

规则一:每个对象都是八字节对齐。

-
-

从前面Object的输出中,我们看到,当一个对象只有头部信息时占用16byte,刚好是8的整数倍。

-
3.2 Object子类的内存布局

跟在对象头后面的类属性按照它们的大小在内存中排序,例如:int是4字节、long是8字节。采用字节对齐可以提高性能,因为从内存读取4字节到4字节的寄存器性能更好。

-

为了节约内存,Sun的虚拟机在分配对象字段的时候和它们声明的顺序不同,有如下顺序规则:

-

1、double和long类型
2、int和float
3、short和char
4、boolean和byte
5、reference

-

为什么可以优化内存呢?我们看一下这个例子:

-
class MyClass {
byte a;
int c;
boolean d;
long e;
Object f;
}
- -

它的对象布局如下:

-
script
[HEADER:  8 bytes]  8
[a: 1 byte ] 9
[padding: 3 bytes] 12
[c: 4 bytes] 16
[d: 1 byte ] 17
[padding: 7 bytes] 24
[e: 8 bytes] 32
[f: 4 bytes] 36
[padding: 4 bytes] 40
-

总共使用了40字节内存,其中14个用于内存对齐而浪费掉。如果重排顺序则:

-
script
[HEADER:  8 bytes]  8
[e: 8 bytes] 16
[c: 4 bytes] 20
[a: 1 byte ] 21
[d: 1 byte ] 22
[padding: 2 bytes] 24
[f: 4 bytes] 28
[padding: 4 bytes] 32
- -

经过优化后只有6个字节用于对齐填充,总内存也只有32byte。

-
3.3 子类的内存布局
-

规则三:继承结构中属于不同类的字段不混合在一起。父类优先,子类其次。

-
-
class A {
long a;
int b;
int c;
}

class B extends A {
long d;
}
-

B类的布局如下:

-
script
[HEADER:  8 bytes]  8
[a: 8 bytes] 16
[b: 4 bytes] 20
[c: 4 bytes] 24
[d: 8 bytes] 32
- -

如果父类的字段不符合4字节对齐。

-
-

规则四:父类的最后一个字段和子类第一个字段之间必须4字节对齐。

-
-
class A {
byte a;
}

class B {
byte b;
}
- -
script
[HEADER:  8 bytes]  8
[a: 1 byte ] 9
[padding: 3 bytes] 12
[b: 1 byte ] 13
[padding: 3 bytes] 16
-

a后面的3个字节就是为了使其4字节对齐。这3个字节只能浪费不能给B使用。

-

最后一个规则可以用于节约一些内存空间:当子类的第一个属性是long或者double类型且父类没有以8字节边界结束。

-
-

规则五:子类的第一个字段是doubel或long且父类没有以8字节边界结束,JVM打破2的规则,先存储int、short、byte、reference来填补空缺。

-
-

例如:

-
class A {
byte a;
}

class B {
long b;
short c;
byte d;
}
- -

内存布局如下:

-
script
[HEADER:  8 bytes]  8
[a: 1 byte ] 9
[padding: 3 bytes] 12
[c: 2 bytes] 14
[d: 1 byte ] 15
[padding: 1 byte ] 16
[b: 8 bytes] 24
- -

在字节12的位置,A类结束了。JVM打破2的规则放入short和byte类型,节约了4字节中的3个字节,否则将浪费掉。

-
3.4 数组的内存布局

数组类型有一个额外的头部字段保存数组的长度,接下来是数组的元素,数组作为普通对象也是8字节对齐的。

-

这是byte[3]的布局:

-
script
[HEADER:  12 bytes] 12
[[0]: 1 byte ] 13
[[1]: 1 byte ] 14
[[2]: 1 byte ] 15
[padding: 1 byte ] 16
- -

这是long[3]的布局:

-
script
[HEADER:  12 bytes] 12
[padding: 4 bytes] 16
[[0]: 8 bytes] 24
[[1]: 8 bytes] 32
[[2]: 8 bytes] 40
- -
3.5 内部类的内存布局

非静态内部类有一个额外的隐藏字段,持有外部类的引用。这个字段是一个常规的引用,它符合对象在内存布局的规则。内部类因此有4字节额外的开销。

-]]>
- - 计算机 - - - Java - JVM - -
Kotlin Flow的工作原理 /kotlin-lang-flow-under-the-hood.html @@ -2388,47 +2501,6 @@ Kotlin - - Kotlin之JvmStatic和override冲突问题 - /kotlin-lang-jvmstatic-with-interface.html - 一、问题

为了方便Java代码调用Kotlin的object类,我们通常会对object类的方法添加@JvmStatic注解。

- - - - - -
- -

然而、当object类实现某个接口时,对应的方法却不能添加@JvmStatic注解。

-
- -
- - -

二、解决

要想解决上述问题,只需要将object类的实现做一些转换:
-
-

interface Play2 {
fun play()
}

class Singleton2 {

private companion object : Play2 {
@JvmStatic
override fun play() {
}
}
}
- -

三、思考

-

为什么第一种方式会报错,而第二种方式没问题呢?

-
-

通过反编译查看Java代码我们发现:object类的方法会被直接编译成Java的static方法

-
public final class Singleton implements Play {
public static final Singleton INSTANCE;

@JvmStatic
public static void play() {
}

private Singleton() {
}

static {
Singleton var0 = new Singleton();
INSTANCE = var0;
}
}
- -

而companion object则会被编译成静态内部类

-
public final class Singleton2 {
/** @deprecated */
@Deprecated
public static final Singleton2.Companion Companion = new Singleton2.Companion((DefaultConstructorMarker)null);

@JvmStatic
public static void play() {
Companion.play();
}

private static final class Companion implements Play2 {
@JvmStatic
public void play() {
}

private Companion() {
}

// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}

- -

由于static方法是不能重写(override)的,所以同一个关键字不能作用于一个函数。而通过静态内部类的方式,在类的层次增加静态能力,从而消除了方法的static关键字。

-

参考

issue-KT-21342

-]]>
- - 计算机 - - - Java - Kotlin - -
Kotlin中的JVM注解 /kotlin-lang-jvm-annotation.html @@ -2503,6 +2575,47 @@ Kotlin + + Kotlin之JvmStatic和override冲突问题 + /kotlin-lang-jvmstatic-with-interface.html + 一、问题

为了方便Java代码调用Kotlin的object类,我们通常会对object类的方法添加@JvmStatic注解。

+ + + + + +
+ +

然而、当object类实现某个接口时,对应的方法却不能添加@JvmStatic注解。

+
+ +
+ + +

二、解决

要想解决上述问题,只需要将object类的实现做一些转换:
+
+

interface Play2 {
fun play()
}

class Singleton2 {

private companion object : Play2 {
@JvmStatic
override fun play() {
}
}
}
+ +

三、思考

+

为什么第一种方式会报错,而第二种方式没问题呢?

+
+

通过反编译查看Java代码我们发现:object类的方法会被直接编译成Java的static方法

+
public final class Singleton implements Play {
public static final Singleton INSTANCE;

@JvmStatic
public static void play() {
}

private Singleton() {
}

static {
Singleton var0 = new Singleton();
INSTANCE = var0;
}
}
+ +

而companion object则会被编译成静态内部类

+
public final class Singleton2 {
/** @deprecated */
@Deprecated
public static final Singleton2.Companion Companion = new Singleton2.Companion((DefaultConstructorMarker)null);

@JvmStatic
public static void play() {
Companion.play();
}

private static final class Companion implements Play2 {
@JvmStatic
public void play() {
}

private Companion() {
}

// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}

+ +

由于static方法是不能重写(override)的,所以同一个关键字不能作用于一个函数。而通过静态内部类的方式,在类的层次增加静态能力,从而消除了方法的static关键字。

+

参考

issue-KT-21342

+]]>
+ + 计算机 + + + Java + Kotlin + +
Effective Kotlin-51:使用Sequence优化集合操作 /kotlin-lang-sequence.html @@ -3050,9 +3163,9 @@
关于作者

马尔科姆·格拉德威尔(Malcolm Gladwell)(1963年9月3日)毕业于多伦多大学的三一学院,主修历史学,是一位加拿大作家、记者和演讲者,以其畅销书和在《纽约客》杂志上的文章而闻名。他的作品通常探讨社会科学、心理学和行为经济学的主题,通过生动的故事和深刻的见解启发读者。

其他出版物:
《引爆点》(The Tipping Point, 2000):探讨了如何通过少数关键因素引发大的变化,书中引入了“引爆点”的概念。
《决断两秒间》(Blink, 2005):研究了人们在瞬间决策中的潜意识过程和直觉判断。
《异类》(Outliers, 2008):探讨了成功背后的非凡因素,提出了“1万小时定律”等概念。
《大开眼界》(What the Dog Saw, 2009):这本书是他在《纽约客》杂志上发表的文章的集合,涵盖了各种主题。
《大卫与歌利亚》(David and Goliath, 2013):讨论了在人们认为不利的条件下如何取得成功。
《谈话的力量》(Talking to Strangers, 2019):探讨了人们在与陌生人交流时常犯的错误及其后果

-

第一部分:机遇

1、马太效应:英超球员的优势积累

这一节分成六个部分:

+

第一部分:机遇

马太效应:英超球员的优势积累

这一节分成六个部分:

    -
  • 成功靠什么:成功靠的是个人意愿和能力优势,只能靠自己而不是他人的帮助。真的是这样吗?
  • +
  • 成功靠什么:成功靠的是个人意愿和能力优势,只能靠自己而不是他人的帮助。真的是这样吗?
  • 成功者之幸
  • 生于年初:职业青年队绝大多 数球员的生日集中在1月、2月和3月
  • 优势积累:一个1月1日出生的选手,是在跟许多年纪比其小的队友争夺晋级权。晋级后接受更好的训练。
  • @@ -3064,8 +3177,8 @@
  • 离绝对老大只剩三天:出生在1月4日,只差3天他就是同龄队员中绝对的老大了
-

读书笔记:有意识的提前建立优势,并不断积累优势是成功的关键。

-
2、1万小时定律:生于1955年的乔布斯和比尔盖茨

这一节分成六个部分:

+

读书笔记:有意识的提前建立优势,并不断积累优势是成功的关键。

+
1万小时定律:生于1955年的乔布斯和比尔盖茨

这一节分成六个部分:

  • 天才创始人:计算机科学家比尔·乔伊。
  • 一万小时有多久:一万小时训练是成为优秀的必要条件。
  • @@ -3078,7 +3191,7 @@
  • 时势造成功:机遇造就了成功。

读书笔记:成功 = 时代机遇 + 努力

-
3、智商和机遇:曼特人的谬误

这一节分成五个部分:

+
智商和机遇:曼特人的谬误

这一节分成五个部分:

  • 全美最聪明的人:智商195的兰根参加《以一敌百》节目。
  • 超常“特曼人”
    @@ -3092,7 +3205,7 @@
  • 充满想象力的心灵:发散性思维测试要求你运用想象力,寻找尽量多的不同的可能性。
  • 事与愿违的试验结果:特曼忽略了一个事实——智力在现实中的作用并 没有那么大。
-
4、社交与家庭:天才兰根的忧伤

这一节分成六个部分:

+
社交与家庭:天才兰根的忧伤

这一节分成六个部分:

  • 令人心碎的天才命运:天才兰根家庭环境不好,即使是天才,最后结局也很一般。
  • 另一位天才的命运:天才奥本海默,家庭环境好,结局成功。
  • @@ -3105,7 +3218,7 @@

    家境富裕的父母总是让孩子一刻也不能闲着, 让孩子穿梭于各项活动之 间,并听取孩子对老师、教练或是队友的评价
    而穷人家孩子的生活中完全没有这种紧张的时间安排, 他们的活动不会 是每周两次足球训练,而是和亲戚或者邻居家的孩子在外面玩耍。

    读书笔记:家庭教育很重要,让孩子高效利用时间深度参与到有意义的社会活动中,鼓励孩子表达自己的想法,挑战权威,敢于表现自己。

    -
    5、最佳时代:乔-弗洛姆的律师生涯

    这一节分为七个部分:

    +
    最佳时代:乔-弗洛姆的律师生涯

    这一节分为七个部分:

    • 律师事务所之翘楚:贫穷的移民,被歧视的犹太人:乔-弗洛姆,从世达律师事务所的助理到合伙人,从几个人到几千人。这是时代造就了行业
    • 纽约移民区的故事:弗洛姆成长环境下的几个小故事。
        @@ -3118,7 +3231,7 @@
      • 成功不是随机事件

      读书笔记:受歧视的乔-弗洛姆进不了大公司只能进小公司,自己创业,处理那些别人不愿处理的案子。随着时代或政策的转变业务激增,二流律师摇身一变成为一流。弗洛姆并不 是克服了逆境,而是原先的逆境忽然之间变成了机遇。

      -

      第二部分:文化传承

      6、文化差异:小镇哈伦

      这一节分为四部分:

      +

      第二部分:文化传承

      文化差异:小镇哈伦

      这一节分为四部分:

      • 血染哈伦
        哈伦县城两大家族矛盾和枪战。
      • 荣誉文化
        @@ -3134,7 +3247,7 @@
      -
      7、权力距离指数:韩国飞机失事率
      +
      权力距离指数:韩国飞机失事率

      权力距离是指人们对待比自己更高等级阶层的态度,特别是指对权威的重视和尊重的程度。

        @@ -3166,7 +3279,7 @@
      • 卸下重担:

      读书笔记:客机失事的主要原因在于权利指数在副驾驶和主驾驶之间发挥着作用。这是一种文化特征,是一种上下级的阶级关系。我们应该对事不对人,客观辩证的处理问题,不屈服于权威。

      -
      8、内在优势:亚洲人精神

      这一节分为6个部分:

      +
      内在优势:亚洲人精神

      这一节分为6个部分:

      • 数字优势:亚洲人在数字方面有优势,一方面是因为他们对数字的发音更短,另一方面得益于族裔文化。
      • 稻田中的辛劳:种植水稻的亚洲农民一年的工作时长约为3000小时。
      • @@ -3176,7 +3289,7 @@
      • 劳有所得:哪个国家和地区的学 生更愿意花时间仔细回答冗长的问卷,哪个国家和地区的学生在TIMSS考试中的成绩就更好。

      读书笔记:亚洲人精神:吃苦耐劳,耐心,持之以恒。

      -
      9、扭转风气:玛丽塔之幸

      这一节分为6个部分:

      +
      扭转风气:玛丽塔之幸

      这一节分为6个部分:

      • 风气之先:KIPP项目代表了美国教育的新理念,它的成功并非依靠环境、师资或制度创新。
      • 西方教育的传统:
          diff --git a/sitemap.xml b/sitemap.xml index 541fa897..e95485e8 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1,10 +1,24 @@ + + https://wangduwei.top/android-jetpack-startup.html + + 2024-07-09 + + + + + https://wangduwei.top/admob-init-performance-test.html + + 2024-07-09 + + + https://wangduwei.top/%E3%80%8A%E5%BC%82%E7%B1%BB-%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84%E6%88%90%E5%8A%9F%E5%90%AF%E7%A4%BA%E5%BD%95%E3%80%8B.html - 2024-05-25 + 2024-06-06 @@ -37,14 +51,14 @@ - https://wangduwei.top/categories/index.html + https://wangduwei.top/about/index.html 2024-04-29 - https://wangduwei.top/about/index.html + https://wangduwei.top/categories/index.html 2024-04-29 @@ -121,14 +135,14 @@ - https://wangduwei.top/kotlin-lang-jvmstatic-with-interface.html + https://wangduwei.top/kotlin-lang-jvm-annotation.html 2024-04-29 - https://wangduwei.top/kotlin-lang-jvm-annotation.html + https://wangduwei.top/kotlin-lang-jvmstatic-with-interface.html 2024-04-29 @@ -163,14 +177,14 @@ - https://wangduwei.top/java-multithreading-synchronized.html + https://wangduwei.top/java-object-layout.html 2024-04-29 - https://wangduwei.top/java-object-layout.html + https://wangduwei.top/java-multithreading-synchronized.html 2024-04-29 @@ -184,14 +198,14 @@ - https://wangduwei.top/flutter-state-bloc.html + https://wangduwei.top/file-format-elf.html 2024-04-29 - https://wangduwei.top/file-format-elf.html + https://wangduwei.top/flutter-state-bloc.html 2024-04-29 @@ -333,7 +347,7 @@ https://wangduwei.top/ - 2024-05-25 + 2024-07-09 daily 1.0 @@ -341,182 +355,182 @@ https://wangduwei.top/tags/Android/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/CPU/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/Flutter/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/Java/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/Kotlin/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/Reading/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/View/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/%E5%AE%89%E5%8D%93%E6%A1%86%E6%9E%B6/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/%E6%9E%B6%E6%9E%84/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/Compose/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/Economics/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/cryptography/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/Linux/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/%E7%BB%8F%E6%B5%8E%E5%AD%A6/ - 2024-05-25 + 2024-07-09 daily 0.6 - https://wangduwei.top/tags/File/ - 2024-05-25 + https://wangduwei.top/tags/%E8%BD%AF%E4%BB%B6%E5%93%B2%E5%AD%A6/ + 2024-07-09 daily 0.6 - https://wangduwei.top/tags/%E8%BD%AF%E4%BB%B6%E5%93%B2%E5%AD%A6/ - 2024-05-25 + https://wangduwei.top/tags/File/ + 2024-07-09 daily 0.6 https://wangduwei.top/tags/C-C/ - 2024-05-25 + 2024-07-09 daily 0.6 - https://wangduwei.top/tags/Concurrency/ - 2024-05-25 + https://wangduwei.top/tags/JVM/ + 2024-07-09 daily 0.6 - https://wangduwei.top/tags/JVM/ - 2024-05-25 + https://wangduwei.top/tags/Concurrency/ + 2024-07-09 daily 0.6 https://wangduwei.top/tags/LeetCode/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/%E7%AE%97%E6%B3%95/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/%E9%93%BE%E8%A1%A8/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/List/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/tags/%E5%B7%A5%E4%BD%9C/ - 2024-05-25 + 2024-07-09 daily 0.6 @@ -525,28 +539,28 @@ https://wangduwei.top/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/categories/%E7%BB%8F%E6%B5%8E%E5%AD%A6/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/categories/%E5%B7%A5%E4%BD%9C/ - 2024-05-25 + 2024-07-09 daily 0.6 https://wangduwei.top/categories/Reading/ - 2024-05-25 + 2024-07-09 daily 0.6 diff --git a/tags/Android/index.html b/tags/Android/index.html index a5a26b69..a240f18b 100644 --- a/tags/Android/index.html +++ b/tags/Android/index.html @@ -514,13 +514,13 @@

          Android - 120k + 123k - 1:50 + 1:52 diff --git a/tags/C-C/index.html b/tags/C-C/index.html index 174e6d1f..729db418 100644 --- a/tags/C-C/index.html +++ b/tags/C-C/index.html @@ -331,13 +331,13 @@

          C/C++ - 120k + 123k - 1:50 + 1:52 diff --git a/tags/CPU/index.html b/tags/CPU/index.html index c11b5872..5d60deb4 100644 --- a/tags/CPU/index.html +++ b/tags/CPU/index.html @@ -331,13 +331,13 @@

          CPU - 120k + 123k - 1:50 + 1:52 diff --git a/tags/Compose/index.html b/tags/Compose/index.html index 462f666f..0a4ca77b 100644 --- a/tags/Compose/index.html +++ b/tags/Compose/index.html @@ -331,13 +331,13 @@

          Compose - 120k + 123k - 1:50 + 1:52 diff --git a/tags/Concurrency/index.html b/tags/Concurrency/index.html index 331776cd..546d6200 100644 --- a/tags/Concurrency/index.html +++ b/tags/Concurrency/index.html @@ -351,13 +351,13 @@

          Concurrency - 120k + 123k - 1:50 + 1:52 diff --git a/tags/Economics/index.html b/tags/Economics/index.html index e52eb727..114ec236 100644 --- a/tags/Economics/index.html +++ b/tags/Economics/index.html @@ -331,13 +331,13 @@

          Economics - 120k + 123k - 1:50 + 1:52 diff --git a/tags/File/index.html b/tags/File/index.html index b4c7f90c..74b470ee 100644 --- a/tags/File/index.html +++ b/tags/File/index.html @@ -351,13 +351,13 @@

          File - 120k + 123k - 1:50 + 1:52 diff --git a/tags/Flutter/index.html b/tags/Flutter/index.html index 7b753351..86ca8bc9 100644 --- a/tags/Flutter/index.html +++ b/tags/Flutter/index.html @@ -371,13 +371,13 @@

          Flutter - 120k + 123k - 1:50 + 1:52 diff --git a/tags/JVM/index.html b/tags/JVM/index.html index e27a1bb8..be866337 100644 --- a/tags/JVM/index.html +++ b/tags/JVM/index.html @@ -331,13 +331,13 @@

          JVM - 120k + 123k - 1:50 + 1:52 diff --git a/tags/Java/index.html b/tags/Java/index.html index bd070f05..d5d43bb0 100644 --- a/tags/Java/index.html +++ b/tags/Java/index.html @@ -394,13 +394,13 @@

          Java - 120k + 123k - 1:50 + 1:52 diff --git a/tags/Kotlin/index.html b/tags/Kotlin/index.html index 4646d7cd..e2992a46 100644 --- a/tags/Kotlin/index.html +++ b/tags/Kotlin/index.html @@ -514,13 +514,13 @@

          Kotlin - 120k + 123k - 1:50 + 1:52 diff --git a/tags/LeetCode/index.html b/tags/LeetCode/index.html index a668ea1c..faa1c199 100644 --- a/tags/LeetCode/index.html +++ b/tags/LeetCode/index.html @@ -351,13 +351,13 @@

          LeetCode - 120k + 123k - 1:50 + 1:52 diff --git a/tags/Linux/index.html b/tags/Linux/index.html index 7ab3d60b..5fce036d 100644 --- a/tags/Linux/index.html +++ b/tags/Linux/index.html @@ -331,13 +331,13 @@

          Linux - 120k + 123k - 1:50 + 1:52 diff --git a/tags/List/index.html b/tags/List/index.html index 56974552..507adcb9 100644 --- a/tags/List/index.html +++ b/tags/List/index.html @@ -331,13 +331,13 @@

          List - 120k + 123k - 1:50 + 1:52 diff --git a/tags/Reading/index.html b/tags/Reading/index.html index 7c23e44c..14444bfa 100644 --- a/tags/Reading/index.html +++ b/tags/Reading/index.html @@ -377,13 +377,13 @@

          Reading - 120k + 123k - 1:50 + 1:52 diff --git a/tags/View/index.html b/tags/View/index.html index 2671bc69..a1963f41 100644 --- a/tags/View/index.html +++ b/tags/View/index.html @@ -331,13 +331,13 @@

          View - 120k + 123k - 1:50 + 1:52 diff --git a/tags/cryptography/index.html b/tags/cryptography/index.html index 988ee5de..e975aecc 100644 --- a/tags/cryptography/index.html +++ b/tags/cryptography/index.html @@ -331,13 +331,13 @@

          cryptography - 120k + 123k - 1:50 + 1:52 diff --git a/tags/index.html b/tags/index.html index 1959f48e..b7b3d133 100644 --- a/tags/index.html +++ b/tags/index.html @@ -331,13 +331,13 @@

          标签 - 120k + 123k - 1:50 + 1:52 diff --git "a/tags/\345\256\211\345\215\223\346\241\206\346\236\266/index.html" "b/tags/\345\256\211\345\215\223\346\241\206\346\236\266/index.html" index f1de7414..ee57645e 100644 --- "a/tags/\345\256\211\345\215\223\346\241\206\346\236\266/index.html" +++ "b/tags/\345\256\211\345\215\223\346\241\206\346\236\266/index.html" @@ -331,13 +331,13 @@

          安卓框架 - 120k + 123k - 1:50 + 1:52 diff --git "a/tags/\345\267\245\344\275\234/index.html" "b/tags/\345\267\245\344\275\234/index.html" index cf25a3ae..42526d6b 100644 --- "a/tags/\345\267\245\344\275\234/index.html" +++ "b/tags/\345\267\245\344\275\234/index.html" @@ -331,13 +331,13 @@

          工作 - 120k + 123k - 1:50 + 1:52 diff --git "a/tags/\346\225\260\346\215\256\345\272\223/index.html" "b/tags/\346\225\260\346\215\256\345\272\223/index.html" index 2bb185f7..f5e31045 100644 --- "a/tags/\346\225\260\346\215\256\345\272\223/index.html" +++ "b/tags/\346\225\260\346\215\256\345\272\223/index.html" @@ -331,13 +331,13 @@

          数据库 - 120k + 123k - 1:50 + 1:52 diff --git "a/tags/\346\236\266\346\236\204/index.html" "b/tags/\346\236\266\346\236\204/index.html" index 9f545e49..35950bf2 100644 --- "a/tags/\346\236\266\346\236\204/index.html" +++ "b/tags/\346\236\266\346\236\204/index.html" @@ -331,13 +331,13 @@

          架构 - 120k + 123k - 1:50 + 1:52 diff --git "a/tags/\347\256\227\346\263\225/index.html" "b/tags/\347\256\227\346\263\225/index.html" index 5c613d31..af2e4401 100644 --- "a/tags/\347\256\227\346\263\225/index.html" +++ "b/tags/\347\256\227\346\263\225/index.html" @@ -351,13 +351,13 @@

          算法 - 120k + 123k - 1:50 + 1:52 diff --git "a/tags/\347\273\217\346\265\216\345\255\246/index.html" "b/tags/\347\273\217\346\265\216\345\255\246/index.html" index 33f27a06..40a1cda6 100644 --- "a/tags/\347\273\217\346\265\216\345\255\246/index.html" +++ "b/tags/\347\273\217\346\265\216\345\255\246/index.html" @@ -354,13 +354,13 @@

          经济学 - 120k + 123k - 1:50 + 1:52 diff --git "a/tags/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/index.html" "b/tags/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/index.html" index 0b673e5d..ff08ca91 100644 --- "a/tags/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/index.html" +++ "b/tags/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/index.html" @@ -354,13 +354,13 @@

          计算机基础 - 120k + 123k - 1:50 + 1:52 diff --git "a/tags/\350\275\257\344\273\266\345\223\262\345\255\246/index.html" "b/tags/\350\275\257\344\273\266\345\223\262\345\255\246/index.html" index ec2bef6a..021b5761 100644 --- "a/tags/\350\275\257\344\273\266\345\223\262\345\255\246/index.html" +++ "b/tags/\350\275\257\344\273\266\345\223\262\345\255\246/index.html" @@ -331,13 +331,13 @@

          软件哲学 - 120k + 123k - 1:50 + 1:52 diff --git "a/tags/\351\223\276\350\241\250/index.html" "b/tags/\351\223\276\350\241\250/index.html" index 43dc5968..5fb05f35 100644 --- "a/tags/\351\223\276\350\241\250/index.html" +++ "b/tags/\351\223\276\350\241\250/index.html" @@ -331,13 +331,13 @@

          链表 - 120k + 123k - 1:50 + 1:52 diff --git "a/\343\200\212\345\274\202\347\261\273-\344\270\215\344\270\200\346\240\267\347\232\204\346\210\220\345\212\237\345\220\257\347\244\272\345\275\225\343\200\213.html" "b/\343\200\212\345\274\202\347\261\273-\344\270\215\344\270\200\346\240\267\347\232\204\346\210\220\345\212\237\345\220\257\347\244\272\345\275\225\343\200\213.html" index a8f11dfd..63798add 100644 --- "a/\343\200\212\345\274\202\347\261\273-\344\270\215\344\270\200\346\240\267\347\232\204\346\210\220\345\212\237\345\220\257\347\244\272\345\275\225\343\200\213.html" +++ "b/\343\200\212\345\274\202\347\261\273-\344\270\215\344\270\200\346\240\267\347\232\204\346\210\220\345\212\237\345\220\257\347\244\272\345\275\225\343\200\213.html" @@ -29,7 +29,7 @@ - + @@ -216,6 +216,13 @@

          +