From 0bdeb83a9811184d49d0e70df283fc4bdf6c92d5 Mon Sep 17 00:00:00 2001 From: lihan Date: Wed, 6 Mar 2024 11:49:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=A8=E4=B8=89-03-06=2011:49:51?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _config.yml | 9 +- _posts/.placeholder | 1 + _posts/0_md_generator.sh | 22 + _posts/2015-02-28-test-markdown.md | 76 - _posts/2016-01-01-another-test-markdown.md | 315 --- _posts/2016-05-19-super-short-article.md | 7 - _posts/2016-05-20-super-long-article.md | 11 - _posts/2016-08-12-my-example-post.md | 13 - ...s-post-demonstrates-post-content-styles.md | 100 - _posts/2017-06-10-quick-mardown-example.md | 164 -- _posts/2017-12-04-plantuml-example.md | 66 - _posts/2017-12-08-mermaid-example.md | 75 - _posts/2017-12-15-table-example.md | 111 - _posts/2017-12-18-video-example.md | 43 - _posts/2018-05-26-mathjax-test.md | 13 - _posts/2018-12-05-an-exhibit-of-markdown.md | 94 - _posts/2018-12-07-welcome-to-jekyll.md | 74 - ...0-10-01-releasing-not-pure-poole-v0-1-0.md | 14 + _posts/2020-10-02-testing-mathjax.md | 17 + _posts/2023-10-16-.md | 103 + _posts/API_software/0_md_generator.sh | 21 + .../API_software/2023-07-23-love_markdown.md | 135 + ...023-07-25-tianruo_OCR_use_simpletex_API.md | 264 ++ _posts/API_software/2023-07-29-github.md | 868 ++++++ _posts/API_software/2023-07-29-latex.md | 401 +++ .../2023-07-30-auto-find-answer.md | 267 ++ .../API_software/2023-07-30-generate-blog.md | 152 + _posts/API_software/2023-07-31-jekyll.md | 233 ++ _posts/API_software/2023-08-15-1024-code.md | 210 ++ _posts/API_software/2023-09-10-resume.md | 87 + _posts/API_software/2023-09-30-gpt-prompt.md | 93 + .../2023-11-30-download-xiaohongshu.md | 40 + _posts/API_software/2024-03-05-.md | 13 + .../2024-03-05-md_plus_tuchuang.md | 37 + ...7-0594e514-cba4-4179-a5ca-e3908874f1ca.png | Bin 0 -> 109217 bytes ...9-26b3b65d-d176-49f2-9c52-d8c677590d87.png | Bin 0 -> 43203 bytes .../assets/image-20231130210427811.png | Bin 0 -> 25052 bytes _posts/algorithm/0_md_generator.sh | 21 + .../2 023-07-31-basic-2-container.md | 883 ++++++ _posts/algorithm/2023-07-25-basic-1.md | 283 ++ _posts/algorithm/2023-07-30-dp-01bag.md | 106 + _posts/algorithm/2023-07-30-problem-array.md | 994 +++++++ _posts/algorithm/2023-07-30-problem-string.md | 312 +++ _posts/algorithm/2023-07-30-slide-window.md | 187 ++ _posts/algorithm/2023-07-30-yingshe.md | 41 + _posts/algorithm/2023-07-31-basic-3-banzi.md | 531 ++++ _posts/algorithm/2023-08-02-baidu-jingsai.md | 61 + _posts/algorithm/2023-09-23-string-match.md | 94 + ...thm_\345\233\236\346\272\257_backtrack.md" | 104 + ...m_\345\233\236\346\272\257_backtrack_2.md" | 123 + ...7_backtrack_3_\346\200\273\347\273\223.md" | 191 ++ ...7_backtrack_4_\345\216\273\351\207\215.md" | 108 + .../assets/image-20221027114950476.png | Bin 0 -> 128641 bytes ...02\346\255\245\346\227\245\345\277\227.md" | 109 + _posts/byte_tech/0_md_generator.sh | 22 + _posts/byte_tech/2023-07-25-go-1.md | 1474 ++++++++++ _posts/byte_tech/2023-07-26-0_overview.md | 349 +++ _posts/byte_tech/2023-07-30-go-2-godemo.md | 108 + _posts/byte_tech/2023-07-31-go-4-http-rpc.md | 722 +++++ _posts/byte_tech/2023-08-01-go-5-arp-nat.md | 291 ++ _posts/byte_tech/2023-08-05-go-7-database.md | 369 +++ _posts/byte_tech/2023-08-08-redis.md | 265 ++ .../byte_tech/2023-08-10-dui_xiang_cun_chu.md | 157 ++ .../byte_tech/2023-08-11-xiao_xi_dui_lie.md | 77 + _posts/byte_tech/2023-08-12-project.md | 486 ++++ _posts/byte_tech/2023-08-17-mult-thread.md | 349 +++ _posts/byte_tech/2023-08-17-package.md | 1942 +++++++++++++ _posts/byte_tech/2023-08-17-test.md | 190 ++ _posts/byte_tech/2023-08-18-hole.md | 144 + _posts/byte_tech/2023-08-24-zero-copy.md | 42 + _posts/byte_tech/2023-0823-go-quick-book.md | 2441 +++++++++++++++++ .../assets/image-20230731154712540.png | Bin 0 -> 381059 bytes _posts/cpp/0_md_generator.sh | 21 + _posts/cpp/2023-07-03-cpp-others-ptr.md | 118 + _posts/cpp/2023-07-25-cpp_STL_0_basic.md | 252 ++ _posts/cpp/2023-07-26-cpp_STL_1_allocator.md | 427 +++ _posts/cpp/2023-07-30-commit-style.md | 54 + _posts/cpp/2023-07-30-cpp_style.md | 103 + _posts/cpp/2023-08-14-confuse.md | 111 + _posts/cpp/2023-08-23-unique-not-auto.md | 94 + _posts/cpp/2023-09-22-basic-problems.md | 211 ++ _posts/cpp/2023-10-05-acm-input.md | 323 +++ _posts/leetcode_week/0_md_generator.sh | 22 + _posts/leetcode_week/2023-07-23-355.md | 148 + _posts/leetcode_week/2023-07-30-356.md | 334 +++ _posts/leetcode_week/2023-10-20-.md | 14 + _posts/leetcode_week/all.md | 961 +++++++ _posts/lib_linux/0_md_generator.sh | 19 + _posts/lib_linux/2023-07-30-use-gdb-cmake.md | 125 + _posts/lib_linux/2023-08-02-httpserver.md | 462 ++++ _posts/lib_linux/2023-08-02-muduo.md | 145 + _posts/lib_linux/2023-08-05-xiangmuhuizong.md | 22 + _posts/navigation/2020-07-31-index.md | 15 + _posts/navigation/2020-07-31-tags.md | 6 + _posts/navigation/2020-07-31-tools.md | 67 + _posts/navigation/2020-07-31-toup.md | 12 + _posts/navigation/2023-07-31-about.md | 29 + _posts/navigation/2023-07-31-categories.md | 6 + _posts/navigation/2023-07-31-dates.md | 5 + .../assets/image-20230919144456697.png | Bin 0 -> 256171 bytes _posts/summary/0_md_generator.sh | 19 + _posts/summary/2023-08-08-2023-m.md | 22 + _posts/web/0_md_generator.sh | 21 + _posts/web/2023-09-27-websocket.md | 31 + assets/my/favicon.ico | Bin 0 -> 47925 bytes 105 files changed, 20759 insertions(+), 1165 deletions(-) create mode 100644 _posts/.placeholder create mode 100644 _posts/0_md_generator.sh delete mode 100644 _posts/2015-02-28-test-markdown.md delete mode 100644 _posts/2016-01-01-another-test-markdown.md delete mode 100644 _posts/2016-05-19-super-short-article.md delete mode 100644 _posts/2016-05-20-super-long-article.md delete mode 100644 _posts/2016-08-12-my-example-post.md delete mode 100644 _posts/2017-05-20-this-post-demonstrates-post-content-styles.md delete mode 100644 _posts/2017-06-10-quick-mardown-example.md delete mode 100644 _posts/2017-12-04-plantuml-example.md delete mode 100644 _posts/2017-12-08-mermaid-example.md delete mode 100644 _posts/2017-12-15-table-example.md delete mode 100644 _posts/2017-12-18-video-example.md delete mode 100644 _posts/2018-05-26-mathjax-test.md delete mode 100644 _posts/2018-12-05-an-exhibit-of-markdown.md delete mode 100644 _posts/2018-12-07-welcome-to-jekyll.md create mode 100644 _posts/2020-10-01-releasing-not-pure-poole-v0-1-0.md create mode 100644 _posts/2020-10-02-testing-mathjax.md create mode 100644 _posts/2023-10-16-.md create mode 100644 _posts/API_software/0_md_generator.sh create mode 100644 _posts/API_software/2023-07-23-love_markdown.md create mode 100644 _posts/API_software/2023-07-25-tianruo_OCR_use_simpletex_API.md create mode 100644 _posts/API_software/2023-07-29-github.md create mode 100644 _posts/API_software/2023-07-29-latex.md create mode 100644 _posts/API_software/2023-07-30-auto-find-answer.md create mode 100644 _posts/API_software/2023-07-30-generate-blog.md create mode 100644 _posts/API_software/2023-07-31-jekyll.md create mode 100644 _posts/API_software/2023-08-15-1024-code.md create mode 100644 _posts/API_software/2023-09-10-resume.md create mode 100644 _posts/API_software/2023-09-30-gpt-prompt.md create mode 100644 _posts/API_software/2023-11-30-download-xiaohongshu.md create mode 100644 _posts/API_software/2024-03-05-.md create mode 100644 _posts/API_software/2024-03-05-md_plus_tuchuang.md create mode 100644 _posts/API_software/assets/254448537-0594e514-cba4-4179-a5ca-e3908874f1ca.png create mode 100644 _posts/API_software/assets/254448629-26b3b65d-d176-49f2-9c52-d8c677590d87.png create mode 100644 _posts/API_software/assets/image-20231130210427811.png create mode 100644 _posts/algorithm/0_md_generator.sh create mode 100644 _posts/algorithm/2 023-07-31-basic-2-container.md create mode 100644 _posts/algorithm/2023-07-25-basic-1.md create mode 100644 _posts/algorithm/2023-07-30-dp-01bag.md create mode 100644 _posts/algorithm/2023-07-30-problem-array.md create mode 100644 _posts/algorithm/2023-07-30-problem-string.md create mode 100644 _posts/algorithm/2023-07-30-slide-window.md create mode 100644 _posts/algorithm/2023-07-30-yingshe.md create mode 100644 _posts/algorithm/2023-07-31-basic-3-banzi.md create mode 100644 _posts/algorithm/2023-08-02-baidu-jingsai.md create mode 100644 _posts/algorithm/2023-09-23-string-match.md create mode 100644 "_posts/algorithm/algorithm_\345\233\236\346\272\257_backtrack.md" create mode 100644 "_posts/algorithm/algorithm_\345\233\236\346\272\257_backtrack_2.md" create mode 100644 "_posts/algorithm/algorithm_\345\233\236\346\272\257_backtrack_3_\346\200\273\347\273\223.md" create mode 100644 "_posts/algorithm/algorithm_\345\233\236\346\272\257_backtrack_4_\345\216\273\351\207\215.md" create mode 100644 _posts/algorithm/assets/image-20221027114950476.png create mode 100644 "_posts/algorithm/\345\274\202\346\255\245\346\227\245\345\277\227.md" create mode 100644 _posts/byte_tech/0_md_generator.sh create mode 100644 _posts/byte_tech/2023-07-25-go-1.md create mode 100644 _posts/byte_tech/2023-07-26-0_overview.md create mode 100644 _posts/byte_tech/2023-07-30-go-2-godemo.md create mode 100644 _posts/byte_tech/2023-07-31-go-4-http-rpc.md create mode 100644 _posts/byte_tech/2023-08-01-go-5-arp-nat.md create mode 100644 _posts/byte_tech/2023-08-05-go-7-database.md create mode 100644 _posts/byte_tech/2023-08-08-redis.md create mode 100644 _posts/byte_tech/2023-08-10-dui_xiang_cun_chu.md create mode 100644 _posts/byte_tech/2023-08-11-xiao_xi_dui_lie.md create mode 100644 _posts/byte_tech/2023-08-12-project.md create mode 100644 _posts/byte_tech/2023-08-17-mult-thread.md create mode 100644 _posts/byte_tech/2023-08-17-package.md create mode 100644 _posts/byte_tech/2023-08-17-test.md create mode 100644 _posts/byte_tech/2023-08-18-hole.md create mode 100644 _posts/byte_tech/2023-08-24-zero-copy.md create mode 100644 _posts/byte_tech/2023-0823-go-quick-book.md create mode 100644 _posts/byte_tech/assets/image-20230731154712540.png create mode 100644 _posts/cpp/0_md_generator.sh create mode 100644 _posts/cpp/2023-07-03-cpp-others-ptr.md create mode 100644 _posts/cpp/2023-07-25-cpp_STL_0_basic.md create mode 100644 _posts/cpp/2023-07-26-cpp_STL_1_allocator.md create mode 100644 _posts/cpp/2023-07-30-commit-style.md create mode 100644 _posts/cpp/2023-07-30-cpp_style.md create mode 100644 _posts/cpp/2023-08-14-confuse.md create mode 100644 _posts/cpp/2023-08-23-unique-not-auto.md create mode 100644 _posts/cpp/2023-09-22-basic-problems.md create mode 100644 _posts/cpp/2023-10-05-acm-input.md create mode 100644 _posts/leetcode_week/0_md_generator.sh create mode 100644 _posts/leetcode_week/2023-07-23-355.md create mode 100644 _posts/leetcode_week/2023-07-30-356.md create mode 100644 _posts/leetcode_week/2023-10-20-.md create mode 100644 _posts/leetcode_week/all.md create mode 100644 _posts/lib_linux/0_md_generator.sh create mode 100644 _posts/lib_linux/2023-07-30-use-gdb-cmake.md create mode 100644 _posts/lib_linux/2023-08-02-httpserver.md create mode 100644 _posts/lib_linux/2023-08-02-muduo.md create mode 100644 _posts/lib_linux/2023-08-05-xiangmuhuizong.md create mode 100644 _posts/navigation/2020-07-31-index.md create mode 100644 _posts/navigation/2020-07-31-tags.md create mode 100644 _posts/navigation/2020-07-31-tools.md create mode 100644 _posts/navigation/2020-07-31-toup.md create mode 100644 _posts/navigation/2023-07-31-about.md create mode 100644 _posts/navigation/2023-07-31-categories.md create mode 100644 _posts/navigation/2023-07-31-dates.md create mode 100644 _posts/navigation/assets/image-20230919144456697.png create mode 100644 _posts/summary/0_md_generator.sh create mode 100644 _posts/summary/2023-08-08-2023-m.md create mode 100644 _posts/web/0_md_generator.sh create mode 100644 _posts/web/2023-09-27-websocket.md create mode 100644 assets/my/favicon.ico diff --git a/_config.yml b/_config.yml index 59b1c2b..1a6256e 100644 --- a/_config.yml +++ b/_config.yml @@ -24,9 +24,9 @@ # You can create any custom variable you would like, and they will be accessible # in the templates via {{ site.myvariable }}. -title: Your awesome title +title: li54426 blog email: your-email@domain.com -author: GitHub User +author: li54426 # Copyright setting # You can use any html code, currently below placeholders are available: @@ -46,16 +46,19 @@ description: >- # this means to ignore newlines until "baseurl:" Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description. +记录我的代码和日常生活 baseurl: "" # the subpath of your site, e.g. /blog url: "" # the base hostname & protocol for your site, e.g. https://example.com -favicon: "" # the favicon for your site +favicon: "assets/my/favicon.ico" # the favicon for your site # Yat date format # refer to https://shopify.github.io/liquid/filters/date/ if you want to customize this yat: date_format: "%b %d, %Y" +permalink: /:categories/:year/:title.html + # If you want more debug log, you can set true # debug: false diff --git a/_posts/.placeholder b/_posts/.placeholder new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/_posts/.placeholder @@ -0,0 +1 @@ + diff --git a/_posts/0_md_generator.sh b/_posts/0_md_generator.sh new file mode 100644 index 0000000..5255f38 --- /dev/null +++ b/_posts/0_md_generator.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +filename=$(date +"%Y-%m-%d-.md") + +cat > "$filename" << EOF +--- +layout: blog +banana: true +category: default +title: +date: $(date +"%Y-%m-%d %H:%M:%S") +background-image: http://ot1cc1u9t.bkt.clouddn.com/17-8-1/24280498.jpg +tags: +- default +- memcache +--- + +* content +{:toc} +EOF + +echo "文件已生成:$filename" diff --git a/_posts/2015-02-28-test-markdown.md b/_posts/2015-02-28-test-markdown.md deleted file mode 100644 index 153b312..0000000 --- a/_posts/2015-02-28-test-markdown.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -layout: post -title: Test markdown -subtitle: Each post also has a subtitle -categories: markdown -tags: [test] ---- - -You can write regular [markdown](https://markdowntutorial.com/) here and Jekyll will automatically convert it to a nice webpage. I strongly encourage you to [take 5 minutes to learn how to write in markdown](http://markdowntutorial.com/) - it'll teach you how to transform regular text into bold/italics/headings/tables/etc. - -**Here is some bold text** - -## Here is a secondary heading - -Here's a useless table: - -| Number | Next number | Previous number | -| :------ |:--- | :--- | -| Five | Six | Four | -| Ten | Eleven | Nine | -| Seven | Eight | Six | -| Two | Three | One | - - -How about a yummy crepe? - -![Crepe](https://s3-media3.fl.yelpcdn.com/bphoto/cQ1Yoa75m2yUFFbY2xwuqw/348s.jpg) - -It can also be centered! - -![Crepe](https://s3-media3.fl.yelpcdn.com/bphoto/cQ1Yoa75m2yUFFbY2xwuqw/348s.jpg){: .center-block :} - -Here's a code chunk: - -~~~ -var foo = function(x) { - return(x + 5); -} -foo(3) -~~~ - -And here is the same code with syntax highlighting: - -```javascript -var foo = function(x) { - return(x + 5); -} -foo(3) -``` - -And here is the same code yet again but with line numbers: - -{% highlight javascript linenos %} -var foo = function(x) { - return(x + 5); -} -foo(3) -{% endhighlight %} - -## Boxes -You can add notification, warning and error boxes like this: - -### Notification - -{: .box-note} -**Note:** This is a notification box. - -### Warning - -{: .box-warning} -**Warning:** This is a warning box. - -### Error - -{: .box-error} -**Error:** This is an error box. diff --git a/_posts/2016-01-01-another-test-markdown.md b/_posts/2016-01-01-another-test-markdown.md deleted file mode 100644 index d8f271b..0000000 --- a/_posts/2016-01-01-another-test-markdown.md +++ /dev/null @@ -1,315 +0,0 @@ ---- -layout: post -title: Another test markdown -subtitle: Each post also has a subtitle -categories: markdown -tags: [test] ---- - -Put the math expression within $...\$: - -\\(\LaTeX{}\\) - -$\Pi$ - -$ a * b = c ^ b $ - -$ 2^{\frac{n-1}{3}} $ - -$ \int\_a^b f(x)\,dx. $ - -\\( \int\_a^b f(x)\,dx. \\) - -$$ -\begin{cases} -\text{if true}\ foo \\ -\text{if false}\ bar -\end{cases} -$$ - -$ \rho {\rm{FOD}} = \sum\limits{\sigma ,i} {(\delta _1 - \delta _2 n_i^\sigma )|\phi _i^\sigma ({\bf{r}})|^2} $ - -$$ \rho {\rm{FOD}} = \sum\limits{\sigma ,i} {(\delta _1 - \delta _2 n_i^\sigma )|\phi _i^\sigma ({\bf{r}})|^2} $$ - - -{{ "here is a liquid filter." | capitalize }} - -{% capture test %} -\`escape inline code\` -`inline code` -Here is a **capture block**. -{% endcapture %} - -{{ test | markdownify }} - -{% assign x = 100 %} {% assign x = x | divided_by: 3 %} -100 / 3 = {{ x }} - -:+1: -:bolivia: - -\1. 21312 -\2. 21312 -\4. 4214 - -{% highlight python wl linenos %} -import networkx as nx -from collections import Counter - -diagrams = defaultdict(list) -particle_counts = defaultdict(Counter) - -for (a, b), neighbors in common_neighbors.items(): - # Build up the graph of connections between the - # common neighbors of a and b. - g = nx.Graph() - for i in neighbors: - for j in set(nl.point_indices[ - nl.query_point_indices == i]).intersection(neighbors): - g.add_edge(i, j) - - # Define the identifiers for a CNA diagram: - # The first integer is 1 if the particles are bonded, otherwise 2 - # The second integer is the number of shared neighbors - # The third integer is the number of bonds among shared neighbors - # The fourth integer is an index, just to ensure uniqueness of diagrams - diagram_type = 2-int(b in nl.point_indices[nl.query_point_indices == a]) - key = (diagram_type, len(neighbors), g.number_of_edges()) - # If we've seen any neighborhood graphs with this signature, - # we explicitly check if the two graphs are identical to - # determine whether to save this one. Otherwise, we add - # the new graph immediately. - if key in diagrams: - isomorphs = [nx.is_isomorphic(g, h) for h in diagrams[key]] - if any(isomorphs): - idx = isomorphs.index(True) - else: - diagrams[key].append(g) - idx = diagrams[key].index(g) - else: - diagrams[key].append(g) - idx = diagrams[key].index(g) - cna_signature = key + (idx,) - particle_counts[a].update([cna_signature]) -{% endhighlight %} - -```cpp -void insert(const char* key) { - if (*key == '\0') { - finish = true; - } else { - int idx = *key - 'A'; - if (!next[idx]) - next[idx] = new Trie(); - next[idx]->insert(key + 1); - } -} -``` - -```ruby -p ":+1:" -``` - -``` diff -+ 'user_exists' => 'SELECT EXISTS(SELECT 1 FROM table WHERE username = (:username || \'@sample'))', -+ 'get_users' => 'SELECT split_part(username, \'@\', 1) FROM table WHERE (username ILIKE :search) OR (name ILIKE :search)', -+ 'get_password_hash_for_user' => 'SELECT split_part(password, \'{CRYPT}\', 2) FROM table WHERE username = (:username || \'@sample\')', -+ 'set_password_hash_for_user' => 'UPDATE table SET password = \'{CRYPT}\' || :new_password_hash WHERE username = (:username || \'@sample\')', -``` - -Reload the Nginx: - -``` console -$ sudo nginx -s reload -``` - -|: |: :|: $$O_3 + C_2H_2 \rightarrow $$ :|||: $$O_3 + C_2H_4 \rightarrow $$ :|||: :| -|: ^^ Method :| ^^ $$\lambda^a$$ | vdW | TS | cycloadd. | vdW | TS | cycloadd. | ^^ MAE | -|-------------------------|-------------------|--------|-------|------------------------|-------|------|----------------------|-----------| -| $$\lambda$$-tPBE | 0.20 | -0.40 | 7.69 | -68.00 | -1.86 | 4.87 | -57.57 | 1.29 | -|-------------------------|-------------------|--------|-------|------------------------|-------|------|----------------------|-----------| -| MC1H-PBE $$^b$$ | 0.25 | -1.08 | 3.66 | -70.97 | -1.25 | 0.13 | -61.26 | 3.35 | -|-------------------------|-------------------|--------|-------|------------------------|-------|------|----------------------|-----------| -| Reference values $$^c$$ | --------- | -1.90 | 7.74 | -63.80 | -1.94 | 3.37 | -57.15 | --------- | -|=========================|===================|========|=======|========================|=======|======|======================|===========| -| $$^a$$ The optimal mixing parameter.$$\~$$ $$^b$$ From Ref. .$$\~$$ $$^c$$ Best estimates from Ref. . |||||||| - - -| 1 | 2 | 3 | 4 | 5 | 6 | 7 | -| spancell1 || spancell2 || cell | spancell3 || -|^^ spancell1 || spancell2 || cell | spancell3 || -{:class="custom-table"} - - - - -|:-----:|:-----:|:-----:|:-----:| ---- | -| (0,0) | (0,1) | (0,2) | (0,3) | | -| (1,0) || ^^ | (1,3) | | - - -|:-----:|:-----:|:-----:|:-----:| ---- | -| (0,0) | (0,1) | (0,2) | (0,3) | | -| (1,0) ||| (1,3) || - - -|:-----:|:-----:|:-----:|:-----:| ---- | -| (0,0) | (0,1) | (0,2) | (0,3) | | -| (1,0) ||| ^^ | | - -|:-----:|:-----:|:-----:|:-----:| ---- | -| (0,0) | (0,1) | (0,2) | (0,3) | \ -| (1,0) ||| ^^ | | - - -## Table - -| Stage | Direct Products | ATP Yields | -| ----: | --------------: | ---------: | -|Glycolysis | 2 ATP || -|^^ | 2 NADH | 3--5 ATP | -|Pyruvaye oxidation | 2 NADH | 5 ATP | -|Citric acid cycle | 2 ATP || -|^^ | 6 NADH | 15 ATP | -|^^ | 2 FADH | 3 ATP | -| 30--32 ATP ||| - - -{:color-style: style="background: black;" } -{:color-style: style="color: white;" } -{:font-style: style="font-weight: 900; text-decoration: underline;" } - -|: Here's a Inline Attribute Lists example :|||| -| ------- | ------------------------- | -------------------- | ----------- | -|: :|:
< Normal HTML Block >
:||| -| ^^ | Red {: .cls style="background: orange" } ||| -| ^^ IALs | Green {: #id style="background: green; color: white" } ||| -| ^^ | Blue {: style="background: blue; color: white" } ||| -| ^^ | Black {: color-style font-style} ||| - - -[cell image]: https://jekyllrb.com/img/octojekyll.png "An exemplary image" - -| Heading | Column 1 | Column 2 | -|--------------------|---------------|------------------------------------| -| Row 1 | Apple[^1] | [Youtube (Home)] | -| Row 2 | Banana | [Github][1] | -| Row 3 (merged) | Blueberry | [Google] ***** [Github] | -| ^^ | [Plum](https://example.com) | Raspberry ![example][cell image] | -| Row 4 | | [test](https://www.google.com){:target="_blank"} | -|^^ |^^ | | -| Row 5 | || - -[Youtube (Home)]: https://www.youtube.com -[Google]: https://www.google.com -[Github]: https://www.github.com -[1]: https://www.github.com -[^1]: Footnote - - - -Not in table: `` - -In table: - -Decision Point | Design Decision ---- | --- -Authoritative DNS MX Record | `` - -9 \* 9 - -| 1 \* 1 = 1 | -| 1 \* 2 = 2 | 2 \* 2 = 4 | -| 1 \* 3 = 3 | 2 \* 3 = 6 | 3 \* 3 = 9 | -| 1 \* 3 = 3 | 2 \* 3 = 6 | 3 \* 4 = 12 | 4 \* 4 = 16 | - -## Emoji -:+1: - -## Mathjax - -$\LaTeX{}$ - -## PlantUML - -@startuml -Bob -> Alice : hello -@enduml - -## Mermaid - -```mermaid! -graph LR - concurrent.futures --->| on top of | threading - concurrent.futures --->| on top of | multiprocessing - threading --->| on top of | \_thread - click concurrent.futures "https://docs.python.org/3.9/library/concurrent.futures.html" _blank -``` - -## Video - -![Flower](https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm) - -![](//www.youtube.com/watch?v=Ptk_1Dc2iPY) - -![](https://avatars3.githubusercontent.com/hubot?v=3&s=40) - -[\[video link\]](//www.youtube.com/watch?v=Ptk_1Dc2iPY) - -## Audio - -[HTML5 Audio Formats Test](https://hpr.dogphilosophy.net/test/) - -Opus Audio (".opus"): - -![](https://hpr.dogphilosophy.net/test/opus.opus) - -"MP3" file (".mp3") : - -![](https://hpr.dogphilosophy.net/test/mp3.mp3) - -WebM Audio (".weba"): - -![](https://hpr.dogphilosophy.net/test/weba.weba) - -WebMv2 Audio (".webm"): - -![](https://hpr.dogphilosophy.net/test/webmv2.webm) - -Ogg Vorbis (".ogg") : - -![](https://hpr.dogphilosophy.net/test/ogg.ogg) - -"wave" file(".wav") : - -![](https://hpr.dogphilosophy.net/test/wav.wav) - -FLAC file (".flac") : - -![](https://hpr.dogphilosophy.net/test/flac.flac) - -CAF file (".caf") : - -![](https://hpr.dogphilosophy.net/test/cafopus.caf) - -Spotify Podcast: - -![](https://open.spotify.com/episode/31AxcwYdjsFtStds5JVWbT) - -## Special media links - -![]( {{ "/assets/devstories.webm" | relative_url }} ) - -[![w:1100](https://i.imgur.com/bc9HOJU.png)](https://www.youtube.com/watch?v=kCHGDRHZ4eU) - -Tips: -* Use pipes {% raw %}(`|`){% endraw %} to delineate columns, and dashes to delineate the header row from the rest of the table. -* Spacing doesn't matter to the markdown processor, any extra white space is removed, but it can really help with readability. -The two markdown examples below both create this table. - -Use pipes `{% raw %}(`|`){% endraw %}` to delineate columns, and dashes to delineate the header row from the rest of the table. - diff --git a/_posts/2016-05-19-super-short-article.md b/_posts/2016-05-19-super-short-article.md deleted file mode 100644 index c925c64..0000000 --- a/_posts/2016-05-19-super-short-article.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -layout: post -title: "Some articles are just so short that we have to make the footer stick" -categories: misc ---- - -Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. diff --git a/_posts/2016-05-20-super-long-article.md b/_posts/2016-05-20-super-long-article.md deleted file mode 100644 index 5652a9a..0000000 --- a/_posts/2016-05-20-super-long-article.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -layout: post -title: "Some articles are just so long they deserve a really long title to see if things will break well" -categories: misc ---- - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce bibendum neque eget nunc mattis eu sollicitudin enim tincidunt. Vestibulum lacus tortor, ultricies id dignissim ac, bibendum in velit. Proin convallis mi ac felis pharetra aliquam. Curabitur dignissim accumsan rutrum. In arcu magna, aliquet vel pretium et, molestie et arcu. Mauris lobortis nulla et felis ullamcorper bibendum. Phasellus et hendrerit mauris. Proin eget nibh a massa vestibulum pretium. Suspendisse eu nisl a ante aliquet bibendum quis a nunc. Praesent varius interdum vehicula. Aenean risus libero, placerat at vestibulum eget, ultricies eu enim. Praesent nulla tortor, malesuada adipiscing adipiscing sollicitudin, adipiscing eget est. - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce bibendum neque eget nunc mattis eu sollicitudin enim tincidunt. Vestibulum lacus tortor, ultricies id dignissim ac, bibendum in velit. Proin convallis mi ac felis pharetra aliquam. Curabitur dignissim accumsan rutrum. In arcu magna, aliquet vel pretium et, molestie et arcu. Mauris lobortis nulla et felis ullamcorper bibendum. Phasellus et hendrerit mauris. Proin eget nibh a massa vestibulum pretium. Suspendisse eu nisl a ante aliquet bibendum quis a nunc. Praesent varius interdum vehicula. Aenean risus libero, placerat at vestibulum eget, ultricies eu enim. Praesent nulla tortor, malesuada adipiscing adipiscing sollicitudin, adipiscing eget est. - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce bibendum neque eget nunc mattis eu sollicitudin enim tincidunt. Vestibulum lacus tortor, ultricies id dignissim ac, bibendum in velit. Proin convallis mi ac felis pharetra aliquam. Curabitur dignissim accumsan rutrum. In arcu magna, aliquet vel pretium et, molestie et arcu. Mauris lobortis nulla et felis ullamcorper bibendum. Phasellus et hendrerit mauris. Proin eget nibh a massa vestibulum pretium. Suspendisse eu nisl a ante aliquet bibendum quis a nunc. Praesent varius interdum vehicula. Aenean risus libero, placerat at vestibulum eget, ultricies eu enim. Praesent nulla tortor, malesuada adipiscing adipiscing sollicitudin, adipiscing eget est. diff --git a/_posts/2016-08-12-my-example-post.md b/_posts/2016-08-12-my-example-post.md deleted file mode 100644 index d64a84d..0000000 --- a/_posts/2016-08-12-my-example-post.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -layout: post -categories: junk ---- - -Eos eu docendi tractatos sapientem, brute option menandri in vix, quando vivendo accommodare te ius. Nec melius fastidii constituam id, viderer theophrastus ad sit, hinc semper periculis cum id. Noluisse postulant assentior est in, no choro sadipscing repudiandae vix. Vis in euismod delenit dignissim. Ex quod nostrum sit, suas decore animal id ius, nobis solet detracto quo te. - -{% comment %} -Might you have an include in your theme? Why not try it here! -{% include my-themes-great-include.html %} -{% endcomment %} - -No laudem altera adolescens has, volumus lucilius eum no. Eam ei nulla audiam efficiantur. Suas affert per no, ei tale nibh sea. Sea ne magna harum, in denique scriptorem sea, cetero alienum tibique ei eos. Labores persequeris referrentur eos ei. diff --git a/_posts/2017-05-20-this-post-demonstrates-post-content-styles.md b/_posts/2017-05-20-this-post-demonstrates-post-content-styles.md deleted file mode 100644 index ec675ca..0000000 --- a/_posts/2017-05-20-this-post-demonstrates-post-content-styles.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -layout: post -title: "This post demonstrates post content styles" -categories: junk -author: "Bart Simpson" -meta: "Springfield" ---- - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce bibendum neque eget nunc mattis eu sollicitudin enim tincidunt. Vestibulum lacus tortor, ultricies id dignissim ac, bibendum in velit. - -## Some great heading (h2) - -Proin convallis mi ac felis pharetra aliquam. Curabitur dignissim accumsan rutrum. In arcu magna, aliquet vel pretium et, molestie et arcu. - -Mauris lobortis nulla et felis ullamcorper bibendum. Phasellus et hendrerit mauris. Proin eget nibh a massa vestibulum pretium. Suspendisse eu nisl a ante aliquet bibendum quis a nunc. Praesent varius interdum vehicula. Aenean risus libero, placerat at vestibulum eget, ultricies eu enim. Praesent nulla tortor, malesuada adipiscing adipiscing sollicitudin, adipiscing eget est. - -## Another great heading (h2) - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce bibendum neque eget nunc mattis eu sollicitudin enim tincidunt. Vestibulum lacus tortor, ultricies id dignissim ac, bibendum in velit. - -### Some great subheading (h3) - -Proin convallis mi ac felis pharetra aliquam. Curabitur dignissim accumsan rutrum. In arcu magna, aliquet vel pretium et, molestie et arcu. Mauris lobortis nulla et felis ullamcorper bibendum. - -Phasellus et hendrerit mauris. Proin eget nibh a massa vestibulum pretium. Suspendisse eu nisl a ante aliquet bibendum quis a nunc. - -### Some great subheading (h3) - -Praesent varius interdum vehicula. Aenean risus libero, placerat at vestibulum eget, ultricies eu enim. Praesent nulla tortor, malesuada adipiscing adipiscing sollicitudin, adipiscing eget est. - -> This quote will change your life. It will reveal the secrets of the universe, and all the wonders of humanity. Don't misuse it. - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce bibendum neque eget nunc mattis eu sollicitudin enim tincidunt. - -### Some great subheading (h3) - -Vestibulum lacus tortor, ultricies id dignissim ac, bibendum in velit. Proin convallis mi ac felis pharetra aliquam. Curabitur dignissim accumsan rutrum. - -```html - - - -

Hello, World!

- - -``` - -In arcu magna, aliquet vel pretium et, molestie et arcu. Mauris lobortis nulla et felis ullamcorper bibendum. Phasellus et hendrerit mauris. - -#### You might want a sub-subheading (h4) - -In arcu magna, aliquet vel pretium et, molestie et arcu. Mauris lobortis nulla et felis ullamcorper bibendum. Phasellus et hendrerit mauris. - -In arcu magna, aliquet vel pretium et, molestie et arcu. Mauris lobortis nulla et felis ullamcorper bibendum. Phasellus et hendrerit mauris. - -#### But it's probably overkill (h4) - -In arcu magna, aliquet vel pretium et, molestie et arcu. Mauris lobortis nulla et felis ullamcorper bibendum. Phasellus et hendrerit mauris. - -### Oh hai, an unordered list!! - -In arcu magna, aliquet vel pretium et, molestie et arcu. Mauris lobortis nulla et felis ullamcorper bibendum. Phasellus et hendrerit mauris. - -- First item, yo -- Second item, dawg -- Third item, what what?! -- Fourth item, fo sheezy my neezy - -### Oh hai, an ordered list!! - -In arcu magna, aliquet vel pretium et, molestie et arcu. Mauris lobortis nulla et felis ullamcorper bibendum. Phasellus et hendrerit mauris. - -1. First item, yo -2. Second item, dawg -3. Third item, what what?! -4. Fourth item, fo sheezy my neezy - -## Headings are cool! (h2) - -Proin eget nibh a massa vestibulum pretium. Suspendisse eu nisl a ante aliquet bibendum quis a nunc. Praesent varius interdum vehicula. Aenean risus libero, placerat at vestibulum eget, ultricies eu enim. Praesent nulla tortor, malesuada adipiscing adipiscing sollicitudin, adipiscing eget est. - -Praesent nulla tortor, malesuada adipiscing adipiscing sollicitudin, adipiscing eget est. - -Proin eget nibh a massa vestibulum pretium. Suspendisse eu nisl a ante aliquet bibendum quis a nunc. - -### Tables - -| Title 1 | Title 2 | Title 3 | Title 4 | -| --------------------- | --------------------- | --------------------- | --------------------- | -| lorem | lorem ipsum | lorem ipsum dolor | lorem ipsum dolor sit | -| lorem ipsum dolor sit | lorem ipsum dolor sit | lorem ipsum dolor sit | lorem ipsum dolor sit | -| lorem ipsum dolor sit | lorem ipsum dolor sit | lorem ipsum dolor sit | lorem ipsum dolor sit | -| lorem ipsum dolor sit | lorem ipsum dolor sit | lorem ipsum dolor sit | lorem ipsum dolor sit | - -| Title 1 | Title 2 | Title 3 | Title 4 | -| -------------------------- | -------------------------------------- | -------------------------- | -------------------------------------- | -| lorem | lorem ipsum | lorem ipsum dolor | lorem ipsum dolor sit | -| lorem ipsum dolor sit amet | lorem ipsum dolor sit amet consectetur | lorem ipsum dolor sit amet | lorem ipsum dolor sit | -| lorem ipsum dolor | lorem ipsum | lorem | lorem ipsum | -| lorem ipsum dolor | lorem ipsum dolor sit | lorem ipsum dolor sit amet | lorem ipsum dolor sit amet consectetur | diff --git a/_posts/2017-06-10-quick-mardown-example.md b/_posts/2017-06-10-quick-mardown-example.md deleted file mode 100644 index 384b737..0000000 --- a/_posts/2017-06-10-quick-mardown-example.md +++ /dev/null @@ -1,164 +0,0 @@ ---- -layout: post -title: Quick markdown example -subtitle: This is a quick markdown example -categories: markdown -tags: [example] ---- - -Paragraphs are separated by a blank line. - -2nd paragraph. *Italic*, **bold**, and `monospace`. Itemized lists -look like: - - * this one - * that one - * the other one - -Note that --- not considering the asterisk --- the actual text -content starts at 4-columns in. - -> Block quotes are -> written like so. -> -> They can span multiple paragraphs, -> if you like. - -Use 3 dashes for an em-dash. Use 2 dashes for ranges (ex., "it's all -in chapters 12--14"). Three dots ... will be converted to an ellipsis. -Unicode is supported. ☺ - - - -An h2 header ------------- - -Here's a numbered list: - - 1. first item - 2. second item - 3. third item - -Note again how the actual text starts at 4 columns in (4 characters -from the left side). Here's a code sample: - - # Let me re-iterate ... - for i in 1 .. 10 { do-something(i) } - -As you probably guessed, indented 4 spaces. By the way, instead of -indenting the block, you can use delimited blocks, if you like: - -~~~ -define foobar() { - print "Welcome to flavor country!"; -} -~~~ - -(which makes copying & pasting easier). You can optionally mark the -delimited block for Pandoc to syntax highlight it: - -~~~python -import time -# Quick, count to ten! -for i in range(10): - # (but not *too* quick) - time.sleep(0.5) - print(i) -~~~ - - - -### An h3 header ### - -Now a nested list: - - 1. First, get these ingredients: - - * carrots - * celery - * lentils - - 2. Boil some water. - - 3. Dump everything in the pot and follow - this algorithm: - - find wooden spoon - uncover pot - stir - cover pot - balance wooden spoon precariously on pot handle - wait 10 minutes - goto first step (or shut off burner when done) - - Do not bump wooden spoon or it will fall. - -Notice again how text always lines up on 4-space indents (including -that last line which continues item 3 above). - -Here's a link to [a website](http://foo.bar), to a [local -doc](local-doc.html), and to a [section heading in the current -doc](#an-h2-header). Here's a footnote [^1]. - -[^1]: Some footnote text. - -Tables can look like this: - -Name Size Material Color -------------- ----- ------------ ------------ -All Business 9 leather brown -Roundabout 10 hemp canvas natural -Cinderella 11 glass transparent - -Table: Shoes sizes, materials, and colors. - -(The above is the caption for the table.) Pandoc also supports -multi-line tables: - --------- ----------------------- -Keyword Text --------- ----------------------- -red Sunsets, apples, and - other red or reddish - things. - -green Leaves, grass, frogs - and other things it's - not easy being. --------- ----------------------- - -A horizontal rule follows. - -*** - -Here's a definition list: - -apples - : Good for making applesauce. - -oranges - : Citrus! - -tomatoes - : There's no "e" in tomatoe. - -Again, text is indented 4 spaces. (Put a blank line between each -term and its definition to spread things out more.) - -Here's a "line block" (note how whitespace is honored): - -| Line one -| Line too -| Line tree - -and images can be specified like so: - -![example image](https://user-images.githubusercontent.com/9413601/123900693-1d9ebd00-d99c-11eb-8e9e-cf7879187606.png "An exemplary image") - -Inline math equation: $\omega = d\phi / dt$. Display -math should get its own line like so: - -$$I = \int \rho R^{2} dV$$ - -And note that you can backslash-escape any punctuation characters -which you wish to be displayed literally, ex.: \`foo\`, \*bar\*, etc. diff --git a/_posts/2017-12-04-plantuml-example.md b/_posts/2017-12-04-plantuml-example.md deleted file mode 100644 index e45b91a..0000000 --- a/_posts/2017-12-04-plantuml-example.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -layout: post -title: Plantuml example -categories: example -tags: [plantuml] ---- - -## My First PlantUML - -### PlantUML Block-1 -@startuml -Bob -> Alice : hello -@enduml - - -### PlantUML Block-2 -``` plantuml! -Bob -> Alice : hello world -``` - - -### PlantUML Block-3 -@startuml -(*) --> "Initialization" - -if "Some Test" then - -->[true] "Some Activity" - --> "Another activity" - -right-> (*) -else - ->[false] "Something else" - -->[Ending process] (*) -endif -@enduml - - -### PlantUML Block-4 - -@startuml -skinparam handwritten true - -skinparam usecase { - BackgroundColor DarkSeaGreen - BorderColor DarkSlateGray - - BackgroundColor<< Main >> YellowGreen - BorderColor<< Main >> YellowGreen - - ArrowColor Olive - ActorBorderColor black - ActorFontName Courier - - ActorBackgroundColor<< Human >> Gold -} - -User << Human >> -:Main Database: as MySql << Application >> -(Start) << One Shot >> -(Use the application) as (Use) << Main >> - -User -> (Start) -User --> (Use) - -MySql --> (Use) - -@enduml diff --git a/_posts/2017-12-08-mermaid-example.md b/_posts/2017-12-08-mermaid-example.md deleted file mode 100644 index 4b07680..0000000 --- a/_posts/2017-12-08-mermaid-example.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -layout: post -title: Mermaid example -categories: example -tags: [mermaid] ---- - -### 1. Pie chart - -```mermaid! -pie title Pets adopted by volunteers - "Dogs" : 386 - "Cats" : 85 - "Rats" : 35 -``` - -### 2. sequence diagram - -@startmermaid -sequenceDiagram - Alice ->> Bob: Hello Bob, how are you? - Bob-->>John: How about you John? - Bob--x Alice: I am good thanks! - Bob-x John: I am good thanks! - Note right of John: Bob thinks a long
long time, so long
that the text does
not fit on a row. - - Bob-->Alice: Checking with John... - Alice->John: Yes... John, how are you? -@endmermaid - -```mermaid! -graph TD -A[Christmas] -->|Get money| B(Go shopping) - B --> C{Let me think} - C -->|One| D[Laptop] - C -->|Two| E[iPhone] - C -->|Three| F[fa:fa-car Car] -``` - -### 3. Class diagram -```mermaid! -classDiagram -Animal <|-- Duck -Animal <|-- Fish -Animal <|-- Zebra -Animal : +int age -Animal : +String gender -Animal: +isMammal() -Animal: +mate() -class Duck{ - +String beakColor - +swim() - +quack() -} -class Fish{ - -int sizeInFeet - -canEat() -} -class Zebra{ - +bool is_wild - +run() -} -``` - -### 4. State diagram -```mermaid! -stateDiagram -[*] --> Still -Still --> [*] - -Still --> Moving -Moving --> Still -Moving --> Crash -Crash --> [*] -``` diff --git a/_posts/2017-12-15-table-example.md b/_posts/2017-12-15-table-example.md deleted file mode 100644 index af03411..0000000 --- a/_posts/2017-12-15-table-example.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -layout: post -title: Table example -subtitle: -categories: example -tags: [table] ---- - -## Table example as below - -**For now, these extended features are provided:** - -* Cells spanning multiple columns -* Cells spanning multiple rows -* Cells text align separately -* Table header not required -* Grouped table header rows or data rows - -### Rowspan and Colspan -^^ in a cell indicates it should be merged with the cell above. -This feature is contributed by [pmccloghrylaing](https://github.com/pmccloghrylaing). - -| Stage | Direct Products | ATP Yields | -| ----: | --------------: | ---------: | -|Glycolysis | 2 ATP || -|^^ | 2 NADH | 3--5 ATP | -|Pyruvaye oxidation | 2 NADH | 5 ATP | -|Citric acid cycle | 2 ATP || -|^^ | 6 NADH | 15 ATP | -|^^ | 2 FADH | 3 ATP | -| 30--32 ATP ||| - -[ Net ATP yields per hexose] - -### Multiline -A backslash at end to join cell contents with the following lines. -This feature is contributed by [Lucas-C](https://github.com/Lucas-C). - -|: Easy Multiline :||| -|:------ |:------ |:-------- | -| Apple | Banana | Orange \ -| Apple | Banana | Orange \ -| Apple | Banana | Orange -| Apple | Banana | Orange \ -| Apple | Banana | Orange | -| Apple | Banana | Orange | - - -### Headerless -Table header can be eliminated. - -|--|--|--|--|--|--|--|--| -|♜ | |♝ |♛ |♚ |♝ |♞ |♜ | -| |♟ |♟ |♟ | |♟ |♟ |♟ | -|♟ | |♞ | | | | | | -| |♗ | | |♟ | | | | -| | | | |♙ | | | | -| | | | | |♘ | | | -|♙ |♙ |♙ |♙ | |♙ |♙ |♙ | -|♖ |♘ |♗ |♕ |♔ | | |♖ | - - -```markdown -|: Fruits \|\| Food :||| -|:-------- |:-------- |:------------ | -| Apple |: Apple :| Apple \ -| Banana | Banana | Banana \ -| Orange | Orange | Orange | -|: Rowspan is 5 :||: How's it? :| -|^^ A. Peach ||^^ 1. Fine | -|^^ B. Orange ||^^ 2. Bad $I = \int \rho R^{2} dV$ | -|^^ C. Banana || It's OK! ![example image][my-image] | -``` - -### Text Alignment -Table cell can be set alignment separately. - -| \:Fruits || Food :| -|:-------- |:------ |:-------- | -| Apple | Banana | Orange | -| Apple | Banana | Orange | - - -| | Fruits\:: || -|:-------- |:------ |:-------- | -| Apple | Banana | Orange | -| Apple | Banana | Orange | - - -|: \:Fruits :|| |: Food :|| -|:-------- |:------ |:-------- |:-------- |:------ | -| Apple | Banana | Orange |: Strawberry :| -| Apple & Banana || ^^ | Peach :|| - - -|: \:Fruits :|| |: Food :|| -| Apple | Banana | Orange |: Strawberry :| - - -|: Fruits \|\| Food :||| -|:-------- |:-------- |:------------ | -| Apple |: Apple :| Apple \ -| Banana | Banana | Banana \ -| Orange | Orange | Orange | -|: Rowspan is 5 :||: How's it? :| -|^^ A. Peach ||^^ 1. Fine | -|^^ B. Orange ||^^ 2. Bad $I = \int \rho R^{2} dV$ | -|^^ C. Banana || It's OK! ![example image][my-image] | - -[my-image]: http://www.unexpected-vortices.com/sw/rippledoc/example-image.jpg "An exemplary image" - diff --git a/_posts/2017-12-18-video-example.md b/_posts/2017-12-18-video-example.md deleted file mode 100644 index 353cdb7..0000000 --- a/_posts/2017-12-18-video-example.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -layout: post -title: Video example -subtitle: -categories: example -tags: [video] ---- - -## Canon in D (Pachelbel's Canon) - Cello & Piano [BEST WEDDING VERSION] -Some of you know that we occasionally play for weddings. As you can imagine, we get a LOT of requests for Canon in D, and we discovered that there were no good arrangements available anywhere for piano and cello! Hard to believe given its popularity. So we decided to make our own! We tried to stick as closely to the original as possible (which was written for three violins and basso continuo), and we performed it *not* at a snail's pace so the bride can actually make it down the aisle without putting everyone to sleep. 🙊(Yeah, we said it! Nobody likes a slow processional!) Also, the number one complaint about this piece from cellists is always how booooring it is to play because they literally have to play the same 8 bass notes over and over for the entire piece. Problem solved with this arrangement because the cello never has to play the bass! 🙌(The piano does, but we get lots of other fun stuff too so it's ok!) So for all you musicians out there playing weddings, we hope you enjoy playing this arrangement a little more than the ones you were used to...You can get it from www.musicnotes.com. 😊Be sure to let us know in the comments if you do! - -![](//www.youtube.com/watch?v=Ptk_1Dc2iPY) - -## GUCCI HALLUCINATION / THE LINE ANIMATION / GUCCI -BACKGROUND / - -Gucci share their creative vision through a series of surreal animated paintings by acclaimed artist Ignasi Monreal and The Line Animation studio. The animations make up part of a larger campaign shared via social media, above the line and print. - -APPROACH / - -Our aim was to ground and accentuate the outlandish scenarios with ambient sound design. Neither proclaiming to be positive or negative, the sound conveys a sense of the uncanny and leaves the audience with nothing but their own interpretations. their creative vision through a series of surreal animated paintings by acclaimed artist Ignasi Monreal and The Line Animation studio. The animations make up part of a larger campaign shared via social media, above the line and print. - -![](https://vimeo.com/263856289) - - -## FINNEAS Demos How He Builds Songs For Billie Eilish -Grammy Award-winning musician and producer FINNEAS sits down with Pitchfork and closely examines his creative process while working on some of the biggest hit songs of the past couple years. FINNEAS explores the sounds that brought upon -some of his greatest musical breakthroughs in songs such as bad guy, bury a friend, ocean eyes, when the party's over, I Lost a Friend, Used to This and much more. - -![][demo] - -[demo]: https://dai.ly/x7tgcev - -## 2019 BMW Vision M NEXT Concept (HD) - -In future, drivers will be able to choose whether they wish to be driven or do the driving themselves. With the BMW Vision M NEXT, the BMW Group is revealing its take on how driving pleasure might look in future. It offers a foretaste of the BMW M brand’s electrified future by placing the focus squarely on the actively engaged driver. Intelligent technologies provide comprehensive yet carefully targeted assistance to turn them into the ultimate driver. - -![](https://www.dailymotion.com/video/x7bur2y) - -## This is the poster image -In modern browsers, adding a video to your page is as easy as adding an image. No longer do you need to deal with special plug-ins or require crazy markup, you can do it with a single element. -![video](//www.html5rocks.com/en/tutorials/video/basics/devstories.webm) - diff --git a/_posts/2018-05-26-mathjax-test.md b/_posts/2018-05-26-mathjax-test.md deleted file mode 100644 index 92bf6f1..0000000 --- a/_posts/2018-05-26-mathjax-test.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -layout: post -title: Mathjax Test -subtitle: My first mathjax expression -categories: markdown -tags: [test] ---- - -* A safe integer is an integer that - * can be exactly represented as an IEEE-754 double precision number, and - * whose IEEE-75 representation cannot be the result of rounding any other integer to fit the IEEE-754 representation -* For example, $ 2 ^ {53} - 1 $ is a safe integer, - * it can be exactly represented diff --git a/_posts/2018-12-05-an-exhibit-of-markdown.md b/_posts/2018-12-05-an-exhibit-of-markdown.md deleted file mode 100644 index 1748ca2..0000000 --- a/_posts/2018-12-05-an-exhibit-of-markdown.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -layout: post -title: An exhibit of Markdown -subtitle: Each post also has a subtitle -categories: markdown -tags: [example, markdown] ---- - -This note demonstrates some of what [Markdown][1] is capable of doing. - -## An exhibit of Markdown - - - -*Note: Feel free to play with this page. Unlike regular notes, this doesn't automatically save itself.* - -## Basic formatting - -Paragraphs can be written like so. A paragraph is the basic block of Markdown. A paragraph is what text will turn into when there is no reason it should become anything else. - -Paragraphs must be separated by a blank line. Basic formatting of *italics* and **bold** is supported. This *can be **nested** like* so. - -## Lists - -### Ordered list - -1. Item 1 -2. A second item -3. Number 3 -4. Ⅳ - -*Note: the fourth item uses the Unicode character for [Roman numeral four][2].* - -### Unordered list - -* An item -* Another item -* Yet another item -* And there's more... - -## Paragraph modifiers - -### Code block - - Code blocks are very useful for developers and other people who look at code or other things that are written in plain text. As you can see, it uses a fixed-width font. - -You can also make `inline code` to add code into other things. - -### Quote - -> Here is a quote. What this is should be self explanatory. Quotes are automatically indented when they are used. - -## Headings - -There are six levels of headings. They correspond with the six levels of HTML headings. You've probably noticed them already in the page. Each level down uses one more hash character. - -### Headings *can* also contain **formatting** - -### They can even contain `inline code` - -Of course, demonstrating what headings look like messes up the structure of the page. - -I don't recommend using more than three or four levels of headings here, because, when you're smallest heading isn't too small, and you're largest heading isn't too big, and you want each size up to look noticeably larger and more important, there there are only so many sizes that you can use. - -## URLs - -URLs can be made in a handful of ways: - -* A named link to [MarkItDown][3]. The easiest way to do these is to select what you want to make a link and hit `Ctrl+L`. -* Another named link to [MarkItDown](https://www.markitdown.net/) -* Sometimes you just want a URL like . - -## Horizontal rule - -A horizontal rule is a line that goes across the middle of the page. - ---- - -It's sometimes handy for breaking things up. - -## Images - -Markdown can also contain images. I'll need to add something here sometime. - -## Finally - -There's actually a lot more to Markdown than this. See the official [introduction][4] and [syntax][5] for more information. However, be aware that this is not using the official implementation, and this might work subtly differently in some of the little things. - - - [1]: https://daringfireball.net/projects/markdown/ - [2]: https://www.fileformat.info/info/unicode/char/2163/index.htm - [3]: https://www.markitdown.net/ - [4]: https://daringfireball.net/projects/markdown/basics - [5]: https://daringfireball.net/projects/markdown/syntax diff --git a/_posts/2018-12-07-welcome-to-jekyll.md b/_posts/2018-12-07-welcome-to-jekyll.md deleted file mode 100644 index dfad3d1..0000000 --- a/_posts/2018-12-07-welcome-to-jekyll.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -layout: post -title: Welcome to Jekyll! -subtitle: A awesome static site generator. -author: Jeffrey -categories: jekyll -banner: - video: https://vjs.zencdn.net/v/oceans.mp4 - loop: true - volume: 0.8 - start_at: 8.5 - image: https://bit.ly/3xTmdUP - opacity: 0.618 - background: "#000" - height: "100vh" - min_height: "38vh" - heading_style: "font-size: 4.25em; font-weight: bold; text-decoration: underline" - subheading_style: "color: gold" -tags: jekyll theme yat -sidebar: [] ---- - -You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated. - -To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works. - -## section 1 - -Jekyll also offers powerful support for code snippets: - -{% highlight ruby %} -def print_hi(name) -puts "Hi, #{name}" -end -print_hi('Tom') -#=> prints 'Hi, Tom' to STDOUT. -{% endhighlight %} - -## section 2 - -Check out the [Jekyll docs][jekyll-docs] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll’s GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll Talk][jekyll-talk]. - -[jekyll-docs]: https://jekyllrb.com/docs/home -[jekyll-gh]: https://github.com/jekyll/jekyll -[jekyll-talk]: https://talk.jekyllrb.com/ - -$ a \* b = c ^ b $ - -$ 2^{\frac{n-1}{3}} $ - -$ \int_a^b f(x)\,dx. $ - -```cpp -#include -using namespace std; - -int main() { - cout << "Hello World!"; - return 0; -} -// prints 'Hi, Tom' to STDOUT. -``` - -```python -class Person: - def __init__(self, name, age): - self.name = name - self.age = age - -p1 = Person("John", 36) - -print(p1.name) -print(p1.age) -``` diff --git a/_posts/2020-10-01-releasing-not-pure-poole-v0-1-0.md b/_posts/2020-10-01-releasing-not-pure-poole-v0-1-0.md new file mode 100644 index 0000000..0987775 --- /dev/null +++ b/_posts/2020-10-01-releasing-not-pure-poole-v0-1-0.md @@ -0,0 +1,14 @@ +--- +layout: post +title: Releasing Not Pure Poole v0.1.0 +author: Songzi Vong +tags: +- jekyll theme +- jekyll +date: 2020-10-01 13:56 +0800 +--- +The Jekyll theme **Not Pure Poole** v0.1.0 was released! + +Not Pure Poole is a simple, beautiful, and powerful Jekyll theme for blogs. It is built on [Poole](https://github.com/poole/poole) and [Pure](https://purecss.io/). + +For more information about this theme, you can read the [README](https://github.com/vszhub/not-pure-poole/blob/master/README.md) file. diff --git a/_posts/2020-10-02-testing-mathjax.md b/_posts/2020-10-02-testing-mathjax.md new file mode 100644 index 0000000..a4690ac --- /dev/null +++ b/_posts/2020-10-02-testing-mathjax.md @@ -0,0 +1,17 @@ +--- +layout: post +title: Testing MathJax +tags: mathjax +math: true +date: 2020-10-02 15:32 +0800 +--- +Not Pure Poole supports [MathJax](https://www.mathjax.org/). You can enable it on a page by setting `math: true` in the front matter. + +An inline math: \\\(E=mc^2\\\). + +A display math: + +$$ +i\hbar \frac{\partial \Psi}{\partial t} = -\frac{\hbar^2}{2m} +\frac{\partial^2 \Psi}{\partial x^2} + V \Psi +$$ diff --git a/_posts/2023-10-16-.md b/_posts/2023-10-16-.md new file mode 100644 index 0000000..de6d213 --- /dev/null +++ b/_posts/2023-10-16-.md @@ -0,0 +1,103 @@ +--- +layout: blog +banana: true +category: default +title: +date: 2023-10-16 11:09:25 +background-image: http://ot1cc1u9t.bkt.clouddn.com/17-8-1/24280498.jpg +tags: +- default +- 八股 +--- + +* content +{:toc} + + + + + + + + + + +### 考试内容 + +- 上午考试的内容是计算机与网络知识,考试时间为150分钟,笔试,选择题,而且全部是**单项选择题**,其中含5分的英文题。上午考试总共75道题,共计75分,按60%计,**45分算过关**。 +- 下午考试的内容是网络系统设计与管理,考试时间为150分钟,笔试,问答题。一般为**5道大题**,每道大题15分,有若千个小问,总计75分,按60%计,**45分算过关**。 + + + + + + + +### 上午考试方法 + +- 记得带2B以上的铅笔和一块比较好的橡皮。上午考试答题采用填涂答题卡的形式,阅卷是由机器阅卷的,所以需要使用2B以上的铅笔;带好一点的橡皮是为了修改选项时擦得比较千净。 +- 注意把握考试时间,虽然上午考试时间有150分钟,但是题量还是比较大的,一共75道题,做一道题还不到2分钟,因为还要留出10分钟左右来填涂答题卡和检查核对。笔者的考试经验是做20道左右的试题就在答题卡上填涂完这20道题,这样不会悦张,也不会明显地影响进度。 +- (3)做题先易后难。上午考试一般前面的试题会容易一点,大多是知识点性质的题目,但也会有一些计算题,有些题还会有一定的难度,个别试题还会出现新概念题(即在教材中找不到答案,平时工作也可能很少接触),这些题常出现在60~70题之间。考试时建议先将容易做的和自己会的做完,其他的先跳过去,在后续的时间中再集中精力做难题 + + + +### 下午考试注意事项 + +- 下午考试答题采用的是专用答题纸,既有选择题,也有填空题。下午考试答题要注意以下事项: +- (1)先易后难。先大致浏览一下5道考题,考试往往既会有知识点问答题,也会有计算题,同样先将自己最为熟悉和最有把握的题先完成,再重点攻关难题。 + (2)问答题最好以要点形式回答。阅卷时多以要点给分,不一定要与参考答案一模一样,但常以关键词语或语句意思表达相同或接近为判断是否给分或给多少分的标准。因此答题时要点要多写一些,以涵盖到参考答案中的要点。比如,如果题目中某问题给的是5分,则极可能是5个要点,一个要点1分,回答时最好能写出7个左右的要点。 + (3)配置题分数一定要拿住。网络工程师的配置题分值大、形式固定、内容变化也不大,热悉基本和常见的配置命令和配置流程就能拿高分 + + + + + + + +### OSI模型 + +开放系统互连参考模型分七层,从低到高分别是 + +- 物理层、数据链路层、网络层、传输层、 +- 会话层、表示层 以及 应用层。 + + + + + + + +### 数据链路层 + +- `MAC`帧 +- 差错检测 恢复 +- 链路标识、流量/拥塞控制 + + + + + +### 网络层 + +- IP数据包 +- 路由选择 +- + + + + + +### 传输层 + +- 端到端的数据传输 +- 会分段 + + + + + + + +### 表示层 + +- 数据加密和解密、数据压缩和解压。 diff --git a/_posts/API_software/0_md_generator.sh b/_posts/API_software/0_md_generator.sh new file mode 100644 index 0000000..bf6f8a0 --- /dev/null +++ b/_posts/API_software/0_md_generator.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +filename=$(date +"%Y-%m-%d-.md") + +cat > "$filename" << EOF +--- +layout: blog +banana: true +category: API_software +title: +date: $(date +"%Y-%m-%d %H:%M:%S") +background: blue +tags: +- API_software +--- + +* content +{:toc} +EOF + +echo "文件已生成:$filename" diff --git a/_posts/API_software/2023-07-23-love_markdown.md b/_posts/API_software/2023-07-23-love_markdown.md new file mode 100644 index 0000000..b5b05f2 --- /dev/null +++ b/_posts/API_software/2023-07-23-love_markdown.md @@ -0,0 +1,135 @@ +--- +layout: blog +banana: true +title: 永远热爱markdown +category: API_software +background: blue +# background-image: https://i0.hdslb.com/bfs/album/2f4f352c599fdd8c59177cd0aabd91db8c7dad15.png +date: 2023-07-23 14:21:18 +toc: true +tags: +- software +- markdown +--- + + + +* content +{:toc} +![image-20220906145334336](/assets/20230801md.png) + + + +[xlzy520/picgo-plugin-bilibili: 为 PicGo 开发的一款插件,新增了B站图床 图床。 使用用户动态的图片上传API。填写SESSDATA即可,获取方式在下面。 (github.com)](https://github.com/xlzy520/picgo-plugin-bilibili) + +- 找`cookie`中的 `SESSDATA` 还有 `bli_jct` 复制即可 + +![test](https://i0.hdslb.com/bfs/article/be203733ece44d65d871fa2e780aed31327645612.png) + +### 一 简介 + +#### 1 什么是markdown + +​ Markdown是一种轻量级标记**语言**,创始人为约翰-格鲁伯(John Gruber)。它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档。这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。 +​ 由于Markdown的轻量化、易读易写特性,并且对于图片,图表、数学式都有支持,许多网站都广泛使用Markdown来撰写帮助文档或是用于论坛上发表消息。如GitHub,Reddit,Diaspora,Stack Exchange,OpenStreetMap,SourceForge、简书等,甚至还能被使用来撰写电子书。 + +-------来自百度百科 + +#### 2 为什么我们需要markdown + +- 在我们需要进行记笔记时, 我们对于格式( 例如, 字号, 段间距)并没有太大的要求, 反而对结构有要求, 例如标题是什么, 这个标题下有几个小标题, 对于我们的要求来讲, word 显得过于臃肿, +- markdown 是 latex 和 word 的一个 trade-off +- 因为他的轻量化, 导致他的格式固定, 使用不同的平台不会出现 word 那样不兼容的问题 +- 因为是近几年才出现的( 04年 ), 能够更贴近这个时代, 例如md文件本身不保存图片, 这就可以使用网络上的图床, 让专业的人干专业的事 + +#### 3 markdown 工具( 软件 ) + +Typora( 强推 )[Typora 官方中文站](https://typoraio.cn/)、MacDown + +#### 4 markdown 插件 + +``` +markdown here [Markdown Here](https://markdown-here.com/) +markdownload [markdownload](https://microsoftedge.microsoft.com/addons/detail/hajanaajapkhaabfcofdjgjnlgkdkknm) +``` + + + +### 二 markdown 语法 + +#### 1 标题 '#' 号----生成文章的结构 + +- 后面需要一个空格 +- 一个是一级标题, 两个是二级标题, 依次类推, 越少代表优先级越高, +- 被用来生成文章的结构, 我经常用###代表目录, ####代表子目录 + +``` +### 第一章 +#### 第一章第一节 +#### 第一章第二节 +``` + +#### 2 无序列表 + +``` +使用- (注意后面有空格) +``` + +#### 3 网址 + +``` +[显示内容](网址) +例如上文的 +[Typora 官方中文站](https://typoraio.cn/) +``` + +#### 4 图片 + +``` +![图片名称]() +![image-20220906145334336](https://i0.hdslb.com/bfs/album/2f4f352c599fdd8c59177cd0aabd91db8c7dad15.png) +``` + +#### 5 代码 + +> 使用```(数字1前面的那个) + +#### 6 引用 + +``` +> (小于号) +``` + +### 三 markdown插件使用说明 + +#### 1 markdown here------将markdown上传为 html 格式 + +``` +markdown here [Markdown Here](https://markdown-here.com/) +``` + +**使用方法** : 点击插件图标或者是, alt + ctrl + M (动画在下面) + +![GIF 2022-9-11 20-27-10](https://i0.hdslb.com/bfs/album/fdee3963b6834bfb16fc70114f6202ea19f5827a.gif) + +设置格式 : 右键浏览器插件图标 -> 扩展选项-> 基本渲染CSS + +![image-20220911203043930](https://i0.hdslb.com/bfs/album/963686deae86fd0d6fb499b10337941859f1b3b9.png) + +``` + +``` + +还可以使用 latex公式使用$$包裹起来 + +![image-20220911203928798](https://i0.hdslb.com/bfs/album/eb781ce80e9e1c58933aec422858372f048bbfc2.png) + +#### 2 将网页下载为markdown + +``` +markdownload [markdownload](https://microsoftedge.microsoft.com/addons/detail/hajanaajapkhaabfcofdjgjnlgkdkknm) +``` + +**使用方法**: 点击图标 -> Download + +![GIF 2022-9-11 20-37-20](https://i0.hdslb.com/bfs/album/0d90a870ae85cc1425ad47f66814268cac12b16d.gif) diff --git a/_posts/API_software/2023-07-25-tianruo_OCR_use_simpletex_API.md b/_posts/API_software/2023-07-25-tianruo_OCR_use_simpletex_API.md new file mode 100644 index 0000000..8fef991 --- /dev/null +++ b/_posts/API_software/2023-07-25-tianruo_OCR_use_simpletex_API.md @@ -0,0 +1,264 @@ +--- +layout: blog +banana: true +category: API_software +title: 天若ocr调用simpletex +date: 2023-07-25 21:19:24 +background: blue +tags: +- software +- API +--- + +* content +{:toc} + + +天若 OCR调用 simpletex API + +记录一次使用别人的接口 + + + +#### 1 什么是天若 OCR + +- **图片转文字**准确率超高的办公利器 +- 可以截图 +- 可以翻译 +- 可以识别公式 + + + + + +#### 2 作者暴露出的部分接口 + +```C# +//image:要识别的图片 +public static string OCR_Custom(Image image) +{ + //string url = ""; + //string poststr =""; + //string result =CustomHelp.HttpPost(url,poststr); + //获取请求获取解析结果后按照下面格式进行解析 + TxtFormat.Root jsonRoot=new TxtFormat.Root(); + jsonRoot.result=new List(); + jsonRoot.isHasLocation=true;//判断是否含有坐标返回 + for(int i=0; i<5; i++)//遍历返回的json字符串 + { + TxtFormat.TextBlock textBlock = new TxtFormat.TextBlock(); + textBlock.Text = "公式测试文本"+i.ToString();//json内的文本 + textBlock.TopLeft = new Point(0,0);//左上角坐标 + textBlock.TopRight = new Point(0,0);//右上角坐标 + textBlock.BottomRight =new Point(0,0);//右下角坐标 + textBlock.BottomLeft =new Point(0,0);//左下角坐标 + jsonRoot.result.Add(textBlock); + } + string json = JsonConvert.SerializeObject(jsonRoot); + return json; +} +``` + + + + + + + +- 一开始认为 `CustomHelp.HttpPost()`是一个具体的类, 但是也没有一个demo来说明各个参数的意义, 因此认为是**伪码**, 所以认为下面的也全是伪代码, 让我付出了惨重的代价 +- 实际上就应该是一个具体的类, 因为后文的TxtFormat等也是具体的类, 但是没有使用说明, 就只能使用 **HttpWebResponse**库交换 http报文 + + + +#### 3 天若开源版本的代码 + +- 猜测**typeset_txt** 就是显示的内容, 也是 接口中返回的**原始字符串**对应起来 + +```c# +var img = image_screen; + var inArray = OcrHelper.ImgToBytes(img); + var s = "{\t\"formats\": [\"latex_styled\", \"text\"],\t\"metadata\": {\t\t\"count\": 0,\t\t\"platform\": \"windows 10\",\t\t\"skip_recrop\": true,\t\t\"user_id\": \"\",\t\t\"version\": \"snip.windows@01.02.0027\"\t},\t\"ocr\": [\"text\", \"math\"],\t\"src\": \"data:image/jpeg;base64," + Convert.ToBase64String(inArray) + "\"}"; + var bytes = Encoding.UTF8.GetBytes(s); + var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api.mathpix.com/v3/latex"); + httpWebRequest.Method = "POST"; + httpWebRequest.ContentType = "application/json"; + httpWebRequest.Timeout = 8000; + httpWebRequest.ReadWriteTimeout = 5000; + httpWebRequest.Headers.Add("app_id: mathpix_chrome"); + httpWebRequest.Headers.Add("app_key: 85948264c5d443573286752fbe8df361"); + using (var requestStream = httpWebRequest.GetRequestStream()) + { + requestStream.Write(bytes, 0, bytes.Length); + } + var responseStream = ((HttpWebResponse)httpWebRequest.GetResponse()).GetResponseStream(); + var value = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")).ReadToEnd(); + responseStream.Close(); + var text = "$" + ((JObject)JsonConvert.DeserializeObject(value))["latex_styled"] + "$"; + split_txt = text; + typeset_txt = text; +``` + + + + + + + +#### 4 simpletex API 的python调用 + +- 使用 **post** 方法 + +```python +import requests +api_url="https://server.simpletex.cn/api/latex_ocr/v2" # 接口地址 +data = { } # 请求数据 +header={ "token": "" } # 鉴权信息,此处使用UAT方式 +file=[("file",("test.png",open("test.png", 'rb')))] # 请求文件,字段名一般为file +res = requests.post(api_url, files=file, data=data, headers=header) # 使用requests库上传文件 +print(res.status_code) +print(res.text) +``` + + + + + +#### 5 如何输出错误 + +- 发现 **MessageBox.Show**()能输出信息, 就用它来**调试** + +```c# +MessageBox.Show(responseContent.ToString() ); +``` + + + + + + + +#### 6 协议 post 的数据格式 + +- 边界符: `boundary=AaB03x ` + - Post 中定义的**换行符**是 \r\n, 每一个边界符前面都需要加 2 个连字符 “--”,然后跟上换行符。 +- 使用**Content-Type** 指定发送或接收实体正文的**媒体类型** + - `Content-Type` 由两部分组成,用斜杠分隔:媒体类型(media type)和子类型(subtype)。**常见的媒体**类型包括: + - `text/plain`:纯文本类型。 + - `text/html`:HTML 文档类型。 + - `application/json`:JSON 数据类型。 + - `application/xml`:XML 数据类型。 + - application/octet-stream : 二进制数据. + - `image/jpeg`:JPEG 图片类型。 + - `audio/mpeg`:MPEG 音频类型。 + - `video/mp4`:MP4 视频类型。 +- `Content-Disposition`:该头部字段用于指示如何处理包含在消息体中的数据。它可以指定将数据显示在浏览器窗口中、作为附件下载、保存到磁盘等行为。常见的值包括: + - `inline`:默认值,将数据在浏览器中显示。 + - `attachment`:将数据作为附件下载。 + - `filename=<文件名>`:指定下载时的文件名。 + - **Content-Disposition**: form-data; name="file"; filename="file1.dat", 通常是用在客户端向服务端**传送大文件数据**,如:图片或者文件 +- 使用` boundary`来分隔文件 +- 数据结束后的分界符,注意因为这个后面没有数据了所以需要**在后面追加一个 “--”** 表示**结束**。 + +```html +// 来自 https://blog.csdn.net/flymorn/article/details/6769722 +Content-Type: multipart/form-data; boundary=AaB03x + + --AaB03x + Content-Disposition: form-data; name="submit-name" + + Larry + --AaB03x + Content-Disposition: form-data; name="file"; filename="file1.dat" + Content-Type: application/octet-stream + + ... contents of file1.dat ... + --AaB03x-- + +``` + + + +#### 7 完整代码如下 + +```c# + public static string OCR_Custom(Image image) + {// Image 是一个类,它是用于处理图像和图形的基本类之一。 + byte[] result; + using (var memoryStream = new MemoryStream()) + { + image.Save(memoryStream, ImageFormat.Png); + result = memoryStream.ToArray(); + } + // request + string url = "https://server.simpletex.cn/api/latex_ocr/v2"; + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.ContentType = "multipart/form-data;boundary=---------------------------boundary"; + request.Method = "POST"; + request.Headers["token"] = ""; + string boundary = "---------------------------boundary"; + byte[] boundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n"); + string formDataTemplate = "--{0}\r\nContent-Type:application/octet-stream\r\nContent-Disposition: form-data; name=\"file\"; filename=\"image.png\"\r\nContent-Type: image/png\r\n\r\n"; + string formData = string.Format(formDataTemplate, boundary); + byte[] formDataBytes = Encoding.UTF8.GetBytes(formData); + // 设置请求体长度 + request.ContentLength = formDataBytes.Length + result.Length + boundaryBytes.Length; + // 将请求体数据写入请求流中 + using (Stream requestStream = request.GetRequestStream()) + { + requestStream.Write(formDataBytes, 0, formDataBytes.Length); + requestStream.Write(result, 0, result.Length); + requestStream.Write(boundaryBytes, 0, boundaryBytes.Length); + } + // 发送请求并获取响应 + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + // 处理响应 + string responseContent; + using (StreamReader reader = new StreamReader(response.GetResponseStream())) + { + responseContent = reader.ReadToEnd(); + // Console.WriteLine(responseContent); + } + response.Close(); + var resultData = ((JObject)JsonConvert.DeserializeObject(responseContent)); + var data = resultData["res"]; + var region = data["latex"]; + var text = "$" +region.ToString() + "$"; + TxtFormat.Root jsonRoot=new TxtFormat.Root (); + jsonRoot.result=new List(); + jsonRoot.isHasLocation=true;// 判断是否含有坐标返回 + TxtFormat.TextBlock textBlock = new TxtFormat.TextBlock (); + textBlock.Text = text;//json 内的文本 + textBlock.TopLeft = new Point (0,0);// 左上角坐标 + textBlock.TopRight = new Point (0,0);// 右上角坐标 + textBlock.BottomRight =new Point (0,0);// 右下角坐标 + textBlock.BottomLeft =new Point (0,0);// 左下角坐标 + jsonRoot.result.Add (textBlock); + // `SerializeObject(object value)`:将对象序列化为 **JSON 字符串**。 + return JsonConvert.SerializeObject (jsonRoot); + } + + +``` + + + + + + + + + +#### 记录一下用的接口 + +| 服务 | 免费额度 | 超出免费额度 | 并发请求数 | +| ---------------------------------- | -------------------------------------- | ------------------------- | ---------- | +| **百度**通用文字识别 | 每月1000次(实名认证后) | 0.0050元/次(开通付费后) | | +| 通用文字识别(高精度版) | 每月1000次(实名认证后) | 0.028元/次(开通付费后) | | +| | | | | +| 彩云小译API(在用) | 每月100万字符 | 20元/100万字符 | 无相关说明 | +| **百度**通用翻译API(标准版) | 完全免费 | | 1次/秒 | +| **百度**通用翻译API(高级版) | 每月200万字符 | 49元/100万字符 | 10次/秒 | +| | | | | +| **百度**教育场景文字识别 | 每月500次(有效期365天, 后续资源付费) | 1500元/万次(开通付费后) | | +| **腾讯**数学试题识别()已经**废弃** | 每月1000次 | 120元/1000次 | | + diff --git a/_posts/API_software/2023-07-29-github.md b/_posts/API_software/2023-07-29-github.md new file mode 100644 index 0000000..e61eddd --- /dev/null +++ b/_posts/API_software/2023-07-29-github.md @@ -0,0 +1,868 @@ +--- +layout: blog +banana: true +category: API_software +title: "Github使用指南" +date: 2023-07-29 15:17:12 +background: blue +tags: +- github +- git +--- + +* content +{:toc} + + + + + + +### 1 相关概念与快速开始 + +[Git的安装与使用教程(超详细!!!)_9.冄2.7.號的博客-CSDN博客_git安装教程](https://blog.csdn.net/weixin_44950987/article/details/102619708?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=23755edd-9ec1-4927-b5a1-37dd70887f46&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control) + + + +版本控制是什么? + +- 一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统 + +为什么需要版本控制? + +- 更好的关注变更,了解到每个版本的改动是什么,方便对改动的代码进行检查,预防事故发生也能够随时切换到不同的版本,回滚误删误改的问题代码; + + + +什么是 git + +- Git 是一款免费、开源的分布式版本控制系统,他是著名的 Linux 发明者 Linus Torvalds 开发的 +- GitHub 主要提供基于 git 的**版本托管**服务。也就是说现在 GitHub 上托管的所有项目代码都是基于 Git 来进行版本控制的,所以 Git 只是 GitHub 上用来管理项目的一个工具而已,GitHub 的功能可远不止于此! + +#### 1.1 GitHub 基本概念 + + +Repository + +- 仓库的意思,即你的项目,你想在 GitHub 上开源一个项目,那就必须要新建一个 Repository,如果你开源的项目多了,你就拥有了多个 Repositories 。 + + + +Issue + +- 问题的意思,举个例子,就是你开源了一个项目,别人发现你的项目中有bug,或者哪些地方 + 做的不够好,他就可以给你提个 Issue ,即问题,提的问题多了,也就是 Issues ,然后你看 + 到了这些问题就可以去逐个修复,修复ok了就可以一个个的 Close 掉。 + +Star + +- 这个好理解,就是给项目点赞,但是在 GitHub 上的点赞远比微博、知乎点赞难的多,如果你有一个项目获得100个star都算很不容易了! + +Fork + +- 这个不好翻译,如果实在要翻译我把他翻译成分叉,什么意思呢?你开源了一个项目,别人 + 想在你这个项目的基础上做些改进,然后应用到自己的项目中,这个时候他就可以 Fork 你的 + 项目,这个时候他的 GitHub 主页上就多了一个项目,只不过这个项目是基于你的项目基础 + (本质上是在原有项目的基础上新建了一个分支,分支的概念后面会在讲解Git的时候说 + 到),他就可以随心所欲的去**改进**,但是丝毫不会影响原有项目的代码与结构。 + +Pull Request + +- 发起请求,这个其实是基于 Fork 的,还是上面那个例子,如果别人在你基础上做了改进,后 + 来觉得改进的很不错,应该要把这些改进让更多的人收益,于是就想把自己的改进合并到原 + 有项目里,这个时候他就可以发起一个 Pull Request(简称PR) ,原有项目创建人就可以收 + 到这个请求,这个时候他会仔细review你的代码,并且测试觉得OK了,就会接受你的PR,这 + 个时候你做的改进原有项目就会拥有了。 + +Watch + +- 这个也好理解就是观察,如果你 Watch 了某个项目,那么以后只要这个项目有任何更新,你 + 都会第一时间收到关于这个项目的通知提醒。 + +Gist + +- 有些时候你没有项目可以开源,只是单纯的想分享一些**代码片段**,那这个时候 Gist 就派上用 + 场了! + + + + + + + + + + + + + +#### 1.2 git 目录结构 + +- Git 的本质是一个**文件系统**,工作目录中的所有文件的**历史版本**以及**提交记录**(commit)都是以文件对象的方式保存在 `.git` 目录中的。 +- git下的版本库只位于工作区根目录下的 git目录 , **仅此一处** +- +- 目前的Key的类型四种,分别是dsa、rsa、ecdsa、ed25519, 默认使用的是rsa, 由于一些安全问题,现在已经**不推荐使用dsa和rsa了**,优先推荐使用ed25519 + + + + ```bash +├─hooks +├─info +├─logs +│ └─refs +│ ├─heads +│ └─remotes +│ └─origin +├─objects # 保存 git 对象的目录, 包括三类对象, commit,tree, blob +│ ├─info +│ └─pack +└─refs # 保存branch和tag对应的commit + ├─heads # branch 对应的 commit + ├─remotes + │ └─origin + └─tags # tag 对应的 commit + ``` + +- `objects`:这里是真正保存 Git 对象的目录,包括三类对象 commit,tree 和 blob + - Blob存储文件的内容 + - Tree存储文件的目录信息 + - Commit存储提交信息,一个Commit可以对应唯一版本的代码 +- +- refs 内容就是对应 Commit ID因此把ref当做**指针**, 指向对应的Commit来表示当前Ref对应的版本. + - Branch `git checkout -b`可以创建一个新分支, 分支一般用于开发阶段,是可以不断添加 Commit 进行**迭代**的 + - Tag标签一般表示的是一个稳定版本, 指向的Commit一般**不会变更** +- `refs/head` 下保存 分支信息 + + + +#### 1.3 密钥生成/ 设置用户名/ 缩写 + +```bash +# 生成本地密钥 +# ssh-keygen -t ed25519 -C "your_email@example.com" 密钥默认存在 ~/.ssh/id_ed25519.pub +ssh ssh-keygen -t rsa +// linux 下ssh-keygen -t rsa + +//根据日志信息里面的 SSH KEY 存储路径找到 .ssh/id_rsa.pub 文件 +//打开 git 网站,右上角用户头像,点击 settings,左侧菜单 SSH KEYS,将文件内容复制到 key 里 添加就可以了 + +//设置名称和邮箱 +git config --global user.name "Your Name" +git config --global user.email "email@example.com" + +# 设置简写 +git config --global alias.psm 'push origin main' +git config --global alias.plm 'pull origin main' + +git config --global alias.st 'status' +git config --global alias.ci 'commit' +git config --global alias.br 'branch' +``` + + + +#### 1.3.pull &push/ 快速开始 + +```bash +//推过去所需要的步骤 +# 1 添加 +git add . + +# 2 提交改变 +git commit -m "描述" + +# 3 将本地的 main 分支的提交推送到名为 origin 的远程仓库的 main 分支。 +git push origin main + +# 拉过来 +git pull origin main + +git remote add origin 仓库名 +``` + + + + + + + +#### 1,5 git 的三种状态 + + Git 有三种状态,你的文件可能处于其中之一: 已提交(committed)、已修改(modified) 和 已暂存(staged)。 + +- 已修改表示**修改**了文件,但还没保存到数据库中。 +- 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。 +- 已提交表示数据已经安全地保存在本地数据库中。 + + + +#### 1.6 objects + +如何将三个信息串联在一起 + +- 通过`commit`找到 `tree`的信息, 每个 commit 都存储对应的 `tree id` +- 通过 tree 存储的信息, 获取对应的目录树结构 +- 从 `tree`中 获取`blob`的id, 通过`blob id`获取对应的文件内容 + + + + + + + + + + + +### 2 远端仓库/ remote + +#### 2.1 http 和 git 协议有什么区别 + +- 第一组使用 HTTPS 协议,第二组使用 SSH 协议。具体选择哪种协议取决于你的需求和配置。 +- 使用 HTTPS 协议需要提供**用户名和密码**,而使用 SSH 协议则需要设置密钥对。 + +```bash +# 用于查看当前项目中配置的所有远程仓库的详细信息。 +git remote -v +origin https://github.com/*****/tinywebserver (fetch) +origin https://github.com/*****/tinywebserver (push) + +origin git@github.com:*****/simple-douyin.git (fetch) +origin git@github.com:*****/simple-douyin.git (push) +``` + +其中 + +- `fetch`:`git fetch` 命令用于从远程仓库获取最新的代码和提交历史,但不会自动合并或更新你的本地分支。它将远程仓库的内容下载到你的本地仓库,使你能够查看和**比较**远程分支与本地分支之间的差异。`fetch` 操作**不会修改**你的本地分支,只会更新你的本地仓库。 +- `push`:`git push` 命令用于将你的本地分支的提交推送到远程仓库。它将你的本地分支的提交上传到远程仓库,并将远程仓库的相应分支更新为你的提交。`push` 操作会修改远程仓库的内容。 + + + +#### 2.2 链接远程仓库 + +```bash +# 链接远程仓库,使通过网络与远程仓库进行交互。 +git remote add + +# 设置fetch 和 push 为不同的仓库 +git remote set-url --add --push origin git@github. com: my_repo/git.git +``` + + + +#### 1.4 我当前在 dev分支, 运行 `git push main`会发生什么 + +如果你当前在 `dev` 分支,并且运行 `git push main` 命令,Git 会尝试将当前分支的提交推送到名为 `main` 的远程分支。 + +然而,由于你当前在 `dev` 分支,而不是 `main` 分支,这个命令可能会失败。因为默认情况下,`git push` 命令会将当前分支的提交推送到与当前分支同名的远程分支。 + +如果你想要将 `dev` 分支的提交推送到远程的 `main` 分支,你可以使用以下命令: + +```bash +git push origin dev:main +``` + +这个命令将会将本地的 `dev` 分支的提交推送到名为 `origin` 的远程仓库的 `main` 分支。 + + + +#### `git fetch origin dev:main`是什么意思 + +`git fetch origin dev:main` 命令的含义是从名为 `origin` 的远程仓库获取 `dev` 分支的最新提交,并将其存储为**本地**的 `main` 分支。 + +这个命令的具体含义如下: + +- `git fetch`:从远程仓库获取最新的提交和分支信息。 +- `origin`:远程仓库的名称,通常是你克隆或者关联的远程仓库的默认名称。 +- `dev`:远程仓库的分支名称,你希望获取其最新提交。 +- `main`:本地分支的名称,用于存储从远程仓库获取的 `dev` 分支的提交。 + +通过运行这个命令,Git 会从 `origin` 远程仓库获取 `dev` 分支的最新提交,并将其存储为本地的 `main` 分支。这样,你就可以在本地的 `main` 分支上查看和操作从远程仓库的 `dev` 分支获取的提交。 + +需要注意的是,这个命令会将远程 `dev` 分支的提交直接应用到本地的 `main` 分支,而不会创建新的合并提交。这种操作可能会覆盖本地 `main` 分支上的提交,所以请确保在运行这个命令之前,你的本地 `main` 分支没有重要的未提交的更改。 + + + + + +#### 查看文件内容 + +`git cat-file` 是一个用于查看 Git 对象内容的命令。Git 中的对象是存储在仓库中的基本数据单元,包括提交(commit)、树(tree)、标签(tag)和文件内容(blob)等。 + +使用 `git cat-file` 命令,你可以通过指定对象的哈希值或引用来查看对象的内容。它的基本语法如下: + +```plaintext + cat-file -t <对象引用> +``` + +这个命令将会返回指定对象的类型。例如,`git cat-file -t abc123` 将会返回对象 `abc123` 的类型,比如 `commit`、`tree`、`tag` 或 `blob`。 + +```plaintext + cat-file -p <对象引用> +``` + +这个命令将会返回指定对象的内容。例如,`git cat-file -p abc123` 将会返回对象 `abc123` 的内容,比如提交信息、文件内容等。 + +通过使用 `git cat-file` 命令,你可以查看 Git 仓库中的对象的详细信息,这对于调试和了解仓库的内部结构非常有用。 + +希望这个解释对你有帮助。如果你还有其他问题,请随时告诉我! + + + + + + + +### 3 分支操作 + +#### 3.1 本地操作分支 + +```bash +# 查看本地分支列表 +git branch + +# 查看远程分支列表 +git branch -r + +# 新建一个叫 develop 的分支 +git branch develop +# 创建一个名为 "test" 的新分支,并从 "master" 分支进行分叉。 +git branch test master + +# 切换 到 dev 分支 +git checkout dev + +# 新建并且自动切换到 develop 分支 +git checkout -b dev + +# 删除本地分支 +git branch -d develop + + +# 生成分支 +git tag v1.0 + +# 用来切换tag +git checkout v1.0 +git checkout ffd9f2dd68f1eb21d36cee50dbdd504e95d9c8f7 # 后面的一长串是commit_id,是每次com +mit的SHA1值,可以根据 git log 看到。 + +# tag<=> 稳定版本 +git tag v0.0.1 + + + +``` + + + + + +#### 3.2 想拉取远程仓库的 dev 分支怎么做 + +要拉取远程仓库的 dev 分支,可以按照以下步骤进行操作: + +```bash +git fetch origin dev +``` + + + +1. 使用 git fetch origin dev 命令从远程仓库拉取 dev 分支的最新代码。这将会将远程仓库的 dev 分支代码下载到你本地仓库,不会自动合并到你当前的分支。 +2. 使用 git checkout dev 命令切换到 dev 分支。如果本地还没有 dev 分支,可以使用 git checkout -b dev origin/dev 命令创建并切换到 dev 分支。 + +现在你已经成功拉取了远程仓库的 dev 分支,可以开始在本地与该分支进行开发和修改。记得在操作前先保存好本地的修改,以免冲突。 + + + + + +#### 3.3 远程分支 + +- 远程分支**没有新建**指令, 直接 **push** 就好 + +```bash +# 删除远程分支 +git push origin --delete publish +# 通过将 设置为空,就表示没有要推送的本地分支,而只是请求删除远程分支 +git push origin :develop + +# 如果你远程的分支想取名叫 develop2 ,那执行以下代码: +git push origin develop:develop2 + +# 把 develop 分支推送到远程仓库 +git push origin develop +``` + + + +当我们使用git clone 时, 克隆下了远端的仓库的哪个分支 + +当你使用 `git clone` 命令克隆远程仓库时,默认情况下会克隆远程仓库的**主分支**(通常是 `master` 分支或者 `main` 分支)。 如果你想要克隆远程仓库的特定分支,可以使用 `--branch` 参数指定分支名称。例如,要克隆远程仓库的 `develop` 分支,可以运行以下命令: + +```bash + git clone --branch develop +``` + + + + + +拉取远端其他分支 + +```bash +# 在本地创建一个名为 dev 的分支, 并拉取远端分支 +git fetch origin dev:dev +``` + + + + + + + + + +#### 3.4 合并分支 + +- Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 **快照** 。在进行提交操作时,Git 会保存一个提交对象(commit object)。 +- Git 的分支,其实本质上仅仅是指向**提交对象**的可变**指针**。 +- Git 又是怎么知道当前在哪一个分支上呢? 也很简单,它有一个名为 HEAD 的特殊指针。指向当前所在的本地分支(译注:将 HEAD 想象为当前分支的别名)。 +- 由于 Git 的分支实质上仅是包含所指对象校验和(长度为 40 的 SHA-1 值字符串)的文件,所以它的创建和销毁都异常高效。 + + + + + +```bash +# 我们在一个 featureA 分支开发完了一个功能,这个时候需要合并到主分支 master 上去 +git checkout master +git merge featureA + +# 也可以这么写 +git checkout master +git rebase featureA +``` + +区别 + +- rebase 跟 merge 的区别你们可以理解成有两个书架,你需要把两个书架的书整理到一起去, +- 第一种做法是 merge ,比较粗鲁暴力,就直接腾出一块地方把另一个书架的书全部放进去,虽然暴力,但是这种做法你可以知道哪些书是来自另一个书架的; +- 第二种做法就是rebase ,他会把两个书架的书先进行比较,按照购书的时间来给他重新排序,然后重新放置好,这样做的好处就是合并之后的书架看起来很有逻辑,但是你很难清晰的知道哪些书来自哪个书架的。 + + + + + +#### 3.5 遇到冲突时的分支合并 + +- 有时候合并操作不会如此顺利。 如果你在两个不同的分支中,对**同一个文件**的同一个部分进行了不同的修改,Git 就没法干净的合并它们。 +- 此时 Git 做了合并,但是**没有自动地创建一个新的合并提交**。 Git 会**暂停**下来,等待你去**解决**合并产生的**冲突**。 + + + +```bash +# 现在在 master分支, 想要合并 dev 的内容 +$ git merge dev +Auto-merging index.html +CONFLICT (content): Merge conflict in index.html +Automatic merge failed; fix conflicts and then commit the result. + +$ git status +On branch master +You have unmerged paths. + (fix conflicts and run "git commit") +Unmerged paths: + (use "git add ..." to mark resolution) + both modified: index.html +no changes added to commit (use "git add" and/or "git commit -a") +``` + + + +任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来。 Git 会在有冲突的文件中加入标准的冲突 +解决标记,这样你可以打开这些包含冲突的文件然后手动解决冲突。 出现冲突的文件会包含一些特殊区段,看 +起来像下面这个样子: + +```bash +# HEAD 所指向的版本 +<<<<<<< HEAD:index.html + +======= +# 合并所指向的版本 + +>>>>>>> iss53:index.html +``` + +为了解决冲突,你必须选择使用由 ======= 分割的两部分中的一个,或者你也可以自行合并这些内 +容。同时 `<<<<<<<` ,` =======` , 和 `>>>>>>>` 这些行被**完全删除**了。 + + + + + +#### 3.6 多人合作冲突 + +远程跟踪分支是远程分支状态的引用。它们是你无法移动的本地引用。一旦你进行了网络通信, Git 就会为你移 +动它们以精确反映远程仓库的状态。它们以\/\ 的形式命名。 + +假设你的网络里有一个在 `git.ourcompany.com 的 Git` 服务器。 如果你从这里克隆,Git 的 clone 命令会为你自动将其命名为 origin,拉取它的所有数据, 创建一个指向它的 `master `分支的指针,并且在本地将其命名为 `origin/master`。Git 也会给你一个与 origin 的master 分支在指向同一个地方的本地 master 分支,这样你就有工作的基础。 + + + +隔离性 + +- 如果你在本地的 master 分支做了一些工作,在同一段时间内有其他人推送**提交**到 `git.ourcompany.com` 并且**更新**了它的 master 分支,这就是说你们的提交历史已走向不同的方向。 即便这样,只要你保持不与origin 服务器连接(并拉取数据),你的 origin/master 指针就不会移动。 +- 如果要与给定的远程仓库**同步数据**,运行 `git fetch `命令 + + + + + + + + + + + + + + + +### 4 常见开发场景 + +#### 1、本地仓库有文件,远程服务器上面是新建的仓库 + +```bash +# 1 初始化仓库 +git init test + +# 2 在仓库中新建文件编辑内容(例如test.txt) + +# 3 添加到暂存区 +git add test.txt + +# 提交修改 +git commit test.txt -m '提交test.txt' + +# 关联远程仓库, origin也是默认仓库的名字,也可以命名为其它的名字 + git remote add origin git@gitee.com:blueses/test.git + +# 把本地仓库的master分支与远程仓库的master分支关联起来 +# 把本地仓库的master分支的文件推送到远程仓库的master分支中 + git push -u origin master + + +``` + + + + + +#### 2、远程服务器上面有很多代码,要拉取到本地开始开发 + +```bash +# 直接克隆 + git clone git@gitee.com:blueses/test.git + +# add、commit、pull、push 三步走 +``` + + + + + + + + + + + + + +### 5 其他操作 / igonre + +#### ignore + + + +`.gitignore` 文件用于告诉 Git 哪些文件或目录应该被忽略,不纳入版本控制。当你在项目中创建一个 `.gitignore` 文件并列出要忽略的文件或模式时,Git 将不会跟踪或记录这些文件的更改。 + +`.gitignore` 文件的作用有以下几个方面: + +1. 忽略生成的文件:在开发过程中,你可能会生成一些临时文件、日志文件、编译输出文件等。通过在 `.gitignore` 文件中列出这些文件的模式,你可以告诉 Git 忽略它们,避免将它们纳入版本控制。 +2. 忽略敏感信息:有时,你可能会在项目中包含一些敏感信息,如密码、API 密钥等。通过将这些敏感文件的路径添加到 `.gitignore` 文件中,你可以确保它们不会被意外地提交到版本库中。 +3. 忽略操作系统和编辑器生成的文件:不同的操作系统和编辑器可能会生成一些特定的文件,如临时文件、缓存文件、配置文件等。通过 `.gitignore` 文件,你可以告诉 Git 忽略这些与特定环境相关的文件。 + +`.gitignore` 文件使用简单的模式匹配规则来指定要忽略的文件或目录。你可以使用通配符、路径模式和其他规则来匹配文件名或路径。 + +需要注意的是,`.gitignore` 文件只对尚未被 Git 跟踪的文件起作用。如果某个文件已经被 Git 跟踪并提交到版本库中,那么即使将其添加到 `.gitignore` 文件中,Git 仍然会继续跟踪该文件。 + + + +工作说明 + +`.gitignore` 是一个**文本文件**,其中的每一行代表一个**模式**,表示**匹配规则**,开发人员需要忽略的模式相关的模式都应该放到`.gitignore` 文件中 + +`.gitignore` 一般放在代码库的根目录下,这是官方推荐的做法。但是你也可以把它放置在代码库里边的任意目录下,代码库可以有多个`.gitignore` 文件,其中的匹配模式的路径是相对当前`.gitignore` 所在目录的。 + + + + + + + +#### git add . 会追踪 gitignore的对象么 + +`git add .` 命令会将当前目录下的所有文件和文件夹添加到 Git 的暂存区,但它不会追踪 `.gitignore` 文件中指定的被忽略的对象。 + +`.gitignore` 文件的作用是告诉 Git 忽略某些文件或目录,不将它们纳入版本控制。当你运行 `git add .` 命令时,Git 会将所有未被忽略的文件添加到暂存区,但被 `.gitignore` 文件指定的被忽略的文件不会被添加到暂存区。 + +这意味着,`.gitignore` 文件中指定的被忽略的文件或目录不会被 `git add .` 命令追踪或添加到暂存区。它们将保持未被跟踪的状态,不会被包含在提交中。 + +如果你想要确保被 `.gitignore` 文件指定的被忽略的文件不会被 `git add .` 命令添加到暂存区,你可以使用 `git add --ignore-errors .` 命令。这个命令会忽略被忽略的文件,并继续添加其他未被忽略的文件到暂存区。 + +需要注意的是,一旦某个文件被添加到暂存区并提交到版本库中,`.gitignore` 文件对该文件将不再起作用。如果你想要从版本库中移除已经提交的文件,你需要使用 `git rm --cached ` 命令。 + +希望这解答了你的问题!如果还有其他问题,请随时问我。我会尽力帮助你! + + + + + +#### 提交操作 + +```bash +# 修改最近一个的 commit 信息, 修改之后, commit id 会改变 +# 老的 不会删除 +git commit --amend + +# 对最近三个commit的修改, 合并commit, 修改具体的 commit message, 删除某个commit +git rebase -i HEAD~3 + +# 该命令可以指定删除所有提交中的某个文件或者全局修改邮箱地址等操作 +filter --branch +``` + + + + + + + + + +#### 日志操作 + +```bash +git reflog expire --expire=now --all +git gc --prune=now + +``` + + + + + +#### 拉取操作概念辨析 + +- `Clone`拉取完整的仓库到本地目录,可以指定分支,深度. +- `Fetch`将远端某些分支最新代码拉取到本地,不会执行merge操作,会修改refs/remote内的分支信息,如果需要和本地代码合并需要手动操作. +- `Pull`拉取远端某分支,并和本地代码进行合并,操作等同于 git fetch + git merge,也可以通过 git pull --rebase 完成 git fetch + git rebase 操作. + 可能存在冲突,需要解决冲突. + + + + + +```bash +# 初始化一个新的 Git 仓库: +git init + +# git remote add origin 远程仓库URL +git remote add origin git@github.com:username/repo.git + +# 将远程仓库内容下载到本地: +git pull origin 主分支名称 + +# 首次拉取代码时一定会存在当前分支与远程分支不同步的问题,我们可以指定使用 rebase 策略将你的更改应用到远程更改之上: +git pull --rebase origin main + + +# 如何查看我有没有 ssh 权限修改 github 的内容 +ssh -T git@github.com # + +# 如果你想要将本地分支与远程仓库的同名分支进行关联, +git push -u origin <本地分支名称> +# 可以使用 git push / git pull + +# 将会将本地的 main 分支推送到远程仓库 origin 的 master 分支。 +git push origin main:master +``` + + + + + + + + + + + + + + + +### 2 其他操作 + +#### 1.3 建立图片存储仓库 + +建立 public 仓库 + +设置 -> 开发者设置 -> 个人访问令牌-> 生成新令牌-> 设置有效期 + +申请的Token只会显示一次,当你第二次在打开该页面时就无法看到该Token了。如果忘记了Token,唯一的办法就是重新生成一个 + +**注意如果上传的文件和仓库里的文件重名,会上传失败** + +``` +//注意: "repo": "Github用户名/仓库名称", + "token": "之前你申请的Token", + +{ + "picBed": { + "current": "github", + "github": { + "repo": "xxx/xxx", + "branch": "main", + "token": "xxxxxxxxx", + "path": "images/", + "customUrl": "" + } + }, + "picgoPlugins": {} +} +``` + + + + + + + +### 工作流 + + + + + +| 分支管理工作流 | 特点特点特点 | +| -------------- | ------------------------------------------------------------ | +| Git Flow | 分支类型丰富,规范严格 | +| Github Flow | 只有主干分支和开发分支,规则简单 | +| Gitlab Flow | 在主干分支和开发分支之上构建环境分支,版本分支,满足不同发布or环境的需要 | + + + +#### 1. git flow + +包含五种类型的分支 + +- Master: 主干分支 + +- Develop: 开发分支 + +- Feature: 特性分支 + +- Release: 发布分支 + +- Hotfix: 热修复分支 + + + +优点 + +- 如果能按照定义的标准严格执行代码会很清晰,并且很难出现混乱. + +缺点 + +- 流程过于复杂,上线的节奏会比较慢. + 由于太复杂,研发容易不按照标准执行从而导致代码出现混乱. + + + + + +#### github flow + +Github 的工作流,只有一个主干分支,基于 `Pull Request` 往主干分支中**提交代码**. + +选择团队合作的方式 ( 两种 ) + +- owner创建好仓库后, 其他用户通过 Fork的方式来创建自己的仓库, 并在 fork的仓库上进行开发 +- owner 创建好仓库后, 统一给团队内成员**分配权限**, 直接在**同一个仓库**内进行开发 + + + + + +#### gitlab flow + +- Gitlab推荐的工作流是在GitFlow和 Github Flow上做出优化,既保持了单一主分支的简便,又可以适应不同的开发环境 + +原则: + +- upstream first 上游优先 +- 只有在上游分支采纳的代码才可以进入到下游分支,一般上游分支就是 `master` + + + + + +#### 代码合并 + +Fast-Forward + +不会产生一个merge节点,合并后保持一个线性历史,如果target分支有了更新,则需要通过 rebase操作更新 source branch 后才可以入. + + + +Three-Way Merge + +三方合并,会产生一个新的 merge节点 + + + + + + + +#### 如何选择合适的工作流 + +选择原则: 没有最好的,只有最合适的 + + + +针对小型团队合作, 推荐使用Github工作流即可 + +- 1.尽量保证少量多次,最好不要一次性提交上千行代码 +- 提交 Pull Request 后最少需要保证有 CR 后再合入 +- 主干分支尽量保持整洁,使用 fast-forward 合入方式,合入前进行`rebase` + + + + + +#### 一次混乱的开发流程 + +昨天看了下分支,好像大家拉的比较乱, + +- dev是完成 dao 层以后的, +- user是 dev 加了用户登录, +- token 是 dev 加了 token功能 +- feed是 user 加了 feed 功能, +- publish是在user上改的 + diff --git a/_posts/API_software/2023-07-29-latex.md b/_posts/API_software/2023-07-29-latex.md new file mode 100644 index 0000000..acd45d2 --- /dev/null +++ b/_posts/API_software/2023-07-29-latex.md @@ -0,0 +1,401 @@ +--- +layout: blog +banana: true +title: "latex使用指南" +category: API_software +date: 2023-07-29 14:26:19 +background: blue +tags: +- software +- latex +--- + +* content +{:toc} +## 论文技巧Latex使用简介: + +### latex摘要----快速入门 + +中文使用cjkutf8 + +- 使用 % 进行注释 +- 段与段之间要空一行 + +### 0 安装 + +网址 [清华大学开源软件镜像站 | Tsinghua Open Source Mirror](https://mirrors.tuna.tsinghua.edu.cn/) + +推荐miktex + texstudio + +安装推荐:miktix和texstudio + +miktex console -> 更新 ->选择一个源 + + + + + +###1. 公式 + + ####1.1 基本使用 + +- 使用$$表示行内公式 +- 如果需要直接使用不带编号的行间公式,则将公式用命令 \ [ 和 \ ] 包裹 +- 使用带编号的公式 使用 \begin{equation} 和 \end{equation} + ​ 还可以用 \tag 命令手动修改公式的编号,或者用 \notag 命令取消为公式编号 + ​ 数学模式有如下特点: + +``` +1 空格忽略, +2 不允许有空行, +3 所有字母当作变量处理 +``` + + ####1.2 数学符号 + +| 省略号 | 代码 | +| ---------------------- | -------------------------------------- | +| $\div$ | \div | +| $\times$ | \times | +| | | +| 空格 | \quad | +| 省略号$\dots$ | \dots | +| 上标 | ^{} | +| 下标 | _{} | +| | | +| 根号$\sqrt[n]{}$ | \sqrt[n]{} | +| 分数 $\frac{}{}$ | \frac{}{} | +| | | +| 或者 $$ | \parallel | +| 无穷大 $\infty $ | \infty | +| | | +| 求和 $\sum $ | \sum | +| 求和有上下 | \sum \limits^{}_{} | +| | | +| 不等号 $\ne $ | \ne | +| 大于等于 $\ge$ | \ge | +| 小于等于 $\le $ | \le | +| 约等于 $\approx $ | \approx | +| 等价 $\equiv $ | \equiv | +| | | +| 范数(双竖杠) $\Vert $ | \Vert | +| | | +| 罗马数字 $$ | \uppercase\expandafter{\romannumeral2} | + +| 希腊字母 | Latex代码 | +| -------- | --------- | +| $\alpha$ | \alpha | +| $\beta$ | \beta | +| $\delta$ | \delta | +| | | +| $\Delta$ | \delta | +| $\Pi$ | \Pi | + + + +#### 1.3 公式引用 + +``` +\begin{equation} + \label{key} +\end{equation} + +%当引用时, 没有括号 例如 6 +\ref{key} +%当引用时, 需要括号 例如 6 +(\ref{key}) +``` + + + +#### 1.4 特殊的公式----规划 + +```latex +\begin{align} +% 规划的形式 +% 最后一行没有 \\ + \min \quad + & 目标函数 \\ + \text{s.t.} \quad + & 约束1 \label {cons1}\\ + & 约束2 \label {cons2}\\ + & 约束3 \label {cons3}\\ + & 约束4 \label {cons4} +\end{align} +``` + +```latex +%分段函数 +\begin{equation} +f(x)= + \begin{cases} + 0 & \text{x=0}\\ + 1 & \text{x!=0} + \end{cases} +\end{equation} +``` + +#### 1.5 多行公式 公式编号在中间 + +```latex +% 如果要折行的话,习惯上优先在等号之前折行,其次在加号、减号之前,再次在乘号、除号之前。其它位置应当避免折行。 目前最常用的是 align 环境,它将公式用 & 隔为两部分并对齐。分隔符通常放在等号左边 +% 用 \notag 去掉某行的编号 + +\begin{equation} +\begin{aligned} + a &= b + c \\ + d &= e + f + g \\ + h + i &= j + k \\ + l + m &= n +\end{aligned} +\end{equation} + +%如果因为加的元素太多, 一行放不开 建议, +\begin{equation} +\begin{aligned} + a =& b + c \\ + + & e + f + g \\ + + & j + k \\ + + & n +\end{aligned} +\end{equation} + + + +%如果因为加的元素太多, 一行放不开 建议 + \begin{equation} + \begin{aligned} + \text{min} \quad & b + c \\ + \text{s.t.} \quad & e + f + g \\ + & j + k \\ + & n + \end{aligned} + \end{equation} +``` + + + + + + + +###2. 图片 + +#### 2.1 单个标题 + + \includegraphics[⟨options⟩]{⟨fi lename ⟩}, + 文件名可能需要用相对路径或绝对路径表示, 图片文件的扩展名一般可不写 + + ``` +\include{chapters/file} % 相对路径 +\include{/home/Bob/file} % *nix(包含 Linux、macOS)绝对路径 +\include{D:/file} % Windows 绝对路径,用正斜线 + ``` + + ``` + %导包 + usepackage{graphics} + + %导入图片, 当模板为两列, 但是想让图片占据着两列时, 使用\begin{figure*}[t] + %图片 + \begin{figure}[htbp] + %居中 + \centering + %\includegraphics[width=2.5in]{Autoencoder1} + %占据0.8宽度 + \includegraphics[width=0.40\textwidth]{time.png} + %图片名称 + \caption{Experimental running time} + \label{time} + \end{figure} + + +- \[htbp\] 为调整图片排版位置选项,说明如下: + + \[h\]当前位置。将图形放置在正文文本中给出该图形环境的地方。如果本页所剩的页面不够,这一参数将不起作用。 + \[t\]顶部。将图形放置在页面的顶部。 + \[b\]底部。将图形放置在页面的底部。 + \[p\]浮动页。将图形放置在一只允许有浮动对象的页面上。 + +#### 2\. 并排插入多张图片并公用一个caption + +有时候我们希望同时插入一组图片,共用一个大标题且为每张子图设小标题,效果如下: +![在这里插入图片描述](https://img-blog.csdnimg.cn/20200417095821196.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NTI2NjIz,size_16,color_FFFFFF,t_70) +方法:同时引入 \\usepackage{graphicx} 和 \\usepackage{subfigure} 宏包,如下代码实现。 + +``` +\begin{figure}[htbp] +\centering +\subfigure[Fig1]{ +\includegraphics[scale=0.25]{Fig1.png} \label{1} +} +\quad +\subfigure[Fig2]{ +\includegraphics[scale=0.25]{Fig2.png} \label{2} +} +\quad +\subfigure[Fig3]{ +\includegraphics[scale=0.25]{Fig3.png}\label{3} +} +\quad +\subfigure[Fig4]{ +\includegraphics[scale=0.25]{Fig4.png}\label{4} +} +\caption{Experimental results of the authors} +\end{figure} + +``` + +代码说明: +\\subfigure\[Fig1\] 为子图的标题; +\\caption{Experimental results of the authors} 为总标题。 + + + +### 3.引用 (参考文献) + +#### [Bib 参考文献一键复制](https://greasyfork.org/zh-CN/scripts/455062-bib参考文献一键复制) + +设置方法 + +- 谷歌学术-> 设置 -> 选中`显示导入 bibtex的链接` + + + +#### 3.1 IEEE模板 + +```latex +% IEEE官网的latex模板,无法调用cite包。与下面第一节调用的biblatex包冲突(模板里自带的,开始没注意到,相当于我调用了两个参考文献的包),然后我改成网上一样的biblatex调用声明还是不行,因为新版必须用bibtex编译,且要在[ ]中声明,很多博客用的是biber,并且默认也是biber!即调用biblatex包必须要声明是用bibtex编译! + +%导包, 在文章开始之前也就是 \begin{document} +\usepackage[backend=bibtex,sorting=none]{biblatex} +\addbibresource{ref.bib} + +%sorting=none表示按照参考文献在论文中出现的先后顺序排序。 +hyperref=true和backref=true表示为各个参考文献的引用处、及定理、定义、例子等的引用处都添加上超链接; + +% 显示参考文献, 在\end{document}之前 +\printbibliography + +%引用格式: +\cite{key} +``` + + + +#### 3.2 其他模板 + +```latex +%引用, FCN是我们在bibtex文件中自定义的名字 +以一篇古老的分子动力学文章作为参考\cite{yu2013toward} + +%如果不想用方括号, 可以使用 +\usepackage[superscript]{cite} + +%参考文献, 在 \end{document}之前写 +\bibliographystyle{IEEEtran} +\bibliography{ref.bib} +``` + +####3.2引用网址 + +``` + %正文前引用 +usepackagefurl} + + %bib文件中加入: +@Misc{cite变量名, +howpublished = {\url{网页地址}}, +note = {Accessed进入网页的具体日期}, +title = {网页名称}, +author = {作者} +} +1911正文中具体使用为 +1\cite{cite变量名) + + +``` + + + +### 4.表格 + +网址 : tablegenerator.com + +``` +\begin{tabular}{cc}%一个c表示有一列,格式为居中显示(center) + +%\begin{tabular}{|c|c|}通过添加 | 来表示是否需要绘制竖线 +(1,1)&(1,2)\\%第一行第一列和第二列 中间用&连接 +(2,1)&(2,2)\\%第二行第一列和第二列 中间用&连接 +\end{tabular} +``` + +``` + %经典三线表格 table的目的就是把表格给图片化 + \begin{table}[] + \centering + \caption{Notations in This Paper} + \begin{tabular}{|c|c|} + \hline + 标题1 & 标题2 \\ + \hline + + $P$ & the provider \\ + $M_{it}$ & the \\ + \hline + \end{tabular} + \end{table} +``` + + + +### 5 算法 + +``` +%算法宏包 +\usepackage[linesnumbered,ruled,vlined]{algorithm2e} +\usepackage{setspace} + + +\begin{algorithm}[t] + %设置算法编号 + %\renewcommand{\thealgocf}{3-1} + \SetAlgoLined %显示end + \caption{Genetic Algorithm}%算法名字 + \label{} + \KwIn{input parameters $T, $}%输入参数 + \KwOut{$ $}%输出 + % '\;' 用于换行 + some description\; + \For{condition}{ + \If{condition}{ + 1\; + } + } + + return + \end{algorithm} +``` + +### 6 字体大小 + +``` +%学院名称太长, 导致作者变成了两行, 可以把学院名称的字体调小 +\tiny Hello Latex. +\scriptsize Hello Latex. +\footnotesize Hello Latex. +\small Hello Latex. +\normalsize Hello Latex. +``` + + + + + + + + + + + diff --git a/_posts/API_software/2023-07-30-auto-find-answer.md b/_posts/API_software/2023-07-30-auto-find-answer.md new file mode 100644 index 0000000..30810f1 --- /dev/null +++ b/_posts/API_software/2023-07-30-auto-find-answer.md @@ -0,0 +1,267 @@ +--- +layout: blog +banana: true +category: API_software +title: 自动化查题 +date: 2023-07-30 17:55:31 +background: blue +tags: +- API_software +- python +- auto +--- + +* content +{:toc} + + +- 问题文件 `question.txt` +- 题库文件 `diction.xlsx` +- 输出为`查询结果.xlsx` + + + + + +#### 1 读取查询列表 + +```python +##########-读取查询列-######### + + +# 文本预处理 + +filepath = "./auto/question.txt" + +with open(filepath, 'r', encoding='utf-8') as f: + text = f.read() + +text_new = text.replace('(', '(') +text_new = text_new.replace(')', ')') + +with open(filepath, 'w', encoding='utf-8') as f: + f.write(text_new) + + + + +# 打开txt文件并读取内容 +with open("./auto/question.txt", "r", encoding="utf-8") as file: + content = file.read() +# print("contect=", content) + +# 把题目导出来 +pattern = r'(\d+\.+)(.+?)(?=(\(|\。|\n|$))' +matches = re.findall(pattern, content, flags=re.DOTALL) +# [('1. ', '质量流量计不能够直接测出的参数是( )'),.....] +``` + + + +#### 2 读取题库 + +```python +######### 读取题库 ############## +dic = [] +# 读取单选题 +df= pd.read_excel("./auto/diction.xlsx", sheet_name="one", usecols=[0,1]) +value_array = df[["题目", "答案"]].values +#print(df) +dic1= [(question, ans) for question, ans in value_array] +dic.extend(dic1) + +``` + + + +#### 3 进行查题 + +```python +########### 进行查询 ############### +res= [] + +num = 0 + +for match in matches: + # 查询id, 查询题目 + id = match[0] + qu = match[1] + + # 题目过短, 自己进行处理 + if(len(qu)<=5): + res.append((id, "没有答案")) + continue + + flag = 0 + # 开始从题库中查询 + for allqu, ans in dic: + if qu in allqu: + res.append((id, ans)) + flag =1 + num+=1 + break + + + if(flag ==0): + res.append((id, "没有答案")) + +# print("res=", res) +print("共查询到", num , "/", len(res),"个结果") + +# 输出为 execl, 一共两列 +data = { + '题号': [item[0] for item in res], + '答案': [item[1] for item in res] +} +df=pd.DataFrame(data) +df.to_excel("./auto/查询结果.xlsx",sheet_name="Sheet1", header=None, index=False) + + + +############ 如果没有搜索到答案 ########### +print("下面请输入没有搜索到答案的问题") +for i in range(100): + s = input("请输入问题:(右键即黏贴)\n") + + for ques, ans in dic: + if s in ques: + print(ans,"\n\n\n") + +``` + + + + + + + +#### 4 总体代码 + +```python +import re +import pandas as pd + + + +##########-读取查询列-######### + + +# 文本预处理 + +filepath = "./auto/question.txt" + +with open(filepath, 'r', encoding='utf-8') as f: + text = f.read() + +text_new = text.replace('(', '(') +text_new = text_new.replace(')', ')') + +with open(filepath, 'w', encoding='utf-8') as f: + f.write(text_new) + + + + +# 打开txt文件并读取内容 +with open("./auto/question.txt", "r", encoding="utf-8") as file: + content = file.read() +# print("contect=", content) + +# 把题目导出来 +pattern = r'(\d+\.+)(.+?)(?=(\(|\。|\n|$))' +matches = re.findall(pattern, content, flags=re.DOTALL) +# [('1. ', '质量流量计不能够直接测出的参数是( )'),.....] + +# print("maches=", matches) + +matches = [(ma[0], ma[1] ) for ma in matches] +print("maches=", matches) + + +# 将数据转换成 DataFrame 格式 + +# 将数据转换成 DataFrame 格式, 并修改列名为 "序号" 和 "答案" +df = pd.DataFrame(matches, columns=['序号', '问题']) + +# 使用 slice() 方法将 content 列的字符串长度截断为 20 +df['问题'] = df['问题']#.str.slice(20) + + + +# print("df=", df) +# 将数据保存到 Excel 文件中 +df.to_excel('./auto/问题列表.xlsx', index=False) + + + + + + +######### 读取题库 ############## +dic = [] +# 读取单选题 +df= pd.read_excel("./auto/diction.xlsx", sheet_name="one", usecols=[0,1]) +value_array = df[["题目", "答案"]].values +#print(df) +dic1= [(question, ans) for question, ans in value_array] +dic.extend(dic1) + + + + +# dic = [('修改后的《安全生产法》由习近平主席于2014年签署第十三号令予以公布,自2014年()起施行。', 'C'),(),,,,] +# print("\n\n\ndic=", dic) + + +########### 进行查询 ############### +res= [] + +num = 0 + +for match in matches: + # 查询id, 查询题目 + id = match[0] + qu = match[1] + + # 题目过短, 自己进行处理 + if(len(qu)<=5): + res.append((id, "没有答案")) + continue + + flag = 0 + # 开始从题库中查询 + for allqu, ans in dic: + if qu in allqu: + res.append((id, ans)) + flag =1 + num+=1 + break + + + if(flag ==0): + res.append((id, "没有答案")) + +# print("res=", res) +print("共查询到", num , "/", len(res),"个结果") + +# 输出为 execl, 一共两列 +data = { + '题号': [item[0] for item in res], + '答案': [item[1] for item in res] +} +df=pd.DataFrame(data) +df.to_excel("./auto/查询结果.xlsx",sheet_name="Sheet1", header=None, index=False) + + + +############ 如果没有搜索到答案 ########### +print("下面请输入没有搜索到答案的问题") +for i in range(100): + s = input("请输入问题:(右键即黏贴)\n") + + for ques, ans in dic: + if s in ques: + print(ans,"\n\n\n") + +``` + diff --git a/_posts/API_software/2023-07-30-generate-blog.md b/_posts/API_software/2023-07-30-generate-blog.md new file mode 100644 index 0000000..1a6349a --- /dev/null +++ b/_posts/API_software/2023-07-30-generate-blog.md @@ -0,0 +1,152 @@ +--- +layout: blog +banana: true +category: API_software +title: "如何基于github快速建立博客站点" +date: 2023-07-30 16:28:49 +background: blue +tags: +- blog +- API_software +--- + +* content +{:toc} + + + + +## 修改 + +- 从原作者项目地址进行 `clone` [原作者项目地址在这里](https://github.com/Liberxue/liberxue.github.io) +- 进行修改 +- 上传 + + + + + +#### 设置说明 + +- 修改_config.yml 的 links 为您的菜单 +- 修改_config.yml 的 paginate 为您的按照多少页分页 +- 修改自己的网**图标**`\style\favicons\favicon.ico` +- 修改自己的网**标志**`\style\favicons\logo-liberxue.png` +- 在`_layouts\blog.html`中, 将 `本文由 liberxue 创作` 改为您的`github`名字 +- 修改`\about.md`中的内容, 它对应着文章中的`关于`这一页 +- 在`_layouts\default.html`中, 将 `本文由 liberxue 创作` 改为您的`github`名字 + + + +#### 使用说明 + +- 打开`\_posts` 文件夹是**博客文章**所在的位置,文件夹中的内容就是你的**博客**, 博客格式为 `markdown` +- 文件名格式为`2015-06-11-xxxx.md`, **不能有中文**, 因为文件名会成为这篇博文的链接 +- ~~当天的`blog`不会上传~~ + +```markdown +layout: blog +book: true +title: "《美丽新世界》之幸福和自由思考" +background: green +background-image: http://ot1cc1u9t.bkt.clouddn.com/17-7-15/78939382.jpg +date: 2017-07-03 23:13:54 +category: 书籍 +tags: +- 美丽新世界 + + + + + +可选项目 +// 设置颜色 +background: green +background: blue +background: purple + +// 设置路径 +redirect_from: + - /about/ +``` + + + + + +#### 颜色说明 + +- 蓝色: 软件/ API/ 提升效率 +- 绿色: 语言相关 +- 紫色: 算法/ 周赛 + + + +#### 自动提交脚本 + +- 只是一个博客, 提交的信息就不重要了, 只提交一个 时间信息就好 + +```bash +@echo off + +setlocal enabledelayedexpansion + +REM 获取当前日期和时间 +for /f "tokens=1-4 delims=/ " %%i in ("%date%") do ( + set year=%%l + set month=%%j + set day=%%k +) + +for /f "tokens=1-3 delims=:." %%i in ("%time%") do ( + set hour=%%i + set minute=%%j + set second=%%k +) + +REM 构建提交信息 +set commit_message=%year%-%month%-%day% %hour%:%minute%:%second% + +REM 添加文件到暂存区 +git add . + +REM 提交代码,并包含日期和时间作为提交信息 +git commit -m "%commit_message%" + +REM 推送到远程仓库 +git push + +endlocal + +``` + + + +#### 自动生成 markdown + +```markdown +#!/bin/bash + +filename=$(date +"%Y-%m-%d-.md") + +cat > "$filename" << EOF +--- +layout: blog +banana: true +category: default +title: +date: $(date +"%Y-%m-%d %H:%M:%S") +background: green +tags: +- default +- memcache +--- + +* content +{:toc} +EOF + +echo "文件已生成:$filename" + +``` + diff --git a/_posts/API_software/2023-07-31-jekyll.md b/_posts/API_software/2023-07-31-jekyll.md new file mode 100644 index 0000000..19a4c97 --- /dev/null +++ b/_posts/API_software/2023-07-31-jekyll.md @@ -0,0 +1,233 @@ +--- +layout: blog +banana: true +category: API_software +title: "jekyll进阶设置" +date: 2023-07-31 19:55:34 +background: blue +tags: +- API_software +--- + +* content +{:toc} + + +### 1简介 + +#### 1.1 Jekyll 究竟是什么? + +Jekyll 是一个简单的博客形态的**静态站点**生产机器。它有一个模版目录,其中包含原始文本格式的文档,通过一个转换器(如 [Markdown](http://daringfireball.net/projects/markdown/))和我们的 [Liquid](https://github.com/Shopify/liquid/wiki) 渲染器转化成一个完整的可发布的静态网站,你可以发布在任何你喜爱的服务器上。Jekyll 也可以运行在 [GitHub Page](http://pages.github.com/) 上,也就是说,你可以使用 GitHub 的服务来搭建你的项目页面、博客或者网站,而且是**完全免费**的。 + +[官方文档](http://jekyllcn.com/docs/) + + + +```bash +$ jekyll build +# => 当前文件夹中的内容将会生成到 ./_site 文件夹中。 + +$ jekyll build --destination +# => 当前文件夹中的内容将会生成到目标文件夹中。 + +$ jekyll build --source --destination +# => 指定源文件夹中的内容将会生成到目标文件夹中。 + +$ jekyll build --watch +# => 当前文件夹中的内容将会生成到 ./_site 文件夹中, +# 查看改变,并且自动再生成。 +``` + + + + + +#### 1.2 目录结构 + +``` +. +├── _config.yml +├── _drafts +| ├── begin-with-the-crazy-ideas.textile +| └── on-simplicity-in-technology.markdown +├── _includes +| ├── footer.html +| └── header.html +├── _layouts +| ├── default.html +| └── post.html +├── _posts +| ├── 2007-10-29-why-every-programmer-should-play-nethack.textile +| └── 2009-04-26-barcamp-boston-4-roundup.textile +├── _site +├── .jekyll-metadata +└── index.html +``` + +- `config.yml` 里写有整个站点的主要配置项 +- `_includes` 可以在模板中随时包含的文件 +- `_layouts` 布局文件,在博客头配置中可以选择 +- `_posts` 下的所有目录中的所有博客 + + + +### 2 头部信息(设置信息) + +#### 2.1 头信息 + +| 变量名称 | 描述 | +| ----------- | ------------------------------------------------------------ | +| `layout` | 如果设置的话,会指定**使用该模板文件**。指定模板文件时候不需要文件扩展名。模板文件必须放在 `_layouts` 目录下。 | +| `permalink` | 如果你需要让你发布的博客的 URL 地址**不同于默认值** `/year/month/day/title.html`,那你就设置这个变量,然后变量值就会作为最终的 URL 地址。 | +| `published` | 如果你**不想**在站点生成后**展示**某篇特定的博文,那么就设置(该博文的)该变量为 false。 | +| `date` | 这里的日期会**覆盖文章名字中的日期**。这样就可以用来保障文章排序的正确。日期的具体格式为 `YYYY-MM-DD HH:MM:SS +/-TTTT`;时,分,秒和时区都是可选的。 | +| `category` | 除过将博客文章放在某个文件夹下面外,你还可以指定博客的一个或者多个分类属性。这样当你的站点生成后,这些文章就可以根据这些分类来阅读。`categories` 可以通过 [YAML list](http://en.wikipedia.org/wiki/YAML#Lists),或者以逗号隔开的字符串指定。 | +| `tags` | 类似分类 `categories`,一篇文章也可以给它增加**一个或者多个**标签。同样,`tags` 可以通过 YAML 列表或者以逗号隔开的字符串指定。 | + + + +#### 2.2 格式 + +传统的块格式使用连字符 + 空格来开始列表中的新项目。 + +``` +--- # Favorite movies +- Casablanca +- North by Northwest +- The Man Who Wasn't There +``` + +可选的内联格式由逗号+空格分隔,并括在括号中 + +``` +--- # Shopping list +[milk, pumpkin pie, eggs, juice] +``` + + + + + + + + + +#### 2.3 默认值 + +假设您想添加一个默认的布局给站点中的所有页面和文章。 你要将这添加到你的 `_config.yml` 文件: + +```bash +defaults: + - + scope: + path: "" + type: "posts" + values: + layout: "my-site" + - + scope: + path: "projects" + type: "pages" # 以前的 `page`, 在 Jekyll 2.2 里。 + values: + layout: "project" # 覆盖之前的默认布局 + author: "Mr. Hyde" + +``` + + + + + + + + + + + +#### 2.4 路径的组织方式 + +总体设置 + +```yaml +#产生路径方式 +permalink: pretty +permalink: /:categories/:title.html +# 可以使用分类的方式 +permalink: /:categories/:title.html + +# 这是默认的方式 +permalink: /:year/:month/:day/:title.html +https://xxxx.github.io/algorithm/2023/07/30/problem-string/ + +``` + + + +单独设置 + +```yaml +--- +permalink: /about/ +--- + +``` + + + +| Permalink Style | URL Template | +| --------------- | ------------------------------------------------------------ | +| `date` | `/:categories/:year/:month/:day/:title:output_ext` | +| `pretty` | `/:categories/:year/:month/:day/:title/` | +| `ordinal` | `/:categories/:year/:y_day/:title:output_ext` | +| `weekdate`4.0 | `/:categories/:year/W:week/:short_day/:title:output_ext` (`W` will be prefixed to the value of `:week`) | +| `none` | `/:categories/:title:output_ext` | + + + + + + + +### 3 其他 + +#### 3.1 github 某些 样式 + +- [Jekyll Themes](http://jekyllthemes.org/) +- [cotes2020/jekyll-theme-chirpy:一个用于技术写作的最小、响应迅速且功能丰富的 Jekyll 主题。 (github.com)](https://github.com/cotes2020/jekyll-theme-chirpy) +- [博客模板 1](https://github.com/Liberxue/liberxue.github.io) +- [artemsheludko/bef: Bef is a responsive jekyll theme https://artemsheludko.github.io/bef/](https://github.com/artemsheludko/bef) +- [leopardpan/leopardpan.github.io: 个人博客,看效果进入](https://github.com/leopardpan/leopardpan.github.io) + + + +#### 3.2 引用图片和其它资源 + +很多时候,你需要在文章中引用图片、下载或其它数字资源。尽管 Markdown 和 Textile 在链接这些资源时的语法并不一样,但你只需要关心在站点的哪些地方保存这些文件。 + +由于 Jekyll 的灵活性,有很多方式可以解决这个问题。一种常用做法是在工程的**根目录下创建一个文件夹**,命名为 `assets` 或者 `downloads`,将图片文件,下载文件或者其它的资源放到这个文件夹下。然后在任何一篇文章中,它们都可以用站点的根目录来进行引用。这和你站点的域名 / 二级域名和目录的设置相关,下面有一些例子(**Markdown 格式**)来演示怎样利用 `site.url` 变量来解决这个问题。 + +在文章中引用一个图片 + +``` +… 从下面的截图可以看到: +![有帮助的截图]({{ site.url }}/assets/screenshot.jpg) +``` + +链接一个读者可下载的 PDF 文件: + +``` +… 你可以直接 [下载 PDF]({{ site.url }}/assets/mydoc.pdf). +``` + + + + + + + + + +- + + + diff --git a/_posts/API_software/2023-08-15-1024-code.md b/_posts/API_software/2023-08-15-1024-code.md new file mode 100644 index 0000000..169d9ca --- /dev/null +++ b/_posts/API_software/2023-08-15-1024-code.md @@ -0,0 +1,210 @@ +--- +layout: blog +banana: true +category: API_software +title: "1024 code 使用说明" +date: 2023-08-15 16:24:03 +background: blue +tags: +- API_software +--- + +* content +{:toc} +### 1024 相关/ 项目 + +#### 1 简介 + +拿到**邀请码**以后再去注册 + +主要功能 + +- 在线**多人协作**, 包括代码 +- code 在线分享: 类似于 **kaggle** +- 助手: gpt +- Git版本管理: Git Commit,管理你的代码版本 +- 数据库: 云端数据库 + + + +建议 创建 github仓库 + +[‌‌‌⁢⁤‍⁣‍‌‬‌‌⁡⁣⁤‌⁡⁣⁤‬⁣‬‍⁡⁢⁡⁣‬⁣⁡⁡⁤⁡‌1024Code 组队协作编程流程说明文档(后端) - 飞书云文档 (feishu.cn)](https://c1n2p7ijpkc.feishu.cn/docx/HyJfd9n2DojarxxaNsQcTs8hn3c) + +[产品简介 | 1024Code 文档中心](https://docs.1024code.com/) + + + + + +#### 2 github 联动 + +添加公钥到 GitHub/Gitee/GitLab + +打开个人中心设置页面复制个人的 SSH 公钥:添加到你的 GitHub/Gitee/GitLab 账户中: + +![添加公钥到GitHub](https://1024code.com/images/git_remot_copysshkey.png) + + + +- 创建一个和代码空间同名的远程仓库,或在已存在的远程仓库中复制该仓库地址,如:`git@github.com:li382112772/SimpleNES.git` + + + + + +#### 3 创建团队 + +- 登录1024Code账号,进入工作台后,点击我的团队区域的"**创建团队**"功能按钮创建团队. +- 上传团队头像,填写团队名称以及团队简介信息后创建团队. + +在团队工作台成员页面,添加或使用链接邀请成员加入团队. +在对团队成员列表里,可以更改成员角色、移出团队成员,可更改的角色包括: + +- 成员:可自由创建团队代码空间,可见团队所有代码空间,但不可编辑自己未加入协作的代码空间 +- 管理员:可自由创建团队代码空间,可见并可主动加入所有团队代码空间进行协作编辑,可处理团队加入申请、可管理团队 +- 所有者:拥有管理员全部权限的同时,可移交团队给其他成员(将其他成员设为所有者) + + + +#### 4 1024 创建代码空间 + +- 进入团队工作台,点击新建按钮选择` Go1.17`环境模版,给团队创建代码空间: +- 代码空间创建成功后,在终端 shell中使用 git clone命令从服务端 Demo仓库(https://github.com/RaymondCode/simple-demo) clone项代码 或者直接Fork现成的项目demo代码空间:[抖音项目服务端Demo - 1024Code](https://1024code.com/codecubes/n56lqqb) +- + +邀请队员加入代码空间协作 + +- 在代码空间中点击协作浮窗,搜索添加或链接邀请队员加入代码空间进行实时协作编程. + +使用git功能从远程仓库同步代码 + +- 首先前往GitHub/GitLab网站创建一个项目,作为这次组队项目的远程代码仓库,并各自创建分支,以方便团队成员之间异步协作. +- 之后,打开1024Code代码空间git功能侧边窗口,按照操作提示流程连接远程仓库,同步1024Code代码仓库代码和GitHub/GitLab远程库代. + +连接App调试接口 + +- 按照项目要求**下载apk** +- 安装App后.在App中设置**服务端地址**,即1024Code代码空间浏览器输出窗口中的URL地址,进行接口调试,如下图: + +注意:1024Code代码空间浏览器输出窗口中的URL地址,如https:/e398ab9bee48dc435e6fd167398b57c3-app.1024paas.com,伴随着代码空间所在容器的**释放和重启**激活(代码空间长时间无操作或者关闭页面后代码空间所在容器会被释放掉,再次打开后会重启一个容器),该URL地址会变.当服务端URL地址改变后,需要在App中重新设置下服务端地址. +此外,1024Code浏览器输出端口暂时仅支持8080端口,参照demo代码空间, listen and serve on +0.0.0.0:8080. + + + + + +#### 5 1024 的问题 + +- 使用git clone命令克隆项目代码报错 + - 1024Code IDE环境默认为国内网络环境,国内网络环境连接 GitHub,使用git clone命令会有不稳定的情况导致clone失败,失败时可多次尝试. +- 如何安装依赖1024 + - Code IDE代码空间基于Linux环境,并使用了Nixos来管理系统依赖,常用的第三方依赖我们可以使用npm install的方式进行安装,系统级依赖,如node.js和npm包,需要通过nix的方式,具体可参照:https://docs.1024code.com/Tutorials/practice +- 项目编译被 Killed + - 1024Code默认提供了1G内存大小的容器环境给每个代码空间,部分项目编译及运行时需要的内存大小瞬时超过1G,内存不足系统会kill掉该进程.遇到这种情况,大家在群里联系我们,青训营期间我们可以直接帮大家调大代码空间容器内存大小. + + + + + +#### 6 环境问题 + +- 1024Code 使用 [NixOS](https://search.nixos.org/packages?channel=22.05&show=pcre&from=0&size=50&sort=relevance&type=packages&query=pcre) 对 IDE 进行环境管理(不支持 sudo 和 apt),我们需要通过修改代码空间的 **nix 配置**文件 `.1024nix`,在 `.1024nix` 的 packages 中添加新的依赖项。 +- `.1024nix` 为受限的隐藏文件,所以需要我们在 shell 中用 vim 命令对文件进行修改,或者使用 `cp` 命令将`.1024nix` 复制成新文件到文件树打开进行修改, 如 `cp .1024nix 1`。修改后,再执行 `cp 1 .1024nix` 命令,使 “1” 文件中的内容覆盖`.1024nix` 文件中的内容;然后点击运行按钮,重新运行项目,以更新环境基础依赖。 +- 需要哪个包可以提前在[nixos.org](nixos.org)搜索下; + +```bash +# 复制为可见副本 +cp .1024nix 1 + +# 修改 + +# 将副本修改为 配置文件 +cp 1 .1024nix + +``` + + + + + + + + + + + +```bash +{ pkgs ? import {} }: +pkgs.mkShell { + shellHook = '' + alias ll="ls -l" + export PS1="\[\e[0m\]\w\[\e[0m\]#\[\e[0m\] " + export LANG=en_US.UTF-8 + export GO111MODULE=on + export GOPROXY=https://goproxy.cn,direct + export PATH=$PATH:~/go/bin + ''; + packages = [ + # env + pkgs.go_1_17 + pkgs.mysql57 + pkgs.mongodb + pkgs.ffmpeg + pkgs.minio + pkgs.redis + pkgs.postgresql + # lsp + pkgs.gopls + pkgs.glibcLocales + ]; +} +``` + + + + + +#### 7 go 如何设置 数据库 + +```go +package main + +import ( + "database/sql" + "fmt" + "log" + "os" + + _ "github.com/go-sql-driver/mysql" +) + +func main() { + db, err := sql.Open("mysql", getConnectionString()) + if err != nil { + log.Fatal(err) + } + defer db.Close() + + err = db.Ping() + if err != nil { + log.Fatal(err) + } + + fmt.Println("Connected to MySQL database!") +} + +func getConnectionString() string { + server := os.Getenv("MYSQL_HOST") + port := os.Getenv("MYSQL_PORT") + user := os.Getenv("MYSQL_USER") + password := os.Getenv("MYSQL_PASSWORD") + database := "mydatabase" + + return fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", user, password, server, port, database) +} +``` + + + diff --git a/_posts/API_software/2023-09-10-resume.md b/_posts/API_software/2023-09-10-resume.md new file mode 100644 index 0000000..3068c6f --- /dev/null +++ b/_posts/API_software/2023-09-10-resume.md @@ -0,0 +1,87 @@ +--- +layout: blog +banana: true +category: API_software +title: "简历制作教训" +date: 2023-09-10 19:19:59 +tags: +- API_software +- latex +- resume +- job +--- + +* content +{:toc} + + + + +模板推荐 + +- [Chinese English resume template 中英双语简历模板 - Overleaf, Online LaTeX Editor](https://www.overleaf.com/latex/templates/chinese-english-resume-template-zhong-ying-shuang-yu-jian-li-mo-ban/nmwszfjntkyr) +- [中文简历模板(Chinese Resume Template) - Overleaf, Online LaTeX Editor](https://www.overleaf.com/latex/templates/zhong-wen-jian-li-mo-ban-chinese-resume-template/jgdzmymxmpfc) + + + +推荐使用以上两个简历, 知乎推荐的简历字体**太大**了, **不推荐使用** + + + +### 1 简历原则: + +- 简历**模板**要清晰、简洁!别用花里胡哨的**格式**, 双栏简历达咩 +- 简历不超过**一页纸** +- **错别字和语病**不要有、**字体统一** +- 不同岗位,不同要求,**不同**简历 + + + +### 2 基本信息 + +- 证件照: 最好用**白底**、灰底、蓝底的职业照/证件照,这样一来既不会让你的照片在简历上显得很突兀,同时会让HR更加有印象。 +- 个人基本情况, 姓名, 性别, 年龄, 联系方式 +- 学历, 学位, 专业 +- 教育背景要有, 格式可以像 + - `大学, 专业, 时间`, + - `主修课程`: 核心课程就可 +- 信息要全, 电话, 邮箱, 籍贯等等 + + + +### 3 项目/ 实习经历 + +【建议】 项目经历是简历中非常重要的一部分,它能够展示你在实际工作中的能力和经验。如果你还没有项目经历,建议你尽快参与一些项目,可以是学校的实践课程、实习或者自己的个人项目。通过参与项目,你可以锻炼自己的团队合作能力、问题解决能力和项目管理能力,同时也能够丰富你的简历内容,提高竞争力。 + +【示例】 以下是我简历中的项目经历: + +> 项目名称:在线商城网站开发 +> +> - 项目描述:负责开发一个在线商城网站,包括用户注册登录、商品浏览购买、订单管理等功能。 - 职责:担任前端开发工程师,负责网站的页面设计和前端代码编写。 +> - 工作成果:成功完成网站的前端开发工作,实现了用户友好的界面和良好的用户体验。网站上线后,用户访问量增加了xx%,销售额提升了xx%。 +> +> 2. 项目名称:智能家居系统设计 - 项目描述:参与设计一个智能家居系统,包括家庭安防、智能控制等功能。 - 职责:担任软件工程师,负责系统的需求分析、系统设计和代码编写。 - 工作成果:成功完成系统的设计和开发工作,实现了远程监控、智能控制等功能。系统上线后,用户满意度提高了xx%,故障率降低了xx%。 3. 项目名称:数据分析与挖掘 - 项目描述:参与一个数据分析与挖掘项目,对大量的数据进行分析和挖掘,提取有价值的信息。 - 职责:担任数据分析师,负责数据清洗、特征提取和模型建立。 - 工作成果:成功完成数据分析和挖掘工作,提取出了关键指标和规律,并提供了有针对性的决策建议。项目完成后,公司的利润增长了xx%。 以上是我在简历中的项目经历,通过这些项目,我不仅提升了自己的技能和经验,也取得了一定的成绩和成就。 + + + +### 4 职业技能 (专业技能) + +【建议】 职业技能是简历中非常重要的一部分,它能够展示你的专业能力和技术水平。对于已有的职业技能,建议你在描述时要更加具体和有针对性,可以提供一些相关项目经验或成果,以突出你的实际应用能力。另外,可以考虑添加一些与职位要求相关的技能,以提高简历的匹配度。 + +- 计算机二级.... + + + +### 5 其他模块 + +- 语言能力 六级等 +- 获奖经历 +- 自我评价 +- 兴趣爱好 + +所有的模板你都可以放心用,按你的经验,简历要尽量保证在一页以内。目前的简历内容比较少,有大量的留白,非常容易被pass,要补充内容尽可能将简历达到一页。如果当前的模块无法达到1页,想下有没有其他经历适合放到简历上。 + + + + + diff --git a/_posts/API_software/2023-09-30-gpt-prompt.md b/_posts/API_software/2023-09-30-gpt-prompt.md new file mode 100644 index 0000000..177dd80 --- /dev/null +++ b/_posts/API_software/2023-09-30-gpt-prompt.md @@ -0,0 +1,93 @@ +--- +layout: blog +banana: true +category: API_software +title: "GPT 提示词" +date: 2023-09-30 14:10:07 +background: blue +tags: +- API_software +--- + +* content +{:toc} + + + + + + +#### 论文降重 + +> 你是一个期刊收录系统,你熟练使用文本相似度算法如余弦相似度,Jaccard,曼哈顿距离等,来判断原文与相似内容之间的相似度接下来,我将给你原文与相似内容.你需要给我两者的相似度结果,然后,你需要对原文进行改写,使相似度降低到-1,然后重新计算原文与相似内容的相似度最终,你会把修改后的原文给我以及他与相似内容的想似度 +> +> 原文内容: 智能车辆的任务并不是都可以卸载的,车辆任务按照其关键程度分为三类:关键任务(Crucial Tasks,CTs)、高优先级应用程序(High-Priority Tasks,HPTs)和低优先级应用程序(Low-Priority Tasks,LPTs)。 +> +> CTs是和车辆安全相关的应用,是保证车辆和乘客安全的关键应用程序,如车辆控制、系统监控和事故预防等。由于CTs和安全紧密相关,因此享有最高的优先级,必须保留充足的计算资源给它,不能因为HPTs和LPTs的存在而影响CTs的正常运行,因此这类任务也不允许卸载,只允许在本地执行,不属于计算任务卸载的范畴。该类任务的实例是:车辆控制、碰撞预警、红绿灯警告、网上车辆诊断、道路湿滑检测等。 +> +> HPTs包括与驾驶相关的应用和可选的安全增强应用,这类应用程序对车辆而言是重要但不是必须的,拥有较高的执行优先级,例如实时路径规划和路况提醒等。这类应用允许出现延迟或卸载失败的情况,但不能影响CTs。该类任务的实例是:地图导航、平视显示器、视野增强、车辆传感等。 +> +> LPTs是一类为用户提供影音娱乐服务的应用程序,它的优先级较低,例如语音识别,它允许驾驶员发出各种声音命令,通过语音识别命令计算机做一些响应,而不会使驾驶员分心。该类任务的实例是:虚拟现实、语音识别、视频处理、在线游戏等。 +> +> HPTs和IPTs已经被部署到越来越多的车辆上,由于HPTs和LPTs不会涉及到安全,因此可以将其进行卸载,来提高资源的利用率。 + + + + + + + +### prompt\_论文润色 + +> 充当论文润色者(拿摘要部分举例) +> +> > 请你充当一名论文编辑专家,在论文评审的角度去修改以下论文,使其更加流畅,优美。下面是具体要求: +> +> 1. 能让读者快速获得文章的要点或精髓,让文章引人入胜;能让读者了解全文中的重要信息、分析和论点;帮助读者记住论文的要点 +> 2. 字数限制在 300 字以下 +> 3. 请你在摘要中明确指出您的模型和方法的创新点,强调您的贡献。 +> 4. 用简洁、明了的语言描述您的方法和结果,以便评审更容易理解论文 +> +> > 下文是论文的摘要部分,请你修改它: + + + + + + + + + +充当论文润色者(拿摘要部分举例) + +> 请你充当一名论文编辑专家,在论文评审的角度去修改以下论文,使其更加流畅,优美。下面是具体要求: + +1. 能让读者快速获得文章的要点或精髓,让文章引人入胜;能让读者了解全文中的重要信息、分析和论点;帮助读者记住论文的要点 +2. 字数限制在 300 字以下 +3. 请你在摘要中明确指出您的模型和方法的创新点,强调您的贡献。 +4. 用简洁、明了的语言描述您的方法和结果,以便评审更容易理解论文 + + + + + +#### 写研究进展 + +参考北大核心期刊,总结《车联网中的任务卸载算法》,写一篇5000字左右的专业学术论文,要求引用文献有中文和英文,不少于20篇. + +### 论文润色 + +润色指标: + +1 删除不必要的内容 +2 加强段落之间的过渡 +3 修正拼写和语法错误 +4 优化段落结构 +5 替换过时的词汇或短语 +6 增加更多的细节和具体内容 +7 澄清表达意思 +8 调整字母大小写规范 +9 提高段落可读性 +10 替换文章中的垃圾词语 + +通过模仿下面的的内容进行修改: diff --git a/_posts/API_software/2023-11-30-download-xiaohongshu.md b/_posts/API_software/2023-11-30-download-xiaohongshu.md new file mode 100644 index 0000000..7d98c44 --- /dev/null +++ b/_posts/API_software/2023-11-30-download-xiaohongshu.md @@ -0,0 +1,40 @@ +--- +layout: blog +banana: true +category: API_software +title: "如何批量下载小红书的图片" +date: 2023-11-30 14:58:22 +background: blue +tags: +- API_software +--- + +* content +{:toc} +### 如何批量下载小红书的图片 + +- 首先下载油猴插件 +- 其次安装该脚本[Picviewer CE+ (greasyfork.org)](https://greasyfork.org/zh-CN/scripts/24204-picviewer-ce) +- 使用脚本下载图片 + + + +### 脚本使用 + +- 打开连接 +- 按住`g` +- 右上角`命令`-`下载当前所有` + +快捷键 + +- 打开图库(加功能键为全局)9 +- 打开大图`a` +- 打开当前图片`C` +- 打开放大镜观察`m` +- 下载`d` + + + + + +![image-20231130210427811](assets/image-20231130210427811.png) diff --git a/_posts/API_software/2024-03-05-.md b/_posts/API_software/2024-03-05-.md new file mode 100644 index 0000000..bda9467 --- /dev/null +++ b/_posts/API_software/2024-03-05-.md @@ -0,0 +1,13 @@ +--- +layout: blog +banana: true +category: API_software +title: +date: 2024-03-05 15:02:16 +background: blue +tags: +- API_software +--- + +* content +{:toc} diff --git a/_posts/API_software/2024-03-05-md_plus_tuchuang.md b/_posts/API_software/2024-03-05-md_plus_tuchuang.md new file mode 100644 index 0000000..1c46a85 --- /dev/null +++ b/_posts/API_software/2024-03-05-md_plus_tuchuang.md @@ -0,0 +1,37 @@ +--- +layout: blog +banana: true +category: API_software +title: 图床 +date: 2024-03-05 14:48:37 +background: blue +tags: +- API_software +--- + +* content +{:toc} + + +[xlzy520/picgo-plugin-bilibili: 为 PicGo 开发的一款插件,新增了B站图床 图床。 使用用户动态的图片上传API。填写SESSDATA即可,获取方式在下面。 (github.com)](https://github.com/xlzy520/picgo-plugin-bilibili) + +- 找`cookie`中的 `SESSDATA` 还有 `bli_jct` 复制即可 + +![](https://i0.hdslb.com/bfs/article/be203733ece44d65d871fa2e780aed31327645612.png) + + + + + + + +#### 什么是node . js + +Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,用于构建快速、可扩展的网络应用。它**允许开发者使用 JavaScript 来编写服务器端的代码**,而不仅仅局限于浏览器端的脚本。Node.js 的特点包括: + +1. **事件驱动**: Node.js 使用基于事件驱动的非阻塞 I/O 模型,这意味着它可以处理大量并发连接而不需要为每个连接创建新的线程,从而提高了性能和扩展性。 +2. **跨平台**: Node.js 可以在多种操作系统上运行,包括 Windows、macOS 和各种 Linux 发行版。 +3. **轻量和高效**: Node.js 采用了 Chrome V8 引擎,具有快速的代码执行速度,同时也是相对较轻量的运行时环境。 +4. **丰富的模块库**: Node.js 提供了大量的内置模块和第三方模块,使得开发者可以方便地构建各种类型的应用程序,包括 Web 服务器、RESTful API、实时通讯应用等。 + +总之,Node.js 提供了一种高效、灵活的方式来构建服务器端的应用程序,使得开发者可以利用 JavaScript 的优势来开发各种类型的后端应用。 diff --git a/_posts/API_software/assets/254448537-0594e514-cba4-4179-a5ca-e3908874f1ca.png b/_posts/API_software/assets/254448537-0594e514-cba4-4179-a5ca-e3908874f1ca.png new file mode 100644 index 0000000000000000000000000000000000000000..c06083293d41a5c3d4f18896651abb83522d8b16 GIT binary patch literal 109217 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 z z%kWHMEvjM>p|_zO=%`qQU%8jz;ab`pvr3Tqow)rY0}Ar~Kbbi$wuyeaZ_lBlysYMR zyuP&P0uqDBjZu8U!55}!LXY4?bRXZjDGfNQ6z5kdl{4*Gz?w$~jL{*a$ltuS!~C6^ zu^y2g{P0T?cTTE9#zGrnXFT6vqhoX$qA@l&?FMAqO*l1%KefPUdh7fiMrb?)0HGsAL2oHMFSI~<$N(U3p2a)1gPlCr4W!#A9J z95s{BgEaqydlXaUoa|e^>#@)2Qkmfe@3VPyuTo~*M$p=RrbNDgx$tK~oDzXk7 z?$*ni8x*)t5nTrwY6*d7DtHW-H?cE!#r`w;dVhtg>2K4_6b$>3lhNtC{!qL76?QZ^ z(|Ym-r$!GZh2DXh^ktyZnd8SdrqVg^8Cn@ccB$yIFh$ZP?(_QeG!t<4rb8SR<%Sx_ zrt%Jq#dG8_<{E6H=^LX4Y^n&C+enHcA|26U`3cwtZCd_&YobGR#Lwo~Hd8hpq$bSN zqY+O0&iS=XtEXZS+9)1FNHf?p=L-h43|Ka?D?*I4?cjxFO+bo>oTWGRJzj zpa+k?%ARxLj)8|x^!l2o5n5NRvI^NI+nE&4&}0m0lk=BDTkP9vPujzBvi-DWq~!1> zDh(E`k*jyz-`2G>)XBrU%C07B6&iLcl-49WN(2X?hU6rxhHt*enE22vxIwhx!AiY# z3{}8xntcReyr=rX{WGL;ZY_mW9kp4Qs53U~yhC-SFtM)k6PqTc8)Q6bXiof7L@(w% zQP-!wq-UdC)YSNon10vDn@-M*VK`wFf>JBIH2bxsSKD1~N{#3@W0azUqUCh9dg!iI z2@ucRjzLIK;%@Y5263Yvbho~)WyWsgsRjnS(3#b@2J8y?m1=9-*W-noH0e<43=%w;d^NP~@T>jo3` zVz}*0=i85V-znm}Z!fam+{y~BESqTccoBB8&0?{mxDV0~D!+8ec6xI#FEhJ%T*Ljq z)poou$}jJf4fXtR(jC~|!YA`|`9JbJWrT)NJW`W3Mho+R#8NconQI1XM^^HuKiI;I zDrGxb5G(OVN>#6_B+9x%khG%b_IrtSRY$Z&JM4-jIyg@4iRFYKou<j{nQ4QybjM%>Wop0#8%G>#7B`sl&1(| zX`DkVe|V1s*BVvb) zA$OHSE!FuOX`oHD%WWF2;VHF2Wv3FV5pm{Wtp zHassTn7#PBD@P}38?Ms_1OnQR$%1y?(Z#8J^ zkCNGmTt>7jOq4l;d=X0c^9au@-acIxG@^Qe-LcmDT*?fWYZc2P@#`>g;x;a+pQab8 z%%mN4DQxmgMwLg;Aaw?o8;6YZFQ{=UKEt?@Z3vR2EeL*Zm3Sp_LxO0>V$did2_Az9 z3}52>{upMPK)2tx!CbPzfhbCBak^G;5MCI3!agBF_Gn4acxDmtS_Dk4bqUNZ%HI;*w2%8JzvVjTp@CbV>+A2O-C*g49XnT zvW?|9^QZY8?sMsRx%#IF$m-wDjgfKG#ViI@KR#du&L+6qJ$&UD;N$bF|>am6!nb zgvUMZW!C1RE4iKN^6jPpMKG$t0eWJ?7@J1^xCiZzF_mok@~XlJ=SSo0FguQ9{<;p=H5>&y$RJblK|#ETSF-|t za+2QY{M!4nab2&O8`$2p^L~H+-zU^U2|AK65y8iP8EYKvAkP?qBkg>}O=Pnw;kV}h$1WsTIpftcVb!8ml%d6=E{D|Ak7w+S zMA#ceqnP{i`l|;&hR%xL{}gcFV1abk-;ThV4U6$)XiKsjccY|3YYsp4ynk1t?P&sE zMwgKIBod)+y$*u=M_yeo!1`UuWcoF92$M%edaNHZ9=QyoBh~K?MdRF-IC) z@rPjY*NToQVLn&SNOGX>*%~mpa5CpzGG)#6alhPIxCyVE2+Lu^8>yTp7q^pMe_BX) zj`QURd2TaB@?z~SQs=^Afw~%J9ER+KrI0OI|LErMr%iW1I7cQi>h%U2(PAj=N1u0$ zE_mPS7u#b36GMNOjr-(rEnT1d1v3iSG~Qe(leopHTva{kyL;AUOn`|<$y~!Xj*b#z zpnuoyvLt(6rP7qN+hSWijxD^7(-td!k@BeYk{eT@G~xi>%FhZ~52b=J_aBbBpDEOJ zT%QQ7i`xwSA2FG5we`~2m5%E_$ImK#t>e^J9h4uugMW{fk9$MC!0{IB z@crrNko1%N;Sf;CTt~S{pR5~Qjn9CgBCLh#VMsyd!Z(@5FMdy;0;t3>xx_ke%q81?pYZSXl%`(=2CU-4 zhRH@M)azQ{gGyj!dJk2GtWzjmX0Lif4+u$iS}=9C@LpAlqh`P*PVISp;RC@(Q_TwZNr=`D8{nT4 zvd%sp81=DWwUbaacOFzVY!r!cXCUB(77%;s1D{ zocK?*J?lSChNn+yzJNO|aHl+dQ}y3=HRxSLBu_EsQ=tO9vj2DYcluZVZ)jGu2eJ!T zKM8||<$!t&DJ&=3f@I~To8-ZOX-WlvSQ8kcgUBJOUCXJA)9E)9Ww<%@142(1Af9G( zN&@63S@nY8r@_D*rcfU8h}8RjFxDmb4j%$n0Us1V2hz{Gp`4}PFF@|_zANkc_CLsN zl|y&Y+Cjk!SKh^!fv%etA&^BR1%eO(1^bGhwEA)I_&Nuq^ny^-RfsPI3dLwE;Sl7^ zbr1qXS^z|w22JbtUHx|M1$~M%gv#UHR-bg&qq8@=ArKSln+JcL3C%7Sz{E~%b80B! zU;!d0ryJXrUPB>^fq<4x0t(PanfD#y_H0>fpP_J;J~=7xJ&;rQ8;nHDK;rbp(yYgkaMK{yJ#3$>%}M z3YeQ)ezJfX;@zl>;{5vdshemUA2cM^iU|!C&*m_4YkKy{Kh*j z-#(4-2JEfT9Md?NYv82W;Xq00I}ONN5x7bJ6U@$U`$K74Ensq*3bb&5>(0d zp0cAi=(8X)Zy`zfA`b*QuO6EX$8S5^BxM7v4t(Ulpy0C_$6x;|U%Ltd`XCF7BoN=A z2*J@w5h*bKDgO=WiRJ;z`3qotpbPT46YBXksy^{qZpA#D4I@i^3^do~H+Y9J$fX0# zZ~35rdZ#Qr2ze}Cq+M*?Y&jTh<)2svHlzTE_cenu4^to&0#X{d%L7JAdVznZlh+SK zt|dN$>@vIC3eu47zze?2w_Wlb7{Z{3o`wBt6;!iXUpsO2Px;S@QkZOM! zbT!&W+VKD0Zf9t5MJEX095I_g;cZAF|;mY z6J;lq{C#T&4ug zkW(vz$jZc9xPu45=ib-Dnf3MB*LigP zH6Vp>#rst@85D!PUYp=q3=hUV?bFVlKWqbM$L2eLxD6k_gQAXIeo3#WPaRkso!>w} zqyCcg(HY|P9WVz6*#fMKDzIXEmu1sqAjg^XALu6r7;T!xW`pmWS-8_5a9g$;x+7Hg zM^%Qxeb*tesAzMF%p&j|O~d{sh}|leLXCnE{&cDbgy0K!@n7SC=CuDkaab=CuLB!J zVe~jVU{jF;=)k;Z)Zvg#DLyGI$@;rc5={Ky8?>XgC;4$297ZWDrecQ{Lbam^TR_Un zX}SMExNkkN%^M5?jgsrTn4O3F&kiasClV29_`!|h9%Tz_T@su_e}@3w>n;NxN|Cx6 zW{sPIpd{-StsKZGjV5aWO28Oq5oE6hlsHfhe$ZQEuCs>GJTYwZhZ9q}Ip*R_+%qBZ z&6$=o@{$eSuZ?>o_*l2`2vEtT;Y;9_;wKx7TfJWHuT95{VuM^&C2bd7)Jd?>@Q*g3 z&Vln0Ij!7DEaScfNtJhmGCJSty2d%1!<-@tAJVXGs_5M>N|$=dIQe^?I0I7V_0mrcAs(tY8S7M#5K z0UMa@;}eX_d53_2_Tjxbtz_?4>lVh4nQi^?`jI1QXJ#4gsiyru4UW(a{At1z^|#YB zSSy+bIK6)VKF?kdcxsk=HF6pPy`5M^_LSk_h#o(B4|toM^#Pk|LpvjO43ZX$x30Np z4JXXCfFb!Ud~C853_;z^v5?r-p9BeYCG1-Vodb}ddyYe&WL}p9U8TFDab?K=kBk2K z$-I@DDpxIiKv#_uEA_=80NQrX1!GoJiz5Ozct$ zYKZ5;!v>-6*r2F39m<#<_&Zd<`JBo^1m(e31{lX;-Wy%%^(x+nD(sEXqKjvVSh@%3 z*I9I6m{-C*)j1e8dq~PTJk@yvHPI&p;0w+vW08?LUGbWynA>dH!X|BQgcnPL+ zFNlN5vpz?4rYGi=Z#?fF`55nOg}9JCGY$C( zCG!nmNe2W7nC%@i%T}m&Fk5kFLOl6<%@M9nz9;infH!lL=Qh{h0-fn@)AYql}g$OdUHQuG;H*X5Qgep=P&joyJE4wA6gHZ3yN4XpXI$ zk%Vk@n^iL96nEP{li5qT9ua#sFKl15c5*RRlJG{%oJh2QPQjmo`f&XVj-{Q{ZHz*4 zVo6u96j; z|9(P!u5l)vbMG+#*i@WcwY z7|sl`rNFHwl0ygOch$l*(J3Yi>h6zFNd&gJ_loa-F=&sJ=bfVgJDp29q;?-_#%*KI z;SIB9z%&20O16}TPUlTC-4$TmazV}+0d^gvV#YdT~t9rCu*Vi)!eJ5rv z6%=aP`AO=d{W*$xV?!C~vC)Lgp1(O4?$Q>toYa>2smTR3qN48LHWjcbcrZu2v0J9i*whny`3qd$`nQEG~YeWvm6dzC$}@Y z((B=MK|J~L!K$j??18X9cIJMllsK~h6?Mly5G4b5?uVm30Xpy`RPG=E3(S?QQkyog%p#}>QTejleN@t=9qq(_r zbXgq*iA@8sUg~Z4w5VcR?y~0gJhw}zQe2Kg+e&Z04sOTJ{@J~xueA8J{P=TpNlSIs z_I&1mael3a@&Q_a7UQTwsakRy)nwXyH00kw#WYZ?hE$*+}^mNwRcs7i6XSnCQgnPN3RhUEFKI;{t?lAQrbNkA3`*>*c z_OTSDViVJ@pM-OF5;|nkryMKez8e>t(RnRpsB%J#PoMXMMKqWcr+|Cdm5==_bS;a9 z<72RLq~dU-g0){1yUpj{HKO5-xVO>;NpB5F6@`S-?bg`lP{iM&UQr{j{5FM=4E8HT zMq+FzyU?hi<fm`uJfeCH@VV;Gwdvg7LO7(gcq9cb3>8* z@-~Tt4Ra;PiR_!HKC_kS9i%1l9umdborEnZ!%{= z9!e6&arjJiN@yn_+EcA5G8q;h+l_Eegmb7~ilO(-O;7k#0a9P>$~=jOWe0;k1%-;9 zA>4U!ab-eeZ|vyWuZiu>7J^E48m*@`?R|m+*j_*Rd?v00W9wz}sCL@zvUiset*8L? z{<^q6>uPCO+Vr^K^uzY#xy}fkap5?+aNV7LXVo|AiY(VNDeYb!PQPl08_ml`JoR8e ziJeDw6uQ+4e>YQ99}tnt|M|h|Z`|~+V;X>y4QuW6rYn+ORs7jJ!$IHVO3_h65ivQA zp6~xFq=C&9uQtky|78q&tZ*Qd5MPagamKvVLL0*`#`aJtj!IDyJBG?}uo4uxh3irz zYW)QH#n=ZVxM`O^6NN1@CrRC;tPO_~bdBGxj0rQr(USQrG~>CUzu5cC&`Bz@w98$= z*+PSA7@a}Y@)ULZEZ)d859~WK462;&A}U;SW_XNaf)#T`b*dI|YmCgE{Pk0HE3Lg@ zs-tHT;&(Kq3r2!EycM+&-;tfOjMZF<%m^clx<-(ThbyYBGrMK;I8RsN^~R4INeL^* z?T)j)80A*oS!U4{%K}%-?8YC3Y^-an1lfi(=gD*JaCd?KshJ_3C|0tIETMCVi^4dc z=`(`DR0QKBZI=l;OeK%8&_+*m2guqfEgU#*Vnu6z?P2wz7cuNeB}Qz_un3RMmL=k^ zU0&A#oPX#T5TFY;v^Uz9>{ur_uM6T73|N>7a3n1pzY(I+8C9xMOmpw`I9bim!VO)H z@)%F0xBQga(WQ8}@B?{IR?1t0ys92?e^IP?Aihu!r+29q@l;X$P6{*k(QR1)a+qoI zGB*ixg*YNI&qr@Z`08{mD#aSRRkFfA`wad~WI7JPrti4Kv0}DU{UN=zCIL3KBuIl? z_eEi3j?xWLKnSx$OkH@?@6AD67KBCb&R$>CkWUt+?4%~rSsHI0i*YtQ8RAme$lMfy zTjP|DjaxI+X)h`n32gA-8rT1fF{-J5*1X}%AN~|8`XN&L*JKw**A;E#DEgvg1i>Qr z9np6#rOtXmFME~*F*C$4eR!5ooNza)5%=}JmCk>s_-Hy<0(a9NO6~Had+6%ygJA15 zYK~hCwyV4M6+|5-pVbObO6XTGu8KZSmSLi-2C)>BZ7hNh873KfB6XVF3_F_`rjU=0 zZZUcuYe-Ule!n8a!mz)>G9*E?mzmDBakan8_Ov^QekvEd`7roFE1~E-;_tAOjhxI zWANv=wM+?ggFA0%sFy7El{6X7zNvBxKg+u=QfkIHN1`pA z+Mh0jizMP*848|4J%GVwX2yS_zKeSz#h1+5J8!yTJ1nagXNC zqI%Nr5*M_}r0^SvMv>K-kDBEQK$jgx_f)AD`#hA1aqc*-&T&?q`H`1?o^Wl8)$YJt z6P1J->0;3s^lEMp7jM4?l#-I2TJ@ZFMdiS| zo6^aSi6|n|q%R&m8oc3wD(L$vjP?+mFBC3H5gV@A)QNUB3>0wuIgt($?!mPEf6jCy z8DAyDFJZ)lx|nl19mWbcF-y$7kt`j>@hu25&I^dB3R-1nN@r!#^k;n-p9{DdM)4CG z=jYGY+K(G&XtIQvqPB&^4LZ+o!fdWlmkjmh#nr$&!ELADGG|N-^%RZ(0NQXs*@X`mhQKg8!Pp0U;+-N|Cm29{8(IY8kwXS<8oIoz- zy_7zDDTf))dQ?#1J!BXUf{nP8#bPlu@tGGE5E?-BTdx|56X}Pl{xpIZYH4zY0CA!Jq$w$Q1SZ=Q)1&pZ{p-B!I~}6j%AbTx$QS z$&&xeyIgrL`mYxUde`UO|IZgp@AJe@2iQ~X-aJ2EP17>5pQ?Ee z&A=PV^>Y)z_%nNF`hu#gC9sz_`{K<#zg%DFFGvQb@=L!mM_urhl zdPi(Wi;!9nwEhTo7On|7_=4ig^pBzLrzTK)y4=jS0C|)l=jZAsdA za=B^;s1md|pbGm9#@26KrGKW|t$4HvL%*Z>KsGEKv_L*YDsI%(g8i(iG5?+i#DsF6 zHlv1|96`fLzmkV5MX&dcoo%W-SwEqHE1!)=jV;IvoHX5RA&(@FcD{ldD8*(7cPJf; z*=$}UfRCGIB} zYdyN|3UPZ{ycww^IOcKy7xzK|buCfj4l0?jPEfpS0xZ&tJ2jMDCp9i_A+u^r1>idb zs$_eiWWQ6FbMP@#*B-M8Rcf3@Uit%rxMi*psJ0m^c0dL|+S1s}+@oJdSoq*}h)W1c zuLc0R;6v#DN=twk;F5ud36#5_gR16KumC=Lt9WkzASgKV=+eh{T z!R#lqFb4)$PTX*7z%^WQQVCqaw;o>@)}2&6?%%AQ#Fc`v)M;Zbof8T454I8r02uIj zqgDK)3*PBLZn;g7`K+w zQy?_Vd-<%bNDbom+^oB{D^&YaT@yFf7t6jq@s4yH{LW5hXe3I-deWu08xWC%AdHNs zgG=-7XfuDuHXzfRE!kMlE-}2>cq}*PJ0h(3<^(Fj0yT|AN&m#sw!9e``;SQKnbkgL zlP3e%TT6ALbClQSv2AQ{gSb^~@o#x8T<6J~AfS09=^i(A6rkPz5sPv!Q8xa15*XCW z^ZMCSUAg)ewsWUdoRAa~f3KSpr@&1uc*=#FQFJ`*H=(_A203qzu7xdp>lA2QGq|t; z0pcLjkV8W=Zw9Kd*=+q4C1}L)Z0q}Z7nhw-G8yYIlX|H4a#fM-J>>Q0jl;fxt^;o~ zhIxg6%N4ai97qM6&a^iR(JMBnzx-Awq&zKv8=lkA1JDjyevw2;8=abDxQTw!K>rOX z_MHZO0WX88=K{gLx86$JhG!7ILCso(ml!Uk%%|K`b|;-Qx~1Wtj?Fb8Oopxm7mE{B zWA#8E%@m=epodBm2zZpcrA4EP3W~%9gT| zjFDnk_gsGf+IhXDG3@PPD>L5ngwaLwuM@1Djh;S&CIItZ5l^5$Xy^~xFwC_B(7Mx+ zd0>fPP=_#0&M_BSw4xvZR9mYJI|v~bt|R^ec%bE!Z#-E&$tzv;qyjjO(^2C^^b$%+ zi=ALK?+YlZvPn=}bi?RzvZwQ)E1@R>)OCTh+c_DOh6NiTd-da%$NTT#w*O{kPGS;d zB|80h8G2j3Wi@2ZH>)x@r(a4ZA@VA=;j{NYGJ8=MIljeANv2B3m2t%|iik4+xe$j~ z@iybs?9PCxvYj0cW^{@(Y`vil-?IaC*W3{K#E_R06N(MTWD2JWw)~lI$RZ+uCsAOV z1WyPy^N+mkGN|?oK9V0q;rOgOW2^qgonfDjRuPL9S~I>3_@up->lbZQhOxgz+Er+< zNw;p_$!8vl#H}M_2m4~US;)@lf4Dio-#2(tTS$fAIp<{0H~$cd=X`*93bj5x zEkN!m%j3n^`(Q9zohl)mGs?E6qaLBx;wGJZ5f#eL>1CZwlH$+=oA6>)8VrVrPv>Xr zpyyU~X7B3^E-2M1_%Ck)-R?~jYTJZOpb+2DQz(@b2-34y)$B|bE{@DOKEdif!b#aG z!DE6gJwDJ?%MFJ)54y!N64;amtLK{o<7*IDuOsRx+>xbox8E1!Y;AKwmBoQ?%Suvc zYRY@2+3J?kmq!;Ad$w}2qwqE+JD#@vTh#t5pJdfe&MU&&jhof;uQu#j?DF;&!SQAC z2&2uks{dyGF)2wsTe7J2>ORE$-ij2Rz+^CTT;)YFcS_jhX?m`<|FJLKdZt;=Vd}TP zu7>UD_d<$eDNt9?-;8FzF=#)rC7X|^fQX!`CLoWO4Kk?8&Go3?Uz!8behE(NiV|&% zo^=m3`grD~YaEHwysPQNPvj1zI=ixwp0MyFO`)2F;MJIq%B);?t43^@P?L%uxzc1x zXpVpeikjm~r5WR|`HFeSG?j7Lj37EKAkq)q|@kx&SJzK4Ubo**n)*SB;_gx zIZ7WS-=1`lcPttdB+QxqM7sw?3+)D?8ya?vrx3yhHM^1ttQU#8S0%`sL(fM3dMHcn zU=XYFGib~QSeSTr>fP%wBn>wl*pja-a`0X%A8D*H?nd}WEEOE76pNto=v&yWy=fGI zd7q!ST>A~(^V_~#azm->W`Wp0F%#{(IDQV)xA_)F6zW9neX$`zJ1X6qDt`at@JG-C z`kc&SBGGBIVx%%|2Zh#NF%uZ(Kk=amdYW{&YA1KcSAUjr^xDnqbmtH* zj=463rziGH2W+HeUQ$Y_LPltnJfR7;xdGUI-53kepkm2-ZykH--jB36nfw}oy(-oBYlwLGl40b7EhQ`w&PWg; zIV!#WiG$--$cnB7wfT^W1q&*_GiU#}+ryK$YB_f$b#|B@_lLxZVXW5qA?SB}vtD|6 zM3z;0t5gS@ebU-2O;ztgz)Q4z-q!jleEwdqQC$qn6M6V^I@H*+2JXApDz7M`lfP4* zq(4qVJ}dg{iS9xf{;anu59;5q*<7yQ@bur<+~1bT_I>lRa^JI0F0j0MZ~5R(_NM7% z5Z{H{L7pv#I<%3v9W7Uuu+DQ=nX8{4f6KO8_9Ruu$j$e8!|#&n?J(@82I@3=+`b@C z7h<6{C!OgTlB6a-0Tdpo9A||y39IR(0y{+A#l!RM6?H*n`X?oUm3nT30-wmeuW9BS ziiH>6FL=r~2-x~E?&hA}#`-MwznLOZmeNeE5{d&3t)A`-!j)h)#LC~vElFZkkLyWl z;tvn_3K>|*n_MU&Ng}7s;HJbzMDN&5te30L(UQE}y`1o@-!n|&TDTqR{zR4Ilyknp z$g#lBI|!F>gEsq_g)2RIDBhnTbm6{ZCSffG;d<`8NnC{(7KdXnXP?q%n| zTRhL7G9#6ufN=CYI>ug-KG&v72RT-3z^GV9L-UkVd!+^&s1)IO?nog^{RrQV&<)?2 z6Dhg+hx~kdE8*gei^SSvd=i{`So^T1V`W+zgK%FLT{O+PNJ)eunozpGkGzYO>b^`) zB%{y1G+Y)L`AiuuHGzFUtahBheyvJ{zstz6)4+8kc@^)lEKP_ANDDef z{IT37mr}K$N5NX_$#IsM%bDI+@je5ID#e)}T z@#X6p>ofy2Y9x2%*}0yORCSm{D(R7X`jHr`cIQ8OKG_)sXVrNrQy=)o-Sb$0q)b&(-Vc^b2>c{2mIvxH_q1|VMz+co>e(P+Bfm(686p7~Sp-#NqFk3S z=R^=!x8CIKE&1@D*{_a@{+VAy`fnmEf-m0NGTlDv9T zEPW==CI1(76tTmGwgp$-=&p(ponkOsHcci?!^HUYZvyt%2z4RYZ|4o1OIfc~%AI_j zgNr&({4+Y--|leDhcW759LiEZ$T(%A-f}4r;J!aC66p7%8*UN$t2szAIc{i}d6JG) z643`atPB@T?IOlIRZ`~EIN*!~cKa74pOZP?lcU<1&^ZmeL7*jkK*-?W@A2ULqn&$4 z#b_jKlKL^>BGOGE6kgLq)7ByB$tESg$X9J@#wfHEf*Y_Wxc_yY=7029+@Q{P*ObWz zn?>>1w7BtLx_ZTJX!^pq1jGDpw(UTe$<;r-*CT^<9hld`_lDRg)|V^`aXPyr6PJD5 zJJzt=l*mYU7kne?uSKR@!g)32WS!gP{5x%Q!o-4q9?xRzL=WHYB>%G92s4t+B^6}*t-T5P>3Ua=|U?O_q8MwCnT z52BiCosKD9o(nqk0vqqR*3k5Rd4;Fc*}oMXPd&`uRQ+%|?zwDO+-~Dv*m5*y z5`Gj@t-Lf2beA)OYM*LVWyLSRAVoaqFIg_1(@9#nmLZt;i%A;vvtA-n_X*5V!5z9x zx5V(o``7F2%qTTzK6CJL-n<6o!TJJu*JXZXhy1ls0sC>xgl{V?!_$MC#OkREa|)ad zci*$fJa1WC>XcKaz$Vgxq5df2RrenBiYTw!+%)fbt!maI?9QX|ainhigQ~-$ zY+5WflY0Rj7atvar8ki!K{_JIN=0eKW{F$-;(JYQSUXSlx)S*wXo zF@AM&DZwSa>Wh*~e4`aLQOBdQdVI=Qb!~uSZOhESVOiN*V%b)*A!)u7BBnBGvmZ$j zfux;mY`3**x>w}py-)Iu@GfKaet(AGR>ZjftRL-QR*&btIbCqKeph{e*f$kJog&1d zM;e9P<;#9vMq!PtqZnEht#v_87>e!xwUF zkn(LjbcGtJ;L8qi@h8_{6n7&p+mKe*Z_8M0Ip3bA;5-rj_J2gs~)+ZiEf z&j|7kepma;3Rp00Zwd|dUPX!p|F5(Xkv*^vFbODK*Yr zIRfC6HXkW5jKaOYq&}0fMOhIOY-&4%@M{snn#X0gV%iX`8V;x&mKwu9t1yz-zgOm& zKHxwcA*!m#o4+WR3t}QZX0vVc!$>g16}#}dFJ%pG5cq|qhMvpIJo0JO03stZ5)hOk zZrX4Tpz;KyeRB7IX`k=^hM?>j1Rx(t7>P0ybs))Qf!3qjiO^f8hJo=s2DNXm!z8c0 z7cPw@&th7N123J&lco?A6CrS>!=YxEeEx!M&p? zdNvCgkc{wq0%&ITodXZ!Y3MW|7{yNqoCIkWa?F~Z^IrPv@eV2$+^mJ*SUK5au{!-q zIdQt-aWagBT+p5z%16eU)(3+RDdmaQqzU}n-B3J+R2?s?cD606s zIhl`b_3F!1zCeir=Of|$>N0*0hd9PTuxO}hbNt9UIu!t5LGDr{z^`c<{k<><-sG9Q zyLs!%?7l2#{6XOu2yQThNMGiB>C1idP~C(+&R}3N_T-F8`47ONY+Qaxkc@OB4C$BWhjbSB|eq2Z`@`$bXN&%qte=8ay*m&JQ2GTZR+7l zr~F$WBVbrPN1rA607*&l2Z=yVVpdnW!f{F>Hn-7(OxKY{Jp>UOdK^k^fdI;U(ICfp zoQFA%!s+Q?=6}=3kLBb_6z!AR7a?;X5nWP#tzwG*+q*UC$3i_C?> z#%$VPXk-{z)x%heE`Ax?R!03^F>Hn?59g$_enSK&fZTD>b|#RUETA?AG+&^YkPsPG z9_F^?BrU4qJ*4tXvmB-B)Op**s?$#eF~=bcHe`|`M)~k61a_oR;3Bg-G99)P`L;VU zV5Dr=)he_?GEMxxz-((NCSC@MtC&@GGSM1B+12E&dwPSvd7qs*EMttF&PWvNtmQW^ zC-%4+b4h2ry=ty1fTk@$+Zt)tz_0E4?BM2p@PeyjgCbE{`@#9CYH~uV6lfv28qsKX z%x*p>e&l8nXG(cu$`|Jz3&HJ4agErgrk8DzUsWG;wedANU4ef8Jc&60C1(PjuyL-Z zkk)ek+FJNgb3(w6z}J;XthP*?dug*>sBpdEKv>n!w-X&c?o`%B(yFql2)c-e5$8#CU|LaIih5@uH9?qiL)(L&PFh-;~5iVNbljyOPgGdpwhh= x(03ycR{JyClT42d2N2YUz*B-((Kgm_vd9~P;9?EhLQ@1jj&`oLb=E1Vp6wULzevK)Ol$Szcc5~J#**2GfYV4&AWH@-fQh=J?mNf!)r|ys+)kDmo8nRQhlkY zbLrAmi%XX-BPqy8pD2z~Q<7dTd+MmjU#c8o-6g%bW-F&5cj;110_C~Yb<+DAZZC~J zFI{5bzWBSWs>6l4bg9@#RZ&jQ&jPW01FG-cMkH1#V9YUp z$|%nf2?s5)L}SNw+b=6^kP*BT1`d<{6Cf%BGo7t;!69%;o>EcQDH&Sy%M4X8GrOzc zz*+CQ;k>|$p7rob`;8alki@TRAwI*S%Nj6({ydeb1^B=pj$6zH9(&%awBn1~brl?O zS78ly@~WEuYMXT+aEcbs4@87-wVXg!Tj+TWnxq~QWHT1`+XD%&Ut-l37>M3I2}^UE z@gEKf)dLVW`q<&r(w0QCD!~QccFa{w8H>xOg9^IUwDas!Sf-16D-ClVO!#6rW8}jb z<7(Ln*qh>8o%Z9baJH`jVB^(~t3gA~2brtwA}#PG4s!N_O9r-jA_rhgHLt1=YN@}U zyU?C0R2F(0%KL3#uc`)D3oQFVEJ%X4#ZYScS{1bON1K^1UT~R4favb!n(cO4{L%bm zvdlEhg&RbBF>NV2MyNAgT?PEUU|j4$#WSyj<>k?;Q~OGkQuxmM@n|KC$)@QEG8mJz zv>Z7Bh&j#zWADg3Y=I*96T@LBM1B4T%t6m)5P` z4Bx~u5kLINuI5&Bb2G*vbppqCje*gY+P!sLb{hlM3mYO@ie{< zD^~Z&>R$%9S8c^D_re&ki^&;*!;k1l!6jgd^NDEI61 zk@XBoO47~ z)zPh&0_5?;87*|btBt`~=XAQua6t4}`l0Err5E>!JyTg$AGgr`mz&Afo zgQH^C+sx_fYXzm+mxUv{c}Ys|Uv-@o=nqPa)+Kq0DUn(S#PL`#OUn1edY7iUq29l? zE%Vzl&Mk<&3qOU{BWSDq3eEdsFSA&DB|1!66Eg!U1h~vQ8udhDZqBW+uMXh}G~iF9 zQMc%e#oUlNo%$r!`B80(`YIWA(Hg-$#z0-m=R zvZyY8y18QUKt&OwHq=6$abaa_-ppnXG)!n;0^Io$bgmkuls&js70^$oSK55vjZJmW z;w?&TVTEJ|s>SCiH_fhv9k&N)X1=&0iCs@J*(r@lRy+McZkl`Bf_nX2~hKY({g_ z;w1U*w~wTTs#=fZ7nl0btPIQQ2CAq*x~2~IlWBJlI`o5QGl76HBsqzBMoPYJ8gP)( z0LB_8e89s#}$(KLt@E6L)$d-?d-He`fq#d&sV z`Mx8^ZjkKn`Bjp|ayCqqgc}A%edSZ_yzgv0&(NSVvIe;4z1X9m*xVWWO`iU7$ws2c zHzl*@ow1{m80fKXxP~7a!zlhxt8%bmc%F=Scyes&%~9`(O0vlHiK}q4JL9sNRq5XO zPzUlGmqBAU4?0U|^v#}gMj%>8S6uq;k+)pN;~M8ds<;L-pYj5H_COu%VzE0EmaZv1 zs85m;eN{m|E94{a%9g^S;oLyB;&O}Z^{RSjOSMRXM;PPAdejzh>$g^;iR{Yp-fB~E zIjw@5)nha^;He^hw6Yzt)mA(6XjJw`OQ6H#QG2^zO(41%uAXCP5a(vRcNYs;xE6pJHT--ja1qnju zPhI9~T05Gn>4TUUtYBb7+b|lnEXp)4XBmf3gzwz<=q6mIyyf%0*G;Pq%+MXNA%7qD ze=v=X7QjqlhB6|tEF{3&OOVAXR3PkHgUS7$w=Z=m%UZo3eMxEVrF6ak%Z0a|3ctV3 z!FQty9_$BHpxA7fJ>M_2(=@%M4pP_ar3m$Md~5!kCLz}gZf#ymc3D^{@|#5)B;KXL zK%>EeG>ipi*)1E>%w)4`rl%%f(PP~ou8RLY-Oi;wO7$cT`&!lQiKI#be=NDYkD_%y zO$gZt2^rRMJYtThEVmk+&$VAZ@6tYhOQ zXn@L_ki&G< zS1UAqV__favI{nb>&$zCg1zMq)_MXpTaa1@X^SD5{^jA75g@|E{D(#E%Bk8Yztv#$ z$|4nedl48}V4bn~JY@fH>-ze~7Xj_e)|s(*0v ziJm^HR8QwRcRX3ZLdT_(ytV01_#R6t`}J7FZT3%Lv$vQtmhL6fdiEp;CLE-OfV*a? zU{HY?s~iUCHtfuyY#hIlbj7^n4^tIK1Q*p5t=RdoUZXtJmD}8KNXCM1sRu*3{A6?Q zt^TIpeUcBK9$eI*OC_sP13kLf)_D<6o5&tCr!Tx5EzL={bd>!ei6^uoCzqhjOC`cU}oKqNB3 z)+LtI_>{bPI3vfO#q=Oj_+WzN4~p@8H3LT}85Wypc(Io;#9@SjvN6-1K|Q>#Yd3AY zcQ>CE*G4Wg4q091k*=h8<7NDc(mZPRPAy+hDqYL1+5MX}n)a#nChBMAZ|W7S86VlU zNvbQA-R<&Ag6Fy}PJceeb{zh4*O=A5E<|!qB?ikQhZ{j9B(R(JGwOMq4&Wz?#FGlc#i5bY~of=OQVOVSuKWmFQt2uhn07VzOZ`) zozy^qfSwNXa`DQ(h1~;nTA;5$m`z0IKr+&`4sQ&iluxbJzN~OhJT>=w%TsOxa@!LaTHiF2EWT{d8 zqE%R&rq2Xe@{%feqpx~Wo-r=W>=w~+EEvs}bT%I$a7D9F*Tin~7;7dA4B@aD+1&_g z8_`4LQ9c8+GleF*Dfhpjy&bR1Q~R=1LdQEUceLT{K+?{PWW%|K9H~DuT9IUerBote zNu_*IWZ$y8yGQFUvv%OzENEA=X1iPeSWJaEYv!kUf@%deC|g>3Mz25fI^AF`D?r&? z&b0oKhHFad(5FP4G`k;eeUlXRaatVIRZ*P&XdU{&Qt7(z04YL2lX_CX?Yx$l_#jH9 z(IjwZ9jMZnp{?|3&knwSfdx08kOB<-h)}v(WzZ&TGFJ3kQ?9qbt<~42n^~^Sv43&E zbK#b06U;%TO5;Zr>pBBno$%VbE#|j<=C|!1&;TgS^o(nHl=Qw&bTLZ2!%E8sn00xlto z8!rEBQc&ROWp~MzYJlwxyIXLXkW&p!a^)sHkoac<86;?Ey&!N++ON^v)H|_kJ1bw! zZHY_Y?KrC_Msb!W6q{F|lE60J=EZAJ{_;GVy3u?AT@h8Gz94*q zyrxto;|abMI5*~6vL^g{gpp#2GVD)jtS{Cl50ruPPUaS5I%>6(Ejl z-RZU~>@1@=p|+SVHAG!W#nuZ(QD7(;1=MauC%kHd{kHpZ(Y$f#ABUF@KDd6iw}ews zMWjh9cusz{m2d}WY<hUhAu2_^zzG*h26;B24eF??{IbJfFmEnY$ zz8cHP;l`!yt7>eJ+&Z#lAw7e^8+TJ{E1eHNY)U`zvhj{fJ#v%Qj}-(_XrCk2ki(Ct zmw*93o5N+@ExpS4yTCd-d6X6M7mSKt83`e6O7CXKsoG^7Rk$~&asn3ggpNX}%~y^@ zl6=^oa<%BQT~Sey0scrcQYkfd*W+c5%JMw)qt?IAb9epc_1ejn$3OJ*m_ifo_u(FK zq>w=AMwwEo-XMu?Fz>eb6ApWHjjxOTdp7L$=xD}znXTEMP@&OPYQjo{x$Zn{i#o-9 zj)PpKkz`hiJcize3ay$tCJLEk&lu+mt;{QQ;Pd8PP72h zOb>^WyoMhYcn{~Z+-Ll36F6yPQ;fkL56;KyaoEwOCwWz_W&19r%>~!TctQtv(F2TE zZq4SvzdX)kF;A*?G-tb4QpU0W3>&<;Bpme%3Go*Pa=t@am>SC5lI@#iwhb0OLB7l~ zN4~mnKmbuvpt2kBxBM7fY6VZhZx|96|FBkg06Mn6)I8dD2%>Kg_+H-|lH(bDq~?gV zy-wfdg0yIRI{J0Uvz>MEbKU?2h{`MD(r?wFAcGSZ4Lz%L zC(w_^7~C&!1&|5yXh!7ekapQpDV+LdUf|x(1b0Ht-Q|X=DMsa}o4yM*|Lmdh8F3DF z;ZLR>6fgm_Nc>bxD|j&c07%>nt7Tb)hUn|&%c?h4n(ujpsE~*mf4AVO@=jq2Mpil{ zr#{Xw#`GsITT?oG7M=GXyUU9RQ4huWz2tiQ5S6NXgWsq_xZw&S`|tDOEny4l_MaCV zkt(ZGep+h41&cQ2CE*V+m=^JywYBG{PFqaAIgwQ8s{9YRg)5bRiVH^XGoCx|-FfFQ zE?Qnk(U@!{^uYn`&cBj;>4?Oc{>ZgLOiB;i?U8*62>|Z+X zwtZQtHq`~JB8|Vu{~X8n-=hl`*K#%T7Hx2g(8zKAi=TY^wyLiFe{hJ26I0W#|LxfS zA;I|HYy7{(RsR3^sDBw$e$EN|a$_6~CIPeR%N~UKKAHRc_HMt}oaNQVab=d41Se?C zUhRNNUNh&!Jc-(PSyT&o;?~ysuA(a~Muba#?wz@qd*s zjV~>j;tyI~{wUD2X8SG(XXrM=+9dj9j`~4MVvB!A%(gRKn}>r@>(MTY&NxNSk2RK^ z^1jnrRqm4+Gp>K-$j|)CkxTwy-!{m~!s=-E3j6{4X$;F47-#1K0TQ>gF=a%&w{g{g z&JbpEuI2EDsadWw#9b!fZ_M@&+z2LQt#SQZw(sCcP`6JY;-u&6;#rjzaB~Gr#MiEf z-@v6h)1`aeN{Ky)L{=EHEYscIWtC7#73)=IalSj8sN79#dP1YgJAc3vDc1Xm`Ps5d zYp_VhBmfbGd$_v#7v`q1?krwnHrxX6c)@2}%hh7o{GT*61NqE9mdP{QIy>W1Rss2V zpuat`y1GTchq*QpTQ*c&_TBpwJspuGKh|PADr=ZLT4U3W%mFr$Xl-?oM$xYM+bZmP z)X%Z^F+(?q_lEh&z@Mp^g1^A%tWF31-OI1yR;9aNLhM$d!*-!kmnI%uBCh=#Ze&?gjXkYElA&6rGN7mX&_z-wMVLcag zJZZ3Awy>sOb|4`FP(k>9lR`}CE{PL1!|YtPLjG>@E@?_3b~L5eb;q;38TbQ+@v9o* zt>M&X5sS9S1Qk!-Ok+xZlgVpvkeQ~?7k@2MwI9e(MPFTeVdNvZbXG&+2oyD9N z6b?whJY#Rsx7F@IGH7P0`FK#0x)zN&TU%rV{jmt~uf+8TR+dQyr7jTmHX++)f-HzJ z!b+ek3ea zU6qA%l?~$34|bCI`1%jiD_z8)<$myyLF;QhRBeY|ENu=$dnuI#vOHwAjYuFLZ~L=^ z+GAPPC!W-0h#UaLHa1H*4hnyejeU5Oy%B;Uw(rHuo)z1<*sO%$oPAN>qYYV^kj-!l z%rFtTv11X^V1)M2Yt7*>h1cU>brZHtUA)2Bhl(Oa_4WASc7a02*-GatmL>SETH_Z_ z3K=fL?sn~`w+Crz#K-C^0{47}+@P;=33gsp0T4}ep(>#3{LggRa;#uG)37SUyUM}_ zksK$!((k;|a7y_S7nq9%o~521FaFi3hMgGiBVDoL&5u(FxfPKlG$6kp(}r<9J$ibp zW1oh=ejw@*0b^HN5c4O3(jCIbdix&)C78I@HJQ{8uqX|O8y2#R0y33|PZ!uzO!j{} zuq^l!XbpHOF1rk6q5YbN^js8xsye7E>w6?T--+*=9d*?`JXV>;q124gOEmAr`<{Xu~OgzUlxa@tp zX|K~??JOVuJb_z1{mjjT1f}H6E3h8puYYi`o*jb-8?)=M%9bwY)hYy|$~9Cg!LO0# zojV?aOg9==rM&7t^JLfCO5)aht>>*fJ}XWO?At521IHGkf$k=8%1*P++;_R*kKmpC zp)iM@ZWkS);RQnf*>WwWa{35>%N9Io=X>_OY-*J`1e2Tw)RrJ!MyXUU;Rg>F;^v)>}Y^AD)l;iGKqV?OeR~X^Qb1J;e75?479e zE^5E7U$(M=KXUt?;)lLRV;9}g(Gk7JqQKU{XiiGiR7?NYrS9xxc};3p8t!=-SJlAp zaueoNhZLEtSquYTdA$0IgtY~pOkW?*n(2$J5whbbF)Qq%>kBq|VuOmWd6Z>#h$Pg~ zBNZFfVxzynWbyT;4G#L5C~JzB3F4wIm=)Y+1z_he%9@|W?@-yVqKh+$hXPHopN^C; zUF8fjoTC8O?YhqDYRPOV$FqI~JbXml)v7dYbaD9^bDQ7Fj0_O`vGh7H$BZK+0T~AfnK(Y88 z+UL&CQ_N~wCEz!0j-Moc+)jCCp22&HpU>;tCfJI0^6rWj0!TTVV=&}dozUO@DV*sE zb*+!yf{&`h%gXMWuGzM&~oy-2j}KBL8}bI4;tj+H0})#3)Ko5r!E{`Fa}bK}z7kBPg~ zQMUzrb4E)HW@@Z*M?H^xyc=jUy!n3eI@<3yJ)ji1Vm) zsb*oR9RyJ)4~?vp?z=iIESqk<{s`E@7r>R-=GqJ{A39yu($PeHY(>L~h;Dc|%`2B_ zBXR#0HU{&<+9;oeM&i~>lj!)nP`r$_H2TKH{q%^{N({DB447M9eFe_lG_zmjLv0B(jw^NO za|}6{jTE?~*S;~tn&V3kf@9$+o6*4bF5gpL{ZmR<&4;pwSp9%sQBJu`VLB_vb-z+I zsN~RcezK|etP4W~j|erJ>~cnz@d~<|QO=`cLV7Q{H@PZ~m}|j8hvO*@hpic0OSb;u zhB{YAuZ%H{5};D&AOd&B;-`<4R4RZ;)zv@g4rA{`e-7CP^@MBdeC{VDoE?y(wZF9$ z4ZG_PQf4j{xwEd$z%u=cs@`&YSG|(7<$1f8#ZY{lwW-g;q|egTWpgXioJza&O$sD_ z>!sATL==s*8yHxvzSNT*)JHr&@D(@&Djb%+HRB&Sd}<8is0JmKA7WOmT5bG=T7R1Bj*C5C;Ond0e5^r#?&u5Sh>K7m9Z;8tyc9OG= zv7#+E0U{o#yx>HG7&}GMPP~<6O;>yDd~~hKf$QEc)gxAE$cXV(nzz@hBwEby`x%aS zpG$GRXMg(2G@(VJpAzqOOmI<6p+~*LYeS9$cx`M!AWca*Y zwBaKMaEO#TJn(^NLO~_te7tyTTkv@|uo}X*?r(Iy-ir72ZOKoN<`h2vaSskLYhXC2 zgLan9m}jVoW_`SAvE`G^JN<&6{{F<&Q$PKdTlPnlo}!(x!FE?4pW{;vgSJv=J*IA} zVEwnKb7<3N+!99N66y<#(;}$NL78o}C*J#{@6G!ZE6&&&^$1p&xJ>`WO3v*$+=i;% zAhN%WEGzFjLZ7{u*uAvph`KpCtK8(=oui=Y=c1GO&=EMFUVkX4o(zHA1F9m!brNiE zEOH{noWm0k&ws5}=^2Ugy{Yd-zdl~muTZ{e;a};RGIO8mFiYs=;gYT~PB&{D^#`57;~yOd?B70hnJnbkFMHGF)PgJ?rc>$9GDf{S+2} zJS5w=9eUMt&XQ^RT%j6R*%pZLh`#4hy{eU^7)VSZUrsZ1O2nA}jA20kG{MnB03#dC zI{RD!ofjg(cY(cKy3Zd#3HDuaHyr>@K(f1>buGq`Nh<)_IH%1W z+hM)4q12Nh^C1w^VC6SH79L+k`m_Na-7G2H8`O_kmM*DwKH<|ph9-n~&8Dq&A04U0 zA4h~7mJv^ex>Fe9*#fYMJ88#{yt_)h4}ocV^X=Z_;^($Hr&l_wX1?>**OL{#CCm#= z4}poJ5ou#63=FmbAD4;5zobu00_UufkEmM{O&jKTI-HJCC+F+KU56=NF2)np#P!1t zcQh$;gc?0v@fCD0BJSDq7-dLsroZzw%9|T|T2~HTTwb*-=YE6KgZn4+;hx79-;} z<3Cn9_+NcnNRflKf#64f6I&YSsX)Ir`X3Mqw}xB@jGXp%r#j^_YId>2+(w9i^HM-S z@ZlSn^o+ok`r>FX8uTpifNPzpNCUUvScQYQ*j|`N1ZRlV#`JYUamwTl*kK!#Z#trp z69iVWO71|TYi$T?1y;WK;MWfR{6G7&<>Dw4qD@_J6}j!0>{xtDMCzk> z*RI=px+BP!Y`5-QB|J|(CU4FFbLz#~MI2K}#MMBtX&Gb|ce;EgtUvkn3L*7!k^olK zy?)IW=G7e}#e=Tw+r#-!P`_pGSzO=5h?H;x#mDa^2Kp4{PU3sD>3wyhGDwX50!5%m zOfs6L>igk&O+p2Wx8Ok)ICz1)ROA+?RYF~EbBxe>`enuqtM`bJ_IJy*@?xXBk#Jh3 z4WnGnn&G*$3mHy^E}(nqIPfz=d=gq?<+F*#w{1z#xkY;5IbppLc$RC5F~Nw(ZgTys zC4yI59=9}(Z1lKdy_3#1%zPI7{pXvt`*D&BBGtsN3{3J~TaEYc5JofEvmd~geHPDh zx2lQx7{D-G3csD$N&+8@>O zk9rQ(QM9lW|8b%At(jFtOh%PyhoJq$sgbeYfv?~xWYJ--!lW(URj?gApKvZo+p_e7I49Aj`qho8;xsk$b88+RJ#-7O8PN`!t2`gnY~f)*Mr$Oco>kiobjry zQKNF;Cm^dr^uhY-P+ET0dneNL+f~rZ8*+0rnR!huOz46ya5I4j9u*3KE2KHReVVS}D74ZzKCnIJ{Epz!bg4Nf7YGw4zF{O$)T|zi4u@+KL@~b`j7Y>)t6l()X<7 zO8vn#Q>QYsPIP@vG@OGlKnL;Qx5Q^!=Tk=P((*8(f~Otu_u4q2$e(b!4HK3+kQgKK z^?8np6GO(?D2=&435q!$5?joiJoi$)FH-YF!|}zB5Ri^w)`^nBH9=}7$2nc?C-ffW zW%O{N!e9lhhAT52e0|xzgiiKf3?D1ccBcu9e_g?WHTz`t=N+31)OvXmFK(!=;|`N? zUgE!xA0zsP8trq31*L}6XT{4tqUOc)B&HikF;@c7jJ64zZ-pH4`OO$J_~E+HURb}U zvs539dGKtezx^IS!i}7md{Zw6=oXRVCmO%L)cH90(51kBKl59`>|4C{+VPDi-{eym ziv48PbAck)cBT8sI-?K(&A1_;0hG&SMgOR(V3x~!_-Y@GTqdGNmdAVlwaz0}(~ka|pdhIpStV#JM?xVY z*<=2&;!w16fIh->e{qEiU7Iyys~(EL70vPgvM!8 z+RwVFOd{1de{$!SEc<+3f1W%#wPdgbr$0Bh z)|o`g5aARW@a({N;%cu)%A(KjSWCz5atpl6B=IeH5~r?bSuH5GNQYn}+s@;$?YR!Y zcPE@bpG}|09*7zzrN&-tn11niVJ6hs66P1tsWW{IQ0hcUsasB` z;PRC7-fAzZo#c3L=(+Pr1-q2|8p}?;effD&ymPAP?GUC$egf;^n_>8Y$8scb!FH#X1X(j^kaqba}SCH1@;ximljKYdN zlRvQNB976(ld3fjfjwS2M^L?iC<@^ z3;I5uZ0AwE#8SiN_9^DXvI69!$p7Yia4j3D+@=?#E`^4(L>z@EbW?MRP6B6mWEau9 z$#WEtUY6i@>Cl>jLY*G!BHoueo02!ktF!M@P#BZbsV9f1Yd+1-or&o>5cf>{EtSq-!B?CX@`mpS;V%gtr zr?yzIEgyAZE-$A08~0uH%W>9{lD$O~!3M?Cx9*3=3cy}sNA7`9L_ERelYa;$UYz9E;}fNEO%JwJ>>}yv+S3n&w-_o zTNUOTzGQQ~DSK_9o`;hOdim4qFA+BxzMsXf;wv?L6$I9(S|ab1(&q5?yyplKTc&Bg ze;Dxt77AqyMU)ZINJ3W!L%(C3nns`=lcO`5QV=WnaFBVtdde;$!g&#CFTu7CaBGkR zCc);t9O14P99d}|G2ghh<#4u^(yz^JFeZ4MnaG|VNzD8U;p96c+G98rOxnwT$xFT0 zm1?<;%OpCsHSR7y9TWk*GYmsN9+C@;8VF;GKYfd6=PIU$a7=eW^JRU-Nb&XwVCnre zEr;#AO6xwhJ(gZC^P9N7BMljD4XNTAZ?@u#-^_Lk8OQzg!)`3z4UtQhKAHMtAV(df z3H@$H9X2DAd~l4UqyE(q;K^oW!KY<#RZ`lu%s|4GN@Q*5G+OR4B=lvHydl7G33Q%~ zJbj@_{8KNad6IMx8AL{$Ito$lmrbbd!_jtiRn`Ux46RmyK#h~}QfJ32J7HfT{PE5X zsMIr=y3h2rt}p81$!F3p%XK_Xv+Chv`*nKsZ3#7u1A^8oYdTt)sv9Ptw|z0O;)M0DF&u{^%0aFSRg4;XWL9S$?NfU5woPS{dY1$&A4S zSQV@q6e>5CD=r|(^qbU_DVzlL_z=Fa!AjG@D_eDUSm_E|uGPh1rDDoghdofRF!T-L zC^kt5Daw^tlnD#go?%7-N7`fH#E@nz%y}`xhmE*c(U!`+OFS+0H8{-;O3a4KOwbaF zJ&s^fPPyDCUVk3X^o>Pk_==VnX=DO^6a;C`u{`yPpfRfY1r`lR*}HOr(SOwaI#U(z zQa2`^MkY+5szNRI(2OM#!nSHH|pc5w|dwUUeWpAi*6zQq=9we7s?8_0{= z>MwQqIllZE6jT2MdHv&%Rq*FsWM+hmuYtU{SF6-!x!{?b+;#F>BQIW4Jfh1TJyq9Z znm2@!rwVUB>xf*ZsgLBo!k7PACwrrAGdY;0f3%>l)o1w^l5!>5bphM^iLem`PSNw6 z?>)EDqBNgg!~Xs5-c*`5YNy`qa; z?ZKOLS6{uCyOG33^GN2R$&ddFS( z@L_RRT&wktaz9ee$h#o(;bIhCjnPb=5d$Qi3Z7jWKtHrhJChF!erpaaxfX66Hv3LP zI(qfNp1c`vy_Q`SipW#J!Wxd5(({w0<> zI}*|lLm)CkosLf5s_TyjhdNv4-rKJsFT;aX`zC1f0lniwA?F_+nHC063#pY#-LhNe zj_zey%{s2QwtVMQff@GFogs{l@y^5FTNNHC>9Q*YqH6w{&{j?g%W1Ku%^~CA#>Yxl ztcJ*$#$XS{m;Ew)Mm%|` z5W`caF?yDl;Ur4UETXvF>exT{4nerawPea9Rlqeo1FUFuzf`$oGj=oDfwfPTzP5fd z2R!#F?Pnp=5w*uCq%Kq$tHXt8OLjZ35*=h_eK6|Di+`6(Cbe2S(MBTzcy0wOd3rco zlvzbpzbBB2*C@7;xI(29Mq$41Fi=^PqLSm{qW5*MWFu1f6Vp1#b!Vb+wfLyL+FGhc z7OGVe+;RBgYS!^ymlcxvaX3l@Ki;=wla3e4Xr-oS>AF&-A<0m3^Ql|6Rwf||ukMzJ zP!sA`IS;BM)rLKp*5haHlGzU!ipe3j&0%Mu*>}2 zlb(IPN+sy5!+TEihUKt_1N7c79P&L|{`J617@C`FQMTO~@l<j5%s2fH0!h;W*{f=`+2dKTYI|qyjoX$-o%T>r+~dz=M(e&&k6zH zExp(RX51$r>KJ5h7|O*YY^T^nd|~&79Tf*4^6dyPN9j1a(S=wpZ*>Vp)C;&WMAWwY z9LJ|vhgQlVp~sp-hl(djz~b{z$mVZ44XS&D`@P1EdNU77cg1a zjt_GV?#th=N&{!XPq)10BjfI0hiEs0U)=aJy_UJH^JjV*l~u(B!tuK-DA1fnc~`VN z(2wPzo*;`Yz8i;<&hMDcFXI4h=$mpE)MzqoER{*`xG=?6+vmRu*|%mtjw6Ebf53RW zD=4UB6@BYl=kYv)@%nquj*!FHy}ZCw^*sV}si9%Fbe~#GbFIf2my zxeug&KCe)1VR$@b;4)S?s2UiGDHv84jl=AtT9QNm zeeKoWp#I3uy$QF2G@x4spaG4zv>Gv17+-08cvWUsQHy|b>nfpwsbTXRInD1fKNqNY z%6&TD{+3Gy!n;~Jf9kzP^Bym^m3tK@%t}3b##xu!jkmfgKId2ru+@#WuTkFL3NU6xzEGTeq)hF4AZ2G#(T z5x$mXmA;1``WVGTC1%B0VP5Le*s<-s9!o3=dfrD=BG`_Pk%1(lv8#0P zYePSYP!v&@UwBUa`8(K{^bW@vLv zVKK+mD&k z*xFouv#;|gwahGz@aeP{0JqRv(BO|piIDgt4Y}j`+A;%?4rDuy4d~^q^I$w}dW>5D z(VSYn_cHSA@BEKHE{>_STUH`H^*0rp?XJ}=cL{`~4h9G=8ae@67}Ei$Fqa4~!Qq7w zrvzx+0w?e59~ss%stvfz)!ecwHe@TO&hzrOU-x}KSN@o;Om=41I|{7tBx7mHS#CWQ z-0cz+ImNl;5A_~mrr3DluEE^p_^W$)BlaAhWHqFCkwhhy?_boHQWned?n0IeRFfCa zX=;!AobNgW7^0MNy;b?V;{*w#+Fw-{$=7{oU=alssa}IO{6^iF?HfG??nmH0BV5{= zyT<6>WKOI!^mU<~lXRSS_)_b$)vcCyPxZ<$j;0DZlwS1MXPy zKhEsaCWXW=r8g{`S_?J6MjLXxBeLD{&I~M??FOA?Q|N6|ShWcgLE%No*ma%|^f{L* zv3SK8Ul~Zm(_B>TW{>u=xc(MHwtOYF4*E;A9y~2BAKFMcZfw6}j9~xmtZtksKp?ii zG)7dZ5ptuu5Sp|Njy^V#0tNhZL>1?sgF-(^MFa|dH3)m+&}4ihDfv`VfPl7__@hey z-fsvmUs|I#xOofNxg(h>M$jJUO#U0&C3uxFhTnUlunm&5W-`)9hkkC{8S9!+tXa4Y zmGFym}FJ~|N7COR&2J8{IePNTI+AT#LaDmBZvf9l20 zQ$?_&xUE*?Zew%h3~@qcQ&&SDLw$HaCQnfY`~nGgU3_tGzD_<=!vk*xx-vu5{VZDX z30rydW~L&0>ch0SoA!HYQ?1;B*Q+KR7@+09%u0EU0leHM;%(@62QRh@o#K-S_zP0ys3alh&{soIlEz!~ZlY$SOEj|5 zxXiO%v4F!}bC#rR)GkynpwmI!N!0u>PE9-{;10rRWc4WM5~<^=8~(REk_W??{hy`k zUh)4=>fisr(v(6-M*%1{I)*jkP~G4bnv5Sb!1J-`zr+7Zf&s5J!e?>pK|4hN+vor2 za}%Qs>efyYFhJDzf2;o$P09wITii6iklk}~?v_$p%(VS0+f_``r-$wo7LWaVgg{b7 z=~~ZDB;cjOKcZePQ~l0Zj?I7D;WAC77xaF1_n#)76t;Lm^K$=vU{Yo2e;h%;S@?f_ z^1%P#$p6P71`yxb^9L>Z<;+?#%*%HY)jlyb8+!dSFbm;4|K+I&Hz7WVjGZ)6c|c4| zc@^NP-*DFR$>pG94VSIK)bT9HL8i#S@^kk$URA-bzPM$#p4SdZI$=#(yh>K%>ug8k zx4AambNY@QxskRPbx$!~WF-B}56$2)ehcWFH*!UWBwh{OKWHWHh%GwR*=gb=*4|$Y z?)Y*z^~p}NuhwT6fZ6%G>vCFaGoJNUdgRzI576mdnie)3~ebb&FaeV;RmC%M2T>*h5lxetm0G#7Ar^P!51`GS%VSpEW{sr47a9_bYYtaVKsTy8lh3%Gex%pHxhM}2 zYG&QQtJ?YJ(rHxab{#2z=0BB@!J>Moyd>}GRKq638QNO`!}R9|P;#04isP?*ID=`^ zDq$Ov28R;P_FM*2$b&XRithP-%-LEx2;5IJ5q_{lQba;w!Ps?`CX2R!(?xeL4zrfG z=AyQTEUwtuIN8TC5=+6O%PzC#KHjbSwdx{$%@%Ee%^G66cb0h#Zg=u3u5F#dbBPUh zn$Jp2rO|a|Rfm}5u=L0+H*l}EOs4dyEI1R9C0^~ZFYQLeyPUL^>87`(8No^>Gs1tP z)*mdbb%x^+=)8Xx@exD+6UbD=ImBp10+%`aO2m-GYH$H0;XcAU$uM$|5J?NJhypJy$ z-pwCv5oGnFW*PX8I^VyrE;g}R58GDLx&!E6#g7yco>9Cjq@BP*-Tu@KixFy6lMkGa zndnj_(t(Pn;rsS0jf8ZUf}%7?OG$$YNOuWHcXx-R zfPhL2NOun~bdFL(NDkdHG}3kU;P?BUbJls+Z@ugMpn+!_tt4v-N@eQl!tB7XE}9!a_IS)xL479yEK)4wd=p|9YP%qyn}U>5i|y?EtOd` z^Cj=pI;t@Py~NY}mGus`@she!h;fzjLntQlJr}$Shb|0@WDjbbcs~w4_t%VrN7A|! z?JHA5uZ#n4!creAc`EBi0OKS3N)}E#&Sv`Y6yk6HrLBxOb+X0qyOldL^y5%z$ou@= zTG%!ybqPtshH5!?1{^mon zX5z|mH;c+viA?dH&*3k*jne0+_>xd&R21yg~Y}eoXpZDxcmQBZ$5mAma;=-G%<1K1&vv=WplJAWsXIp zx)0Vrj2S3=wHf_W7znlyFZ%tSs?NJG!=)sU9#(jjJ=D-Yo-G+VS9GICpriJ7a)?md z&^^D>WybvD(08)=``6}=7d59BQO0YbC>4R9Qe$SzJ@suiajqF%uix9$;3)fMOYsF< zdj(coOKBHNzM$k=$#CAh+%y)srCyxp?OC0`Q&#I|3%qN-Q`F=sYvh@EOqU>bT6D*P z+$F|{+@qJ*_JO?$ivblqhjF)sMTCL{=B>G&v6>R`Sz#pC)>PGycA%3GF@E=Qe%=|n z8=y~Au*2Bx?PR*9@7UTKDaUGb=vqDfG3*IF8sgE$A?0yXT%K!7(nj^52aoOWYIJ1J z!J!&_<}`Bn5P3g|KDJxSYu0Y#jnCY8wxoojjgltzD>!xMe+>+?^?y&5-^}F*SdHs} zb{EsnGcaTvWfK@0xSe;!e6MVh{rT`YuBhU~Ggf_catB@wzoe$)jmxS|z~3xAJQ^6% zeAh)hr5BSs)^};5-2W1pBoS5D5K-Av_O}ItPi2740qpXtm#oI)1-i20fYd3lLf~cGqwd-F> z2@rSx))#b98oh;$aCleA7hO114q|Ssn!{HnANAO3UUhZf9oVrn$olPN`Usc5T(me| zzYRX;(c#m)&t{s{?#AE>>Hcl4?*BUbN#OM%$i|u*8cKnGG*b&YGyN3&WQ);rLl@-P z9SIBw(csc}e;HTeaEvMz1e;Q07H5b2^gu4nqjTV-$>$3b++Rrh$EJPPcI6c65A+vX zel9+0W=cK&HsQvC0srEV3FEld6nqpjRg! zhKgJB-=;xkYAu`P3sn*}kPl7NTCOU7zIvnM*weFVvjj*CR}(NzG&>}?NIL&U(C-{u z(Cfg2VIj-+RJQ@x$r_wSr5bD|SOpQ^EPq%EPnBwOorQB{>~0KxTV>$tT@d_IFIt#+ zN_Cfj56(=r&b&=sB3 z-WUq`vkU^QL13hdBCy@}Y|jDEVjMXo03&|8`OVUQ!T$~`?ZRoQ!B|3KKfmCh_e&UT z$v=%tpL|F+^5Sr6=6GnfUL3CuUv4^1r6&_EImsfQY0D%whRn?=O3_dIg~fpUueyh-;O!Sx?Bp~+ep8K zAy);5el&tc-~Co7hfZUMeZwxe!WS4e=7qx&0{%+3XReHAb)UKc9J|HevRUuLUg5nQ z>+v~NdAePnv+Z4p)lbjqJ!u^365+o4{@1P%kLWfEcfklmfl~Umve*fq=g%jRd@$Qt zhXm21C>k*zw}Dd{At(93ce}N)Hirq3((5Az@1DfAS$@}zcV~$Sem(dAq~LCiW6RZk zT_dvUY6)pQoh@B=6~7!!5a8%0sQ?fbr2+RZaI4(7n=9(mnJTffznW~mLzqg(7a6(n z;>Fg}90z`zfJ5?v#e z0T;N&ai}2q?8cKxeZ3Of>z3sRnmIsM&K*Jn`|WEKU7wX3y&B_TLoV_|)T~~kU$eNE zUoFPP_ICp!{)c>YXApjxvBx(8uP~Z|)4xBv39jrrd;pP*>sKH4=lZyP(xr_cC%cH# zpN>c}`KAu&jb7joj02)`FCigI%;)?n;|PYK@_9dUbM>=S^YiSqOlAM@Jyz;hZKZ!}G& zVH#!Z<{=hOcfvH83Hh*%*eRY^Z;j;K`Y}7Dzah#A-*sP&Yd=NYq`3Cg#~LVjY9`mI zct1iJjIYJzYWaDxJzuIcC7J5IT~~bTZ6}`^iL(}!$fVXxrMDH6E)m$aD4#3Ou#<3{ z|2Fl~-RHPm@MbGYwcc`t~OkE5OcoRA|EV4iM@;wR~-pGq} z{hLH4`AhHmG1nN5xhNtgLy&z#+y)^mv5OuOhi-g9w@^&{=&a0mSZ`6mgB1Qo%=yb(L7#X-RTmrS4Kv`K!n{8~ zGL=hZ`{{RMPB`f994aw~sBGWZ%Q$Z?F!R?x8=V*51}jX*(;a@rw|2q@Hbq?!|2u7I zRxE4HZ;bE%M0sx7I%*VjSVd$Y$h9hJreyTZ|GWSY#!DI+%9MHSIqAdlk)D<55AG z!g(q?))Pc|{WQDEPXM&MB^(*YO8&&VPn}nf9+%A$xEC_y?*0+qAH{+?i!Uo?%jRny zlN*=M}TZ+NPvh|I*=This0vRs-#pTp{VVn@oOPhCPk}3zQ2Dzg1 zSjQgxb%aFw!_b!jHz7c*B*?&7Hr>7MOvQ|e&E=M4LKVWH_K;CXFG^<2Cjz9T@T?=a zL(!eXfI)=bTLppn^SDSzx8a?yayj9fKhfU`m}qO|43YEm=Kcjsni271Q9yvsnMlNF z0zsY0CU8DYIVD^y_ z1sEKIhoI#BnbP+)ngev&bgMy%;B3h>5muY!%@nDvAN{{;Emb6(Mern4#4hp{rL&)H0ZdiEoG}uv*t&jr63UHY5130zG4f=r+4;vxtb_VzbBkGS*1016MgDU1d8{*vTh<8DUI<2|fJ=PZp6 z-lf(0iI?&+9eQD{^=pmN2p2o-`6=iPKy))AUwj6q~@AYv>!vdny?5LHC-6*QDct@iHo0pe$Cmmz~o{vbLXj zzjpEV>I#nBxyP!@wL1q`F+9>^wgsXyJstLDp)SuejeGqfs3SGo2A4XAri!8?+1>{) z->l@s#&CzSlJ3*3boCy3Pi)uxDYz{xmyR;s9Vc`#A$y5RLDKN2&9ciO<{i1*>hb6^ zy)(0T;mNyq#1ic>EW5N^%+j(j%%-i$a{bc&ubP7^D`b2|SPO-7odQV5H_xAM5aWxa zlgXM;`c4(NDEO1h?=G; zqriE`=bQqA9?Oia24!a|N@va+o5OCcKIP3qJTToVr{F+*IJ@5v!~SI`0U^+7jA0~M z)8S0lF*=|hNae8o2Ez#CSaV8Tw#*8ctwf`U{wNN+*xhYEsa&pgIwz8^(-SnR{qr#$ zZ16gL%H-iL~6yu88_VawL<4#N0+tl*3@@^C?+AUZu>Ok8W z^z8K5ZhOWRSI}}ercKIyjYuBsGiYSlSi}dSpcgz9X6LfISgqU?7M;qnd^O8MQ;7Ql zFbaNNmgR&@g&``A@s-odc;cPJ$AOJ=79ExPmd2qm$C1``0rm?p=~(T;y!L_WI)B1< zEC@rQ`{G?By@%C@pwfI~XaO*qFvJmHRxPmzr5-6G7?7E&4HUk1YR`I-YP&TeHYYD$ z^C@s|X9jjPRXvCPLP~qggsSDEtokZwbH-M@<`?tr1-jwJbBs!co2^KWfj;w%q4X)6 zTR@@Pd6$Q0UQ`aB86NKlm+cpdyGy+_iN~r;cf6Dkbm>tLbXs~H2(m!UVa79Z7EL%) z@xfabsN0M{iCSOx5OOx;%97vu@sdoOT>fCzrL=s`1MYxGOa6o_S{u01X`5y!v3+~7 z9LWLm-MiTIdmPW@D=+#{8fXe3%OKk=gcrc6I&jZsvbdKQea>{1@svWfVrlDa{~)`! zsXZ_`6qy=Z;pP#?hB;id{$XBdDh@?pOI-1FJ?@LhqJC9LB_HiD~GTAKU*02 zxkSad_X#Yzpg*tv$KC<*b&`?!zr&fUA}A-Ej{MK$8f5ZR^9{>HM;(z4!>eCQ_ z665pC1nv{4bU~g_TGuiJ@G$W;h_Y!{xZ#qsJBj)Jb@IPDiP@MOMtc33?d{`n^!`;e z;(lJhU)e?0+fK@y9l`V7ruFPj>i(fcCeZwON80i#@lEIy(ndkLW4`4lb02V#)p3K> zvXtk=dYY{3xS`jwY;o{rn_}|Zyyx90vR-|LS^6dww5|tK0DE!0G4sbtIdLXobe^-n z;%EeifdU37byF)K+ix0NdT~6LWhpfO-h#8%XFY$v@SL>P3 zO;`fGt|cJa{j-Iy514)kBXl0154gY`9c&-!e%z`u1)?sbZ!C2ztY&`~J1qYQzx7C3 z?v}4>;i{1;`UW`Bi$+NA7Y;-OYbMU-LyGh)#}{gCd+-2?dh6-b5`)QT`ei zB1jV}A0rhw5=2>fgeGI|Wr-Uz(0VE(ax8Mo z@IR%<^{toQf_Pl>-xg}B8wK8+q!McV-qh-+{=4qM|IXL2JS0uC8R(XR#=M3BHPRB-r$_>DzU;ka6wp*R3j#@=ofu`87G_K}#i0Uxg*;Vz4B5 zX-4~##N#MfT}^NWE|>C3M?Q)J2GUHM5fu{W@I!y|0kS|xY3<3X8gL=O(|lH- zsdeTeIOi1VYd^~92~^4Y!#r<^jc;3Q#7c7Lx-}p=P@#}KcSEIFIa&2yWOMRWa>PR; zKA?yQ2oc$sUY*-(CODM*N!=}rQ3+%Vy6QXDyMNFwWt0%Xh3DuUIyjTJti;)-Q(#uA zb(u)zTV0;VAojz*6;s)dd4R{N28{oS7d7R5H36O$yhrTWG+gDW1(FV z97rI-F$3z=si|j{zl7OKS+I*g!zl9IYlB8sl(8y}9fhkCmt^{7DNU|_iPjbhJQF)T zI3DQrRw=tHRC(1@Ms(}N34Ku%5N=4?1QZ%wdP*(E_0wE-t9duwHE= zXG~SfL{Q~(KrK1oQJ_^kr|xz`DRX;+s}U7hY%}5%xbdyfKmVz5krXSGi<+Rz>hgCbpAOs*Agk`75GV8`en|9S=qxf zPVK(vX+F<@xFb?8DW{rCFsJ&Z(sX|QlzPB2!SQ7&iQnRhi8FncSi<9XCMFD;p|17V zjLSW;DGx(3&Mb}_=|E|oUj|gK1VADb%7fisbD?$KvEH&ZCck>Bl_n6IQ}Ld>Staw{ z)<|`VsEue1dTF(#hEX*2fWl*lNqql{x^j6Dn|{4rW-y<0rVeU<&bbr$)J7bv+Gf^KJ0abKt>t_q|*So$#w9z2Bonx*%~ zB3A4QkA%k2q)`i%dOJR~Uu3Mx!22lupw?d35eWB1z6~UrEiOM2RknUyO#|*%iJ=rl zV-T+uCA6>%;Wgu4Q$wiM#bO@%iBKbnxkM=?%Ck5|#TpwOFMRmI%#YY{6@glKsK|7UYb?|}KaA+w_SC)tX(+8EiD%-1r2|y>UZ_T55b6bC=O5`W*HJugFN}}LIIni< z+@-HwYm7*sm&Sk{04Ll!f5-h53x!Z4@+dY$AqenItbub2bZb9el(3@ZWM|Kf8KK!5BUixR(_{}=L!yx*7}RsSbP%hp+IL6{ zAT2+`dL&y?+#HYc{jEDR%cn;8Jf2c`?5-?7Z!dhARNhIq#_iL-vK2}ZDQ3G#d!)KB z*;6S&3N_{fm)ozcSPkFggJ2?muLrnb?!Z>AlCj{2P`b+yBtO@3CWoWAWy@(w`jxzB6QVM~ z4c*ttZux(fME8`k$X0iX37r)gZGP3A2+dCR;IY=wJA6}GLxp)BrJXgG z+)wMfC>a-_47M0~Pv>Du!glT}E|78^DI$?4Vg%6UTNK@)@9tec{i;GhE*4GZ(Z5JQc3 zug+abCOfstQ%7MXYiV5Knfg)V;66C;At%B0r-c8R4zPHbShlw^*6YRx=*5U zNLDl%Cu3}b@EOE^OhBA(r(4=#wz>@OgJ<2-4Ceu~WAx*^*8&jsv_cC zpqn2xi$BfDa33ydNhzH~$+)4)@=YaoK`8#a4idn(=nVH3oOc_qfz)fpY%c}Tc_`ex z3kl1NtOpubh2m)_Z$1uZjK2IULRJYh)Pw5?H6MnMrm%CyzAM^k@Nb`+c$aDhfO5CA z91s#0N%PX8qv_c##^3c-isK%3m2Wg!|8s}{Qr6QY{bz@R{Qo7(00PEbEIVfgNn*^V z{m(=Z@}a!13MPU!hB6T!VOezZ`jOs(i+;)a5I1YS!WqDloU1EVhYwaZPuD*`Z463u@0IAK-Z=MXfchpPTm7d{$~tucC>*3m%ICtVu<-& zBd0T6T)8dFRXp`N5XZ(FFuwrN91KP`n#y8tuB=Ywzs zMqRayA#ZZ+ z%Y+jbB!y^aWm`$w09~)!lQLsime`G1%kzP1pe50irEj;q*bR>JkH7z=qJEFdr3rj; zNZY+35RY{rL)1@^%Qj3t@tgbqG`5O4sJA?C4mkyvA&9vzSoBV33%&`yE1#f-X`F_0 z0{&oU8v8ouzk@48^yKV1OQ|h~5%>9s0~`%*`>j`5AgB!XvL!4_zY%cH&*8{E)1nrj zAAARnwc3v35%bNSe=87G4(MM=l!ZF!oH~Nb3*_m&d+_N529a$gdwRIVR05=ZIO7kp z-38uXl<;YooK|k$gOnOa^4m@}&i{A~{KMYY_|@zwBtg z^CbcO%O04SnE2tR&})Rf*acpeC8%4#G*c&Fp%j}p9sDblK-pTaP}ZR%=+<3KYXvZB z1n*Gj=5dQ>d)?N5U8nP$@g(04RmP;13`#*s#c zYr4*AEw*iV_ydR|vPipd{V60Tq&1uT?={#h%?Y81oBl)+xCy(-DWzUqacz!TA`{41 zjq}h~=>&H!HL*+ERpwj&ksmw*-clOb z(KSw;Qg`1pSmk1AiH7Xuw&0c^|C?Q84_*QhSK$&C*+OEPzc8(Wo|*S4n-qHdP)ZSI z`7(@Cii9KwxBYUROK&6iV)@1=Hz`u}D&FSoA1t|BY07F87Kx|?EyW9;3N>8qN&A^i zmf*;0v|tOcX_p-|B(pM_$}$z>XoOWUYC7=$Vif^4kBKPlmL$Rl`%PE$i-yT1ztbIC z|4fAk^D!$yraVQ~#N-(GUeyzmX|>P?UOV3zm4Tkv)msAPRZ$H+UCu1V{~`-CT6|9S z)=LfC5T)|csiU~op9}f>EyY9z?r255qV9AF(9=`^Pt$m-h>KUZHn)ItdPam{QMc3fh+sK*Ls+iA$l)EXcTKn=(K$|-8&Gp8QL)4 zaMLUN0r&>A72;>q3n3kN3D3%4; z6e7BgS5|U4Cf}&l$G|?&02L5)kpj5A#1kOe>ruL!^&?b);E2CyXN!xRp;|$lk?7>C z8UpsM6O-aQ2jd$=54?FwCW({U&^m!4td0q)DW{kOjt=oAnp7y8N0NLtz< zdwQ$zZ7M?sBufaC)09c##r@`J4hP>_vN+4?lQee!!_FB&2S%z2Pz-yPsCA1n=6nzw z;rJHDEK+j$XmZoG51HIpV$Jl`i+_}w%#~=CUV|T->v9jp#5`+9c3>^nA1@I)jIqXp z#SblN9?N~LaG%nIsMi=AB0OfCeYze#hX6Qd{KjM&<`f}tlh(#KMr4eBqj8U9V`I}I zN^mrPJS7jBrk{tn$83N-0FUe`<|ACz2?ZSCe8^wj^-uipvhPL>mWETW(m}=PCQPv?NbcC>n?WBW11$nOfWLX>b7!k`208|PYTEAM6}5y?#`~=qp!7~Sy=H8SF1bbh^*nhaUN+b&g?DE~ z?m)D6iCU86wrU?Ik-pe*w>Aw;M5F3qO1mqOej}OI z+JdcwUYhqSqVc)gGqGWf(h&>@A+cyOGeS<7k-9UnI4kELdu%L?!6l_GH1qzCTV;$y zDrss`Ufc#0+t0&vX+L07%@`%url%)}&~whYIdBI_bsof7v1)0UpUxsyM>AFk%lZ-+ z_Rpx`Q=CylTVb&+KfTp77K=XK^H6T&_W{6$;4_JHZUB9rGSXiQRBqgR)nL*Yl4?Bz zcf7j5-sFv=+kFD zmg#A5dfa&*c=>I$O5o+wsr9?)tn<8DeF2}4O{2QB9X63=P`>&7drIZ zQvn*eae}iyGyVFD_kz%-49~y%^SZ2IpWR+DG$IWUb$YLka^2d#Q38)~B|-aogJqw5 zCA{sl-+JAF-YRg-am3gIU)6;rD%XO6@6cI+y5R)nR(e7^- zkrE19>6@Qd61V58w=I>QTO|MmHHCxdfw+Hs1x5bEdHyV3?u>4gd3s+2%>9TVdJC>+ zVz;8DW!y3&f0}y9IVdCx5bMZ75}qO7n@w~W%)|cLzIhjXduhBLp_#h7p0)|O03ti~ z3-Mk4OV-x`&uQXG(7h5;xYDbX`v*S~Spz3GA?tO<|M`HwNnnmwxov*|fZ8<}5mL(l zzb&Q)TQJHb2^KyFwJE>&>zWX@6E$Zc26cjyPx|e^GUmY!7AzYheZ*` z4(A8UqXwJZ`$z-_kloZnzap2e%N>o@8s>@Q>8Xb7hs2X_{z+{C@L_D>$8$K)1@v@m zJ1JX^zqgyPBLy*=MO4`6*CAZsZSMPfU^CS1Tx6pnQ@ z2PoK4Isn4~rKN>yfoTQ^p)Ylvlzks1f#t^pcBUFYh%wR-FFT}Gd=7G}0jY4mnYDBV zv*%BHfR|)n)IRtoxaNU*{}3h>n1)iMgkk~VZ{-1=^^OLq@COy>k{?cYHs>ex?K4Zq z)ZeznECZ<29sn8j9cKu;&LJxmnmRO0yaSjn&@T|*0-TLX8YG38@RN? zUyCV-??%1L_i|TQ!?KIeJlG!Of2y=QtMx|j02LnrtN=-fR{QpRj7qN#$uV1YJRR(8 z_yWLO`@g7vOxniD=?KU}5@yZjBb+o5`suD4ERjB)1n1Sh3)q?gH>!u0lPP>cO^g5c zq=dEiPWAad7Su!-rT&X3aQqWng;m;K+<$&GK&#{LA+Q`JBK9qhbp*lb;Rq+ghi0o# zK~K78BTp4)$(`8+O{1dqSitxX{c$Pk#Ras=^?-8`DfTg~6M9R%3g%c1spH8Op5yh< zh5zR(2e`6>C3F7~?mQy->}*Nhge6(`kP6F_3Xf+w%ikJ^?2#iWT!Cu*xv6By+UiyqlY`a)M)9t*n#W)P<7Z>;%6rn?{fiy zJrYjVy(12sfGp$lH1Y`;0RQWhxT6&TeVZaF$@Z}2J8 zGMy}8q)Z%}46gt$H4;qmWW4h-nqD;W>bzT+ z-1bcSj4MZOAu{spH!!*oHCVg)8Yu>ttf!aPB$+-(XeG|aCk^k`z{=NNDc8Rr64uov zix;9%O?doa;t^-v+mXj%P7+*Tiha`+3c`3#RbFs;@%vtBf}CJX!OABZBN#47lLUCW}Vvw*LdTPiPWA;l557FZ~hWfo)l1*s1 ze2mxcJW60Qq_@FYSVw-6Uk2loDqXQj^`JqZ{eJ6NJiUF)P4~;7vzp^-n+x9$P_$_< z79HQLabc`QhJby^-G`vX@w#Az=zur4UJp)oSBc((=7ol3ot?8VDC)3y~i@ZUvc*wWz&Z~^W9+PBMxBFFd?R7qQ2y7jm= z4~p!!tkQINKhFYDNdDrC9W-HdmQN6##S+d+e(pCa8{bzQ=hiU5*?fK=dytc8z&YH# zQd=Gj^Hn{}<57O`2@5ymIT^pW#4V+|7$KyBE->!y8)?W)Jiwb%&X+!dKNAmri=QW! z8nON?hy+|5;A}U&6)^|?HC#ChbdhgVjO3ps+|UzbPh=0UU&Tgi`Gv{sjr)_Rh+l-= z4{eO8zVOP=e)8@`cH-PQ&qkJk^4I3dyt}Z9s;i*V?=!5h&?9Ess&9$5tmE z^?w#<#7y=+nb7v9G;K|prth;y~P^nc+XlW=eya7DtGOvg;S5rdHI0}g}__P4%Wlp4HnrYP!a2pF`dZ z2fn?W%R7s&-86s5W+Mu6SI~bhvccK5Hl~HrE&hBz;9Zh?hPf$&%TV3tOhM=oB|O2y zh=TQ^MQxf~q4|A-Jsa5A*T6(~^Zvxx?{S>=#PghRU{aQHo^{f;@)<#Rn@K0?B6i+) zps@I9X3xAp}Ib~T^$Pfy`(ws3$r z-PlAD==OD^eWRte3Ge?Nz2&-afAoA3v_6ylNB9t0^zi`L?KtMfp1su*le6ezmCfLF zzXR=^;oo^}p~n3|T7{LHBRL4juj<|D2$Utr);NANAr!to`d(v!xqE)mJL zU&2;gb&XiH+Hw~7W?s$#1nO<;MeO@){wMks2kyRmO@)CKO0fm!eJj1UJXJ=3kXB~(cZBEwnTOVsl8&gP}CdKQC^&6!|jG_1X?0?~sYU&L;M9v$pd_;524 zn-;hXgMr&P65bF2&x{G4ifeiAQyoE5LvM|eMthIH={w||o z(P-oL`e*kZP)P4w%4$->jTKQs+D@rNn+i;8>3(afslwQ+E&an}ChaU`XwwXJp&eP+s@Q1hQF*lTfFPIao>0+;Sao?`d}g*Eh(yY z_|9>jiPpdKpcKd78{!xL46~AfFX0{TnM5)K$fQ3oHC)7#G@EO5w(yj%srazVpCPJ4 z0l5esom)Y}e_WcLmGhDxm?~=kdNMcJRJ!vGHIVpG?sfoUsGHqu;k=$JTW6V&<^IDD zHaOf1(!ipk3^xnq{4AE<6)l#~NoChegflLO_0D(yvsmFAXOJ#D_$Js%LgP|6=M98< z)}>(i#;${uwFsPf(fR=%nTEG?7H`I6ufNfIYU)HL5*f27*+sXx4}8zLw`U`zeQwYZ7!I z46x6ov*he(ahKdXsWil1{z9{l)fcimJf1iqnG*>W`{N-7zNAXt{bshh&MkWn|r=~X_BlA0al0fVt$nC zo5(qVZGXE9ju(^*S4g5eQoDpNr*0~2M|j;~QSB=H%mO>0S?B1j>&Cf%*6H;dOwwOc zjr|`69ARc6eOMODUai~xY}YQK-u3i5A*(^ShUs-Eg4>Gs%}2%DrHR*82Ni&U0=i2k zYka3>Rg4~I8G&W_^UwyOHEH9`ZNIH?2C(7HbeNC+Qn+Kr-Q;b9I0DtG-X?GIpJupB zJ%@SRk4|mqJ6^&KzMSVa@22|B#C#lJh;WKmVl`jBB#iwi%HO>hFEOcm9}A#B4R~z- z%VdBA)c`v(uqStt-cQT@KViB5F$4fPaXu+ReQF5oHrq<~w*z_@5owdaZjfljK_vo*l;h9GB>Xn=v3y(p%HzsC6$%Fjo1qBsyS(rvf+?aJ2QZ%E?5sJ7fwtahlmjj(4LsjjME2N$AN4 zKHV$6@3oJ}@{slik9@+Xjk4PFIKeq!Rw^cSz4!|Tmftciu*=+BUcjxV9|1{06$F&z zEtq(eOAc2<_O~Zm{!CGXRy83RIeG$tw|-NFEas}6Oa|5dtMJJZ8#@vyqbR2V%Rb{| ztdtfYCPB;3fM^)ms%cnH)i1bJCIw2wFg2uxPP)p&zAx(3909P7-HMXB9hg4v-7?xe zpfaVXeTvK?7<4d{%_*s!GGaJ0TmS|OOxL<_xopTx-T)_VAM}_Fs`zAvf3BNK{ebU2 z8Tw`jXp0Y*o$3hb0%yy--CC~S!9rD!dT_j5T6t-rPz1o2mVbY~3ahXCYzcj>cM$Dp z{Is<%%a~0OM8g{TAJZLq#n*5a$gbu)(1Rh>MbO?1R9XyHvzWao82Fw z+Qo7XzEu(Yzyaqe5dmIp6vyR^W}1>&kvo9-<8GxtO>w{|Fm*=eXH{Q z(1I#^;IpRT8z~KpeW!+PcDinrGk@jNL#K=U z^($Qgl~|;I@~5P<;_p>iYg^;L;?u|WD==l%IA$1|Ez5KPj50%VeCu|Jwcqk>jh1@) zHxq9pY7uSEH*uPE4Pelm% zW9Zt|+RJj8_F0$4-R(`T@GtDwQ}OKu`D!wcsd)Ut2<*c|Lw*l%3GPduK06yq%6~hn z@fCRKx6`;XurH%vmHZ_kDOI2QUo&MKr;>NP!b$ZU%k#alM|EjJLoQ2Ed?mo8X=E0; zI4i4*(b$q7SdHk_hi>cp*08D(>&r27AB4{ngvwJ(>9s(*&`abL6P))nSaxcWV?Lf3 z*Sn4mZ|5V*Xvj*&RqpI;8b6A8(W68i$Pfx@bW_ThEdT=|NK#I&trgaVfdEqlv(kGA z^=-YfB6+eHcKpqz{B2r)yfqkc7U=YC5eu(T>H!;>9efL_e$4}>RU%Pu?HwxnZ@mGU9_&ylVV?L^|2RGiqnxu zM3jN!pve*xw;_-lB5#ttBInfqYCrPHi8nnOZ>RDdBiMP7L*iZLq*9d zYnE<9p27mo;qRI0^Kjl$n`bP}P<5|C5fP$@ogzZT2OT3P6R)Drklp9`SgR2tToJfq zd+Xh|u+Im;__5sCcQiYqlsx`X=RR*?^Dm2+29-cDyEf`h(@f$uLR}-YZqhiBAzD@Q&Q1%g7)T&X347rAv%WobW@slU2kM zeRa#;bl0~xF6ikrnXX(Kg^A)#n_@9ISe?UsJW?z1X58D72#Gt6U%SVd=pdp$yHni& zeB9Fri*%udnvx*qGDe;Qg=w**UkjlnAFg?rjnvUKn}Kh~+`n)sCFHe9+_G1Glw2Pvw<;ouv{W^ILKESXogC6Ql#+q&0R-u+-4@c0=U9Ifd$oO+_2Bbc<9~LB0zQx;E>Y} zgegzXgGr8y@CppSXKVfILhBNQQpBl17I?Vj^kgyIN^@1edpy$CVX>;jWmi{xZ0?k^ zS>7=F>bpJ_O=o41d(No;?G)!h$_udX+xnduT>zMVvV`1(EwdbDC{3&I77#!L%Ls82 z5@fzB%R_m!7ntpBOk9?P%D*ow8;@hE*T~9$Aa6t-cAin@I%Gl-#mT=Wis*U#tferV zP1^H4ZgIq>(;ju@vJh*?{bSEKG+DYN+x^`&Y3DRf@OE}l`2*Qg>OUHiQhdz2Ed^!U ziiz0z$hqg{<1^1oIaeV*Nccd@rswj-3~ck&R1q~fH}(UM0Lpn%>uV?xj+YVjLd-T* zs7%o3!6q~8N`ysYBR8nG=u69fdBeiWnOW5GruQI(bfeSR1o43+M+_JA_O(n_Cwm#S z?ly4h_lvHIumh9^>-hxX(?)?Oj=uwjLOl+e2^Z<>J4WuVD~K>Pk?sA&6J2S*!ADCA ze*8N3#yE8Sds`tTTX-q*-DId_x zxg$ArZTaf4XqK=w3NC6p2+&1S{;fByIT{gOiT;0ecIM$w_H7?;kx*_aBFl*ONMwsJ z*+!+vzLY(C_B~tHWKC|AZL*~-BeISysZ{oDCZ@5*(3n9JLyUQU*SPQdd7t%o-q(MQ z!*RK0`^|Zt-|zQxa=&Q1fxAz8uj~MI5oRP~RURH5`>=yMSdK2hRaIiC`2*?PYf}M2 zN%7#+Ts1*~98w#+L)GdGu_UFL)_Z&bu6$|X8jJFS@x7QvkeUy*q-gBwwQKweBI)OP z3$kp^>4w`jsxjWZrsJ+ly(jxgRn3jFLjC17-2vaP(o?_RurN?#L3m1A*Uo`+nv96vQm~$w`V1jJ>eQ?yuCV?7kxiG$ z3(fWc`?TaVmcTZi8h_qfP~wiO%f2>G(~Tz+pU@xL&zNYc4r^Z`e?#9zza#=kh+FFO z%Y2shyEcHAM%Vf1!d*sFRXE1g#CP3ESf9dih=euLk>~voepbDoad0;7vR*dl$IbnvmLYYQ9~&~q%d>Ix3`>VOTa&XW2`5|DdBH1fZ60#J^H*ZRN zPAz^lG&Y|v*4ud(B!fa3MxCow|BTi+=fsq(jU)pfVW0hXpzfozGQ|5|e~;|F_1ZoW z1kN6O%?%>YgO-p}NpBQDCh@g6S3)EXl+$a}5!a=Oxqb}50nLQ{CaBN_cAY>r&?ziW zM$KJ~QIz}mHiT~ITKjLOTD@kjQUB2A^#UcZD15^FOowK zkFFEKx*^OPXsq(gdi8q@Q=nPMwa-R_siOLkF{|oe zO94WIIy%Ms1qkl|mB!l@N!4Pr&Gtu}VE;2ug)eh(sOb`|5z_z|Na!_ej$yMfV7|B* z^Wn_!Nwm6WBdjex{1CZ*+K+C^NDAH8Qr2LukhuTA0(7rJ=VziaKvb)~?Tk6A8W^_v zb!ME4C(C4QIeH)9uW={#76jRCDh1LY4L^DEeDEZYl`UK6Qhbvqr?kXfGfGMrjnWko z#LD5M;TNTmNeJ6aRH!t{DS$_?>4lf%n_Y<$z@%C#9%Fa*LO@Yv?#Pf>d!9?+rg;4{GGUCC8xn&n&C1kE(pJ%l3CI#w3ODGQv_b4D&e=BL1?4P~H@ zhSP0O!`@qQL&*ZGb`uJ}$!idPU&YskihrQ)joTYO5yS7cl;;52r>(C?)Aw~v3sj5k zmuRCfld9q?`1C@moX3DSuE3$j7tn;h+9oS~w`^BmtKMN;x+HV&XWLe>??`;m@_QZ{ z*o`(KN8PI1p)Wp02Zwo=I}RE>a9DwuP8u{xf?H+}Hfam*!&t!?792vKMEfUqFhWOx zO~Rlk*{|CpF$R2t%W7d*zPxYgx7=1$Y+s|Y8o)AJ9x@;=EDwTvorBlqwim!DU1FBu z!V-xtYe{+jQzrT} z##UQ@$C``&lETkdYBWEf&qL$*aq>7ow|oY{D&kMaHu5-)}#Jy^WRZcu|^t5%isdo=U8ySSVkB?SafBivVT;=V zZ;`UzcAQf7e1!7_9%L$}i2xj>l0saMRaJFaP6dSpyUW?U`)IWD!`lHce*t5@g$ZT^ zH@9sY;YC4`+aL`x6f0L(CSBqfEjm%n$txBRGF#nSuY4o??NT7qe%Ptw0v;3LPj^b| zEKRLM9awd04W(_a$}(B?JQVRrf+?ZxLIw{c!9sk{mZutHOfc`filXILNqu=i_2=?u zS|~ja$q-+W2-Cj1_xW1za~T(GbwdkJhv*`$_){v)`=lK0&Qtj2#BTo&AQ2uEvN_!^ zMbu$@ffTL+KBIMWe?Xl#l2;;}@)>NH@XZF!bL>GYUb{*Q-nnqjrN=!|o%(_N5>}Ue zTm;d>rWvvkYL7#475u)vQOB0gnS=fChJpxg^`^!=U#UCq-YDYt^Jo&=tYG_5DY7G% zd5g|EP6EgY#L^scuG*=_yZ_i0@1Y9T{+vgjPZZp#IzNBGxxK^tt7M7wXoDL#B1HzC zfKEfgMuf%W7$V7Wcx`s|OmX&i_d)YABZB;l%89r)Qz}m>%<}#Tw#3Z} z^NA0zu%aSpQzC$`aV;p`xt?Q?nFH_1lA#=6`N=A_nw9KUgj{k zb{W7R(1u!kg1Dz`QdVtPRbC>tKy&`Sxg8>b$jgN1Zx; z-4-f!gk0`)Cp>$3*5pK+n%AC}gxnAeT@fHoX}w}TSF4w@?S5HimYUlp!47phA>QO4 zL>Q}_y(PN{rl1tVPsa}ru$nljR5=W-r1T#D$v7>hZ!H3kid`ej;7iUql$K9o(GlRb zMS2>DFDPc~5m<)fa=a1Pj(V(Rm=Zdzrza%t^*Zk7{B+odbLInnmnyen_OWBx2wEc& z)CFX^TTCSLI?}Z4g2szHoXweF#LK0wdwSN#znaxw07J@>;`y=w92>*D1w6xx?gY{<<9%Wr z;F~{?KKM!;6LM}JvBz62N)wYp1q;_n1r6o+)hyhofdv^&`pP3o&~Uk$XX&9ydGeTAPJ_~`IHBXM$-HCe!NnRGap zV%KpqmH^};v~8&o{siQi1{}B{j~`4AmVRlS-z4pUf4x+&EXftPW-?Iol-DBI%t!k- z-qGN1z~9lHDwWLEm#U*US>gHKH)E^PuUsf})Bi@e)hswtchX+!~ollw|V{ZI#a59X*GFLOEZ#SIi^S@pCZfc_s6#d^c~aooX9C>&p86#C+T z&hsu7VF*|?;mc;gOy4Wz+r~-p zBCYF~tkA3zA5Pn@q08K4>GJGQK?-86V=Ngh75knP>M$u;)T1j&I}J=rX8^n50EtN z*28z2PeFl$Sm__Tq?29%tSXnDWY@@LC z_Jev~f)OSAArgK<;5noysTZbzT%!*!lXy>o%cA!j#(&!ls~1!faP@)8m;76~46QHL zN0u@F2M6z-ZQ|kIwKLN7F;`CIhf6|NR5-bv+W4;(uD>n}(1+|0YkE7bl{DEuKUi>! zVV?7~#DFFSy-p!Cf|y4=Bk+YA2VKKvFMuLXg<;}iQlTWn{1ZOe0M3iBdU|NxFZ?j- zPlZa;*%mynZnIrSfV>6d;wZ>S>QiA-Mz!49bYSohftMHIox`ti_X+S}KKYGPyl3Nk zLw`92Vgk4UA7~tTc(3r%Y?iy%sca9M?&K6N&RSUZ538&YIY7+Chi)udrrz8pgAYi` z0EX>{YT-ZW1Dx~(u@yEhX-oxVow?e_U)?Dlx&@K~c+jHJNK(DOngElcz7?-)a^My+ zk|%t*{nFBbEQ3w`aQ!6$K1 z2qg#{N!M3kPBM?+o(g~J-K4F!tS&V1(#&iIvRtbxWB@3EGA#->bF_7?kO>?EJuqWzSmdPtD>w=dXvpRQ2d;DHJDs?gBFL z3^NC8VKGBb8w4#j*QS%}qOQM6D9GC7HoER&kO*n8pfj{AwNqR#Or^cyGv%(Rc741O zII&KJd$iI;-Yh)@M-I+j5Qv!bp(~x1cVNXv-DR~GisQC{Rznip6@a$AewK%De)!(; zdawRBno6bSuRMM?>Yws_tEv|(5-h>V%i9&sth_UPLM68P%|RO&;RGHe3(cu8rA^{* z^51UKVGw1k(S4wB?rBZi{gY6ZP|N>XdJ0nP7$s1V)qKT7E0-wnqNotPA`|D&{ajhoGYe7p6K+kl?N_1&l#b+WpQHLS+^YBcBb=hjm!+6=f3#Z zw`6Y$vR+5J%Q?>K13(-O>iO4WLSalSw`L(|o}lNql$H|JJ#i9ydUE1}fUFhrMELgv z03~U4TUhScpza7yh%+hQT$QU^M=~8bt0r~~-jECc*(-3hS~shZ0P#*oqJ8rFWrg(d zTGk3-^=PDKeYN#CJ5kGI_wJ`lw}bG;Jx2%xeLR~bwpd4qPN~s|-|Ri!+ZzhV6$3>f ztp-p4C&gxN*Jry-1>mbQU3BJgoY3F1Yxr=9sL%AVC|$dU514F$>8xv+>1AzAI^6z zyau(6^S1$Xpf7h=T#Y+ccV9U_jK$i(6he1D#7~!fZ`X*LW-&0bj@x?`lX~+pmqep4 z@i4wbP&xk0SekUH%NeX^yQV*`o1VZg+2k85Wr|~3MRRv%Y#=|N#l1-Ng)<@xl}hcD z@qjUaffyNoZsvsNe>zA0*s?pkTr>GsOdxa*FFE#9T&Q-a5q;-yORfo^;G!3&?78{S z9W$heCwr|2d!qBv_WEW#EzX<*M;s&0TC4>Y-OU`(s2D&6)sTN^9(diR@x{+T^yzG? z0{mW#cfqP)+K~&4!pQSXz|0V5iTPE>7lSVd0%E22m1sW)w;XEb4tE?ql;HTq_cf~J zu`T1`2Wo>oHa8UIp3(0cA+bkZb+cF|T)Uca?fF>qy^W5!vsW|J8P8ZYSCf}Bcrgi< zoLi3(LQFfmP%gE1oK^_t%Yi=ey9pK}6Nh9+?sL|t7R8IFMjcX477v;v7&>=nexrCn^LS{C|?Sw50P1#3YWYKIj2&^m*k9GYDuyul8k;EDPb|H;BxeOih;}1=mgXPaIj!8wVluh*f~h z&Tr_xJET%;y4l>IllG|N?naUIT4;KP?g5HLtQqv|@L~Tk3Y=LHrta}X#>J@fCvbFm zbdH7Mn)|u<#w=F-N;_(Cs0!j}O#`2eQH2G*#JUxz`e?v1t51|2y_h+8IB^MnBX@y+ z5~(m5<=5DAu=66ABH%$m++X!Kidn;@f*3{al7b|Kl3@kc<`pAy4c3y1bMhKQzcRN7 zBgs(v+Bw#J+n*vYy>=4J>XqB|4;-__gCA>!WSoB=PZEyU+i7>GbKjUPsHM+Qg4`-K zI#<62Q@Zg|0N00|1jJk_C9uccon9Wsj*MR- zdoQBGnTGZNiw?e}o=ba?sv|#4de#2hR_$aUL>gE=(?M04pDLg?|=TOMSYc8zj2Ey&W$1ZwKI-+ADbOojfswc|%H>gi+lf5B| z!QRzES_knt-44xh*SaRbPT|MLf(xR$WgFiV( zzFz+y2B^Qv!+%kC{vU7WpD$%%*ya*BR}6jFV`B?T&jz^G=dsyC^92!+B7?MS+0mOa ze>?)clCl8T3E3}~CmD%G_2XK;gaDanRHB@o{~xSxF~j1M5gBixIs!aUbmnnjp>0a} z^Y=LRt&!ts^BRy+?9-76*4lnzVvGkT_KcC+Iq37sj+x4vug*kiP@n@FXz|8i|JC-r z3}k9|F^2K~ZracIvwxjn+rHgGtABp<|D7K3FJ9OG+oetuw!-f3csCZ+RWZ5){9M)0 KR!6B?Mf?v7UGEkE literal 0 HcmV?d00001 diff --git a/_posts/API_software/assets/image-20231130210427811.png b/_posts/API_software/assets/image-20231130210427811.png new file mode 100644 index 0000000000000000000000000000000000000000..38969a99542a6a52b1b990bfa1d67f05f50f59af GIT binary patch literal 25052 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 `G(x;2l+j$H#L_$#3 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 Wt4==kp75y+s0+HrI>p*oL;eHKou@ef literal 0 HcmV?d00001 diff --git a/_posts/algorithm/0_md_generator.sh b/_posts/algorithm/0_md_generator.sh new file mode 100644 index 0000000..6c2430f --- /dev/null +++ b/_posts/algorithm/0_md_generator.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +filename=$(date +"%Y-%m-%d-.md") + +cat > "$filename" << EOF +--- +layout: blog +banana: true +category: algorithm +title: +date: $(date +"%Y-%m-%d %H:%M:%S") +background: purple +tags: +- algorithm +--- + +* content +{:toc} +EOF + +echo "文件已生成:$filename" diff --git a/_posts/algorithm/2 023-07-31-basic-2-container.md b/_posts/algorithm/2 023-07-31-basic-2-container.md new file mode 100644 index 0000000..948165e --- /dev/null +++ b/_posts/algorithm/2 023-07-31-basic-2-container.md @@ -0,0 +1,883 @@ +--- +layout: blog +banana: true +category: algorithm +title: basic_2_容器使用 +date: 2023-07-31 09:43:37 +background: purple +tags: +- algorithm +--- + +* content +{:toc} + + + + +## 二. 进阶_容器使用 + +自然**有序**的容器, 可以直接使用 a.find(), 例如 + +- set multiset +- map /multimap +- unordered_set/unordered_multiset +- unordered_map/unordered_multimap + + + +| 容器 | 底层数据结构 | 时间复杂度 | 有无序 | 可不可重复 | 其他 | +| ------------------------------------------------------------ | ----------------- | ----------------------------------------------------------- | ------ | ---------- | ------------------------------------------------------------ | +| [array](https://github.com/huihut/interview/tree/master/STL#array) | 数组 | 随机读改 O (1) | 无序 | 可重复 | 支持**随机**访问 | +| [vector](https://github.com/huihut/interview/tree/master/STL#vector) | 数组 | 随机读改、尾部插入、尾部删除 O (1) 头部插入、头部删除 O (n) | 无序 | 可重复 | 支持随机访问 | +| [deque](https://github.com/huihut/interview/tree/master/STL#deque) | 双端队列 | 头尾插入、头尾删除 O (1) | 无序 | 可重复 | 一个中央控制器 + 多个缓冲区,支持首尾快速增删,支持随机访问 | +| [forward_list](https://github.com/huihut/interview/tree/master/STL#forward_list) | 单向链表 | 插入、删除 O (1) | 无序 | 可重复 | 不支持随机访问 | +| [list](https://github.com/huihut/interview/tree/master/STL#list) | 双向链表 | 插入、删除 O (1) | 无序 | 可重复 | 不支持随机访问 | +| [stack](https://github.com/huihut/interview/tree/master/STL#stack) | deque / list | 顶部插入、顶部删除 O (1) | 无序 | 可重复 | deque 或 list 封闭头端开口,不用 vector 的原因应该是容量大小有限制,扩容耗时 | +| [queue](https://github.com/huihut/interview/tree/master/STL#queue) | deque / list | 尾部插入、头部删除 O (1) | 无序 | 可重复 | deque 或 list 封闭头端开口,不用 vector 的原因应该是容量大小有限制,扩容耗时 | +| [priority_queue](https://github.com/huihut/interview/tree/master/STL#priority_queue) | vector + max-heap | 插入、删除 O (log2n) | 有序 | 可重复 | vector 容器 + heap 处理规则 | +| [set](https://github.com/huihut/interview/tree/master/STL#set) | 红黑树 | 插入、删除、查找 O (log2n) | 有序 | 不可重复 | | +| [multiset](https://github.com/huihut/interview/tree/master/STL#multiset) | 红黑树 | 插入、删除、查找 O (log2n) | 有序 | 可重复 | | +| [map](https://github.com/huihut/interview/tree/master/STL#map) | 红黑树 | 插入、删除、查找 O (log2n) | 有序 | 不可重复 | | +| [multimap](https://github.com/huihut/interview/tree/master/STL#multimap) | 红黑树 | 插入、删除、查找 O (log2n) | 有序 | 可重复 | | +| [unordered_set](https://github.com/huihut/interview/tree/master/STL#unordered_set) | 哈希表 | 插入、删除、查找 O (1) 最差 O (n) | 无序 | 不可重复 | | +| [unordered_multiset](https://github.com/huihut/interview/tree/master/STL#unordered_multiset) | 哈希表 | 插入、删除、查找 O (1) 最差 O (n) | 无序 | 可重复 | | +| [unordered_map](https://github.com/huihut/interview/tree/master/STL#unordered_map) | 哈希表 | 插入、删除、查找 O (1) 最差 O (n) | 无序 | 不可重复 | | +| [unordered_multimap](https://github.com/huihut/interview/tree/master/STL#unordered_multimap) | 哈希表 | 插入、删除、查找 O (1) 最差 O (n) | 无序 | 可重复 | | + + + +### 1 迭代器 iterator + +#### 1.1 常用迭代器操作 + +```c++ +// 迭代器在容器内部 +vector :: iterator it; +// 可以使用解引用操作符*,来访问迭代器指向的元素。 +*it; + +// 常用的操作有: +++ -- == != + +// 只有顺序容器才可以适应it + n, <=,>= + +// 左闭右开的好处, 判断相等 +first == last 代表空。 + +// 访问元素 +it-> mem; + + +// 对两个迭代器进行相减操作,会计算它们之间的距离, +auto distance = it2 - it1; + +// 如果迭代器所指向的容器不支持随机访问,例如 list 或 set,则不能使用迭代器相减操作, 可以考虑使用distance +// 位于 头文件中 +#include +typename std::iterator_traits::difference_type + distance( InputIt first, InputIt last ); + +// 如果在调用 std::distance 函数时,第一个迭代器的位置在第二个迭代器的后面,则返回的结果为负数 +auto d = std::distance(it1+3, it1); + +// 在计算迭代器之间的距离时,要确保这两个迭代器都指向同一个容器中的元素或者它们都是指向同一块可寻址内存空间的合法指针。否则,std::distance() 函数的行为是未定义的。 + + +// 找到最大值所在的元素的迭代器, 注意, it1 <= it2 +#include +max_element(it1, it2); +min_element(it1, it2); +``` + + + +#### 获取迭代器的地址 + +```c++ +for (auto it = v.begin(); it != v.end(); ++it) { + std::cout << &(*it) << " "; +} +``` + + + + + +### 2 序列式容器 + +#### 2.1 string + + +````c++ +//四种基本的初始化,顺序容器的初始化,默认,复制,范围,n个值 +string s1; +string s1(s2); +string s3("sdf"); +string s4(n, 'c'); + +// 输入 string +string s4; +cin >> s4; + +// 从开始位置复制到最后 +string s5(s1, pos); +string s6(s1, pos, len); + +// operator+= +s1+= s2; +s1+= 'c'; + +// 清空 +s.clear(); + +// 用迭代器内元素替换 +s.assign(it1, it2); +s.assign(n, value); + +// 也可以直接使用下标进行修改 +s[i] = '0'; + + +// // 也没有 iterator 的形式 +// 查找的类型, 开始位置 +size_t find (char c, size_t pos = 0) const; +size_t find (const string& str, size_t pos = 0) const; +size_t find (const char* s, size_t pos = 0) const; +// 开始位置, 结束位置 +size_t find (const char* s, size_t pos, size_t n) const; + + +// 截取子串, 只有使用下标的形式 +// 若超出字符串长度,则默认从 pos 到字符串末尾提取所有字符。 +string substr (size_t pos = 0, size_t len = npos) const; + +// 临时将string对象转换为C风格字符串。不能直接用于修改字符串内容。 +const char* string::c_str(); + +```` + + + +```c++ +//---------------------插入删除-------------- +// 插入字符串, 字符串的子串 +string& insert (size_t pos, const string& str); +string& insert (size_t pos, const string& str, size_t subpos, size_t sublen); +string& insert (size_t pos, const char* s); +string& insert (size_t pos, const char* s, size_t n); + +// 插入char 类型必须要有数量参数 +string& insert (size_t pos, size_t n, char c); +void insert (iterator p, size_t n, char c); + +iterator insert (iterator p, char c); + +// 删除, 默认是全部删除, 单点删除只支持迭代器 +string& erase (size_t pos = 0, size_t len = npos); +iterator erase (iterator p); +iterator erase (iterator first, iterator last); +``` + + + + + +```c++ +// ----------------string与 数值类型--------- +// 在头文件 string 中 +// string => int +int stoi (const string& str, size_t* idx = 0, int base = 10); + +// string => double +double stod(const string& str, size_t* idx = 0); + +// 转换为 string +// int/ double float => double +string s1 = to_string(123); +string s2 = to_string(4.5); + +//字符处理 +#include +// 判断一个字符是否为字母或数字 +isalnum(char); +isalpha(char); + +isdigit(char); +islower(); +isupper(); + + +toupper(c); +tolower(c); +// 判断是否是字母等 +isalpha 字⺟母(包括⼤大写、⼩小写) + +isalnum(字⺟母⼤大写⼩小写+数字) +isblank(space和\t) +isspace(space、\t、\r、\n) +``` + +输入输出 + +```c++ +// 输入到 string +string str; +cout << "请输入一个字符串:"; +cin >> str; // 用户输入 "Hello, World!",则 str 的值为 "Hello," + +// 当cin遇到空白字符时就停止,最标准的方法是调用getline(cin,str)函数。 +string line; +getline(cin, line); // 用户输入 "This is a sentence.",则 line 的值为 "This is a sentence." + +// 从文件输入 +ifstream fin("file.txt"); +string str; +fin >> str; +``` + + + + + +#### 2.2 vector + +the link with capacity + +- 如果两个`vector`相比较, 返回第一个不相同元素的 `<` 比较结果, +- 内部以连续的方式存放, 当没有空间存放时, 会重新分配空间, 原来的迭代器会失效( 因为**地址**发生了改变), **插入会使该容器所有的迭代器失效** + +```c++ +//初始化 +vector v1; +vector v2(v1); //复制v1 +vector v3(n, value); //n个值为value的元素 +vector v3(n); //n个初始元素的副本。 +vector v4(a+1, a+3) //使用数组进行初始化,不包括最后一个地址的元素。 + +//a的大小 +a.size() ; +//判断是否为空 +v.empty() ; + +//在容器的最后添加一个值为t的数据,容器的size变大。 +v.push_back(t); +//删除容器的末尾元素,仅仅删除,没有返回。 +a.pop_back() ; + + +//第一个元素,最后一个元素的引用(值)。 +v.back(); +v.front(); + +//----------------------大小有关的操作--------------------- +//清空 +v.clear(); +//调整大小。 +v.resize(n, t); +v.resize(n); +//删除,返回删除元素的下一个位置,也是左闭右开。 +v.erase(it); +v.erase(it1, it2); + +//插入it 前面, 代表 成为它 , 原来序号是3, 插入的新值序号也是3 +//同时返回新元素的迭代器 +//第一个版本, 插入一个新的值 +v.insert(it, value); +//第二个版本, 插入n个新的值 +v.insert(it, n, value); +//插入it前面,从it1 到it2 的元素 +v.insert(it , it1, it2); + +//第一个元素的地址, 要把vector 和数组区分开。 +&v[0]; +``` + +```c++ +// ----------------------多维vector---------- +// 多维vector 只能添加 vector +// 若想定义A = [[0,1,2],[3,4]],有两种方法。 +vector > A; +vector B = {0,1,2}; +vector C = {3, 4}; +A.push_back(B); +A.push_back(C); + + +for(int i = 0; i < 2; ++i) { + A.push_back(vector()); +} +A[0].push_back(0); + +// vector >A中的vector元素的个数 +len = A.size(); +// vector >A中第i个vector元素的长度 +len = A[i].size(); +``` + + + +**避免因为插入导致的迭代器失效** + +```c++ +//一个容器中, 读取完元素后, 再插入一个值 +auto first = a.begin(), last = a.end() +while(first != a.end()){ + first = a.insert(++first, 666); + ++first; +} +``` + +关系运算符 ------- 容器的比较是基于**容器内元素**的比较 + +- 当长度相同且元素相等, 则相等 +- 比较的结果 取决于 **第一个不相等**的元素 +- 当 `vector`进行比较时, 空的 vector 被放到前面 + + + +#### 2.3 list + +```c++ +// 因为是双向链表, 所以 it 可以++, -- +list l{1, 2, 3, 4}; +// 多个元素的值 +list > l; + +// 获取元素的值 +l.front(); +l.back(); + +// 头尾均可插入删除 +l.push_front(); +l.pop_front(); + +l.push_back(); +l.pop_back(); + +// 插入 +l.insert(it, val); +l.insert(it, n, val); //n 个 value +l.insert(it, it_first, it_last); + +// delete +l.erase(it); +l.erase(it_first, it_last); + +// 拼接 +// 整个l2 拼接到 it1的位置 +l1.splice(it1, l2) +// 将 l2 的 l2_pos 指向元素(节点)切除,拼接到 l1 的 l1_pos 处(l1 和 l2 可相同) +l1.splice (iterator l1_pos, list& l2, iterator l2_pos ); +l1.splice(head, l1, it_2); +//将容器lt6的指定迭代器区间内的数据拼接到容器lt5的开头 +lt5.splice(lt5.begin(), lt6, lt6.begin(), lt6.end()); + +// 删除重复元素 +l.unique(); + +// 删除满足条件的元素 bool fun() +lt.remove_if(fun); +``` + + + +#### 2.4 deque + +```c++ +// 初始化 +deque de(10, 666); + +de.push_back(1); +de.push_front(1); +``` + + + + + +#### 2.5 stack + +```c++ +stack st; + +// 判断是否为空 +st.empty(); + +// 入栈 +st.push(1); + +// 返回栈顶元素 +st.top() + +// 出栈 +st.pop(); +``` + + + +#### 2.6 queue + +```c++ +queue qu; + +// 进入队列 +qu.push(a); + +// 返回队头元素 +qu.front(); + +// 队头的元素 出队 +qu.pop(); +``` + + + +#### 2.7 priority_queue + +实质: **堆** + +```c++ +// template , class Compare = less > +// class priority_queue; +// 默认是按小于 (less) 的方式比较,这种比较方式创建出来的就是 大顶堆。 +// 就当作 比较的时候 先输入 子节点, 然后输入 父节点 +priority_queue, vector>, compare> heap; + +// 初始化方式, 使用迭代器初始化 +(it1, it2); + +// 和 stack 很像 +// 添加元素 +heap.push(); + +// 获得堆顶元素 +heap.top() + +// 删除元素 +heap.pop(); +``` + + + + + +#### 2.8 bitset 位运算 + +与(AND)、或(OR)和异或(XOR)是逻辑运算符,在计算机编程中有一些特殊性: + +- 与和或 亦或 运算都是**可结合的和可交换**的,即表达式中多个操作数的**顺序**不影响最终结果。 + +异或(XOR)的特殊性:**相同为假**, 不同为真 + +- 异或运算可以用于检测两个值是否不同,如果两个值不同,则结果为真。 +- 在编程中,异或运算常用于交换两个值的变量,而无需引入第三个中间变量。 + + + + + + + +- `1`的特殊性: 二进制形式如 `000000001`, 只有末尾一个`1` +- 编程时,请注意运算符的**优先级**。例如 `==` 在某些语言中**优先级**更高, **位运算需要加括号** + +```c++ +// 将x左移 n位, 补零 +x << n; + +// 判断 第 d 位是否为 1 +// 1 的特殊性, 只有最低位是 1 +bit = 0b11001; +// 右移也是补 0 +bit >>d &1 ; + +// 按位与操作符的返回值是一个新的二进制数 +// 每一位都是两个操作数相应位执行**逻辑操作**的结果 + +// 一个有 n 位数字的集合如何表示全集 +(1<> i) & 1) { // i 在 s 中 + // 处理 i 的逻辑 + } +} + +// 枚举 从空集到 全集 +for (int s = 0; s < (1 << n); s++) { + // 处理 s 的逻辑 +} + +// 设集合为 s,从大到小枚举 s 的所有非空子集 sub +// 暴力做法是从 s 出发,不断减一直到 0,但这样中途会遇到很多并不是s 的子集的情况。 +for (int sub = s; sub; sub = (sub - 1) & s) { + // 处理 sub 的逻辑 +} + +``` + + + + + +```c++ +#include "biset" +// 和一般的容器不一样, <>中间是多少个二进制位数, 5表示5个⼆二进位 +// 默认在高位补零, 下面就是 "00011" +bitset<5> b("11"); + +// 如果用较大的整数向较小的 bitset 对象赋值,也会发生同样的截断错误,不会产生警告或异常, 并且会将高位丢弃 +bitset<3> (16) ; + + +// 从整数创建 +std::bitset<8> b(n); +// 高位置截断 +string str = bs.to_string().substr(bs.to_string().find('1')); + +bitset<5> b; 都为0 +bitset<5> b(u); u为unsigned int,如果u = 1,则被初始化为10000 +bitset<5> b(s); // s为字符串串,如"1101" -> "10110" +bitset<5> b(s, pos, n); // 从字符串串的s[pos]开始,n位⻓长度 + +// 使用下标, 注意, 重要区别 +// b[0] 访问的是 b 的最右边的一位,即二进制数的最低位 +// 访问 std::bitset 对象的元素时,如果所访问的元素的值为 0,则索引操作符返回 false;如果所访问的元素的值为 1,则索引操作符返回 true。 + +// 可以直接输出 +cout << bitset<8>(15); + +// b中⼆二进制位的个数 + b.size(); +// 统计1的位数 +int count = b.count(); + +// 0 1操作 +//把b的下标为4处置1 +b.set(4); + +//所有位归零 +b.reset(); +b.reset(3); //b的下标3处归零 + +// 操作符, 必须位数相同才能操作 +std::bitset<8> b3 = b1 & b2; // 位与 +std::bitset<8> b4 = b1 | b2; // 位或 +std::bitset<8> b5 = b1 ^ b2; // 位异或 +std::bitset<8> b6 = b1 << 2; // 左移 2 位 +std::bitset<8> b7 = b1 >> 2; // 右移 2 位 + + + +// 所有位都为真 +cout << endl << b.any(); //b中是否存在1的⼆二进制位 +// 所有位都为假 +cout << endl << b.none(); //b中不不存在1吗? +cout << endl << b.count(); //b中1的⼆二进制位的个数 + +cout << endl << b.test(2); //测试下标为2处是否⼆二进制位为1 + +b.flip(); //b的所有⼆二进制位逐位取反 +unsigned long a = b.to_ulong(); //b转换为unsigned long类型 +``` + + + + + + + +### 3 关联式容器 + +#### 3.1 pair + +```c++ +typedef pair mypair; + +// map 中 key 类型是 const 类型 +map mp; +for(auto & node: mp){ + // 实际要写成 + pair node: +} + +pair p; +// 只有两个成员, 注意不是成员 函数 +p.first; +p.second; + +``` + + + + + +#### 3.2 map + +**map/multimap属于 关联式 容器,底层结构是用 二叉树( 红黑树 ) 实现, 时间复杂度为O(logn)。** + +```c++ +a.size(); //返回容器中元素的数目 +a.empty(); //判断容器是否为空 +swap(st); //交换两个集合容器 + +a.count(key); //统计key的元素个数 + +// 清除元素 +void erase (iterator position); +size_type erase (const key_type& k); +void erase (iterator first, iterator last); + +void printMap(map&m){ + for (map::iterator it = m.begin(); it != m.end(); it++){ + cout << "key = " << it->first << " value = " << it->second << endl; + } + cout << endl; +} +``` + + + +#### 3.1 unordered_map + +**基于哈希表, 空间大, 时间复杂度不稳定,平均为常数级O(c), 取决于哈希函数,极端情况下为O(n)** + +- `unordered_map, int> mp`会报错, 因为没有给`pair`做 Hash 函数 +- `map` 里面是通过操作符 `<` 来比较大小,而 pair 是可以比较大小的。 + +```c++ +// 注意:C++11才开始支持括号初始化 +unordered_map mp={ + { 1, "张三" },{ 2, "李四" } +}; + +// 使用[ ]进行单个插入,若已存在键值,则赋值修改,若无则 插入。 +mp[2] = "李四"; //不会插入 + +// 使用键值 删除 +size_type erase ( const key_type& k ); + +// 使用insert和pair插入, 麻烦 +mp.insert(pair(3, "王二")); + +//遍历输出+迭代器的使用 +auto iter = mp.begin();//auto自动识别为迭代器类型unordered_map::iterator +while (iter!= myMap.end()){ + cout << iter->first << "," << iter->second << endl; + ++iter; +} + +unordered_map::iterator it; +it->first; // same as (*it).first (the key value) +it->second; // same as (*it).second (the mapped value) +``` + + + + + +#### 3.3 set + +```c++ +// 定义⼀一个空集合s +set s; + +// 增 +s.insert(1); + +// 删除集合s中的1这个元素 +s.erase(1); + +// 查 +s.count(1); + +// s.find() 返回迭代器 +// 根据 STL 前毕后开的特点 如果结果等于s.end()表示未找到 +s.find(2) != s.end()) << endl; +``` + + + +#### 3.4 multiset + +```c++ +multiset set; +// 使用键值删除会全部删除 +st.erase (40); // [10 30 40 40 50 60] -> [10 30 50 60] + +``` + + + + + + + + + +### 4 算法库 & 常用库 + +#### 4.1 sort 函数 + +```c++ +# include + +// 默认,v从⼩小到⼤大排列, 并且是前闭后开 +sort(v.begin(), v.end()); + +//cmp函数返回的值是bool类型 +bool cmp(int a, int b) { + return a > b; // 从⼤大到⼩小排列列 +} + +// 有时候这种简单的if-else语句句我喜欢直接⽤用⼀一个C语⾔言⾥里里⾯面的三⽬目运算符表示~ +bool cmp(stu a, stu b) { + return a.score != b.score ? a.score > b.score : a.number < b.number; +} + +// 也可以使用 lambda 表达式 +sort(envelopes.begin(), envelopes.end(), [](const auto& e1, const auto& e2) { + return e1[0] < e2[0] || (e1[0] == e2[0] && e1[1] > e2[1]); +}); +``` + + + +#### 4.2 max & min & max_element() & min_element + +```c++ +// max min 四 个版本 +template const T& max (const T& a, const T& b); +template const T& max (const T& a, const T& b, Compare comp); +template T max (initializer_list il); +max({3, 4, 5}); +template T max (initializer_list il, Compare comp); + + +``` + + + +```c++ +// 找最大最小值, 返回的是 **迭代器** +template ForwardIterator max_element (ForwardIterator first, ForwardIterator last); + +template ForwardIterator max_element (ForwardIterator first, ForwardIterator last, Compare comp); + +``` + + + +#### 4.5 lower_bound() + +```c++ +// 二分查找最低位 +It lower_bound(ForwardIt first, ForwardIt last, const T& value); + +// 重载形式 +ForwardIt lower_bound(ForwardIt first, ForwardIt last, const T& value, Compare comp); +``` + + + + + +#### 4.3 累加accumulate + +- 使用时注意初值 +- `accumulate(nums2.begin(), nums2.end(), 0LL)` 中的 `0LL` 表示将初始值设为 long long 类型的 0 值,而 `accumulate(nums2.begin(), nums2.end(), 0)` 中的 `0` 表示将初始值设为 int 类型的 0 值。会有**溢出**风险 + +```c++ +// 默认相加的操作, 最后一个参数为初始值, 必须有初始值 +accumulate(it1, it2, init_value); + +// 自定义运算 +std::string str1 = "hello"; +std::string str2 = "world"; + +int sum = std::accumulate(str1.begin(), str1.end(), 0, + [=](int acc, char c) {return acc + c + str2[c - 'a'];}); + + +``` + + + +```c++ +template +T accumulate(InputIt first, InputIt last, T init) { + for(; first != last; ++first) { + init = init + *first; + } + return init; +} + +// +template +T accumulate(InputIt first, InputIt last, T init, BinaryOp op) { + for(; first != last; ++first) { + init = op(init, *first); + } + return init; +} +``` + + + +#### unique + +- 让区间内的元素**唯一** +- 使用之前先排序 +- 只能移除相邻的重复元素,并将重复元素移动到区间的末尾,然后返回指向新的区间尾部 + +```c++ +// 返回最后一个唯一元素 +it unique(nums.begin(), nums.end()); +``` + + + + + + + + + +#### 4.2 常用算法_find fill for_each + +```c++ +//查找元素, find返回迭代器, 如果没找到, 返回it2, 因此, 检查返回值和it2 是否相等可以看出是否找到. +find(it1, it2 , value); + +//将value的副本写入指定的范围, 只对输入范围内部的元素进行写入操作 +fill(it1, it2, value); + +//对于每一个元素都执行的操作 +for_each(it1, it2, func) + +for_each(a.begin(), a.end(),[&](int x){cout<< x<< endl;}); +``` + + + + + + + +#### 4.4 copy() + +```c++ +// copy() 函数定义在 algorithm 头文件中。 +template +OutputIt copy(InputIt first, InputIt last, OutputIt dest) { + while (first != last) { + *dest++ = *first++; + } + return dest; +} +``` + + + diff --git a/_posts/algorithm/2023-07-25-basic-1.md b/_posts/algorithm/2023-07-25-basic-1.md new file mode 100644 index 0000000..0a6ad05 --- /dev/null +++ b/_posts/algorithm/2023-07-25-basic-1.md @@ -0,0 +1,283 @@ +--- +layout: blog +banana: true +categories: algorithm +title: "basic_1_算法基础知识" +date: 2023-07-24 21:19:24 +background: purple +tags: +- algorithm +--- + +* content +{:toc} + + +### 基础知识 + + + +#### 代码风格 + +```c++ +class Solution { +public: + void moveZeroes(vector& nums) { + int slowIndex = 0; + for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) { + if (nums[fastIndex] != 0) { + nums[slowIndex++] = nums[fastIndex]; + } + } + for (int i = slowIndex; i < nums.size(); i++) { + nums[i] = 0; + } + } +}; +``` + + + + + +#### ACM模式 + +```c++ +#include +#include +using namespace std; +int main() { + int n; + while (cin >> n) { + vector gym(n); + vector work(n); + for (int i = 0; i < n; i++) cin >> work[i]; + for (int i = 0; i < n; i++) cin >> gym[i]; + int result = 0; + + // 处理逻辑 + + cout << result << endl; + } + return 0; +} +``` + + + +#### leetcode模式/ 核心代码模式 + +- 只关注**核心逻辑**, 培养算法思维 + +```c++ +class Solution { +public: + void moveZeroes(vector& nums) { + int slowIndex = 0; + for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) { + if (nums[fastIndex] != 0) { + nums[slowIndex++] = nums[fastIndex]; + } + } + for (int i = slowIndex; i < nums.size(); i++) { + nums[i] = 0; + } + } +}; +``` + + + +#### 究竟什么是时间复杂度 + +时间复杂度是一个函数,它定性描述该算法的**运行时间**。 + +我们在软件开发中,时间复杂度就是用来方便开发者估算出程序运行的答题时间。 + +那么该如何估计程序运行时间呢,通常会估算算法的操作单元数量来代表程序消耗的时间,这里默认 CPU 的每个单元运行消耗的时间都是相同的。 + +假设算法的问题规模为 n,那么操作单元数量便用函数 f (n) 来表示,随着数据规模 n 的增大,算法执行时间的增长率和 f (n) 的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 O (f (n))。 + + + +#### 什么是大o什么是大 O + +这里的大 O 是指什么呢,说到时间复杂度,**大家都知道 O (n),O (n^2),却说不清什么是大 O**。 + +算法导论给出的解释:**大 O 用来表示上界的**,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。 + +同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是 O (n^2) 。 + +输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是 O (n),但如果数据是逆序的话,插入排序的时间复杂度就是 O (n^2),也就对于所有输入情况来说,最坏是 O (n^2) 的时间复杂度,所以称插入排序的时间复杂度为 O (n^2)。 + +同样的同理再看一下快速排序,都知道快速排序是 O (nlogn),但是当数据已经有序情况下,快速排序的时间复杂度是 O (n^2) 的,**所以严格从大 O 的定义来讲,快速排序的时间复杂度应该是 O (n^2)**。 + +**但是我们依然说快速排序是 O (nlogn) 的时间复杂度,这个就是业内的一个默认规定,这里说的 O 代表的就是一般情况,而不是严格的上界**。 + +比如下面的常用算法的运行时间 + +| 排序算法 | 平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 排序方式 | 稳定性 | +| -------- | -------------- | ----------- | -------- | ---------- | -------- | ------ | +| 冒泡排序 | O(n^2) | O(n) | O(n^2) | OG) | In-place | 稳定 | +| 快速排序 | O(n log n) | O( n logn) | | Olon n | In-place | 不稳定 | + + + +#### 抓主要矛盾 + +```bash +O(2*n^2 + 10*n + 1000) += O(2*n^2 + 10*n) += O(n^2 + n) += O(n^2) + +``` + + + + + +#### O (nlogn) 和 O (n) + +在算法的时间复杂度分析中,O (nlogn) 和 O (n) 是具有明显差异的复杂度级别。尽管它们都随着输入规模 n 的增加而增加,但增长率不同。 + +当 n 增加时,O (nlogn) 的增长速度比 O (n) 快得多。具体来说,当 n 增加时,O (nlogn) 的增长率是线性对数级别(即 n 乘以其对数)。而 O (n) 的增长率是线性级别(即 n 的倍数)。 + +举个例子,假设 n = 10^6,则 O (n) 的时间复杂度为 10^6,而 O (nlogn) 的时间复杂度为 10^6 * log₂(10^6),约为 10^6 * 20 ≈ 2 * 10^7。可以看到,O (nlogn) 明显大于 O (n)。 + +当输入规模较大时,如 n = 10^9,O (n) 的时间复杂度为 10^9,而 O (nlogn) 的时间复杂度为 10^9 * log₂(10^9),约为 10^9 * 30 ≈ 3 * 10^10。同样可以看到,O (nlogn) 明显大于 O (n)。 + +```bash +2^10 = 1024 ≈ 1000 +n = 1000 时 +O(n) = 1000 +O(nlogn) = (1000 * 10) = 10,000 +``` + + + + + + + + + + +### 2 一些技巧 + +#### 1.0 如何判断你的代码能不能在规定时间内通过: + +- 机器处理的数据量为 1e8 + +- 因此,一般1e4 范围内的数据可以 O(n2), 1e5范围内的数据O(nlogn) + + + +#### 1.1 概念辨析 + +| 命令 | 解释 | +| -------------------- | ----------------------------------------------- | +| fun(x++) | 输入到函数里面的是 **x** | +| fun(++x) | 输入到函数里面的是 **x+1** | +| if(! flag) | 当 **flag == 0**的时候执行 | +| if( 1== a) | 写出if(1=a)就会报错, 少打了= | +| int n = 1e5 | 少写几个零 | +| (a, b)中有 | b-a+1 个数字 | +| vector\的中位数 | a[**n/2**] 或者 1/2 * (a[n/2] +a[**n/2 -1**] ) | +| max(\{a, b, c,,,\}) | abc,,,,中最大的数 | + + + +#### 1.2 各种初始化 + +有三种初始化方式, + +- 小括号初始化, 当你想用默认初始化时, Weight(), 会声明一个函数 +- 大括号统一初始化, 从**概念上**可以用于**一切场合**, 表达一切意思的初始化, 有个新特性, 禁止**内建型别**之间进行**隐式窄化**型别转化 + +```c++ +// -----------------------初始化------------------------- +// 列表初始化 +vector > map = { + {1, 0}, {-1, 0}, {0, 1}, {0, -1} +}; + +// 多维数组的列表初始化, 和上面一样 +int map[4][2] = {1, 0, -1, 0, 0, 1, 0, -1}; + +// 默认值的初始化, 全部是 0 +int a[26] ={}; +int a[26]{}; + +// 前三个是 1, 2, 3, 后面的值都是 0 +int a[26] ={1, 2, 3}; + +// 大括号 初始化 +vector v{1,3,4}; +``` + + + +#### 1.3 巧用 引用`ref` + +```c++ +// -----------------------巧用引用------------------------- +void mysort(vector &nums){ + // 如果要对数组元素进行改变, 可以使用引用. + for(int &x: nums){ + if(x% 2) x=-x; + } + sort(nums.begin(), nums.end()); +} +``` + + + +#### 1.4 数组的中位数 + +- 长度为`len`, 奇数: 正中间, 偶数中间偏右 +- 使用下标时, a[l, r] $\frac{l+r}{2}$**中间靠左** + + + +#### 1.6 类型上下界 + +| 缩写 | 类型 | +| ----------------- | ----------------- | +| INT_MAX INT_MIN | int 类型最大最小 | +| UINT_MAX | unsigned 最大最小 | +| LONG_MIN | | +| LLONG_MAX | long long最大最小 | +| ULONG_MAX | | + + + + + + + +#### 1.5 模板 访问类内部成员 + +- 模拟题才会用到 + +```c++ +// 访问类内部的类型时, 一般而言, 需要实例化以后才可以访问类内部的对象 +template +class Myclass{ + typename T::subtype *ptr; +} +// 含义是指向类内部类型的指针 +``` + + + + + + + + + + + + + diff --git a/_posts/algorithm/2023-07-30-dp-01bag.md b/_posts/algorithm/2023-07-30-dp-01bag.md new file mode 100644 index 0000000..689d3fc --- /dev/null +++ b/_posts/algorithm/2023-07-30-dp-01bag.md @@ -0,0 +1,106 @@ +--- +layout: blog +banana: true +category: algorithm +title: 动态规划_01背包 +date: 2023-07-30 13:38:49 +background: purple +tags: +- algorithm +- DP +--- + +* content +{:toc} + + +``` +algorithm_DynamicProgram_1_01背包问题 +``` + + + +题目链接: [2. 01背包问题 - AcWing题库](https://www.acwing.com/problem/content/2/) + +> 有 N 件物品和一个容量是 V的背包。每件物品只能使用一次。 +> +> 第 i 件物品的重量是 w[i],价值是 v[i]。 +> +> 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 +> 输出最大价值。 + +#### 动态规划的三个步骤: + +- 确立dp数组的意义 +- 确立递推公式 +- 确定遍历顺序( 多维 ) +- 处理边界情况 + +#### 三个 tips: + +- 当递推式包含min时,可以把初值设置的尽可能大,毕竟是求最小。 +- 当递推式需要比较很多项时,min(dp[i] , dp[i-j]);也就是两两比较 +- 注意**处理边界**条件。 + + + + + +> 有 N 件物品和一个容量是 W的背包。每件物品只能使用一次。 +> +> 第 i 件物品的重量是 w[i],价值是 v[i]。 +> +> 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 +> 输出最大价值。 +> +> #### 输入格式 +> +> 第一行两个整数,N,V用空格隔开,分别表示物品数量和背包容积。 +> +> 接下来有 N 行,每行两个整数 vi,wi用空格隔开,分别表示第 i 件物品的体积和价值。 +> +> #### 输出格式 +> +> 输出一个整数,表示最大价值。 +> +> #### 数据范围 +> +> 0 0 +#include +using namespace std; + +int main(){ + // the number of things, and the volume of bags + + int N,V; + cin >> N >>V; + + vector w(N,0), v(N, 0), dp(V+1, 0); + + for(int i =0; i> w[i] >>v[i]; + + } + + //init + for(int i =w[0];i<= V; ++i){ + dp[i] = v[0]; + } + + for(int i =1;i< N; ++i){ + for(int j = V; j>= w[i]; --j){ + dp[j] = max(dp[j- w[i]] + v[i], dp[j]); + + } + } + + cout<< dp[V]<< endl; + return 0; + +} +``` + diff --git a/_posts/algorithm/2023-07-30-problem-array.md b/_posts/algorithm/2023-07-30-problem-array.md new file mode 100644 index 0000000..3b09373 --- /dev/null +++ b/_posts/algorithm/2023-07-30-problem-array.md @@ -0,0 +1,994 @@ +--- +layout: blog +banana: true +category: algorithm +title: 经典的数组的题目 +date: 2023-07-30 22:08:29 +background: purple +tags: +- algorithm +- array +- leetcode +--- + +* content +{:toc} + + + + + +数组是存放在连续内存空间上的相同类型数据的集合。需要两点注意的是 + +- 数组下标都是从 0 开始的 +- 数组内存空间的地址是连续的 + +正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。数组的元素是不能删的,只能覆盖。 + + + + + +# 二分查找 + +## leetCode 704 二分查找 + +给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 + +示例 1: + +``` +输入: nums = [-1,0,3,5,9,12], target = 9 +输出: 4 +解释: 9 出现在 nums 中并且下标为 4 +``` + +示例 2: + +``` +输入: nums = [-1,0,3,5,9,12], target = 2 +输出: -1 +解释: 2 不存在 nums 中因此返回 -1 +``` + +提示: + +1. 你可以假设 nums 中的所有元素是不重复的。 +2. n 将在 [1, 10000]之间。 +3. nums 的每个元素都将在 [-9999, 9999]之间。 + +### 思路 + +最简单的方案,一行代码搞定 + +```js +var search = function (nums, target) { + return nums.indexOf(target) +} +``` + +``` +Accepted +47/47 cases passed (64 ms) +Your runtime beats 63.35 % of javascript submissions +Your memory usage beats 54.75 % of javascript submissions (43.9 MB) +``` + +但我们还是学习一下二分查找的思路。 + +注意这道题目的前提是数组是**有序数组**,这也是使用二分查找的基础条件。 + +1. 定义一个区间 `[left, right]`,其中 right 为数组的最后一项下标 +2. 判断如果 `left <= right` 时,获取一次 left 到 right 的中间值 middle,这里要注意 middle 要使用 `Math.floor` 取整数。 +3. 判断如果下标为 middle 的数值 < target,则 target 在 middle 的右边,将 left 赋值为 middle + 1 +4. 判断如果下标为 middle 的数值 > target,则 target 在 middle 的左边,将 right 赋值为 middle - 1 +5. 否则如果 middle === target,直接返回 middle +6. 循环 2-5 步骤 +7. 否则返回 -1 + +### 解法 + +```js +/** + * @param {number[]} nums + * @param {number} target + * @return {number} + */ +var search = function (nums, target) { + let left = 0 + let right = nums.length - 1 + + while (left <= right) { + const middle = Math.floor((left + right) / 2) + if (nums[middle] > target) { + right = middle - 1 + } else if (nums[middle] < target) { + left = middle + 1 + } else { + return middle + } + } + return -1 +} +``` + +``` +Accepted +47/47 cases passed (56 ms) +Your runtime beats 92.97 % of javascript submissions +Your memory usage beats 89.92 % of javascript submissions (43.8 MB) +``` + +举一反三 + +## leetCode 35 搜索插入位置 + +给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 + +请必须使用时间复杂度为 O(log n) 的算法。 + +示例 1: + +输入: nums = [1,3,5,6], target = 5 +输出: 2 +示例 2: + +输入: nums = [1,3,5,6], target = 2 +输出: 1 +示例 3: + +输入: nums = [1,3,5,6], target = 7 +输出: 4 + +提示: + +- 1 <= nums.length <= 10e4 +- -10e4 <= nums[i] <= 10e4 +- nums 为 无重复元素 的 升序 排列数组 +- -10e4 <= target <= 10e4 + +### 思路 + +注意这道题目的前提是数组是**有序数组**,可以考虑使用二分法。 + +二分法使用完成后,要注意这 4 种情况 + +- 目标值在数组所有元素之前 +- 目标值等于数组中某一个元素 +- 目标值插入数组中的位置 +- 目标值在数组所有元素之后的情况 + +其中 目标值等于数组中某一个元素 和上一题完全相同 + +我们只需要考虑另外 3 种情况 + +- 目标值在数组所有元素之前,循环跑完后,left 为 0,right 为 -1 +- 目标值插入数组中的位置,循环跑完后,left 为 mid + 1,right 为 mid +- 目标值在数组所有元素之后的情况,循环跑完后,left 为 nums.length,right 为 nums.length - 1 + +所以 `return right + 1` + +### 解法 + +```js +/** + * @param {number[]} nums + * @param {number} target + * @return {number} + */ +var searchInsert = function (nums, target) { + // 定义开闭区间 [left, right] + let left = 0 + let right = nums.length - 1 + let mid = 0 + + while (left <= right) { + // 定义二分中间值 + mid = Math.floor(left + (right - left) / 2) + if (target < nums[mid]) { + right = mid - 1 + } else if (target > nums[mid]) { + left = mid + 1 + } else { + return mid + } + } + return right + 1 +} +``` + +``` +Accepted +64/64 cases passed (60 ms) +Your runtime beats 67.55 % of javascript submissions +Your memory usage beats 36.2 % of javascript submissions (41.2 MB) +``` + +## leetCode 34 在排序数组中查找元素的第一个和最后一个位置 + +给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 + +如果数组中不存在目标值 target,返回 [-1, -1]。 + +你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 + + +示例 1: + +输入:nums = [5,7,7,8,8,10], target = 8 +输出:[3,4] +示例 2: + +输入:nums = [5,7,7,8,8,10], target = 6 +输出:[-1,-1] +示例 3: + +输入:nums = [], target = 0 +输出:[-1,-1] + + +提示: + +- 0 <= nums.length <= 10e5 +- -10e9 <= nums[i] <= 10e9 +- nums 是一个非递减数组 +- -10e9 <= target <= 10e9 + +### 思路 + +1. 首先使用二分法得到 target 的位置 +2. 寻找 target 左右两边是否有相等的值 + +### 解法 + +```js +/** + * @param {number[]} nums + * @param {number} target + * @return {number[]} + */ +var searchRange = function (nums, target) { + // 二分法 + let left = 0 + let right = nums.length - 1 + + while (left <= right) { + const middle = Math.floor(left + (right - left) / 2) + if (target > nums[middle]) { + left = middle + 1 + } else if (target < nums[middle]) { + right = middle - 1 + } else { + // 最后再寻找左右边界 + let leftMove = 1 + while (nums[middle] === nums[middle - leftMove]) { + leftMove++ + } + let rightMove = 1 + while (nums[middle] === nums[middle + rightMove]) { + rightMove++ + } + return [middle - leftMove + 1, middle + rightMove - 1] + } + } + return [-1, -1] +} +``` + +``` +Accepted +88/88 cases passed (48 ms) +Your runtime beats 98.98 % of javascript submissions +Your memory usage beats 79.4 % of javascript submissions (41.5 MB) +``` + +## leetCode 69 x 的平方根 + +给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 + +由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 + +注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 + +示例 1: + +输入:x = 4 +输出:2 +示例 2: + +输入:x = 8 +输出:2 +解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。 + + +提示: + +0 <= x <= 2^31 - 1 + +### 思路 + +我们知道大于1的数字的平方根大于这个数的一半,所以我们在定义二分法区间的时候将 right 定义为 `x / 2`,当然这里定义为 x 也是可以的,仅仅多一次循环而已 + +每次循环取 left 到 right 的中间值 mid,计算出 mid 的平方 + +如果 mid 的平方 大于 x,则 mid 过大,可以将边界 right 赋值为 mid - 1 + +如果 mid 的平方 小于 x,则 mid 过小,可以将边界 left 赋值为 mid + 1 + +最后返回 left - 1 的值,因为如果没有完全平方的话,最后一次循环会将 left + 1 再退出 while,所以这里 - 1 + + +### 解法 + +```js +/** + * @param {number} x + * @return {number} + */ +var mySqrt = function (x) { + if (x === 1) { + return 1 + } + let left = 0 + // 大于1的数字的平方根大于这个数的一半 + // 所以我们在定义二分法区间的时候将 right 定义为 x / 2 + // 当然这里定义为 x 也是可以的,仅仅多一次循环而已 + let right = x / 2 + while (left <= right) { + const mid = Math.floor(left + (right - left) / 2) + const r = mid * mid + if (r > x) { // 过大 + right = mid - 1 + } else if (r < x) { // 过小 + left = mid + 1 + } else { + return mid + } + } + return left - 1 +} +``` + +``` +Accepted +1017/1017 cases passed (64 ms) +Your runtime beats 89.63 % of javascript submissions +Your memory usage beats 29.38 % of javascript submissions (42.6 MB) +``` + +## leetCode 367 有效的完全平方数 + +给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。 + +进阶:不要 使用任何内置的库函数,如 sqrt 。 + +示例 1: + +输入:num = 16 +输出:true +示例 2: + +输入:num = 14 +输出:false + + +提示: + +1 <= num <= 2^31 - 1 + +### 思路 + +做过上一题,这一题就简单多了,直接二分法。 + +### 解法 + +```js +/** + * @param {number} num + * @return {boolean} + */ +var isPerfectSquare = function (num) { + if (num === 1) { + return true + } + + let left = 0 + let right = num / 2 + while (left <= right) { + const mid = Math.floor(left + (right - left) / 2) + const r = mid * mid + if (r > num) { + right = mid - 1 + } else if (r < num) { + left = mid + 1 + } else { + return true + } + } + return false +} +``` + + +``` +Accepted +70/70 cases passed (56 ms) +Your runtime beats 84.94 % of javascript submissions +Your memory usage beats 69.41 % of javascript submissions (40.8 MB) +``` + +# 移除元素(双指针法) + +## leetCode 27 移除元素 + +给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 + +不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 + +元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 + +说明: + +为什么返回数值是整数,但输出的答案是数组呢? + +请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 + +你可以想象内部操作如下: + +``` +// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝 +int len = removeElement(nums, val); + +// 在函数里修改输入数组对于调用者是可见的。 +// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。 +for (int i = 0; i < len; i++) { + print(nums[i]); +} +``` + + +示例 1: + +``` +输入:nums = [3,2,2,3], val = 3 +输出:2, nums = [2,2] +解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。 +``` + +示例 2: + +``` +输入:nums = [0,1,2,2,3,0,4,2], val = 2 +输出:5, nums = [0,1,4,0,3] +解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。 +``` + + +提示: + +0 <= nums.length <= 100 +0 <= nums[i] <= 50 +0 <= val <= 100 + +### 思路 + +数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。 + +双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。 + +### 解法 + +```js +// @lc code=start +/** + * @param {number[]} nums + * @param {number} val + * @return {number} + */ +var removeElement = function(nums, val) { + let slow = 0 // 慢指针 + for (let fast = 0; fast < nums.length; fast++) { // 快指针遍历 + if (nums[fast] !== val) { // 非移除元素 + nums[slow] = nums[fast] // 赋值给慢指针的索引值 + slow++ // 慢指针右移 + } + } + return slow // 返回慢指针,移除元素后的数组长度 +}; +``` + +``` +Accepted +113/113 cases passed (60 ms) +Your runtime beats 71.31 % of javascript submissions +Your memory usage beats 86.34 % of javascript submissions (41 MB) +``` + +## leetCode 283 移动零 + +给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 + +请注意 ,必须在不复制数组的情况下原地对数组进行操作。 + +示例 1: + +输入: nums = [0,1,0,3,12] +输出: [1,3,12,0,0] +示例 2: + +输入: nums = [0] +输出: [0] + + +提示: + +1 <= nums.length <= 10^4 +-2^31 <= nums[i] <= 2^31 - 1 + +### 思路 + +方法一,使用快慢指针,快指针遇到非0元素时,将元素的值赋给慢指针,慢指针 + 1,最后再对末尾的0进行操作 + +方法二,使用快慢指针,快指针遇到非0元素时,直接进行交换,慢指针 + 1,这样就将0直接交换到了最后,一次循环搞定 + +### 解法 + +方法一 + +```js +/** + * @param {number[]} nums + * @return {void} Do not return anything, modify nums in-place instead. + */ +var moveZeroes = function (nums) { + let slow = 0 + for (let fast = 0; fast < nums.length; fast++) { + if (nums[fast] !== 0) { + nums[slow] = nums[fast] + slow++ + } + } + for (let i = slow; i < nums.length; i++) { + nums[i] = 0 + } +} +``` + +``` +Accepted +74/74 cases passed (72 ms) +Your runtime beats 98.08 % of javascript submissions +Your memory usage beats 59.63 % of javascript submissions (45.8 MB) +``` + +方法二 + +也可以优化为,直接交换元素,这里用了 es2015 里的解构语法 + +```js +/** + * @param {number[]} nums + * @return {void} Do not return anything, modify nums in-place instead. + */ +var moveZeroes = function (nums) { + let slow = 0 + for (let fast = 0; fast < nums.length; fast++) { + if (nums[fast] !== 0) { + [nums[fast], nums[slow]] = [nums[slow], nums[fast]] + slow++ + } + } +} +``` + +``` +Accepted +74/74 cases passed (64 ms) +Your runtime beats 99.88 % of javascript submissions +Your memory usage beats 38.6 % of javascript submissions (45.9 MB) +``` + +## leetCode 844 比较含退格的字符串 + +给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。 + +注意:如果对空文本输入退格字符,文本继续为空。 + + +示例 1: + +输入:s = "ab#c", t = "ad#c" +输出:true +解释:s 和 t 都会变成 "ac"。 +示例 2: + +输入:s = "ab##", t = "c#d#" +输出:true +解释:s 和 t 都会变成 ""。 +示例 3: + +输入:s = "a#c", t = "b" +输出:false +解释:s 会变成 "c",但 t 仍然是 "b"。 + + +提示: + +1 <= s.length, t.length <= 200 +s 和 t 只含有小写字母以及字符 '#' + +### 思路 + +使用双指针,快指针遍历,慢指针生成最后的数组。 + +快指针遇到退格符号后,慢指针回退一次 + +需要注意不能直接操作字符串,需要将字符串先 split 为数组后操作 + +### 解法 + +```js +/** + * @param {string} s + * @param {string} t + * @return {boolean} + */ +var backspaceCompare = function (s, t) { + if (processStr(s) === processStr(t)) { + return true + } + return false +} + +function processStr(str) { + const strArr = str.split('') + let slow = 0 + for (let fast = 0; fast < strArr.length; fast++) { + if (strArr[fast] !== '#') { + strArr[slow] = strArr[fast] + slow++ + } else { + if (slow !== 0) { + slow-- + } + } + } + return strArr.slice(0, slow).join('') +} +``` + +``` +Accepted +114/114 cases passed (60 ms) +Your runtime beats 80.48 % of javascript submissions +Your memory usage beats 86.45 % of javascript submissions (41.2 MB) +``` + +## leetCode 977 有序数组的平方 + +给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 + +示例 1: + +输入:nums = [-4,-1,0,3,10] +输出:[0,1,9,16,100] +解释:平方后,数组变为 [16,1,0,9,100] +排序后,数组变为 [0,1,9,16,100] +示例 2: + +输入:nums = [-7,-3,2,3,11] +输出:[4,9,9,49,121] + + +提示: + +1 <= nums.length <= 10^4 +-10^4 <= nums[i] <= 10^4 +nums 已按 非递减顺序 排序 + +### 思路 + +![](https://gw.alicdn.com/imgextra/i1/O1CN01ilkNrm1yIF01zYlLZ_!!6000000006555-1-tps-614-386.gif) + +取原数组两端,作为2个指针 + +使用 while 判断 left <= right 时 + +对比 left 和 right 大小,取大数的平方,存入一个新数组 + +### 解法 + +```js +/** + * @param {number[]} nums + * @return {number[]} + */ +var sortedSquares = function(nums) { + // 高级 api + // return nums.map((item) => item * item).sort((a, b) => a - b) + + // 双指针 + let left = 0 + let right = nums.length - 1 + const result = [] + while (left <= right) { + if (Math.abs(nums[left]) < Math.abs(nums[right])) { + result.unshift(nums[right] * nums[right]) + right-- + } else { + result.unshift(nums[left] * nums[left]) + left++ + } + } + return result +}; +``` + +``` +Accepted +137/137 cases passed (152 ms) +Your runtime beats 15.69 % of javascript submissions +Your memory usage beats 35.91 % of javascript submissions (47.5 MB) +``` + +# 滑动区间(双指针) + +## leetCode 209 长度最小的子数组 + +给定一个含有 n 个正整数的数组和一个正整数 target 。 + +找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 + +示例 1: + +输入:target = 7, nums = [2,3,1,2,4,3] +输出:2 +解释:子数组 [4,3] 是该条件下的长度最小的子数组。 +示例 2: + +输入:target = 4, nums = [1,4,4] +输出:1 +示例 3: + +输入:target = 11, nums = [1,1,1,1,1,1,1,1] +输出:0 + +提示: + +1 <= target <= 10^9 +1 <= nums.length <= 10^5 +1 <= nums[i] <= 10^5 + +## 思路 + +使用双指针,滑动窗口的思路 + +![](https://gw.alicdn.com/imgextra/i2/O1CN01bpmyGx1SdFSgBYuBB_!!6000000002269-1-tps-558-432.gif) + +1. 快指针正常遍历 +2. 累加快指针的值 +3. 判断累加值是否大于等于 target,获取子串的长度 +4. 累加值减去慢指针的值 +5. 慢指针 + 1 +6. 循环 3-5 +7. 循环 1-6 + +## 解法 + +```js +/** + * @param {number} target + * @param {number[]} nums + * @return {number} + */ +var minSubArrayLen = function (target, nums) { + // 双指针滑动区间 + let slow = 0 // 滑动窗口的起始位置 + let sum = 0 // 滑动窗口数值之和 + let subLength = 0 // 滑动窗口的长度 + let result = nums.length + 1 // 最终结果 + for (let fast = 0; fast < nums.length; fast++) { + // fast 为滑动窗口的终点位置 + sum += nums[fast] + while (sum >= target) { + // 如果满足条件,寻找最小的子序列 + subLength = fast - slow + 1 + result = Math.min(result, subLength) + sum -= nums[slow] + slow += 1 + } + } + return result === nums.length + 1 ? 0 : result +} +``` + +``` +Accepted +20/20 cases passed (68 ms) +Your runtime beats 64.23 % of javascript submissions +Your memory usage beats 77.99 % of javascript submissions (45.1 MB) +``` + +## leetCode 904 水果成篮 + +你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。 + +你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果: + +你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。 +你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。 +一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。 +给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。 + + + +示例 1: + +输入:fruits = [1,2,1] +输出:3 +解释:可以采摘全部 3 棵树。 +示例 2: + +输入:fruits = [0,1,2,2] +输出:3 +解释:可以采摘 [1,2,2] 这三棵树。 +如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。 +示例 3: + +输入:fruits = [1,2,3,2,2] +输出:4 +解释:可以采摘 [2,3,2,2] 这四棵树。 +如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。 +示例 4: + +输入:fruits = [3,3,3,1,2,1,1,2,3,3,4] +输出:5 +解释:可以采摘 [1,2,1,1,2] 这五棵树。 + + +提示: + +1 <= fruits.length <= 10^5 +0 <= fruits[i] < fruits.length + +## 思路 + +我们可以使用滑动窗口解决本题,`left` 和 `right` 分别表示满足要求的窗口的左右边界,同时我们使用哈希表存储这个窗口内的数以及出现的次数。 + +我们每次将 `right` 移动一个位置,并将 `fruits[right]` 加入哈希表。如果此时哈希表不满足要求(即哈希表中出现超过两个键值对),那么我们需要不断移动 `left`,并将 `fruits[left]` 从哈希表中移除,直到哈希表满足要求为止。 + +需要注意的是,将 `fruits[left]` 从哈希表中移除的时候,如果 `fruits[left]` 在哈希表中的出现次数减少为 `0`,需要将对应的键值对从哈希表中移除。 + +## 解法 + +```js +/** + * @param {number[]} fruits + * @return {number} + */ +var totalFruit = function(fruits) { + // 我们可以使用滑动窗口解决本题,left 和 right 分别表示满足要求的窗口的左右边界,同时我们使用哈希表存储这个窗口内的数以及出现的次数。 + + // 我们每次将 right 移动一个位置,并将 fruits[right] 加入哈希表。如果此时哈希表不满足要求(即哈希表中出现超过两个键值对),那么我们需要不断移动 left,并将 fruits[left] 从哈希表中移除,直到哈希表满足要求为止。 + + // 需要注意的是,将 fruits[left] 从哈希表中移除的时候,如果 fruits[left] 在哈希表中的出现次数减少为 0,需要将对应的键值对从哈希表中移除。 + + let res = 0 + let left = 0 + + const cateObj = {} + + for (let right = 0; right < fruits.length; right++) { + cateObj[fruits[right]] = (cateObj[fruits[right]] || 0) + 1 + while (Object.keys(cateObj).length > 2) { + cateObj[fruits[left]] -= 1 + if (cateObj[fruits[left]] === 0) { + delete cateObj[fruits[left]] + } + left++ + } + res = Math.max(res, right - left + 1) + } + return res +}; +``` + +``` +Accepted +91/91 cases passed (396 ms) +Your runtime beats 8.35 % of javascript submissions +Your memory usage beats 5.85 % of javascript submissions (56.7 MB) +``` + +# 螺旋矩阵 + +## leetCode + +给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 + + +示例 1: + +![](https://gw.alicdn.com/imgextra/i4/O1CN01HyfCt21Q222qwT65l_!!6000000001917-2-tps-242-242.png) + +输入:n = 3 +输出:[[1,2,3],[8,9,4],[7,6,5]] +示例 2: + +输入:n = 1 +输出:[[1]] + + +提示: + +1 <= n <= 20 + +## 思路 + +最外层用 while 进行圈数循环,然后沿着各个边进行循环,填写相应的值 + +## 解法 + +```js +/** + * @param {number} n + * @return {number[][]} + */ +var generateMatrix = function (n) { + let loop = 0 + let startX = 0 + let startY = 0 + let offset = 1 + let count = 1 + let i = 0 + let j = 0 + + // 初始化二位数组 + const res = [] + for (let i = 0; i < n; i++) { + const temp = [] + for (let j = 0; j < n; j++) { + temp.push(0) + } + res.push(temp) + } + + // 旋转的圈数 + while (loop < n / 2) { + // 四条边进行循环 + for (j = startY; j < n - offset; j += 1) { + res[startX][j] = count + count += 1 + } + for (i = startX; i < n - offset; i += 1) { + res[i][j] = count + count += 1 + } + for (; j > startY; j -= 1) { + res[i][j] = count + count += 1 + } + for (; i > startX; i -= 1) { + res[i][j] = count + count += 1 + } + startX += 1 + startY += 1 + offset += 1 + loop += 1 + } + + // 奇数有个中心值 + if (n % 2 === 1) { + res[i][j] = count + } + return res +} +``` + +``` +Accepted +20/20 cases passed (52 ms) +Your runtime beats 95.38 % of javascript submissions +Your memory usage beats 89.85 % of javascript submissions (41 MB) +``` diff --git a/_posts/algorithm/2023-07-30-problem-string.md b/_posts/algorithm/2023-07-30-problem-string.md new file mode 100644 index 0000000..4e53ea6 --- /dev/null +++ b/_posts/algorithm/2023-07-30-problem-string.md @@ -0,0 +1,312 @@ +--- +layout: blog +banana: true +category: algorithm +title: 一些字符串的问题 +date: 2023-07-30 22:09:51 +background: purple +tags: +- algorithm +- leetcode +- problem +--- + +* content +{:toc} + + + + + + + + +字符串相关的算法题目 + + + + +# leetCode 344 反转字符串 + +编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 + +不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 + +示例 1: + +输入:s = ["h","e","l","l","o"] +输出:["o","l","l","e","h"] +示例 2: + +输入:s = ["H","a","n","n","a","h"] +输出:["h","a","n","n","a","H"] + +提示: + +1 <= s.length <= 10^5 +s[i] 都是 ASCII 码表中的可打印字符 + +## 思路 + +遍历一半的长度,并前后互换位置 + +## 解法 + +```js +/** + * @param {character[]} s + * @return {void} Do not return anything, modify s in-place instead. + */ +var reverseString = function(s) { + for (let i = 0; i < s.length / 2; i++) { + [s[i], s[s.length - 1 - i]] = [s[s.length - 1 - i], s[i]] + } +}; +``` + +``` +Accepted +477/477 cases passed (88 ms) +Your runtime beats 62.86 % of javascript submissions +Your memory usage beats 99.2 % of javascript submissions (47.5 MB) +``` + +# leetCode 541 反转字符串 II + +## 思路 + +将字符串拆分为数组,分组,各项反转,再重新组合。 + +## 解法 + +```js +/** + * @param {string} s + * @param {number} k + * @return {string} + */ +var reverseStr = function (s, k) { + const arr = s.split('') + let count = 0 + + // 数组分组 + const arrRes = [] + for (let i = 0; i < arr.length; i += k) { + const temp = [] + for (let j = i; j < k + i; j++) { + if (s[j]) { + if (count % 2 === 0) { + temp.unshift(s[j]) // 反向存入 + } else { + temp.push(s[j]) + } + } + } + count++ + arrRes.push(...temp) + } + + // 还原字符串 + return arrRes.join('') +} +``` + +``` +Accepted +60/60 cases passed (72 ms) +Your runtime beats 29.7 % of javascript submissions +Your memory usage beats 5.05 % of javascript submissions (47.7 MB) +``` + +# 剑指Offer 05 替换空格 + +请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 + +示例 1: + +输入:s = "We are happy." +输出:"We%20are%20happy." + +限制: + +0 <= s 的长度 <= 10000 + +## 解法 + +```js +/** + * @param {string} s + * @return {string} + */ +var replaceSpace = function(s) { + const arr = s.split('') + for(let i = 0; i < arr.length; i++) { + if(arr[i] === ' ') { + arr[i] = '%20' + } + } + return arr.join('') +}; +``` + +``` +执行用时: +64 ms, 在所有 JavaScript 提交中击败了33.48%的用户 +内存消耗: +40.7 MB, 在所有 JavaScript 提交中击败了91.35%的用户 +通过测试用例: +27 / 27 +``` + +# leetCode 151 反转字符串中的单词 + +给你一个字符串 s ,请你反转字符串中 单词 的顺序。 + +单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 + +返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 + +注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。 + + + +示例 1: + +输入:s = "the sky is blue" +输出:"blue is sky the" +示例 2: + +输入:s = " hello world " +输出:"world hello" +解释:反转后的字符串中不能存在前导空格和尾随空格。 +示例 3: + +输入:s = "a good example" +输出:"example good a" +解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。 + + +提示: + +1 <= s.length <= 104 +s 包含英文大小写字母、数字和空格 ' ' +s 中 至少存在一个 单词 + +## 解法 + +```js +/** + * @param {string} s + * @return {string} + */ +var reverseWords = function(s) { + const arr = s.trim().split(/[' ']+/) + return arr.reverse().join(' ') +}; +``` + +``` +Accepted +58/58 cases passed (60 ms) +Your runtime beats 84.18 % of javascript submissions +Your memory usage beats 92.99 % of javascript submissions (42.8 MB) +``` + +# 剑指Offer58-II.左旋转字符串 + +字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。 + +  + +示例 1: + +输入: s = "abcdefg", k = 2 +输出: "cdefgab" +示例 2: + +输入: s = "lrloseumgh", k = 6 +输出: "umghlrlose" + + +限制: + +1 <= k < s.length <= 10000 + + +来源:力扣(LeetCode) +链接:https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof +著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 + +## 解法 + +```js +/** + * @param {string} s + * @param {number} n + * @return {string} + */ +var reverseLeftWords = function(s, n) { + const left = s.substring(0, n) + return s.substring(n, s.length) + left +}; +``` + +``` +执行用时: +64 ms, 在所有 JavaScript 提交中击败了60.49%的用户 +内存消耗: +42.6 MB, 在所有 JavaScript 提交中击败了86.36%的用户 +通过测试用例: +34 / 34 +``` + +# leetCode 459 重复的子字符串 + +给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 + +示例 1: + +输入: s = "abab" +输出: true +解释: 可由子串 "ab" 重复两次构成。 +示例 2: + +输入: s = "aba" +输出: false +示例 3: + +输入: s = "abcabcabcabc" +输出: true +解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。) + + +提示: + +1 <= s.length <= 104 +s 由小写英文字母组成 + +## 思路 + +我们将两个 ss 连在一起,并移除第一个和最后一个字符。如果 ss 是该字符串的子串,那么 ss 就满足题目要求 + +需要先进行较为复杂的数学证明 + +## 解法 + +```js +/** + * @param {string} s + * @return {boolean} + */ +var repeatedSubstringPattern = function(s) { + const double = (s + s).substring(1, s.length * 2 - 1) + return double.indexOf(s) !== -1 +}; +``` + +``` +Accepted +129/129 cases passed (64 ms) +Your runtime beats 86.86 % of javascript submissions +Your memory usage beats 82.62 % of javascript submissions (43.4 MB) +``` diff --git a/_posts/algorithm/2023-07-30-slide-window.md b/_posts/algorithm/2023-07-30-slide-window.md new file mode 100644 index 0000000..f8f6e29 --- /dev/null +++ b/_posts/algorithm/2023-07-30-slide-window.md @@ -0,0 +1,187 @@ +--- +layout: blog +banana: true +category: algorithm +title: 滑动窗口算法 +date: 2023-07-30 22:05:22 +background: purple +tags: +- algorithm +- 滑动窗口 +--- + +* content +{:toc} + + + + +#### 滑动窗口 + +O(n) 时间内解决 **子串, 子数组**问题 + +- right 表示**待处理**的节点 +- 窗口其实就是 [left, right), 窗口大小是 left- right +- right 向右寻找可行解,left 向右寻找最优解 +- 等价于枚举**左端点** + +```python +#-----------------V1---------------- +while right < s.size(): + # 处理s[right] + ++right; + + while( shirink && l 给定一个含有 `n` 个正整数的数组和一个正整数 `target` **。** +> +> 找出该数组中满足其和 `≥ target` 的长度最小的 **连续子数组** `[numsl, numsl+1, ..., numsr-1, numsr]` ,并返回其长度**。**如果不存在符合条件的子数组,返回 `0` 。** +> +> ``` +> 输入:target = 7, nums = [2,3,1,2,4,3] +> 输出:2 +> 解释:子数组 [4,3] 是该条件下的长度最小的子数组。 +> ``` + +```c++ +int minSubArrayLen(int target, vector& nums) { + int len = nums.size(); + int l =0, r=0; + int sum = 0; + int minlen = INT_MAX; + while(r< len){ + sum+= nums[r++]; + + while(sum >= target){ + minlen = min(minlen, r-l); + sum -= nums[l++]; + + } + } + return minlen == INT_MAX ? 0: minlen; + +} +``` + +- 在本题中, 随着 r++, 目标和越来越大, 是向着你想要的目标走, 因此用的是 V1, 在循环内更新 结果 + + + +#### 不满足题目条件---循环外更新 + +[713. 乘积小于 K 的子数组](https://leetcode.cn/problems/subarray-product-less-than-k/) + +> 给你一个整数数组 `nums` 和一个整数 `k` ,请你返回子数组内所有元素的乘积严格小于 `k` 的连续子数组的数目。 +> +> ``` +> 输入:nums = [10,5,2,6], k = 100 +> 输出:8 +> 解释:8 个乘积小于 100 的子数组分别为:[10]、[5]、[2],、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。 +> 需要注意的是 [10,5,2] 并不是乘积小于 100 的子数组。 +> ``` + +```c++ +class Solution { +public: + int numSubarrayProductLessThanK(vector& nums, int k) { + // 返回子数组的数目 + int res = 0; + int l =0, r= 0; + int sum =1; + int len = nums.size(); + + while(r= k && l 给定一个字符串 `s` ,请你找出其中**不含**有重复字符的 **最长子串** 的长度。 +> +> ``` +> 输入: s = "abcabcbb" +> 输出: 3 +> 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 +> ``` + +```c++ +// -----------------------------V2.0---------------------------------- +int lengthOfLongestSubstring(string s) { + unordered_map mp; + int l =0, r=0; + int len = s.size(); + int res = 1; + + // 处理特殊情况 + if(!len) { + return 0; + } + while(r mp.size()){ + c = s[l++]; + mp[c]--; + if(0==mp[c]){ + mp.erase(c); + + } + } + res = max(res, r-l); + } + return res; +} + + +``` + diff --git a/_posts/algorithm/2023-07-30-yingshe.md b/_posts/algorithm/2023-07-30-yingshe.md new file mode 100644 index 0000000..0815a9e --- /dev/null +++ b/_posts/algorithm/2023-07-30-yingshe.md @@ -0,0 +1,41 @@ +--- +layout: blog +banana: true +category: algorithm +title: 数组和映射 +date: 2023-07-30 22:05:22 +background: purple +tags: +- algorithm +--- + +* content +{:toc} + + + + +#### 1 映射的定义 + +​ 两个非空集合A与B间存在着对应关系 f,而且对于A中的每一个元素 a,B中总有唯一的一个元素 b 与它对应,就这种对应为从 A 到 B 的映射,记作 f : A -> B。 + +​ 其中,b称为元素a在映射f下的像,记作:b=f(a)。a称为b关于映射的原像。集合A中所有元泰的像的集合称为映射的值域,记作fA)。 + +#### 2 数组 + +数组在 物理实现 上是一块连续的存储空间 + +但是在逻辑上 是一个映射 f 从 i -> nums[i], 只不过这个 i 的集合是有限制的, 每个元素都是实数 + + + +#### 3 折半( 二分 )查找 可以在 某些映射上进行 + +折半查找的条件 : + +- 数组有序 + +映射可以二分查找的条件: + +- 映射的函数是单调的 +- 保证二分时, mid = (left + right)/2 有映射, diff --git a/_posts/algorithm/2023-07-31-basic-3-banzi.md b/_posts/algorithm/2023-07-31-basic-3-banzi.md new file mode 100644 index 0000000..c6b121c --- /dev/null +++ b/_posts/algorithm/2023-07-31-basic-3-banzi.md @@ -0,0 +1,531 @@ +--- +layout: blog +banana: true +category: algorithm +title: basic_3_算法模板 +date: 2023-07-31 09:43:04 +background: purple +tags: +- algorithm +--- + +* content +{:toc} +## 三. 进阶_ 算法模板 + +### 1 数值处理 + +#### 1.1 数值处理-----反转数字 + +```c++ +for(int num : nums){ + int re =0; + while(num){ + re = re*10 + num% 10; + num/=10; + } + cout<< re<< endl; +} +``` + + + +#### 1.2 数值处理------最大公因子 + +```c++ +// 在algorithm中, 有__gcd()函数 +int gcd(int a, int b){ + // 默认 b 为较小的 + int r; + while (b) { + r = a % b; + a = b; + b = r; + } + return a; +} +``` + + + +#### 位运算 + +**位运算符**(也称为按位运算符)是用来操作操作数的二进制位的。 + +- 按位与(&):将两个操作数的每一位进行比较,如果两个操作数在同一位上都是 1,则结果为 1,否则为 0。 +- 按位或(|):将两个操作数的每一位进行比较,如果两个操作数在同一位上都是 0,则结果为 0,否则为 1。 +- 按位**异或**(^):将两个操作数的每一位进行比较,如果两个操作数在同一位上**相同**,**则结果为 0**,否则为 1。 +- 按位取反(~):将操作数的每一位都取反(0 变成 1, 1 变成 0)。 +- 左移(<<):将左侧操作数的所有二进制位向左移动指定的位数,右侧的空位用 0 补充。 +- 右移(>>):将左侧操作数的所有二进制位向右移动指定的位数,左侧的空位用符号位(对于有符号类型)或 0(对于无符号类型)补充。 + + + +按位亦或 + +- 一个数和 0 做 XOR 运算等于**本身**:a^0 = a +- 一个数和其本身做 XOR 运算等于 0:a^a = 0 +- XOR 运算满足**交换律和结合律**:a^b^a = (a^a)^b = 0^b = b + + + +#### 1.3 数值处理------求幂 + +分为奇数和偶数 + +#### 1.4 数值处理------求模运算 + +自然数取余定义分为两种: + +- 定义 1:如果 a 和 d 是两个自然数,d 非零,可以证明存在两个唯一的整数 q 和 r,满足 `a=qd+r且0 ≤ r < d`(其中 q 为商,r 为余数)。 + 定义 1 一般作为数学中的取余法则,即两个数取余,余数总是为**正数**。 + +```c++ +// C++中 负数 % n 并不做处理 +// 在 C++ 中,对于负数 a 和正整数 n 进行模运算(求余数),其结果的符号与被除数 a 的符号相同。具体地说,当 a <0 时,a % n 的结果为负数,当 a>= 0 时,a % n 的结果为非负数(即自然数) +// 在 C++ 中,对于除数为负数的情况,取模运算结果未定义。因此,应该避免除数为负数的情况。 +cout<< (-1) %3< mp; + +functionfunc = [](int start, bool islimit)-> int{ + // wrong case + if(start == len)// base case + + // 当前的唯一状态表示, 要有 start等信息 + int cur; + + if(!islimit && mp.count(cur)){ + return mp[cur]; + } + + int up = islimit? s[start]-'0': 9; + + int res = 0; + for(int i = 0; i<= up; ++i){ + // 只有当前位置有限制, 且等于 up 时, 才会 有限制 + res += func(start, islimit && i == up) + } + mp[cur] = res; + return res; +} +``` + + + + + +#### 排序技巧 + +```c++ +// 添加元素所对应的坐标, 然后进行自己的排序 +vector > nums; + +for(int i = 0; i < m; i++) + nums[i].push_back(i); +sort(nums.begin(), nums.end(), cmp); + + +// 两个 vector 排序 +// 用来比较两个序列中从前往后逐个元素进行比较,直到出现不同为止。 +// 如果全部元素都相等,则比较两个序列长度,长度较短的序列小于长度较长的序列。 +vector v1 = {1, 2, 3,}; +vector v2 = {1, 2, 3, 5}; +// v1 > 排序 +// 默认按照 pair::first的大小 +``` + + + + + +### 2 回溯 = (先根)DFS + 剪枝 + +```python +res = [] +# can是选择列表 +def backtrack(res, track, can): + if 满⾜结束条件: + res.add(track) + return + + # 时间复杂度O(n^n) + for i in can: + if(满足剪枝条件): + #判断是否需要剪枝, 也就是将不符合题意的循环删除 + continue + + #在递归之前做出选择,在递归之后撤销刚才的选择 + track.push_back(i) + backtrack(res, track, can) + track.pop_back(i) +``` + + + +#### BFS + +- 重点在如何表示状态, 以及状态的转变 +- 状态的组成必须**唯一**, 不能有状态是相同的 +- 状态的组成必须**完备** +- + +```c++ +// encode the state + +typedef <> State +queue qu; + +// 防止走回头路, 可以使用 unordered_set / set/ vector / 数组 +unordered_set visit; +qu.push(start); +visit.insert(start); + +int step = 0; +while(qu.size()){ + int len = qu.size(); + for(int i =0; i ans(len, -1); +stack st; +//从后向前遍历, 小(等于) 当前元素的出去 +for(int i =len - 1; i> -1; --i){ + while(!st.empty() && nums[i] >= st.top()){ + st.pop(); + } + ans[i] = !st.empty()? st.top() : -1; + st.push(nums[i]); +} + + +// -------------------从前往后计算----------------- +// 找到该元素 右边 第一个 比自己大的元素 +stack st; // 递增栈(从栈头到栈底的顺序) +vector result(nums.size(), 0); +for (int i = 0; i < nums.size(); i++) { + while (st.size() && nums[i] > nums[st.top()]) { // 注意栈不能为空 + // 当前元素 是 已遍历元素的 解 + result[st.top()] = i; + st.pop(); + } + st.push(i); +} + + +``` + + + +### 双指针 + +滑动窗口的**右端点**一定会到达**答案的右端点**,这时候左端点就会收缩到答案的左端点了 + + + +### 图论 + +#### 4.1 图的遍历( 使用邻接矩阵 ) + +```c++ +// 图遍历框架 +// 图的遍历和一般 回溯 框架还是有所不同的, 因为传到traverse 函数中的点还没有进行过遍历, 所以衍生出了两种方法: +// - 丢进函数之前 对其进行处理 +// - 在for循环之前进行处理, for循环中不进行处理( 更一般 ) + +void traverse(vector > &graph, int s) { + if (visited[s]) return; + // 经过节点 s + visited[s] = true; + for (TreeNode neighbor : graph.neighbors(s)) + traverse(neighbor); + // 离开节点 s + visited[s] = false; +} +``` + +图遍历过程中, 有些节点被访问了两次( 遍历时, visit[i] == 1 )的情况: + +- 图中有环 +- 某节点 的 入度 大于等于 2 + +要 注意 区分这两种情况 + + + +#### 4.2 二分图 + +> 定义 +> +> 二分图的顶点集可分割为两个互不相交的子集,图中每条边依附的两个顶点都分属于这两个子集,且两个子集内的顶点不相邻。 +> +> 二分图**不是 "回溯"** + +```c++ +//遍历一遍图,并且一边遍历一遍染色,看看能不能用两种颜色给所有节点染色,且相邻节点的颜色都 不相同。 + +bool isBipartite(vector>& graph) { + // the number of nodes + int len = graph.size(); + + vector visit(len, 0); + vector color(len, 0); + int res = 1; + // 防止有单独的子图 + for(int i=0; i > &g, int start, vector &visit, vector &color, int &res , int c){ + if(!res) return; + + // if(visit[v] == 1) return; + // 没有遍历过(染色) + if(visit[start] == 0){ + visit[start] = 1; + color[start] = c; + cout<< "node "<< start<< "=\t "<< c<< endl; + for(int nextnode : g[start]){ + dfs(g, nextnode, visit, color, res, -c); + } + + } + else if(color[start] == c) return; + else { + res = 0; + //cout<< "node"<< start<< "\t is unsuccessful"<< endl; + } +} + +``` + + + +#### 4.3 判断是否有环 + +```c++ +bool hascycle(vector>& g) { + // 检测是不是拓扑序列 也就是 检查 是否有环 + // 使用回溯法, 如果访问的节点在path中, 那么就是有环 + // 为什么不使用 visited, 因为visited是全局的, + int len = g.size(); + + int res = 1; + + vector visited(n, 0), path(n, 0); + for(int i = 0; i > &g, vector &visited, vector path, int start){ + if(!res) return; + + // [----------------------bug is here--------------------] + // 注意这两者的顺序, 先判断是否 在路径上, 因为在路径上一定浏览过, + if(path[start] ==1 ) res = 0; + if(visited[start]) return; + path[start] =1; + visited[start] = 1; + for(int next : g[start]){ + dfs(res, g, visited, path, next); + } + path[start] = 0; +} + +``` + + + +#### 4.4 拓扑排序 + +![image-20221027114950476](assets/image-20221027114950476.png) + + + +```c++ +vector findOrder(vector > g ) { + // 返回 拓扑排序 + // 结论 将后序遍历的结果进⾏反转(逆后序遍历顺序),就是拓扑排序的结果。 + int len = g.size(); + + // 假设我们当前搜索到了节点 u,如果它的所有相邻节点都已经搜索完成,那么这些节点都已经在栈中了,此时我们就可以把 u 入栈 + vector res, trace, path(numCourses, 0), visited(numCourses, 0); + int flag = 1; + + for(int i =0; i< numCourses; ++i){ + // start 是要处理的点 + // cout<< start<< + if(!visited[i]) dfs(flag, trace, g, visited, path, i); + if(!flag) return {}; + } + // 最后反转一下 + reverse(trace.begin(), trace.end()); + return trace; + + +} + +void dfs(int &flag, vector &trace, vector > &g, vector &visited, vector &path, int start){ + if(!flag) {return;} + + if(path[start]) { + flag = 0; + return; + } + if(visited[start]) return; + + path[start]=1; + visited[start] = 1; + for(int next: g[start]){ + dfs(flag, trace, g, visited, path, next); + } + // 到了尽头才添加, 后序遍历 + trace.push_back(start); + path[start] =0; + +} +``` + + + +#### 5.1 双指针------二分查找 + +```c++ +int searchInsert(vector& nums, int target) { + int left =0, right = nums.size()-1; + + while(left <= right){ + int mid = left+ (right - left )/2; + // 相等的时候向左收缩边界, 也就是修改 r + if(nums[mid] >= target) right=mid-1; + else if(nums[mid] < target) left =mid+1; + } + return left; +} +``` + + + +#### 5 双指针------滑动窗口 + +O(n) 时间内解决 **子串, 子数组**问题 + +- 窗口其实就是 **[left, right)**, 窗口大小是 **right - left** +- right 向右寻找可行解,left 向右寻找最优解 +- right 表示**待处理**的节点 +- 等价于枚举**左端点** + +```python +#-----------------V1---------------- +while right < s.size(): + # 处理s[right] + ++right; + + while( shirink && l 给你一个字符串 `s` 和一个字符规律 `p`,请你来实现一个支持 `'.'` 和 `'*'` 的正则表达式匹配。 +> +> - `'.'` 匹配任意单个字符 +> - `'*'` 匹配零个或多个前面的那一个元素 +> +> 所谓匹配,是要涵盖 **整个** 字符串 `s`的,而不是部分字符串。 +> +> ``` +> 输入:s = "aa", p = "a" +> 输出:false +> 解释:"a" 无法匹配 "aa" 整个字符串。 +> ``` + +- 首先, 我们要明白这两个字符的作用是什么 + - `.`匹配任意一个字符 + - `*`有两个作用, 一个是**擦除**前面的字符(匹配零个前面的那一个元素), 或者是 **多个**前面的字符 +- 能匹配 `s[i] == p[j] || p[j] == '.'` 看后面的字符是否为`*`,, + - 后面的字符是否为`*` 那么就会有两种情况,一种是擦除前面的字符, 另一种是多个字符 + - 后面的字符不为`*` 那么, 就直接` dp(s, i+1, p, j+1);` +- 不能匹配的话, + - 后面的字符为为`*`, `*`发挥擦除的作用 + - 否则返回 `0` +- 当匹配完毕后, 如果 p 有多余的字符, 看看是否能够**擦除**字符 + +```c++ +class Solution { +public: + bool isMatch(string s, string p) { + // s is long , p is short + return dp(s, 0, p, 0); + } + + bool dp(string &s, int i, string &p, int j){ + // * 的作用可以复制, 也可以擦除 + int len1 = s.size(), len2= p.size(); + + if(i< len1 && j< len2){ + if(s[i] == p[j] || p[j] == '.'){ + // 特殊情况 + if(j< len2-1 && p[j+1] == '*'){ + // cout<< "s[i] == p[j] || p[j] == '.' && p[j+1] == '*' "<< "i="<< i<< "\tj="< > &res, vector &nums, vector &track, vector &flag){ + if(track.size() == nums.size()){ + res.push_back(track); + return; + } + for(int i =0; i> permute(vector& nums) { + int len = nums.size(); + vector track, flag(len, 0); + //flag is the element is used + vector > res; + + + backtrack(res, nums, track, flag); + + return res; + } + +``` + +#### \ No newline at end of file diff --git "a/_posts/algorithm/algorithm_\345\233\236\346\272\257_backtrack_2.md" "b/_posts/algorithm/algorithm_\345\233\236\346\272\257_backtrack_2.md" new file mode 100644 index 0000000..a4dd84b --- /dev/null +++ "b/_posts/algorithm/algorithm_\345\233\236\346\272\257_backtrack_2.md" @@ -0,0 +1,123 @@ +#### [77_组合](https://leetcode.cn/problems/combinations/) + +> 给定两个整数 `n` 和 `k`,返回范围 `[1, n]` 中所有可能的 `k` 个数的组合。 +> 你可以按 **任何顺序** 返回答案。 +> 输入:n = 4, k = 2 +> 输出: +> [ +> [2,4],[3,4],[2,3],[1,2],[1,3],[1,4], +> ] +> +> //解题思路: +> 一般我们在进行答案的搜索的时候, 都是从小的开始, 先1, 然后2, 并且只找比他大的数 +> [1,2],[1,3],[1,4],[2,3],[2,4], [3,4] + + + +```c++ +vector> combine(int n, int k) { + vector track; + vector > res; + backtrack(res, n, k, 1, track); + return res; + +} + +//----------------------------错误解法1------------------------------ +//输出了 [[1,1],[1,2],[1,3],[1,4],[2,1],[2,2],[2,3],[2,4],[3,1],[3,2],[3,3],[3,4],[4,1],[4,2],[4,3],[4,4]] +void backtrack(vector > &res, int n, int k, int start, vector &track){ + if(track.size() == k) { + res.push_back(track); + for_each(track.begin(), track.end(), [&](int x){cout<< x;}); + cout<< endl; + return; + } + + //for循环 第一句话, 标志着树的 每层 从哪里开始 + for(int i =1; i<=n; ++i){ + track.push_back(i); + //递归调用标志着 下一层树 + backtrack(res, n, k, start+1, track); + track.pop_back(); + } +} +//-----------其实就是start没有用上------ +//回溯树如下图所示, 以后不对的时候, 就画图看一下 + [] + [1] [2] [3],,,,,,,,,,,,,,,,,,,,,,,,,, +[1][2][3][4] +``` + + + +```c++ +//----------------------------正确解法1------------------------------ +void backtrack(vector > &res, int n, int k, int start, vector &track){ + if(track.size() == k) { + res.push_back(track); + for_each(track.begin(), track.end(), [&](int x){cout<< x;}); + cout<< endl; + return; + } + + //for循环 第一句话, 标志着树的 每层 从哪里开始 + for(int i =start; i<=n; ++i){ + track.push_back(i); + //递归调用标志着 下一层树 + backtrack(res, n, k, i+1, track); + track.pop_back(); + } +} +``` + + + + + +#### [216_组合总和3](https://leetcode.cn/problems/combination-sum-iii/) + +> 找出所有相加之和为 `n` 的 `k` 个数的组合,且满足下列条件: +> +> - 只使用数字1到9 +> - 每个数字 **最多使用一次** +> +> 返回 *所有可能的有效组合的列表* 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 +> +> **示例 1:** +> +> ``` +> 输入: k = 3, n = 7 +> 输出: [[1,2,4]] +> 解释: +> 1 + 2 + 4 = 7 +> 没有其他符合的组合了。 +> ``` + +```c++ +vector> combinationSum3(int k, int n) { + vector< vector > res; + vector track; + //vector flag(10,0); + + backtrack(res, k, n, track, 1, 0); + return res; + +} + +void backtrack(vector > &res, int k, int n,vector &track, int start, int sum){ + // sum 是树节点 的总和 + if(track.size() == k && sum == n){ + res.push_back(track); + return; + } + + + for(int i = start; i<10; ++i){ + track.push_back(i); + backtrack(res, k, n, track, i+1, sum +i); + track.pop_back(); + + } +} +``` + diff --git "a/_posts/algorithm/algorithm_\345\233\236\346\272\257_backtrack_3_\346\200\273\347\273\223.md" "b/_posts/algorithm/algorithm_\345\233\236\346\272\257_backtrack_3_\346\200\273\347\273\223.md" new file mode 100644 index 0000000..b9c86a7 --- /dev/null +++ "b/_posts/algorithm/algorithm_\345\233\236\346\272\257_backtrack_3_\346\200\273\347\273\223.md" @@ -0,0 +1,191 @@ +``` +algorithm_回溯_backtrack_3_总结 +``` + +- 回溯总是和递归联系在一起的 +- 要仔细 分析 **回溯 树** 每一层是从**哪个元素**开始的 + + + +#### 3.1 回溯总是和递归联系在一起的 + +``` +result = [] +def backtrack(res, 路径, 选择列表): + if 满⾜结束条件: + res.add(路径) + return + + for 选择 in 选择列表: + 判断是否需要剪枝, 也就是将不符合题意的循环删除 + + #在递归之前做出选择,在递归之后撤销刚才的选择 + 做选择 + backtrack(路径, 选择列表) + 撤销选择 +``` + +​ 回溯其实就是不断的调用自身, 直至满足结束条件 + + + +#### 3.2 要仔细 分析 **回溯 树** 每一层是从**哪个元素**开始的 + +方法还是上次说过的 画图 + +#### 3.2.1 全排列-------每个元素不重复 + +> 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 +> +> 示例 +> +> 输入:nums = [1,2,3] +> 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] + +分析: + +``` + [] + [1] [2] [3],,,,,,,,,,,,,,,,,,,,,,,,,, + [2] [3] [4] +[3] [4] + +``` + +​ 第一层是全部( 1 2 3 4 ), 第二层是缺一个, 第三层是缺两个 + +​ 总结起来就是**每个元素不重复** + +```c++ +//for循环分析 +for(int i =0; i 给定两个整数 `n` 和 `k`,返回范围 `[1, n]` 中所有可能的 `k` 个数的组合。 +> 你可以按 **任何顺序** 返回答案。 +> 输入:n = 4, k = 2 +> 输出: +> [ +> [2,4],[3,4],[2,3],[1,2],[1,3],[1,4], +> ] +> +> //解题思路: +> 一般我们在进行答案的搜索的时候, 都是从小的开始, 先1, 然后2, 并且只找比他大的数 +> [1,2],[1,3],[1,4],[2,3],[2,4], [3,4] + +``` + [] + [1] [2] .... +[2] [3] [4] +[3] 空 空 +``` + +​ 从小的开始, 先1, 然后2, 并且只找比他大的数, 有了3 就不在加入 2 + +```c++ +//for循环 第一句话, 标志着树的 每层 从哪里开始 +for(int i =start ; i<=n; ++i){ + track.push_back(i); + // 下一层树 从哪里开始, 如果顺序有制约, 那么一定和i有关 + backtrack(res, n, k, i+1, track); + track.pop_back(); +} +``` + + + +#### 3.2.3 组合总和 + +> 给你一个 **无重复元素** 的整数数组 `candidates` 和一个目标整数 `target` ,找出 `candidates` 中可以使数字和为目标数 `target` 的 *所有* **不同组合** ,并以列表形式返回。你可以按 **任意顺序** 返回这些组合。 +> +> `candidates` 中的 **同一个** 数字可以 **无限制重复被选取** 。如果至少一个数字的被选数量不同,则两种组合是不同的。 +> +> 对于给定的输入,保证和为 `target` 的不同组合数少于 `150` 个。 +> +> ``` +> 输入:candidates = [2,3,6,7], target = 7 +> 输出:[[2,2,3],[7]] +> 解释: +> 2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。 +> 7 也是一个候选, 7 = 7 。 +> 仅有这两种组合。 +> ``` + +```c++ +for(int i = start ;i 找出所有相加之和为 `n` 的 `k` 个数的组合,且满足下列条件: +> +> - 只使用数字1到9 +> - 每个数字 **最多使用一次** +> +> 返回 *所有可能的有效组合的列表* 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 +> +> **示例 1:** +> +> ``` +> 输入: k = 3, n = 7 +> 输出: [[1,2,4]] +> 解释: +> 1 + 2 + 4 = 7 +> 没有其他符合的组合了。 +> ``` + +```c++ +for(int i = start; i<10; ++i){ + track.push_back(i); + //下一层元素从 下一个元素 后面开始, 因为 元素 不能重复, + backtrack(res, k, n, track, i+1, sum +i); + track.pop_back(); +} +``` + + + + + +#### 3.2.5 电话号码的字母组合 + +> 给定一个仅包含数字 `2-9` 的字符串,返回所有它能表示的字母组合。答案可以按 **任意顺序** 返回。 +> +> 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 +> +> ![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2021/11/09/200px-telephone-keypad2svg.png) + +```c++ +//一个元素 映射为 一个数组 的元素 +vector amap = _map(ch); +for(int i = 0; i 给定一个候选人编号的集合 `candidates` 和一个目标数 `target` ,找出 `candidates` 中所有可以使数字和为 `target` 的组合。 +> +> `candidates` 中的每个数字在每个组合中只能使用 **一次** 。 +> +> **注意:**解集不能包含重复的组合。 +> +> **示例 1:** +> +> ``` +> 输入: candidates = [10,1,2,7,6,1,5], target = 8, +> 输出: [ [1,1,6],[1,2,5],[1,7],[2,6] ] +> ``` + +​ 集合(数组candidates)有重复元素,但还不能有重复的组合. + +**去重 时, 遇事不决, 直接排序** + +![image-20220924111421337](https://i0.hdslb.com/bfs/album/2d073c6fcbc14c6305e99fb5683f758bfcc55461.png) + +```c++ +//------------------ V-1.0 ------------------------- +// 期望输出 [ [1,1,6],[1,2,5],[1,7],[2,6] ] +// 实际输出 [[1,2,5],[1,7],[1,6,1],[2,6],[2,1,5],[7,1]] + +vector> combinationSum2(vector& candidates, int target) { + vector > res; + vector track; + + backtrack(res, candidates, target, track, 0, 0); + return res; + +} + +void backtrack(vector > &res, vector &can, int target, vector &track, int sum, int start){ + if(sum == target){ + res.push_back(track); + return; + } + if(track.size() >= can.size() || sum> target) return; + + for(int i = start; i< can.size(); ++i){ + + track.push_back(can[i]); + backtrack(res, can, target, track, sum+can[i], i+1); + track.pop_back(); + } +} + +//----------------------- V-2.0 ---------------------- +// 回溯树如下 +// [] +// [1] ,,,, [1](重复了),,,,, +// [1](依旧可以选) + +// 因为 已经搜索过了, 你再搜索, 就会重复 +// 既然需要 每一行 去重, 那么, 先排序, 在for循环里面判断一下前面用没用过不就行了? +// 很遗憾, 实际的结果是 [[1,2,5],[1,7],[2,6]] +// 期望输出 [ [1,1,6],[1,2,5],[1,7],[2,6] ] +// 虽然 确实去掉了1,7 和7,1的重复, 但是缺少了 1, 1, 6 的组合 +// 问题出在了哪里? +// 实际的情况是, 我们平时使用for循环时(比如使用的方法 是 遍历法 ), 总是横向的, 横向的意思是回溯树有同一个父亲 +// for(){for(){for(){}}} +// 但是因为 回溯法使用了递归, for循环又会竖向使用, (回溯树中的父子关系) +sort(candidates.begin(), candidates.end()); +for(int i = start; i< can.size(); ++i){ + if(i>0 && can[i] == can[i-1]) continue; + track.push_back(can[i]); + backtrack(res, can, target, track, sum+can[i], i+1); + track.pop_back(); +} + +//----------------------- V1.0 ---------------------- +vector> combinationSum2(vector& candidates, int target) { + vector > res; + vector track, flag(candidates.size(), 0); + + sort(candidates.begin(), candidates.end()); + backtrack(res, candidates, target, track, 0, 0, flag); + return res; + +} + +void backtrack(vector > &res, vector &can, int target, vector &track, int sum, int start, vector &flag){ + if(sum == target){ + res.push_back(track); + return; + } + if(track.size() >= can.size() || sum> target) return; + + for(int i = start; i< can.size(); ++i){ + // 比较反直觉, 没有用过 才表示 是同一层重复 + if(i>0 && can[i] == can[i-1] &&flag[i-1]==0 ) + continue; + flag[i] =1; + track.push_back(can[i]); + backtrack(res, can, target, track, sum+can[i], i+1, flag); + track.pop_back(); + flag[i] =0; + } +} +``` + diff --git a/_posts/algorithm/assets/image-20221027114950476.png b/_posts/algorithm/assets/image-20221027114950476.png new file mode 100644 index 0000000000000000000000000000000000000000..cea5f0d4bef15677a781fdb31c9b9edbe297db1a GIT binary patch literal 128641 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 "$filename" << EOF +--- +layout: blog +banana: true +category: byte_tech +title: "Go_" +date: $(date +"%Y-%m-%d %H:%M:%S") +background: green +tags: +- byte_tech +- go +--- + +* content +{:toc} +EOF + +echo "文件已生成:$filename" diff --git a/_posts/byte_tech/2023-07-25-go-1.md b/_posts/byte_tech/2023-07-25-go-1.md new file mode 100644 index 0000000..164f1e4 --- /dev/null +++ b/_posts/byte_tech/2023-07-25-go-1.md @@ -0,0 +1,1474 @@ +--- +layout: blog +title: "Go_1_简介" +date: 2023-07-28 21:19:24 +categories: byte_tech +background: green +tags: +- byte_tech +- go +--- + +* content +{:toc} + + +### 简介 + +#### 1 特性 + +- **标准库**就考虑**性能**, 但却是**编译型**语言 +- 跨平台 +- 类`C`, 强类型 +- 带**垃圾回收** +- Go(又称 Golang)是 **Google** 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种**静态强类型、编译型**语言。( 果然, 新语言就是没有历史**包袱**, 想怎么设计就怎么设计, ) + + + +#### 2 用 Go 的公司 + +- 腾讯 +- 美团 +- 滴滴 +- + + + + + +#### 3 why go + +- 最初使用的Python由于**性能**问题换成了Go +- C++不太适合在线Web业务早期 +- 内部RPC和HTTP框架的推广 +- 如果你要创建系统程序,或者基于**网络**的程序,Go语言是很不错的选择。 +- 携程等并发模型 + + + + + +#### go 有多简单 + +```go +package main import ( + "net/http" +) +func main() { + http. Handle("/", http.FileServer(http.Dir("."))) + http. ListenAndServe(": 8080", nil) +} +``` + + + + + + + + + +#### OOP 与 Go + +Go 语言在设计上不是一种典型的面向对象编程语言,而是一种以**并发和简洁**为主要目标的编程语言。尽管如此,Go 语言仍然支持面向对象编程的一些概念和特性。 + +Go 语言通过结构体(struct)和方法(method)来实现对面向对象编程的支持。结构体可以用于封装数据和行为,并且可以定义方法来操作结构体实例。这样就能够实现面向对象编程中的封装、继承和多态等概念。 + +尽管 Go 语言没有经典面向对象语言中的类(class)的概念,但可以使用结构体和方法组合来模拟类的行为。通过在结构体上定义方法,可以实现对结构体的操作和行为的封装。 + +除了结构体和方法,Go 语言还提供了接口(interface)的概念,它定义了一组行为规范。通过实现接口,可以实现多态的效果,使不同类型的对象可以根据接口进行统一的处理。 + +需要注意的是,Go 语言更强调简洁和可读性,相比于传统的面向对象编程语言,Go 语言更加注重可组合性和函数式编程的思想。因此,在使用 Go 语言进行开发时,可以灵活地选择使用面向对象编程的特性来组织代码结构,或者使用其他更适合的编程范式。 + +```go +// c 风格 api +s = append(s, "d") +s = append(s, "e", "f") + +// 对象式 + +``` + + + + + +#### 学习平台 + +[go的example](https://github.com/wangkechun/go-by-example/) + + + +[网络运行平台](https://gitpod.io/#github.com/wangkechun/go-by-example) + +短链接:https://hi-hi.cn/gitpod + +gitpod 这个效果还挺好看 + + + +#### 如何组织代码 + +- Go语言的代码通过**包**(package)组织,包类似于其它语言里的**库**(libraries)类推==>`STL`或者模块(modules)`python`。一个包由位于单个目录下的**一个或多个**.go源代码文件组成,目录定义包的作用。每个源文件都以一条`package`声明语句开始,这个例子里就是`package main`,表示该文件属于哪个包,紧跟着一系列导入(import)(`python)`的包,之后是存储在这个文件里的程序语句。 +- `类似于python`Go语言不需要在语句或者声明的末尾添加**分号**,除非一行上有多条语句。实际上,编译器会主动把特定符号后的换行符转换为分号,因此换行符添加的位置会影响Go代码的正确解析(译注:比如行末是标识符、整数、浮点数、虚数、字符或字符串文字、关键字`break`、`continue`、`fallthrough`或`return`中的一个、运算符和分隔符`++`、`--`、`)`、`]`或`}`中的一个) +- Go语言在**代码格式**上采取了很**强硬**的态度。`gofmt`工具把代码格式化为标准格式, `ctrl + s`以后自动格式化, 妙蛙 +- 包导入顺序并不重要;gofmt工具格式化时按照**字母顺序**对包名排序。(我看不懂, 大为震撼) + + + +```go +// 多个包 +import{ + "fmt" + "os" +} + +func +``` + + + + + + + + + + + + + +#### hellow world + +```go +package main + +import( + "fmt" +) + +func main(){ + fmt.Println("hellow world") +} +``` + + + + + + + +#### 编译与运行 + +单文件 + +```bash +# 运行 +go run helloworld.go + +# 编译 +go build helloworld.go +``` + + + + + +### 语法 + +参考资料 + +[前言 · Go语言圣经 (studygolang.com)](https://books.studygolang.com/gopl-zh/) + +- 循环没有括号 +- 没有 `;` +- 变量类型后置 +- 支持返回多个值 + + + +```go +package main + +import "fmt" + +func main() { + fmt.Println("Hello, 世界") +} +``` + + + + + + + +#### 类型与变量 + +- 类型**不需要导入** +- 可以使用 `const`修饰 +- **短变量声明**是一种简洁的变量声明方式,用于**同时声明和初始化**变量。 + +```go +var b, c int = 1, 2 +var e float64 + +// 短变量声明 +f := a + + +// 数组 +var a [5]int +b := [5]int{1, 2, 3, 4, 5} + +// 多维数组 +var twoD [2][3]int + + + +``` + + + +#### byte + +在 Go 编程语言中,`byte` 是一种基本数据类型,用于表示一个 8 位的无符号整数。它是 uint8 类型的别名。每个 byte 的取值范围是 0 到 255。 + +在实际应用中,`byte` 类型通常用于处理二进制数据、字节流以及字符编码等场景。例如,在读取文件或网络数据时,常常使用 byte 数组来存储和操作字节数据。同时,Go 中的字符串也是由一系列 byte 组成的,因此 byte 类型也经常用于处理字符串的各种操作。 + +可以通过以下方式声明和使用 byte 类型变量: + +```go +var b byte // 声明一个 byte 类型变量 +b = 65 // 赋值一个字节值 +fmt.Println(b) // 输出: 65 + +str := "Hello" +for i := 0; i < len(str); i++ { + fmt.Printf("%c ", str[i]) // 遍历字符串并打印每个字符的 byte 值 +} +// 输出: 72 101 108 108 111 +``` + + + + + +#### const + +- 常量, 不用定义类型 +- + +```go + const s string = "constant" + const h = 500000000 + const i = 3e20 / h +``` + + + + + +#### type 定义类型 + + + + + + + +#### 25 个关键字 + +``` +break default func interface select +case defer go map struct +chan else goto package switch +const fallthrough if range type +continue for import return var +``` + + + + + +#### switch + +- 默认**只进入**一个道路 , 与c 不同 +- 也能实现自定义结构体 + +```go +package main + +import ( + "fmt" + "time" +) + +func main() { + + a := 2 + switch a { + case 1: + fmt.Println("one") + case 2: + fmt.Println("two") + case 3: + fmt.Println("three") + case 4, 5: + fmt.Println("four or five") + default: + fmt.Println("other") + } + + t := time.Now() + switch { + case t.Hour() < 12: + fmt.Println("It's before noon") + default: + fmt.Println("It's after noon") + } +} +``` + + + +#### 切片--- 长度可变的数组 + +```go +// 无力吐槽了 int* arr = new int[size]; +s := make([]string, 3) + +// c 风格 api +s = append(s, "d") +s = append(s, "e", "f") + +``` + + + +#### 字典/ 哈希 + +```go +// ------------map------------- +m := make(map[string]int) +m["one"] = 1 +m["two"] =2 + +// 遍历 + +for i, num := range nums{ + +} +``` + + + + + + + + + + + +#### new 和 make + +- 也是像 `C++` + +在 Go 语言中,`make` 和 `new` 是两个用于创建对象的关键字,但它们**用途**不同。 + +- `new`:`new` 用于创建各种类型的**指针**,并分配了零值。例如,使用 `new` 可以创建一个指向整数、结构体或数组的指针,而指针指向的内容会被初始化为对应类型的零值。对于数组来说,返回的是指向数组的指针。 + + ```go + var p *int = new(int) // 创建一个指向 int 类型的指针,并初始化为零值 + fmt.Println(*p) // 输出:0 + + var arr *[]int = new([]int) // 创建一个指向 int 类型切片的指针,并初始化为零值 + fmt.Println(*arr) // 输出:[] + ``` + +- `make`:`make` 用于创建切片、映射和**通道**等**引用**类型的对象,并进行初始化。它会分配内存并返回一个已经初始化的非零值对象。对于切片、映射和通道来说,返回的是对象本身(非指针)。 + + ```go + make(T, size) + + slice := make([]int, 5, 10) // 创建一个长度为 5,容量为 10 的 int 类型切片 + fmt.Println(slice) // 输出:[0 0 0 0 0] + + m := make(map[string]int) // 创建一个 key 为字符串,value 为整数的映射 + m["foo"] = 42 + fmt.Println(m) // 输出:map[foo:42] + + ch := make(chan int) // 创建一个整数类型的通道 + ``` + + + +#### 控制流 for + +```go +for j := 7; j < 9; j++ { + fmt.Println(j) +} + +// 大为震撼.jpg +for { + // ... +} + + +// else 空行不限制 +if 7%2 == 0 { + fmt.Println("7 is even") +} else { + fmt.Println("7 is odd") +} + + + +a := 2 +switch a { + case 1: + fmt.Println("one") + case 2: + fmt.Println("two") + case 3: + fmt.Println("three") + case 4, 5: + fmt.Println("four or five") + default: + fmt.Println("other") +} +``` + + + + + +#### 函数 + +一个函数的声明由`func`关键字、函数名、参数列表、返回值列表(这个例子里的`main`函数参数列表和返回值都是空的)以及包含在大括号里的函数体组成。第五章进一步考察函数。 + +- 支持返回**多个值** + +```go +func add(n int){ + n += 2 + return n +} + + +func exists(m map[string]string, k string) (v string, ok bool) { + v, ok = m[k] + return v, ok +} +``` + + + + + + + +在 Go 中,我们可以使用函数字面值(function literal)或闭包(closure)来定义匿名函数。匿名函数是没有名称的函数,可以直接在代码中声明和使用。 + +匿名函数的定义语法如下: + +```go +func() { + // 函数体 +} +``` + +匿名函数通常被赋值给一个变量,以便后续调用。示例代码如下: + +```go +package main + +import "fmt" + +func main() { + // 定义并调用匿名函数 + func() { + fmt.Println("Hello, anonymous function!") + }() + + // 将匿名函数赋值给变量,然后进行调用 + greeting := func() { + fmt.Println("Hello, anonymous function assigned to a variable!") + } + greeting() +} +``` + +当我们执行上述代码时,输出将会是: + +``` +Hello, anonymous function! +Hello, anonymous function assigned to a variable! +``` + +通过匿名函数,我们可以灵活地在代码中定义临时的、功能独立的函数,并且可以直接调用或将其赋值给变量后再调用。 + + + +#### 指针 + +- 对传入的参数进行修改 + +```go +func addw(n int){ + n += 2; +} + +func add2(n *int){ + *n += 2 +} +``` + + + + + + + +#### nil + +在 Go 语言中,`nil` 表示一个空值或空指针。它是一种特殊的预定义常量,可以用来表示某些类型的零值或未初始化的变量。 + +在 Go 中,`nil` 可以用于多种类型的数据,如指针、切片(slice)、映射(map)、通道(channel)和函数等。当这些类型的变量没有被分配具体的值或引用时,它们的默认值就是 `nil`。 + +使用 `nil` 可以判断一个指针是否为空或未初始化,以避免访问空指针而导致程序崩溃。例如,如果一个指针的值为 `nil`,就表示它没有指向任何有效的内存地址。 + +需要注意的是,在 Go 语言中,不同类型的 `nil` 并不相等。例如,一个指针类型的 `nil` 与一个切片类型的 `nil` 是不相等的。因此,在比较 `nil` 值时,应该使用相应类型的零值或其他相应的方法来进行比较。 + + + + + +#### 结构体 + +```go +type user struct{ + name string + password string +} + +func main(){ + a := user(name: "wang", password: "1024") +} + +``` + + + + + + + +#### 结构体方法 + +- 带指针可以修改 + +```go +package main + +import "fmt" + +type user struct { + name string + password string +} + +func (u user) checkPassword(password string) bool { + return u.password == password +} + +func (u *user) resetPassword(password string) { + u.password = password +} + +func main() { + a := user{name: "wang", password: "1024"} + a.resetPassword("2048") + fmt.Println(a.checkPassword("2048")) // true +} + +``` + + + + + +#### 大括号 + +在 Go 语言中,大括号({})通常用于以下几个方面: + +1. 块语句:大括号用于定义代码块,将多条语句组织在一起形成一个逻辑单元。例如,在函数、条件语句(if、switch)、循环语句(for)等结构中,可以使用大括号包裹多条语句来构成一个代码块。 + +示例: + +```go +go复制代码func main() { + // 代码块 + var x int = 10 + if x > 5 { + fmt.Println("x 大于 5") + // ... + } +} +``` + +1. 结构体和数组的字面量初始化:在结构体和数组的初始化过程中,大括号可以用来指定初始值。 + +示例: + +```go +type Person struct { + Name string + Age int +} + +func main() { + // 使用大括号初始化结构体 + p := Person{ + Name: "Alice", + Age: 25, + } + + // 使用大括号初始化数组 + arr := [3]int{1, 2, 3} +} +``` + +1. 匿名函数体:在 Go 语言中,可以使用匿名函数(闭包)。匿名函数的函数体也需要用大括号包裹。 + +示例: + +```go +func main() { + // 定义匿名函数,并调用 + func() { + fmt.Println("Hello, world!") + }() +} +``` + +除了上述用途外,大括号在其他情况下并没有特殊的含义。需要注意的是,在 Go 语言中,大括号是强制性的,即使代码块只包含一条语句,仍然需要使用大括号将其包裹起来。 + + + + + +### 进阶 + +#### 错误处理 + + + +```go +package main + +import ( + "errors" + "fmt" +) + +type user struct { + name string + password string +} + +func findUser(users []user, name string) (v *user, err error) { + for _, u := range users { + if u.name == name { + return &u, nil + } + } + return nil, errors.New("not found") +} + +func main() { + u, err := findUser([]user{{"wang", "1024"}}, "wang") + if err != nil { + fmt.Println(err) + return + } + fmt.Println(u.name) // wang + + if u, err := findUser([]user{{"wang", "1024"}}, "li"); err != nil { + fmt.Println(err) // not found + return + } else { + fmt.Println(u.name) + } +} + +``` + + + +#### 字符串 + +```go +package main + +import ( + "fmt" + "strings" +) + +func main() { + a := "hello" + fmt.Println(strings.Contains(a, "ll")) // true + fmt.Println(strings.Count(a, "l")) // 2 + fmt.Println(strings.HasPrefix(a, "he")) // true + fmt.Println(strings.HasSuffix(a, "llo")) // true + fmt.Println(strings.Index(a, "ll")) // 2 + fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo + fmt.Println(strings.Repeat(a, 2)) // hellohello + fmt.Println(strings.Replace(a, "e", "E", -1)) // hEllo + fmt.Println(strings.Split("a-b-c", "-")) // [a b c] + fmt.Println(strings.ToLower(a)) // hello + fmt.Println(strings.ToUpper(a)) // HELLO + fmt.Println(len(a)) // 5 + b := "你好" + fmt.Println(len(b)) // 6 +} + +``` + + + + + +#### 字符串格式化 + +- `%v`方便的输出所有的数据 +- `%+v` 十分详细 +- `%#v` 非常详细 +- `%.2f` 保留两位小数 + +```go +package main + +import "fmt" + +type point struct { + x, y int +} + +func main() { + s := "hello" + n := 123 + p := point{1, 2} + fmt.Println(s, n) // hello 123 + fmt.Println(p) // {1 2} + + fmt.Printf("s=%v\n", s) // s=hello + fmt.Printf("n=%v\n", n) // n=123 + fmt.Printf("p=%v\n", p) // p={1 2} + fmt.Printf("p=%+v\n", p) // p={x:1 y:2} + fmt.Printf("p=%#v\n", p) // p=main.point{x:1, y:2} + + f := 3.141592653 + fmt.Println(f) // 3.141592653 + fmt.Printf("%.2f\n", f) // 3.14 +} + +``` + + + + + +#### JSON 处理 + +- 类型首字母需要大写 +- 打印`JSON`的话需要 套一层 `string` + +```go +package main + +import ( + "encoding/json" + "fmt" +) + +type userInfo struct { + Name string + // 输出时, 将会是小写 + Age int `json:"age"` + Hobby []string +} + +func main() { + a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}} + buf, err := json.Marshal(a) + if err != nil { + panic(err) + } + fmt.Println(buf) // [123 34 78 97...] + fmt.Println(string(buf)) // {"Name":"wang","age":18,"Hobby":["Golang","TypeScript"]} + + buf, err = json.MarshalIndent(a, "", "\t") + if err != nil { + panic(err) + } + fmt.Println(string(buf)) + + var b userInfo + err = json.Unmarshal(buf, &b) + if err != nil { + panic(err) + } + fmt.Printf("%#v\n", b) // main.userInfo{Name:"wang", Age:18, Hobby:[]string{"Golang", "TypeScript"}} +} + +``` + + + + + +#### time + +- 转化为字符串 +- + +```go +package main + +import ( + "fmt" + "time" +) + +func main() { + now := time.Now() + fmt.Println(now) // 2022-03-27 18:04:59.433297 +0800 CST m=+0.000087933 + t := time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC) + t2 := time.Date(2022, 3, 27, 2, 30, 36, 0, time.UTC) + fmt.Println(t) // 2022-03-27 01:25:36 +0000 UTC + fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute()) // 2022 March 27 1 25 + // 字符串形式 + fmt.Println(t.Format("2006-01-02 15:04:05")) // 2022-03-27 01:25:36 + diff := t2.Sub(t) + fmt.Println(diff) // 1h5m0s + fmt.Println(diff.Minutes(), diff.Seconds()) // 65 3900 + + // 解析字符串, 转化为 time 格式 + t3, err := time.Parse("2006-01-02 15:04:05", "2022-03-27 01:25:36") + if err != nil { + panic(err) + } + fmt.Println(t3 == t) // true + + // 获取时间戳 + fmt.Println(now.Unix()) // 1648738080 +} + +``` + + + + + +#### 数字解析 + +```go +package main + +import ( + "fmt" + "strconv" +) + +func main() { + + // 字符串, 进制, 精度 + // 进制传 0 自动推测 + f, _ := strconv.ParseFloat("1.234", 64) + fmt.Println(f) // 1.234 + + n, _ := strconv.ParseInt("111", 10, 64) + fmt.Println(n) // 111 + + + n, _ = strconv.ParseInt("0x1000", 0, 64) + fmt.Println(n) // 4096 + + n2, _ := strconv.Atoi("123") + fmt.Println(n2) // 123 + + // 十进制的转化 + n2, err := strconv.Atoi("AAA") + fmt.Println(n2, err) // 0 strconv.Atoi: parsing "AAA": invalid syntax +} + +``` + + + + + +#### 进程信息 + +```go +package main + +import ( + "fmt" + "os" + "os/exec" +) + +func main() { + // go run example/20-env/main.go a b c d + fmt.Println(os.Args) // [/var/folders/8p/n34xxfnx38dg8bv_x8l62t_m0000gn/T/go-build3406981276/b001/exe/main a b c d] + fmt.Println(os.Getenv("PATH")) // /usr/local/go/bin... + fmt.Println(os.Setenv("AA", "BB")) + + buf, err := exec.Command("grep", "127.0.0.1", "/etc/hosts").CombinedOutput() + if err != nil { + panic(err) + } + fmt.Println(string(buf)) // 127.0.0.1 localhost +} + +``` + + + + + +https://fanyi.caiyunapp.com/ + + + + + +### 关键字 + + + +#### defer ------推迟运行 + +在 Go 语言中,`defer` 是一个关键字,用于延迟(defer)函数的执行。当一个函数中包含 `defer` 语句时,被延迟的函数不会马上执行,而是等到包含它的函数执行完毕后才会被调用。 + +`defer` 语句通常用于在函数返回之前执行一些清理或收尾操作,例如关闭文件、释放资源等。无论函数是正常返回还是发生异常,被延迟的函数都会被执行。 + +延迟执行的函数调用会按照后进先出(LIFO)的顺序执行,即最后一个 `defer` 语句会最先执行。 + +下面是一个简单的示例代码,演示了 `defer` 的使用: + +```go +func main() { + defer fmt.Println("延迟执行的函数") + fmt.Println("普通的函数") + + // 输出结果: + // 普通的函数 + // 延迟执行的函数 +} +``` + +在上述代码中,`fmt.Println("延迟执行的函数")` 使用了 `defer` 关键字,所以它会在 `main` **函数执行完毕**之前被延迟执行,而 `fmt.Println("普通的函数")` 则会马上执行。因此,最终的输出结果将先打印 "普通的函数",再打印 "延迟执行的函数"。 + + + + + + + +### 常用的包 + +#### 组织形式 + +- 每个包都对应一个独立的名字空间。每个源文件都是以包的**声明语句**开始,用来指明包的名字。 +- 包内的成员将通过类似 tempconv.CToF 的形式访问。 +- 同一个包的其他源文件也是可以直接访问的,就好像所有代码都在一个文件一样。 +- 要**注意**的是 tempconv.go 源文件**导入**了 fmt 包,但是 conv.go 源文件并没有,因为这个源文件中的代码并没有用到 fmt 包。 + +```go +// 每个源文件都是以包的声明语句开始,用来指明包的名字。 +// Package tempconv performs Celsius and Fahrenheit conversions. +package tempconv + +import "fmt" + +type Celsius float64 +type Fahrenheit float64 + +const ( + AbsoluteZeroC Celsius = -273.15 + FreezingC Celsius = 0 + BoilingC Celsius = 100 +) + +func (c Celsius) String() string { return fmt.Sprintf("%g°C", c) } +func (f Fahrenheit) String() string { return fmt.Sprintf("%g°F", f) } +``` + + + + + +#### 什么叫做 基于 GOPATH 开发的 + +基于 GOPATH 开发指的是在 Go 语言中使用 GOPATH 环境变量设置的工作目录进行开发。在 Go 语言中,GOPATH 是一个重要的环境变量,它指定了 Go **项目的根目录**。 + +当我们使用 Go 语言进行开发时,我们需要将项目源代码和依赖的第三方库都放置在 GOPATH 目录下的相应位置。通常,该目录结构如下: + +``` +GOPATH/ +|-- bin/ # 可执行文件 +|-- pkg/ # 编译后生成的库文件 +|-- src/ # 项目源代码、第三方库等 + |-- myproject/ # 项目代码 + |-- github.com/xxx/yyy/ # 第三方库 +``` + + + + + +### 依赖管理 + +go 依赖管理主要经历以下三个阶段: + +- GOPATH +- GO VENDOR +- GO Module + + + + + +#### gopath + +gopath 是 go 语言支持的一个环境变量,value 是 Go 项目的工作区。 + +```bash +cd $GOPATH +|---bin 项目编译的二进制文件 +|---pkg 项目编译的中间产物加速编译 +|---src 项目源码 +``` + +- 项目代码直接依赖src下的代码 +- `go get`下载最新版本的包到src 目录下 + +同一个 pkg,但是 pkg 有不同版本 pkg v1 和 pkg v2, 里面包含两个方法。而 src 下只能有一个版本存在,那 AB 项目无法保证都能编译通过。 + +就是在 gopath 管理模式下,如果多个项目依赖同一个库,则依赖该库是同一份代码,所以不同项目不能依赖同一个库的不同版本,这很显然不能满足我们的项目依赖需求。无法实现 package 的多版本控制。 + +为了解决这个问题,go vendor 出现了。 + + + + + + + + + +#### Go Vendor + +- 项目目录下增加 vendor 文件, 所有依赖包**副本**形式放在`$ProjectRoot/vendor` +- 依赖寻址方式:vendor=>GOPATH + + + +问题 + +- A依赖于 B C +- B C 依赖于 D不同的版本 + + + + + +#### go module + +有了 Go module 之后,可以方便地管理项目的依赖关系,并且**不需要手动**下载库。使用 Go module,你可以在代码中引入需要的库,并通过指定版本或者版本范围来自动获取相应的库。当你首次引入一个新的库时,Go module 会自动下载该库及其依赖到本地的缓存中。这样,你就可以随意引入库,而无需手动下载。 + + + +依赖管理三要素 + +- 1.配置文件, 描述依赖go.mod +- 2.中心仓库管理依赖库 Proxy +- 3.本地工具 go get/mod + + + +```go +module example/project/ap // p依赖管理基本单元 +go 1.16 // 原生库 +require ( // 单元依赖 + example/lib1 v1.0.2 + example/lib2 v1.0.0 // indirect + example/lib3 v0.1.0-20190725025543-5a5fe074e612 + example/lib4 v0.0.0-20180306012644-bacd9c7ef1dd // indirect example/lib5/v3 v3.0.2 +) +``` + + + +依赖配置 - indirect 关键字 + +- A->B->C,A->B 属于**直接**依赖,A->C 属于**间接**依赖。 +- 在 go.mod 中,对于没有直接导入该依赖模块的包,也就是非直接依赖,标识间接依赖。所以加上 indirect 后缀。 + + + +为什么需要 Proxy + +直接使用版本管理仓库下载依赖,存在多个问题, + +- 无法保证构建确定性:软件作者可以直接代码平台增加 / 修改 / 删除软件版本,导致下次构建使用另外版本的依赖,或者找不到依赖版本。 +- 无法保证依赖可用性:依赖软件作者可以直接代码平台删除软件,导致依赖不可用。 +- 增加第三方代码托管平台的压力,代码托管平台负载问题。 + +使用 go proxy 之后,构建时会直接从 go proxy 站点拉取依赖。类比项目中,下游无法满足我们上游的需求。 + + + +```go +GOPROXY="https://proxy1.cn, https://proxy2.cn ,direct" +``` + + + + + + + +#### 工具 - go get/mod + +开头提到 go model 有两个本地工具,go get/mod。 + +| 指令功能 | | +| -------- | ------------------------ | +| @update | 默认 | +| @none | 删除依赖 | +| @v1.1.2 | 下载指定tag版本,语义版本 | +| @23dfdd5 | 下载特定的commit版本 | +| @master | 下载分支的最新commit | + + + + + +go mod + +| 指令 | 功能 | +| ---- | ------------------------------- | +| init | 初始化,创建go.mod文件 | +| tidy | 增加需要的依赖,删除不需要的依赖 | + + + + + + + + + + + + + + + + + +#### go module 使用方法 + +1. 确保你的项目目录下有一个有效的 `go.mod` 文件。如果没有,可以通过运行 `go mod init` 命令来初始化一个新的模块。 +2. 在你的项目中,使用 `import` 语句导入你需要的依赖项。 +3. 运行 `go mod tidy` 命令来自动分析你的代码并下载缺少的依赖项。这个命令会根据你的代码中的导入语句自动更新 `go.mod` 文件,并下载相应的依赖项。 +4. 如果你想手动下载特定的依赖项,可以使用 `go get` 命令,例如 `go get github.com/example/package`。 + + + +```bash +$ go env +GO111MODULE="on" +GOARCH="amd64" +GOBIN="" +GOCACHE="/home/runner/.cache/go-build" +GOENV="/home/runner/.config/go/env" +GOEXE="" +GOEXPERIMENT="" +GOFLAGS="" +GOHOSTARCH="amd64" +GOHOSTOS="linux" +GOINSECURE="" +GOMODCACHE="/home/runner/go/pkg/mod" +GONOPROXY="" +GONOSUMDB="" +GOOS="linux" +GOPATH="/home/runner/go" +GOPRIVATE="" +GOPROXY="https://goproxy.cn,direct" +GOROOT="/nix/store/4m1nfq0xhc9p1hi6dnxbcpppcgz22yf9-go-1.17.5/share/go" +GOSUMDB="sum.golang.org" +GOTMPDIR="" +GOTOOLDIR="/nix/store/4m1nfq0xhc9p1hi6dnxbcpppcgz22yf9-go-1.17.5/share/go/pkg/tool/linux_amd64" +GOVCS="" +GOVERSION="go1.17.5" +GCCGO="gccgo" +AR="ar" +CC="gcc" +CXX="g++" +CGO_ENABLED="1" +GOMOD="/home/runner/app/go.mod" +CGO_CFLAGS="-g -O2" +CGO_CPPFLAGS="" +CGO_CXXFLAGS="-g -O2" +CGO_FFLAGS="-g -O2" +CGO_LDFLAGS="-g -O2" +PKG_CONFIG="pkg-config" +GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build2769124553=/tmp/go-build -gno-record-gcc-switches" + + + +# 设置 +go env -w GO111MODULE=on +go env -w GOPROXY=https://goproxy.cn,direct + +``` + + + +GO111MODULE 有三个值:off、on 和 auto (默认值) + +- `GO111MODULE=off` :go 命令行将不会支持 module 功能,寻找依赖包的方式将会沿用旧版本那种通过 vendor 目录或者 GOPATH 模式来查找。 + +- `GO111MODULE=on` :go 命令行会使用 modules,而一点也不会去 GOPATH 目录下查找。 + +- ``` + GO111MODULE=auto + ``` + + + + :默认值,go 命令行将会根据当前目录来决定是否启用 module 功能。这种情况下可以分为两种情形: + + - 当前目录在 GOPATH/src 之外且该目录包含 go.mod 文件 + - 当前文件在包含 go.mod 文件的目录下面。 + + + + + + + +嘿!要查看当前环境下是否已安装 `github.com/jinzhu/gorm` 包,你可以尝试以下步骤: + +1. 打开终端或命令提示符。 +2. 运行 `go list -m github.com/jinzhu/gorm` 命令。 + - 如果你看到了类似 `github.com/jinzhu/gorm` 的输出,那么说明该包已经在当前环境中安装了,并且输出会显示其版本号。 + - 如果没有输出或者显示 `go: github.com/jinzhu/gorm: module github.com/jinzhu/gorm not found`,那么说明该包尚未在当前环境中安装。 + +如果你发现该包尚未安装,你可以尝试使用 `go get` 命令来安装它,如:`go get -u github.com/jinzhu/gorm`。 + + + + + +[go mod 使用 | 全网最详细 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/482014524?utm_id=0) + +直接在文件里 import 然后运行 go mod tidy就行吗 + +go build 编译的时候会根据 `go.mod` 里自己**下载**包 + +```bash +go mod init packagename + + +Go mod provides access to operations on modules. + +Note that support for modules is built into all the go commands, +not just 'go mod'. For example, day-to-day adding, removing, upgrading, +and downgrading of dependencies should be done using 'go get'. +See 'go help modules' for an overview of module functionality. + +Usage: + + go mod [arguments] + +The commands are: + + download download modules to local cache + edit edit go.mod from tools or scripts + graph print module requirement graph + init initialize new module in current directory + tidy add missing and remove unused modules + vendor make vendored copy of dependencies + verify verify dependencies have expected content + why explain why packages or modules are needed + +Use "go help mod " for more information about a command. +``` + + + + + + + + + +```bash +# 发布到 github之上, 如果别人需要 +go get github.com/jacksonyoudi/gomodone +``` + + + + + + + + + + + +#### fmt + +```go +fmt.Println("hello world") +``` + + + + + +#### net + + + +在 Go 语言中,`net` 包是一个标准库的包,提供了网络相关的功能和接口。它包含了一系列用于网络编程的函数和类型,可以用于创建和管理网络连接、实现网络通信、处理网络协议等操作。 + +`net` 包提供了对常见网络协议(如 TCP、UDP、IP)的支持,以及一些基本的网络操作,如域名解析、网络地址转换、端口扫描等。通过该包,你可以创建客户端和服务器,进行网络数据的发送和接收,处理网络连接的状态和错误等。 + +在使用 `net` 包时,你可以创建各种类型的网络连接,在这些连接上进行读写操作,还可以设置连接的属性和超时时间。此外,`net` 包也提供了一些高级功能,比如通过 `net/http` 包实现 HTTP 服务器和客户端。 + +总的来说,`net` 包是 Go 语言中用于网络编程的核心库,为开发人员提供了丰富的功能和接口,方便进行网络通信和处理。 + + + +### gin + +Gin 是一种轻量级的 Web 框架,用于构建基于 Go 语言的后端应用程序。它提供了快速、简单和具有高度灵活性的方式来处理 **HTTP** 请求和响应。Gin 框架具有良好的性能,并且易于学习和使用,适用于构建各种规模的 Web 应用程序。它支持中间件、路由、参数解析、错误处理等功能,可以帮助开发者高效地构建 RESTful API 或者其他类型的 Web 服务。Gin 框架在 Go 社区广泛流行,并得到了很多开发者的支持和贡献。 + +它和其他第三方 Golang 库一样。如果你是基于 `GOPATH` 开发的,你需要先使用 `go get -u github.com/gin-gonic/gin` 下载 gin,然后 `import` 导入即可。 + +```go +package main + +import "github.com/gin-gonic/gin" + +func main() { + r := gin.Default() + r.GET("/", func(c *gin.Context) { + c.JSON(200, gin.H{ + "Blog":"www.flysnow.org", + "wechat":"flysnow_org", + }) + }) + r.Run(":8080") +} +``` + + + + + + + +`gin.Context` 是 Gin 框架中的**上下文对象**,它封装了**请求和响应**的相关信息,并提供了许多有用的方法来处理 HTTP 请求和构建 HTTP 响应。 + +在使用 Gin 编写路由处理函数时,通常需要接收一个 `gin.Context` 参数。通过这个参数,我们可以获取请求的各种信息,如请求头、URL 参数、请求体等,并使用它们来进行逻辑处理和生成响应。 + +下面是一些常用的 `gin.Context` 方法: + +- `c.Request`:获取原始的 `http.Request` 对象,可以通过它访问更底层的请求和响应信息。 +- `c.Param(name)`:获取 URL 路径中的参数值。 +- `c.Query(key)`:获取查询字符串中指定键名的值。 +- `c.GetHeader(key)`:获取请求头中指定键名的值。 +- `c.ShouldBindJSON(obj)`:将请求的 JSON 数据绑定到指定的结构体对象中。 +- `c.ShouldBindQuery(obj)`:将查询字符串的参数绑定到指定的结构体对象中。 +- `c.JSON(code, obj)`:将指定的对象以 JSON 格式作为响应发送给客户端。 +- `c.String(code, format string, values ...interface{})`:将格式化后的字符串作为响应发送给客户端。 +- `c.HTML(code, name string, data interface{})`:渲染指定名称的 HTML 模板,并将其作为响应发送给客户端。 + +通过使用 `gin.Context`,我们可以方便地处理请求和构建响应,实现更加灵活和强大的 Web 应用程序。 + + + + + + + +gin.Default () 默认使用了 logger and recovery (crash-free) 中间件 +recovery 会把异常捕获到 做一个处理 比如返回一个状态码 + +```go +// Default逻辑 +func Default() *Engine { + debugPrintWARNINGDefault() + engine := New() + engine.Use(Logger(), Recovery()) + return engine +} + +``` + + + +- `router.GET("/someGet", getting)` 表示在路由器上注册了一个 GET 请求的路由端点。当客户端发送一个 GET 请求到路径 "/someGet" 时,它会调用名为 `getfun` 的处理函数来响应这个请求。 + +```go +router := gin.Default () +router.GET ("/someGet", getfun) +``` + + + + + +#### 路由 + +- 创建一个默认的 Gin 路由器对象(router),然后定义了两个分组(group):v1 和 v2。 +- v1 分组用于处理路径以 "/v1" 开头的请求,包括三个路由端点:/login、/submit 和 /read。这些端点分别对应 loginEndpoint、submitEndpoint 和 readEndpoint 函数。 +- v2 分组用于处理路径以 "/v2" 开头的请求,同样包括三个路由端点。这些端点也对应 loginEndpoint、submitEndpoint 和 readEndpoint 函数。 +- 你访问的路径是 /v3 时,由于在代码中没有注册路径为 /v3 的路由端点,因此无论请求方法是什么(POST、GET 等),都会返回 404 Not Found 错误。Gin 默认情况下会返回 404 错误 + + + +```go +func main() { + router := gin.Default() + // Simple group: v1 + v1 := router.Group("/v1") + { + v1.POST("/login", loginEndpoint) + v1.POST("/submit", submitEndpoint) + v1.POST("/read", readEndpoint) + } + // Simple group: v2 + v2 := router.Group("/v2") + { + v2.POST("/login", loginEndpoint) + v2.POST("/submit", submitEndpoint) + v2.POST("/read", readEndpoint) + } + router.Run(":8080") +} + +``` + diff --git a/_posts/byte_tech/2023-07-26-0_overview.md b/_posts/byte_tech/2023-07-26-0_overview.md new file mode 100644 index 0000000..7d46949 --- /dev/null +++ b/_posts/byte_tech/2023-07-26-0_overview.md @@ -0,0 +1,349 @@ +--- +layout: blog +banana: true +category: byte_tech +title: 字节后端训练营 +date: 2023-07-26 13:21:50 +background: green +tags: +- byte_tech +- go +--- + +* content +{:toc} + + +### 概要 + +1课表,2 结营要求,笔记, 打卡,项目, 沸点, 3 1024如何使用,如何团队协作, 出现问题怎么处理, app如何下载运行 + +[‬⁢⁣⁤⁣‍‍⁡⁣‌⁤⁡⁢‌‍‌⁡‬⁡‌⁢⁤‌‍⁢‌⁣⁣‍‍⁢‬第六届字节跳动青训营-后端方向开营班会 - 飞书云文档 (feishu.cn)](https://bytedance.feishu.cn/docx/KwNudUZqQoGL6sxDzFscelaHnGg) + + + + + +#### 课表 进阶班:直播+录播 + +| 时间 | 7月25日(周二) | 7月26日(周三) | 7月28日(周五) | 7月31日(周一) | 8月1日(周二 | +| ---- | ---------------------------- | ----------------- | ------------------------ | ------------------------- | --------------------------- | +| 课程 | Go语言**基础语法** | Go语言工程实践 | 高质量编程与性能调优实践 | HTTP框架修炼之道 | 打开抖音会发生什么 | +| | | | | | | +| 时间 | **8月2日(周三)** | **8月4日(周五)** | **8月5日(周六)** | **8月7日(周一)** | **8月8日(周二)** | +| 课程 | 将我的服务开放给用户 | 深入浅出RPC框架 | 带你认识存储&数据库 | Go三件详解(Web/ RPC/ORM)R | redis一大厂程序员是怎么用的 | +| | | | | | | +| 时间 | **8月10日(周四)** | **B月11日(周五)** | **8月14日(周一)** | **8月15日(周二)** | **B月18日(周五)** | +| 课程 | TOS对象存储实战 | 走进消息队列 | 微服务架构原理与治理实践 | 架构初探之谁动了我的蛋糕 | 网站常见安全漏洞 | +| | | | | | | +| | **8月21日(周一)** | **8月22日(周二)** | **8月24日周四** | | | +| | 高性能Go语言发行版优化与落实 | 入理解RDBMS | 从零拷贝视角看性能忧化 | | | + + + + + +宝子们,文档来啦~ + +开营班会文档: + +[【开营班会】第六届字节跳动青训营-后端方向](https://bytedance.feishu.cn/docx/KwNudUZqQoGL6sxDzFscelaHnGg) + +开营班会回放:https://meetings.feishu.cn/s/1j4s831x15i4i?src_type=3(已编辑) + + + +第一节课《Go 语言基础语法》分为两小节,课程链接如下: + +1. [走进 Go 语言基础语法 - 掘金](https://juejin.cn/course/bytetech/7140987981803814919/section/7140988735222448165) +2. [Go 语言的实战案例 - 掘金](https://juejin.cn/course/bytetech/7140987981803814919/section/7141265019756675103) + +[1024Code 组队协作编程流程说明文档(后端) - 飞书云文档 (feishu.cn)](https://c1n2p7ijpkc.feishu.cn/docx/HyJfd9n2DojarxxaNsQcTs8hn3c) + + + + + + + +同学们早上好[愉快]今天我们上第二节课《Go 语言工程实践》,本节课分为两小节,课程链接如下: 1. + +[Go 语言进阶与依赖管理 - 掘金](https://juejin.cn/course/bytetech/7140987981803814919/section/7141271987174768676) + +[Go 语言工程实践之测试 - 掘金](https://juejin.cn/course/bytetech/7140987981803814919/section/7141273296397402148) + +[【后端专场 学习资料一】字节跳动青训营 - 掘金](https://juejin.cn/post/7188225875211452476#heading-8) + + + +同学们早上好[辛勤营业]今天我们上第三节课《高质量编程与性能调优实践》,本节课我们分为四小节,课程链接如下: + +[高质量编程简介及编码规范 - 掘金](https://juejin.cn/course/bytetech/7140987981803814919/section/7142746789941084197) + +[性能优化指南 - 掘金](https://juejin.cn/course/bytetech/7140987981803814919/section/7142746472319025182) + +[性能优化分析工具 - 掘金](https://juejin.cn/course/bytetech/7140987981803814919/section/7142747721789603848) + +[性能调优实战案例 - 掘金](https://juejin.cn/course/bytetech/7140987981803814919/section/7142747721793798158) + +今天的课程视频较多,请大家按时学习,学习结束别忘了填写签到问卷~ + +课程签到问卷: + +[《高质量编程与性能调优实践》后端进阶班 签到](https://wj.toutiao.com/q/247018/97f4o30H/ff3e) + +签到时限:截止到 2023.7.28 23:59(过时不支持补签!) + +参考资料: + +[【后端专场 学习资料一】字节跳动青训营 - 掘金](https://juejin.cn/post/7188225875211452476#heading-26) + +由于前两天很多同学签到信息有误,今天的考勤信息更新延迟到下周二,请大家后续认真填写签到问卷,确保信息正确无 + + + + + +学们早上好~今天我们上第四节课《HTTP 框架修炼之道》,本节课分为三小节,课程链接如下: + +[走进 HTTP 协议 - 掘金](https://juejin.cn/course/bytetech/7142811324462923783/section/7142810214532644872) + +[HTTP 框架的设计与实现 - 掘金](https://juejin.cn/course/bytetech/7142811324462923783/section/7142813065883418637) + +[性能修炼之道与企业实践 - 掘金](https://juejin.cn/course/bytetech/7142811324462923783/section/7142812323994927135) + +请大家按时学习,学习结束别忘了填写签到问卷~ + +课程签到问卷: + +[《HTTP 框架修炼之道》后端进阶班 签到](https://wj.toutiao.com/q/247022/r4g1Ee06/7209) + +签到时限:截止到 2023.7.31 23:59(过时不支持补签!) + +参考资料: + +[【Go 语言框架与实现 学习资料】字节跳动青训营 - 后端专场 - 掘金](https://juejin.cn/post/7099665398655615006/#heading-22) + + + + + + + +今天我们上第十三节课《微服务架构原理与治理实践》,本节课分为三小节,课程链接如下: + +[微服务架构原理及特征 - 掘金](https://juejin.cn/course/bytetech/7142811324462923783/section/7142833450368630815) + + + +[核心服务治理功能 - 掘金](https://juejin.cn/course/bytetech/7142811324462923783/section/7142833417237823518) + + + +[字节跳动服务治理实践 - 掘金](https://juejin.cn/course/bytetech/7142811324462923783/section/7142833506689744904) + + + +请大家按时学习,学习结束别忘了填写签到问卷~ + +签到 uid 不要填错了!!看不懂说明的问问别人,填错的话无法统计到数据! + +课程签到问卷: + +[《微服务架构原理与治理实践》后端进阶班 签到](https://wj.toutiao.com/q/247041/M8N2Je40/4058) + +签到时限:截止到 2023.8.14 23:59(过时不支持补签!) + +参考资料: + +[【后端专场 学习资料四】字节跳动青训营 - 掘金](https://juejin.cn/post/7194381054797905981/#heading-0) + + + + + +今天我们上第十四节课《架构初探之谁动了我的蛋糕》,本节课分为四小节,课程链接如下: + +[架构定义解析 - 掘金](https://juejin.cn/course/bytetech/7142773151435489288/section/7142776645873565709) + +[企业级后端架构剖析 - 掘金](https://juejin.cn/course/bytetech/7142773151435489288/section/7142774078720442398) + +[业内后端架构面临的挑战 - 掘金](https://juejin.cn/course/bytetech/7142773151435489288/section/7142777131703992334) + +[后端架构实战 - 掘金](https://juejin.cn/course/bytetech/7142773151435489288/section/7142774419251789831) + +参考资料: + +[【后端专场 学习资料三】字节跳动青训营 - 掘金](https://juejin.cn/post/7193363381804335161/#heading-22) + + + + + +#### 要求 + +- 每日问卷**签到**, 问卷开放时间为课程当日10:00-23:59, 过时不候 + - **周五**出结果, 申诉要**趁早** +- **[8月30日]**之前 , 符合要求打卡天数≥21天 +- **[8月30日]**之前 , 笔记≥6篇 + - 技术学习总结:总结青训营**直播**课程**学习到的知识点**,梳理分析,并给出自己的理解和对其他入门同学的学习建议 + - Go GORm +- 学习**课表**中的课程数13,且每门课程学习进度≥50% +- 条件4(满足其中一个): + - 项目 + - 符合要求的课程笔记≥8篇 +- 证书为**电子**证书 + + + +在沸点圈子「[青训营 - 快乐出发](https://juejin.cn/pin/club/7091610245012815879)」每日发布不少于 30 字的沸点,可优先进行阅读打卡,除了文末提供的阅读材料外,只要是掘金的技术文章都可以,也可以在圈子内分享自己的暑期生活。可以参考话题:# 挑战每日一条沸点 #、# 碳水使我快乐 #等,更多话题可以到话题广场进行搜索。 [juejin.cn/pin/topics](https://juejin.cn/pin/topics) + + + +#### 组队要求 + +- 小组人数4~8, 不能跨班 + + + + + +#### 笔记要求 + +- 标题格式:xxxxx **标题 | 青训营;**(示例:“第六届字节跳动青训营第一课 | 青训营”) +- 文章字数不得少于 650 字,不得有广告 / 洗稿 / 凑字数等行为; +- 所有的笔记都不能只贴代码,要有自己的分析思考,**代码文字比不得超过 70%** 。 + +[📚 第六届青训营笔记伴读 | 升级学习体验,高效掌握知识 - 掘金 (juejin.cn)](https://juejin.cn/post/7259210874446381115) + +![img](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5c208a553193450caffda616c832fa58~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp) + + + + + + + + + + + + + + + + + +### 1024 相关/ 项目 + +#### 1024 code/ 代码 + +拿到**邀请码**以后再去注册 + +主要功能 + +- 在线**多人协作**, 包括代码 +- code 在线分享: 类似于 **kaggle** +- 助手:gpt +- Git版本管理:Git Commit,管理你的代码版本 +- 数据库:云端数据库 + + + +建议 创建 github仓库 + +[‌‌‌⁢⁤‍⁣‍‌‬‌‌⁡⁣⁤‌⁡⁣⁤‬⁣‬‍⁡⁢⁡⁣‬⁣⁡⁡⁤⁡‌1024Code 组队协作编程流程说明文档(后端) - 飞书云文档 (feishu.cn)](https://c1n2p7ijpkc.feishu.cn/docx/HyJfd9n2DojarxxaNsQcTs8hn3c) + +[产品简介 | 1024Code 文档中心](https://docs.1024code.com/) + + + + + +#### github 联动 + +添加公钥到 GitHub/Gitee/GitLab + +打开个人中心设置页面复制个人的 SSH 公钥:添加到你的 GitHub/Gitee/GitLab 账户中: + +![添加公钥到GitHub](https://1024code.com/images/git_remot_copysshkey.png) + + + +- 创建一个和代码空间同名的远程仓库,或在已存在的远程仓库中复制该仓库地址,如:`git@github.com:li382112772/SimpleNES.git` + + + + + +#### 创建团队 + +- 登录1024Code账号,进入工作台后,点击我的团队区域的"**创建团队**"功能按钮创建团队. +- 上传团队头像,填写团队名称以及团队简介信息后创建团队. + +在团队工作台成员页面,添加或使用链接邀请成员加入团队. +在对团队成员列表里,可以更改成员角色、移出团队成员,可更改的角色包括: + +- 成员:可自由创建团队代码空间,可见团队所有代码空间,但不可编辑自己未加入协作的代码空间 +- 管理员:可自由创建团队代码空间,可见并可主动加入所有团队代码空间进行协作编辑,可处理团队加入申请、可管理团队 +- 所有者:拥有管理员全部权限的同时,可移交团队给其他成员(将其他成员设为所有者) + + + +#### 1024 创建代码空间 + +- 进入团队工作台,点击新建按钮选择` Go1.17`环境模版,给团队创建代码空间: +- 代码空间创建成功后,在终端 shell中使用 git clone命令从服务端 Demo仓库(https://github.com/RaymondCode/simple-demo) clone项代码 或者直接Fork现成的项目demo代码空间:[抖音项目服务端Demo - 1024Code](https://1024code.com/codecubes/n56lqqb) +- + +邀请队员加入代码空间协作 + +- 在代码空间中点击协作浮窗,搜索添加或链接邀请队员加入代码空间进行实时协作编程. + +使用git功能从远程仓库同步代码 + +- 首先前往GitHub/GitLab网站创建一个项目,作为这次组队项目的远程代码仓库,并各自创建分支,以方便团队成员之间异步协作. +- 之后,打开1024Code代码空间git功能侧边窗口,按照操作提示流程连接远程仓库,同步1024Code代码仓库代码和GitHub/GitLab远程库代. + +连接App调试接口 + +- 按照项目要求**下载apk** +- 安装App后.在App中设置**服务端地址**,即1024Code代码空间浏览器输出窗口中的URL地址,进行接口调试,如下图: + +注意:1024Code代码空间浏览器输出窗口中的URL地址,如https:/e398ab9bee48dc435e6fd167398b57c3-app.1024paas.com,伴随着代码空间所在容器的**释放和重启**激活(代码空间长时间无操作或者关闭页面后代码空间所在容器会被释放掉,再次打开后会重启一个容器),该URL地址会变.当服务端URL地址改变后,需要在App中重新设置下服务端地址. +此外,1024Code浏览器输出端口暂时仅支持8080端口,参照demo代码空间, listen and serve on +0.0.0.0:8080. + + + + + +#### 1024 的问题 + +- 使用git clone命令克隆项目代码报错 + - 1024Code IDE环境默认为国内网络环境,国内网络环境连接 GitHub,使用git clone命令会有不稳定的情况导致clone失败,失败时可多次尝试. +- 如何安装依赖1024 + - Code IDE代码空间基于Linux环境,并使用了Nixos来管理系统依赖,常用的第三方依赖我们可以使用npm install的方式进行安装,系统级依赖,如node.js和npm包,需要通过nix的方式,具体可参照:https://docs.1024code.com/Tutorials/practice +- 项目编译被 Killed + - 1024Code默认提供了1G内存大小的容器环境给每个代码空间,部分项目编译及运行时需要的内存大小瞬时超过1G,内存不足系统会kill掉该进程.遇到这种情况,大家在群里联系我们,青训营期间我们可以直接帮大家调大代码空间容器内存大小. + + + + + +#### APP 接口 + +[极简抖音App使用说明 - 第六届青训营版 - 飞书云文档 (feishu.cn)](https://bytedance.feishu.cn/docx/NMneddpKCoXZJLxHePUcTzGgnmf) + +[‍‌‬‍‍⁢‌⁣⁤⁣‍⁡⁡‌‬‬⁢⁡‌‌‬⁢‬⁣‌‍⁣⁤‌‍⁣‍抖音项目方案说明-第六届青训营后端项目 - 飞书云文档 (feishu.cn)](https://bytedance.feishu.cn/docx/BhEgdmoI3ozdBJxly71cd30vnRc) + + + + + + + + + + + diff --git a/_posts/byte_tech/2023-07-30-go-2-godemo.md b/_posts/byte_tech/2023-07-30-go-2-godemo.md new file mode 100644 index 0000000..e10a172 --- /dev/null +++ b/_posts/byte_tech/2023-07-30-go-2-godemo.md @@ -0,0 +1,108 @@ +--- +layout: blog +banana: true +category: byte_tech +title: "Go_2_小DEMO" +date: 2023-07-30 13:34:18 +background: green +tags: +- byte_tech +- go +--- + +* content +{:toc} + + +#### 随机数 + +- 需要设计随机数种子 +- 一般使用 **时间戳** 来设置 + + + + + +#### 在线词典 + +[词典地址](https://fanyi.caiyunapp.com/) + +- 右键---检查----开发者工具 +- 输入一个单词 +- 开发者工具中找到 `Network`, +- 右键点击左边的菜单``dict`------- **复制为 curl** (bash) + +``` + +https://api.interpreter.caiyunai.com/v1/dict + +代码生成的网址 +curlconverter.com + +oktools.net/json2go +``` + + + + + +#### 代理服务器 + +> Socket 5(Socks5)是一种网络协议,用于在客户端和服务器之间进行代理连接。Socks5 协议定义了客户端如何与代理服务器进行通信,以便在使用代理时提供安全、可靠的连接。 +> +> Socks5 协议的主要特点包括: +> +> 1. 鉴权机制:Socks5 支持多种鉴权方式,包括无需鉴权、用户名密码鉴权等。客户端在连接代理服务器时需要提供合适的鉴权信息。 +> 2. 支持 TCP 和 UDP:除了常见的 TCP 连接之外,Socks5 还支持对 UDP 数据包的代理转发。 +> 3. IPv6 和域名解析:Socks5 可以处理 IPv4、IPv6 和域名类型的地址,并通过特定的协议交换以实现地址解析和转发。 +> 4. 多重代理链:Socks5 支持多级代理,可以在客户端和目标服务器之间建立多个代理层级,增加灵活性和安全性。 +> +> 通过使用 Socks5 协议,客户端可以将网络请求发送到代理服务器,由代理服务器负责与目标服务器建立连接并传递数据。这使得客户端能够通过代理服务器进行匿名访问、避免网络封锁或限制,或者在需要代理突破防火墙限制时使用。 +> +> 需要注意的是,Socks5 是一种通用的代理协议,并非仅限于特定的应用。它可以被各种网络应用和工具使用,包括网络浏览器、FTP 客户端、邮件客户端等,以提供代理功能和网络连通性。 + + + +#### 携程--------处理上万并发 + +- 协程:用户态,轻量级线程,栈KB级别. +- 线程:内核态,线程跑多个协程,栈MB级别. + +```go +func hello(i int) { + println("hello goroutine : " + fmt.Sprint(i)) +} +func HelloGoRoutine() { + for i:= 0; i< 5; i++ { + go func(j int) { + hello(j) + }(i) + time.Sleep(time.Second) + } +``` + +通信 + +- 提倡通过**通信**共享内存而不是通过共享内存而实现通信 + + + + + +```go +func CalSquare(){ + src := make(chan int) + dest := make(chan int, 3) + go func() { + defer close(src) + A for i := 0; i < 10; i++ { + src ← i + }() + go func() { + defer close(dest) + for i := range src B dest ← i * i + }() + for i := range dest { + /复杂操作println(i) +``` + diff --git a/_posts/byte_tech/2023-07-31-go-4-http-rpc.md b/_posts/byte_tech/2023-07-31-go-4-http-rpc.md new file mode 100644 index 0000000..a5aca34 --- /dev/null +++ b/_posts/byte_tech/2023-07-31-go-4-http-rpc.md @@ -0,0 +1,722 @@ +--- +layout: blog +banana: true +category: byte_tech +title: "Go_4_HTTP_RPC_" +date: 2023-07-31 11:02:06 +background: green +tags: +- byte_tech +- go +--- + +[TOC] + + + + + + +`ctrl` + `/`打开专注模式 + + + +![image-20230731154712540](assets/image-20230731154712540.png) + + + + + + + +### HTTp 框架 + + + + +#### 超文本传输协议 + +- 请求行/状态行 + - 方法名 + - URL + - 协议版本 +- **请求头**/响应头 +- 请求体/响应体 + +``` +POST /sis HTTP/1.1 +Who: Alex +Content-Type: text/plain +Host: 127.0.0.1:8888 +Content-Length: 28 +Let's watch a movie together +``` + + + + + +#### 问题与展望 + +- HTTP1 队头阻塞, 传输效率低, 明文传输不安全 (头部太大) +- HTTP2 多路复用, 头部压缩, 二进制协议 +- QUIC 基于 **UDP** 实现, 解决队头阻塞加, 密减少握手次数, 支持快速启动 + + + + + + + +#### 盖尔定律 + +一个切实可行的复杂系统势必是从一个切实可行的**简单系统**发展而来的。从头开始设计的复杂系统根本不切实可行,无法修修补补让它切实可行。你必须由一个切实可行的简单系统重新开始。 + + +先 `run`起来, 再考虑复用, 使用**迭代**的方式进行 + + + +#### 合理的 API + +不要试图在文档中说明,很多用户不看文档, 这也是在说: **代码的自注释性** + +- 可理解性:如ctx.Body(),ctx.GetBody(),不要用ctx. BodyA() +- 简单性:如`ctx.Request. Header.Peek(key)` + /ctx. GetHeader(key) +- 冗余性 +- 兼容性 +- 可测性 +- 可见性 + + + + + +#### 什么是框架和中间件 + +在计算机编程和软件开发中,框架中间件(Framework Middleware)是指位于**应用程序和底层框架**之间的软件组件或功能模块。它提供了一种可插拔的方式,用于增强、定制或修改框架的行为,以满足特定的需求。 + +框架中间件在应用程序和底层框架之间充当了一个抽象层,用于处理和转换请求、响应以及其他相关的操作。它可以介入整个请求 - 响应周期,对数据进行预处理、后处理或者执行其他的附加操作。 + +框架中间件的主要作用有: + +1. 路由和请求处理:中间件可以通过路由机制将请求分发给不同的处理程序,并执行相应的操作。它可以处理 URL 解析、参数提取、权限验证等任务。 +2. 数据转换和格式化:中间件可以对请求和响应的数据进行转换、验证和格式化。例如,可以将请求数据解析为特定的格式(如 JSON、XML),或者将响应数据转换为适合客户端的格式。 +3. 认证和授权:中间件可以处理用户身份认证和访问控制的任务。例如,它可以检查用户凭据、验证权限,决定是否允许用户继续执行操作。 +4. 缓存和性能优化:中间件可以在请求到达框架之前或之后,进行数据缓存、结果缓存以及其他的性能优化操作。它可以减少对底层资源的访问,提高应用程序的响应速度和性能。 +5. 日志记录和错误处理:中间件可以记录应用程序的运行日志,并处理异常情况和错误。它可以捕获和处理异常,记录错误信息,使得问题排查和故障修复更加方便有效。 + +框架中间件的设计目标是提供灵活性和可扩展性,以满足不同应用程序的需求。通过使用框架中间件,开发人员可以以模块化的方式定制和增强框架的功能,使得应用程序的开发和维护更加容易和高效。 + + + + + + + +#### 洋葱模型 + + + +适用场景: + +- 日志记录 +- 性能统计 +- 安全控制 +- 事务处理 +- 异常处理 + + + + + +#### 什么是 Handler + +在计算机编程和软件开发中,Handler(处理器)是指用于处理特定事件或请求的代码块、函数或对象。它充当了一个中间人,接收来自外部系统或其它组件的事件或请求,并对其进行适当的处理和响应。 + +Handler 的主要任务是根据接收到的事件或请求的类型,执行相应的逻辑。它可以包括各种操作,如数据处理、错误处理、用户界面更新、网络通信、数据库查询等。 + +Handler 可以存在于不同的上下文中。例如,对于图形用户界面(GUI),一个按钮点击事件的处理者就是一个 Handler;在服务端开发中,一个 HTTP 请求的处理者也可以被称为 Handler。它们根据特定的事件或请求类型,执行相应的操作以满足需求。 + +在许多框架和库中,一般会有一套明确定义的规则和接口来定义和使用 Handler。这些规则和接口可以使开发人员更方便地定义和注册 Handler,并将其与相应的事件或请求关联起来。 + +总之,Handler 是用于处理特定事件或请求的代码块、函数或对象,它负责执行相关的逻辑以满足需求。通过合理的使用和组织 Handler,可以有效地管理和处理系统中的各种事件和请求。 + + + + + + + + + + + + + + + +框架路由实际上就是为URL匹配对应的处理函数(Handlers) + +- 静态路由:/a/b/c./a/b/d +- 参数路 :/a/:id/c(/a/b/c,/a/d/c)./*all +- 路由修复: + - 如果只注册了 /a/b,但是访问的 URI 是 /a/b/,那可以提供自动重定向到 /a/b 能力;同样,如果只注册了 /a/b/,但是访问的 URI 是 /a/b,那可以提供自动重定向到 /a/b/ 能力 + +- 冲突路由以及优先级 + - 同时注册 /a/b 和 /:id/b,并设定优先级。比如:当请求 URI 为 /a/b 时,优先匹配静态路由 /a/b + +- 匹配HTTP方法 +- 多处理函数:方便添加中间件 + + + + + + + +如何匹配HTTP方法 + + + + + + + + + + + +#### 开发流程 + +- 1.明确需求:考虑清楚要解决什么问题,有哪些需求 +- 2.业界调研:业界都有哪些解决方案可供参考 +- 3.方案权衡:思考不同方案的取舍 +- 4.方案评审:相关同学对不同方案做评审 +- 5.确定开发:确定最合适的方案进行开发 + + + + + +```go +type Server interface{ + Serve(c context. Context, conn network.Conn) error +} + + +type Conn interface { + Read(b []byte)(n int, err error) + Write(b []byte)(n int, err error) +} +``` + + + + + +[字节内部网络模型](https://github.com/cloudwego/netpoll) + + + +#### 总结 + +- API设计:可理解性、简单性 +- 中间件设计: 洋葱模型 +- 路由设计:前缀匹配树 +- 协议层设计:抽象出合适的接口 +- 网络层设计: 网络模型 + + + + + +#### 设计点 + +- 存下全部Header +- 减少系统调用次数 +- 能够复用内存 +- 能够多次读 + + + + + +```go +type Reader interface { + // 开始读的位置 + Peek(n int)([]byte, error) + Discard(n int)(discarded int, err error) + Release() error + Size() int + Read(b []byte)(l int, err error) +} +``` + + + + + +#### 网络库比较 + +- `go net ` 流式友好, 小包性能高 +- `netpoll` 中大包性能高, 时延低 + + + + + +#### 针对协议的优化 + +- 找到Header Line边界:`\r\n`, 先找到`\n`再看它前一个是不是`\r` +- 热点资源**池化** + + + +针对协议相关的Headers + +- 1.通过 Header key 首字母快速筛除掉完全**不可能**的 key +- 2.解析对应 value到独立字段 +- 3.使用 byte slice 管理对应 header 存储,方便复用请求体中同样处理的Key: + User-Agent、 Content-Type、 Content-Length、 Connection、 Transfer-Encoding + + + +[开源 json 库](https:/github.com/bytedance/sonic) + + + +#### SIMD技术 + + + +SIMD(Single Instruction, Multiple Data)是一种**并行计算**的技术,它在同一时间执行相同的指令来处理多个数据元素。它是在计算机体系结构中用于向量化操作的一种方式。 + +传统的计算机指令集架构(ISA)以标量方式执行指令,即每次执行一个指令处理一个数据元素。而 SIMD 架构通过引入特殊的寄存器和指令集,能够同时处理多个数据元素,加速并行计算。 + +SIMD 技术适用于那些可以**被划分为多个独立任务**的数据,并且这些任务可以并行地进行相同的计算。它可以提高多媒体处理、图形渲染、信号处理、科学计算等应用的性能。 + +SIMD 指令集提供了一系列的指令,用于在单个时钟周期内同时对多个数据进行相同的操作。这些指令可以一次性处理多个数据元素,例如同时对四个浮点数执行加法操作。 + +常见的 SIMD 指令集包括 Intel 的 SSE(Streaming SIMD Extensions)、AMD 的 3DNow!、ARM 的 NEON 等。这些指令集通常有不同的版本,支持不同的宽度(如 128 位、256 位)和数据类型(如整数、浮点数)。 + +使用 SIMD 技术可以显著提高计算性能,但需要合理的程序设计和优化以充分利用 SIMD 指令集的并行计算能力。许多编程语言和编译器提供了对 SIMD 的支持,使得开发者能够方便地利用 SIMD 技术来加速计算。 + + + + + +#### 性能不是全部 + +- 追求性 +- 追求易用, 减少误用 +- 打通内部生态 +- 文档建设、用户群建设, + + + + + + + +#### websocket + +我们知道 TCP 连接的两端,**同一时间里**,**双方**都可以**主动**向对方发送数据。这就是所谓的**全双工**。而现在使用最广泛的 `HTTP/1.1`,也是基于 TCP 协议的,**同一时间里**,客户端和服务器**只能有一方主动**发数据,这就是所谓的**半双工**。 + +这是由于 HTTP 协议设计之初,考虑的是看看网页文本的场景,能做到**客户端发起请求再由服务器响应**,就够了,根本就没考虑网页游戏这种,客户端和服务器之间都要互相主动发大量数据的场景。 + +所以,为了更好的支持这样的场景,我们需要另外一个**基于 TCP 的新协议**。 + +于是新的应用层协议 **WebSocket** 就被设计出来了。 + + + +我们平时刷网页,一般都是在浏览器上刷的,一会刷刷图文,这时候用的是 **HTTP 协议**,一会打开网页游戏,这时候就得切换成我们新介绍的 **WebSocket 协议**。 + +为了兼容这些使用场景。浏览器在 **TCP 三次握手**建立连接之后,都**统一使用 HTTP 协议**先进行一次通信。 + +- 如果此时是**普通的 HTTP 请求**,那后续双方就还是老样子继续用普通 HTTP 协议进行交互,这点没啥疑问。 +- 如果这时候是**想建立 WebSocket 连接**,就会在 HTTP 请求里带上一些**特殊的 header 头**,如下: + +```http +Connection: Upgrade +Upgrade: WebSocket +Sec-WebSocket-Key: T2a6wZlAwhgQNqruZ2YUyg==\r\n +``` + +这些 header 头的意思是,浏览器想**升级协议(Connection: Upgrade)**,并且**想升级成 WebSocket 协议(Upgrade: WebSocket)**。同时带上一段**随机生成的 base64 码(Sec-WebSocket-Key)**,发给服务器。 + +如果服务器正好支持升级成 WebSocket 协议。就会走 WebSocket 握手流程,同时根据客户端生成的 base64 码,用某个**公开的**算法变成另一段字符串,放在 HTTP 响应的 `Sec-WebSocket-Accept` 头里,同时带上 `101状态码`,发回给浏览器。HTTP 的响应如下: + +```http +HTTP/1.1 101 Switching Protocols\r\n +Sec-WebSocket-Accept: iBJKv/ALIW2DobfoA4dmr3JHBCY=\r\n +Upgrade: WebSocket\r\n +Connection: Upgrade\r\n +``` + + + + + + + + + + + + + + + + + + + +### RPC框架 + +#### 什么是 RPC + +RPC(Remote Procedure Call)是一种用于实现**分布式**系统通信的协议和机制。它允许一个进程(客户端)调用另一个运行在不同地址空间的进程(服务器)中的函数或方法,就像调用本地函数一样。 + +RPC 的工作原理如下: + +1. 客户端通过本地调用的方式调用远程服务器的函数或方法。 +2. 客户端的 RPC stub(存根)将调用信息打包成网络可传输的消息,并发送给远程服务器。 +3. 服务器的 RPC stub 接收到消息后,解包调用信息并调用对应的函数或方法。 +4. 函数或方法执行完毕后,将结果打包成响应消息,并发送给客户端。 +5. 客户端的 RPC stub 接收到响应消息后,解包结果并返回给本地调用方。 + +通过 RPC,开发人员可以轻松地在分布式系统中调用远程服务,而无需关心底层的网络通信细节。它隐藏了网络通信的复杂性,使得分布式系统开发更加方便和高效。 + +RPC 的优势包括: + +1. 简化分布式系统开发:RPC 提供了一种简单而直观的方法来调用远程服务,使得分布式系统开发更加容易和高效。 +2. 高效的网络通信:RPC 可以使用高效的序列化和网络传输协议,以最小的开销在分布式系统间传递数据。 +3. 抽象底层细节:RPC 抽象了底层的网络通信细节,使得开发人员可以更专注于业务逻辑的实现,而不用关心底层通信协议和传输细节。 + +常见的 RPC 框架包括 gRPC、Apache Thrift、Spring Cloud、Dubbo 等。这些框架提供了丰富的功能和工具,使得分布式系统的开发、部署和管理更加便捷和可靠。 + + + +和 `HTTP` 对比起来 + +- HTTP 信息非常的冗余, +- 而 RPC,因为它定制化程度更高,因此性能也会更好一些,这也是在公司**内部微服务**中抛弃 HTTP,选择使用 RPC 的最主要原因。 +- 当然上面说的 HTTP,其实**特指的是现在主流使用的 HTTP/1.1**,`HTTP/2` 在前者的基础上做了很多改进,所以**性能可能比很多 RPC 协议还要好**,甚至连 `gRPC` 底层都直接用的 `HTTP/2`。那么问题又来了,为什么既然有了 HTTP/2,还要有 RPC 协议?这个是由于 HTTP/2 是 2015 年出来的。那时候很多公司内部的 RPC 协议都已经跑了好些年了,基于**历史原因**,一般也没必要去换了 + + + +RPC需要解决的问题 + +- 1 函数**映射** +- 2.数据**转换**成字节流 +- 3.网络传输 + + + +RPC 的概念模型: + +- User、 +- User-Stub、 +- RPC-Runtime、 +- Server-Stub、 +- Server + + + + + +#### 优缺点 + +优点 + +- 单一职责,有利于分工协作和运维开发 +- 可扩展性强, 资源使用率更优 +- 故障隔离, 服务的整体可靠性更高 + + + +坏处 + +- 1.服务宕机,对方应该如何处理? +- 2.在调用过程中发生网络异常,如何保证消息的可达性? +- 3.请求量突增导致服务无法及时处理, 有哪些应对措施? + + + + + + + + + +#### 分层设计 + +- 编解码层 包括生成代码 +- 协议层 +- 网络层 + + + + + +- 语言特定的格式 + - 许多编程语言都内建了将内存对象编码为字节序列的支持,例如Java有java.io.Serializable +- 文本格式JSON、XML、CSV等文本格式,具有人类可读性 +- 二进制编码, 具备跨语言和高性能等优点,常见有Thrift的 BinaryProtocol, Protobuf + + + +TLV编码 + +- Tag:标签,可以理解为类型 +- Lenght:长度 +- Value:值,Value也可以是个TLV结构 + + + +增加了冗余信息 + + + +#### 编码层如何选 + +- 兼容性, 支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度 +- 通用性支持跨平台、跨语言 +- 性能从空间和时间两个维度来考虑,也就是编码后**数据大小**和**编码耗费时长** + + + + + + + +### 微服务 + +微服务架构是当前大多数互联网公司的**标准架构**. + + + +#### 软件架构定义 + +​ 软件架构是构建应用系统所需要的一组结构,包括软件元素、**元素之间的关系**以及两者的属性。其中如何分解软件元素以及这些元素之间的关系,变得非常重要。一个好的软件架构具备两个特点: + +- 合理调配生产关系与生产力,让具备不同专业知识与技术栈的的人士都参与到软件系统开发中来, 高效地协同工作; +- 能让各个软件元素有清晰的定义与职责,并有一套良好、高效的交互机制. + + + + + + + +为什么系统架构需要演进? + +- 互联网的爆炸性发展 +- 硬件设施的快速发展 +- 需求复杂性的多样化开发人员的急剧增加 +- 计算机理论及技术的发展 + + + + + +#### 单体模式 + +all in one process + +优势 + +- 1.性能最高 +- 2冗余小 + +劣势: + +1.debug +2.模块相互影响 +3.模块分工、开发流程 + + + + + +#### 分布式架构 + +抽出业务无关的公共模块, 服务层 + +优势: +1.业务无关的独立服务 + +劣势: + +- 1.服务模块bug可导致全站瘫痪 +- 2.调用关系复杂 +- 3.不同服务冗余 + + + + + +#### 微服务架构 + + + + + +在讲述微服务架构之前一定要讲下经典的扩展立方体理论,扩展立方体定义了三种不同的扩展应用程序的方法: + +- X 轴扩展在多个相同实例之间实现请求的负载均衡; +- Y 轴扩展根据功能将应用程序拆分为服务; +- Z 轴扩展根据请求的属性路由请求. + + + +- X扩展,称为水平复制,通过克隆实例的方式发展 +- Y轴扩展,又称为功能性分解,通过不同 +- Z轴扩展,又称为数据分区,通过类似客户ID的方式,把相同的数据分区进行扩展 + + + +微服务架构其实可以理解为” 模块化设计 "的扩展延伸,只是这些" 功能模块 " 以单独的部署包的方式运行在各自的进程中。这样每个服务之间都是相互独立的,并且有自己的**私有数据库**,两者之间仅能通过 **API** 的方式进行通信。 + + + +从单体架构到微服务架构的演进也带来了以下好处: + +- 从代码管理来看,每个服务较小,大部分由于十几个接口或服务方法组成,非常容易**维护**; +- 从运维管理来看,每个服务都可以独立部署,非常易于**扩展**; +- 从团队管理来看,可以更好地划分职责范围; +- 从软件开发总体来看,可以使软件系统可持续性交付部署. + + + +彻底的服务化优势: + +- 1.开发效率 +- 2.业务独立设计 +- 3.自下而上 +- 4.故障隔离 + +劣势: + +- 1.治理、运维难度 +- 2.观测挑战 +- 3.安全性 +- 4.分布式系统 + + + +微服务架构概览 + +- 网关 +- 服务配置和治理 +- 链路追踪和监控 + + + +#### 微服务架构的三大要素 + +- 服务治理(本课程内容) + - 服务注册 + - 服务发现 + - 负载均衡 + - 扩缩容 + - 流量治理 + - 稳定性治理 + +- 可观测性 + - 日志采集 + - 日志分析 + - 监控打点 + - 监控大盘 + - 异常报警 + - 链路追踪 + +- 安全 + - 身份验证 + - 认证授权 + - 访问令牌 + - 审计 + - 传输加密 + - 黑产攻击 + + + +服务service + +- 一组具有**相同逻辑** (同一份代码) 的运行实体. + +实例与进程的关系 + +- 实例与进程之间没有必然对应关系,可以一个实例可以对应一个或多个进程(反之不常见). + +常见的实例承载形式 + +- 进程、VM、k8spod… + +有状态/无状态服务 + +- 服务的实例是否存储了可持久化的数据(例如磁盘文件). + + + + + +服务间通信 + +- 对于单体服务,不同模块通信只是简单的函数调用 +- 对于微服务,服务间通信意味着**网络传输** + +使用微服务架构的应用程序是分布式系统,进程间通信是重要组成部分,有以下几种通信模式: + +- 通信风格:使用哪一种的进程间通信机制; +- 服务发现:客户端如何获得具体实例的真实 IP 地址; +- 可靠性:在服务不可用的情况下,如何确保服务之间的可靠通信; +- 事务性消息:如何将消息发送、事件发布、更新业务数据的数据库事务集成; +- 外部 API: 应用客户端如何与服务通信. + + + + + + + + + +问题 + +在代码层面,如何指定调用一个目标服务的地址(ip:port) + +- 地址会变 +- 有多个地址 + +使用 DNS 解决 + +- 本地DNS存在缓存,导致延时. +- 负载均衡问题. 大部分会只访问第一个 +- 不支持服务实例的探活检查. +- 域名无法配置端口. 必须约定端口 + +解决思路:新增一个统一的**服务注册**中心, 用于存储服务名到服务实例的映射. + + + +#### 服务发布 + +问题 + +- 服务不可用 +- 服务抖动 +- 服务回滚 + +方法 + +- 蓝绿部署---简单,稳定但需要两倍资源 +- 灰度发布---一点一点替换, 回滚操作比较难 + + + +防止链路重试链路层面的防重试风暴的核心是限制每层都发生重试,理想情况下只有最下一层发生重试. +可以返回特殊的status表明"请求失败,但别重试". diff --git a/_posts/byte_tech/2023-08-01-go-5-arp-nat.md b/_posts/byte_tech/2023-08-01-go-5-arp-nat.md new file mode 100644 index 0000000..b3f4c67 --- /dev/null +++ b/_posts/byte_tech/2023-08-01-go-5-arp-nat.md @@ -0,0 +1,291 @@ +--- +layout: blog +banana: true +category: byte_tech +title: "Go_5_网络编程" +date: 2023-08-01 10:16:54 +background: green +tags: +- byte_tech +- go +--- + +* content +{:toc} + + +#### 环境 + +- Linux/操作系统 +- Wireshark件 +- Socket 网络编程开发环境 + + + + + +#### ARP协议 + +- 逻辑同网段才能发送ARP +- ARP请求广播, ARP应答单播 + + + + + +#### 免费 ARP + +ARP(地址解析协议)是一种用于将 IP 地址映射到 MAC 地址的协议。它在局域网中起作用,允许网络设备通过发送 ARP 请求来查找目标设备的 MAC 地址。 + +"免费 ARP"(Free ARP)是指发送 ARP 请求时不指定目标 IP 地址,而是将目标 IP 地址设置为 0.0.0.0。这种类型的 ARP 请求旨在查询网络中是否存在冲突的 IP 地址。当一个设备收到了一个免费 ARP 请求时,如果发现自己的 IP 地址与请求中的源 IP 地址冲突,它将发送一个 ARP 响应来解决冲突。 + +免费 ARP 的主要用途是检测和解决 **IP 地址冲突**问题,因为每个设备都应该具有唯一的 IP 地址。通过发送免费 ARP 请求,设备可以确定是否有其他设备使用了相同的 IP 地址,以便及时处理冲突。 + + + + + +#### NAT + +- 将`ip`和端口都转换 +- 提高了 端口的利用率, 毕竟那么多端口, 用不完 + +NAT(Network Address Translation)是**网络地址转换**的缩写,是一种在计算机网络中用于将私有网络内部的 IP 地址转换为公网可路由的 IP 地址的技术。 + +在一个局域网中,通常会使用私有 IP 地址来分配给内部设备,例如以 "192.168.x.x"、"10.x.x.x" 或 "172.16.x.x" 到 "172.31.x.x" 开头的地址。这些私有 IP 地址在公共互联网上是不可路由的,因此无法直接与外部网络进行通信。 + +NAT 技术允许将多个内部设备的私有 IP 地址映射到一个或多个公共 IP 地址上,以实现与外部网络的通信。NAT 通常由一个网络设备(例如路由器或防火墙)提供支持,它拥有至少两个网络接口,一个连接到内部局域网,一个连接到外部公网。 + +当内部设备发送数据包到外部网络时,NAT 设备会将源 IP 地址从私有 IP 地址替换为公共 IP 地址,并将该转换信息记录在转换表中。当外部网络返回响应数据包时,NAT 设备会根据转换表将目标 IP 地址从公共 IP 地址转换回原始的私有 IP 地址,并将数据包传递给正确的内部设备。 + +NAT 技术有以下几个主要作用: + +1. 节省公共 IP 地址:由于私有 IP 地址在内部网络中可以重复使用,NAT 可以大大减少对公共 IP 地址的需求。 +2. 提供网络安全:由于内部设备的私有 IP 地址不直接暴露在公网上,NAT 在一定程度上提供了网络安全保护。 +3. 简化网络配置:通过使用 NAT,整个局域网可以共享一个公共 IP 地址,无需为每个内部设备分配公共 IP 地址。 + +需要注意的是,使用 NAT 技术的网络中的内部设备一般无法直接从外部网络访问,除非适当配置端口转发或设置 DMZ(Demilitarized Zone)。 + + + +#### TCP + + + + + +HTTP1.1哪些优化? + +- 长连接 +- 部分传输 +- HOST +- 缓存 + + + + + +#### https的加密过程 + +HTTPS(Hypertext Transfer Protocol Secure)是在 HTTP 基础上加入了安全套接层(**SSL/TLS**)的协议,用于在客户端和服务器之间进行安全的数据传输。以下是 HTTPS 的加密过程: + +1. 客户端发起连接请求:客户端向服务器发起连接请求,并请求建立加密连接。 +2. 服务器的证书:服务器将自己的**数字证书**发送给客户端,证书中包含了服务器的公钥和相关信息。 +3. 客户端验证证书:客户端收到服务器的证书后,会对证书进行验证。验证包括检查证书的合法性、颁发机构的可信度以及证书是否过期等。如果证书验证失败,客户端会发出警告或终止连接。 +4. 客户端生成密钥:如果服务器的证书验证通过,客户端会生成一个**随机的对称密钥**(session key),用于后续的数据加密和解密。 +5. 密钥交换:客户端使用服务器的公钥对生成的对称密钥进行加密,然后将加密后的密钥发送给服务器。 +6. 服务器解密密钥:服务器收到客户端发送的加密后的对称密钥后,利用自己的私钥进行解密,得到对称密钥。 +7. 数据加密:接下来的通信过程中,客户端和服务器使用对称密钥进行数据加密和解密。客户端和服务器的数据通过对称密钥进行加密后传输,保证了数据的机密性。 +8. 数据传输:在建立加密连接后,客户端和服务器可以安全地传输数据。数据在传输过程中使用对称密钥进行加密和解密,确保了数据的机密性和完整性。 + +通过以上步骤,HTTPS 实现了对通信过程中的数据进行加密保护,防止敏感信息被窃听或篡改。加密过程中,服务器的数字证书起到了验证服务器身份和传递公钥的作用,而对称密钥的使用则提供了高效的加密和解密机制。 + + + +#### 网络提速 + +- 网络提速-同运营商访问 +- 网络提速-动态API(播放/评论接口)路径优化(DSA) + + + +#### 故障排查 + +先止损再排查 + +比如推荐算法坏了-> 先不用推荐, 先随机刷刷刷 + + + + + +客户端排查 + +- 客户端访问其他服务没问题吗? +- 其他客户端访问目标服务没问题吗? + +服务端排查 + +- 服务端监控/指标都正常吗? +- 手动访问一下正常吗? +- 分组件排查 + +中间链路排查 + +- 服务端跟客户端确保都没问题 +- 中间网络设备有没有问题?(交换机/路由器/网关LB) +- 旁路的DNS有没有问题? + + + +网络故障排查 + +- dig查询DNS问题 +- ping/telnet/nmap查询三层/四层连通性 +- Traceroute排查中间链路 +- iptables +- tcpdump + + + + + +#### 课后作业1 + +UDP socket 实现ack, 感知丢包重传提示: +1.学会UDP socket编程2.先从简单的ack学习,客户端等待ack再发包 +3.什么时候客户端认为是丢包? +4.重传怎么考虑效率? +5.能不能不阻塞只穿丢掉的中间的段? + + + +#### 课后作业2 + +三台同网段内的服务器,模拟实现一个路由器 + + + +方法一:Linux操作系统配置法提示: +1.了解Linux的路由配置方式2.确保是同网段直连可达的环境.在三台机器上另外配置IP网段和路由. +3.一台机器做客户端,一台机器做路由器,一台机器做服务端. +4.客户端配置到达服务器的下一跳指向路由器,路由器上配置到达服务端的路由 + + + + + +方法二:用户态`socket`编程实现简易`route`软件提示: +1.收到指定的包后,做转发2.注意是修改报文的MAC.不是修改IP. +3.实现一个对称路由.这样可以实现TCP交互 +4.可以通过ping来验证5.可以支持traceroute吗? + + + + + +### 第六次课程 + +#### 域名系统的问题 + +- 内网域名的解析也得出公网去获取,效率低下 +- 外部用户看到内网 ip地址,容易被 hacker攻击 +- 云厂商权威DNS容易出故障,影响用户体验 + +解决方案, 自建 DNS + + + +常见的开源DNS:bind、nsd、knot、 coredns + + + +#### DNS 解析的一般步骤: + +1. 发起解析请求:当用户在浏览器中输入一个域名时,系统首先会检查本地的 DNS 缓存,如果存在对应的解析结果则直接返回。如果本地缓存没有相关记录,系统会发起 DNS 解析请求。 +2. 查询本地 DNS 服务器:如果本地缓存没有域名解析记录,系统会向本地 DNS 服务器(通常由 ISP 或企业提供)发送解析请求。 +3. 递归查询过程:如果本地 DNS 服务器不知道域名的解析结果,它会向根 DNS 服务器发起递归查询请求。 +4. 根 DNS 服务器响应:根 DNS 服务器是整个 DNS 系统的顶级服务器,它并不直接返回域名解析结果,而是告诉本地 DNS 服务器应该向哪个顶级域名服务器(TLD DNS 服务器)发送查询请求。 +5. TLD DNS 服务器响应:本地 DNS 服务器收到根 DNS 服务器返回的 TLD DNS 服务器地址后,向 TLD DNS 服务器发送解析请求。 +6. 权威 DNS 服务器响应:TLD DNS 服务器会告诉本地 DNS 服务器要查询的域名的权威 DNS 服务器的地址。 +7. 权威 DNS 服务器响应:本地 DNS 服务器向权威 DNS 服务器发起解析请求。 +8. 解析结果返回:权威 DNS 服务器将域名的解析结果发送给本地 DNS 服务器。 +9. 缓存解析结果:本地 DNS 服务器将解析结果保存在缓存中,并将结果返回给用户的设备。同时,将解析结果缓存在本地,以便下次查询时可以直接返回,提高解析速度。 +10. 用户设备使用 IP 地址访问:用户设备收到 IP 地址后,会使用该地址发起与目标服务器之间的通信,实现对域名的访问。 + +通过以上步骤,DNS 解析过程中的各级 DNS 服务器协同工作,将域名转换为 IP 地址,使用户能够通过域名访问互联网上的各种资源。 + + + + + + + +- 动态加速DCDN + - 针对POST等非静态请求等不能在用户边缘缓存的业务, 基于**智能选路**技术, 从众多回源线路中择优选择一条线路进行传输. + + + + + +请区分下列场景使用的加速类型 + +- 1、用户首次登录抖音,注册用户名手机号等用户信息 + - 动态加速DCDN +- 2、抖音用户点开某个特定的短视频加载后观看 + - 静态加速CDN +- 3、用户打开头条官网进行网页浏览 + - 静态加速CDN+动态加速DCDN + + + + + + + +#### 4层负载均衡特点 + +- 大部分都是通过dpdk技术实现,技术成熟,大厂都在用 +- 纯用户态协议栈,kernel bypass,消除协议栈瓶颈 +- 无缓存,零拷贝,大页内存(减少 cache miss) +- 仅针对4层数据包转发,小包转发可达到限速,可承受高cps + + + + + + + +#### 什么是 nginx + +Nginx(发音为 "engine-x")是一款高性能的开源 Web 服务器软件,也可以用作反向代理服务器、负载均衡器和 HTTP 缓存。它由俄罗斯的程序员 Igor Sysoev 开发,并于 2004 年首次发布。 + +Nginx 的主要特点包括: + +1. 高性能:Nginx 采用了异步非阻塞的事件驱动架构,能够高效地处理大量并发连接和高流量的请求。 +2. 轻量级:Nginx 的内存占用较低,适合于资源受限的环境,并且能够有效利用系统资源。 +3. 反向代理:Nginx 可以用作反向代理服务器,接收客户端的请求并将其转发到后端服务器,隐藏后端服务器的真实 IP 地址,提供更好的安全性和负载均衡能力。 +4. 负载均衡:Nginx 可以基于不同的算法(如轮询、IP 哈希、最少连接等)将请求分发到多个后端服务器,实现负载均衡,提高系统的可扩展性和稳定性。 +5. 静态文件服务:Nginx 能够快速地处理静态文件的请求,通过内置的缓存机制提供高效的静态内容传输。 +6. HTTP 缓存:Nginx 支持反向代理缓存和本地 HTTP 缓存,可以减少后端服务器的负载并加快内容传输速度。 +7. HTTPS 支持:Nginx 能够配置 SSL 证书,提供安全的 HTTPS 连接。 +8. 可扩展性:Nginx 具有模块化的架构,可以通过加载不同的模块来扩展其功能。 + +由于其出色的性能和可靠性,Nginx 被广泛应用于许多大规模的网站、应用程序和服务中,包括一些知名的公司和网站,如 Netflix、GitHub、微博等。 + + + + + +优点 + +- 模块化设计,较好的扩展性和可靠性 +- 基于master/worker架构设计 +- 支持热部署;可在线升级不停机更新配置文件、更换日志文件、更新服务器二进制 +- 较低的内存消耗:1万个keep-alive连接模式下的非活动连接仅消耗2.5M内存 + + + + + +https://dashboard.ngrok.com/get-started/setup diff --git a/_posts/byte_tech/2023-08-05-go-7-database.md b/_posts/byte_tech/2023-08-05-go-7-database.md new file mode 100644 index 0000000..a5251bb --- /dev/null +++ b/_posts/byte_tech/2023-08-05-go-7-database.md @@ -0,0 +1,369 @@ +--- +layout: blog +category: byte_tech +title: "Go_" +date: 2023-08-05 09:57:32 +tags: +- byte_tech +- go +--- + + + +[TOC] + + + +### 数据库 + + + +#### 特点 + +- 作为后端软件的底座, 性能敏感 ( 没有数据还有服务? ) +- 存储系统软件架构, 容易受**硬件**影响 (别人发明了快十倍的硬件, 但是需要从头写, 你用不) +- 存储系统代码,既"简单"又"复杂" + + + +#### 设计程序原则 + +- 「缓存」很重要,贯穿整个存储体系 +- 「拷贝」很昂贵,应该尽量减少 +- 硬件设备五花八门, 需要有**抽象统一**的接入层 , 例如 linux 的 一切皆文件 + + + +高速数据库的设计应该归为操作系统这一级别 + +- 必不可少, 所有的计算机必须存储数据 +- 缓存的数据必须由程序员控制, 而不是操作系统的某个算法来控制 + - 例如, 用户查找了 `A`表的数据, 下一个行为必须是查询`B`表, 算法计算出来的是缓存`C`表, 那缓存还有用吗 + + + + + +#### RAID技术 + +RAID(Redundant Array of Independent Disks)技术是一种数据存储技术,通过将多个硬盘组合在一起来提供更高的性能、容错性和数据冗余。RAID 技术可以应用在服务器、工作站和个人计算机等各种存储设备上。 + +RAID 技术采用了不同的级别或配置,每种级别都具有其特定的优点和用途。以下是常见的几种 RAID 级别: + + + +RAID 0 + +- 多块磁盘简单组合 + +- 数据条带化存储, 提高磁盘带宽 + +- 没有额外的容错设计 + + + +RAID 1 + +- 一块磁盘对应一块额外镜像盘 +- 真实空间利用率仅50% +- 容错能力强 + +RAID 0+1 + +- 结合了RAID0和RAID1 +- 真实空间利用率仅50% +- 容错能力强,写入带宽好 + + + + + + + + + + + + + +#### 为什么要使用数据库 + +- 所有的系统都会**产生数据**, 所以 数据库系统是所有系统**不可或缺**的模块 +- 逻辑层和物理层之间的 存在 **紧耦合** +- 复杂查询很麻烦 + + + +#### 事物具有 + +- A(tomicity),事务内的操作要么全做,要么不做 +- C(onsistency), 事务执行前后,数据状态是一致的 +- I(solation),可以隔离多个并发事务,避免影响 +- D(urability),事务一旦提交成功,数据保证持久性 + + + + + + + +#### 使用文件系统来存储数据的弊端 + +- 数据的冗余和不一致 +- 数据访问图难 +- 数据孤立 +- 完整性问题 +- 原子性问题 +- 并发访问异常 + + + +#### 概念解释 + +| 名词 | 解释 | +| ------------------------------- | ---------------------------------------------------- | +| 关系 | 一组无序的元素或者记录 | +| | | +| 主键(`primary key`) | 某一个唯一**属性**或一个**属性组**能唯一标识一条记录 | +| 外键(`foreign key` ) | 指定一张表中的属性必须存在于另一张表中 | +| | | +| SQL (Structured Query Language) | 结构化查询语言 | + +notes: + +- 原始关系模型中,所有的值都必须保证**原子性**或者单个属性值 (不能是数组 或者嵌套对象) +- `relation` 和 `table` 是一回事 +- `n元组` 就是一个有n个值的元组,它对应于**表**中的一行. + + + +#### 关系代数 + +| 符号 | 解释 | 注释 | +| ------------------------ | ----------------------------------------- | -------- | +| $\sigma _{predicate}(R)$ | 选择 | | +| $\prod_{A1,A2,,,An}(R)$ | 投影, 即选择`部分列`,而元组不改变 | A1是属性 | +| ( R- S ) | R中有但是S中没有 | | +| | | | +| | 并集 | | +| | 交集 | | +| | | | +| $R \times S$ | 笛卡尔积, 产生 所有**可能的不重复**的组合 | | +| $R \bowtie S$ | R表 和 S 中 每个属性都相同 | | + + + + + +#### 聚合函数 + +| 函数名 | 解释 | +| ------------ | ---------- | +| AVG( col ) | 返回平均值 | +| MIN( col ) | 返回最小值 | +| MAX( col ) | 返回最大值 | +| SUM( col ) | 返回 值 | +| COUNT( col ) | 计数 | + +Notes: + +- 聚合函数接收一组 Tuple 作为其输入,然后产生一个单一的标量值作为其输出。 +- 只能在 SELECT 输出列表中使用。 + + + + + + + + + + + + + +#### 课后思考 + +1. 写入存储系统的粒度太大,会不会导致数据原子性问题?例如一次性写 100MB,如果系统突然 crash,会不会只有一部分数据持久化了,另一部分丢失了?如果要解决原子性问题,一般会设计什么机制? +2. 在从应用程序到存储介质的链路上,无论读还是写,数据可能要被拷贝好几次,这几次拷贝能不能去掉?如果我们去掉大部分拷贝操作,会有什么副作用,要怎么缓解副作用? +3. 一个关系型数据库大概率是会被并发访问的,如果要保证并发安全,除了在行数据上加悲观锁还有其他方式吗? +4. 在数据库领域,把数据按行存和按列存各有好处,你能从性能优先的角度设计出一种混合存储格式吗? + + + + + + + +### 主流 存储产品 + +单机存储=单个计算机节点上的存储软件系统,一般不涉及网络交互 + +Linux文件系统的两大数据结构:Index Node&DirectoryEntry + +Index Node记录文件元数据,如id、大小、权限、磁盘位置等node是一个文件的唯一标识,会被存储到磁盘上node的总数在格式化文件系统时就固定了 + +Directory Entry记录文件名、inode指针,层级关系(parent)等dentry是内存结构,与inode的关系是N:1(hardlink的实现) + + + +世间一切皆 key-value + +- key是你身份证,value是你的内涵: +- 感觉就像是数学中的映射 `y = f(x)`, 在数组中, index -> value, map中 key-> value + + + + + +常见使用方式:put(k,v)&get(k) +常见数据结构:LSM-Tree,某种程度上牺牲读性能,追求写入性能拳头产品:RocksDB + + + + + +分布式文件系统 + +HDFS:堪称大数据时代的基石 ( 又是谷歌 ) + +时代背景:专用的高级硬件很贵,同时数据存量很大,要求超高吞吐 + + + +HDFS核心特点 + +- 支持海量数据存储 +- 高容错性 +- 弱POSIX语义 +- 使用普通x86服务器,性价比高 + +( 既要又要还要 ) + + + +分布式存储 一Ceph + +- Ceph:开源分布式存储系统里的「万金油」 + +建议去读源码 + +Ceph的核心特点 + +- 一套系统支持对象接口、块接口、文件接口,但是一切皆对象 +- 数据写入采用主备复制模型 +- 数据分布模型采用CRUSH算法, HASH+权重+随机抽签 + + + + + + + + + +关系型数据库的通用组件 + +- Query Engine—负责解析query,生成查询计划 +- TxnManager负责事务并发管理 +- Lock Manager负责锁相关的策 +- Storage Engine负责组织内存/磁盘数据结构 +- Replication负责主备同步 + + + + + +关键**内存**数据结构:B-Tree、B+-Tree、LRU List等关键 + +**磁盘**数据结构:WriteAheadLog(RedoLog)、Page + + + + + + + +mongoDB + +- 面向「文档」存储文档 +- 可序列化成JSON/BSON,支持嵌套 +- 存在「collection」,collection=文档的集合 +- 存储和构建索引能力依赖wiredTiger引擎 +- 4.0后开始支持事务(多文档、跨分片多文档等) +- 常用client/SDK交互,可通过插件转译支持弱SQL + + + +- 数据结构丰富(hash表、set、zset、list) +- C语言实现,超高性能 +- 主要基于内存,但支持AOF/RDB持久化 +- 常用redis-cli/多语言SDK交互 + + + + + + + + + +Kernel Space -> User Space + +- 避免syscall带来的性能损耗,直接从用户态访问磁盘 + +中断->轮询 + +- 磁盘性能提高后,中断次数随之上升,不利于IO性能SPDK poller可以绑定特定的cpu核不断轮询,减少cs,提高性能 + +无锁数据结构 + +- 使用Lock-free queue,降低并发时的同步开销 + + + + + +- 传统的网络协议栈,需要基于多层网络协议处理数据包,存在用户态&内核态的切换,足够通用但性能不是最佳RDMA是kernel bypass的流派,不经过传统的网络协议栈,可以把用户态虚拟内存映射给网卡,减少拷贝开销,减少cpu开销 + +02 +Persistent Memory在NVMeSSD和Main Memory间有一种全新的存储产品:Persistent Memory O时延介于SSD和Memory之间,约百纳秒量级可以用作易失性内存(memorymode),也可以用作持久化介质(app-direct + +03.可编程交换机P4Switch,配有编译器、计算单元、DRAM,可以在交换机层对网络包做计算逻辑.在数据库场景下,可以实现缓存一致性协议等 + + + +04. +CPU/GPU/DPU CPU:从multi-coremany-core GPU:强大的算力&越来越大的显存空间DPU:异构计算,减轻CPU的workload + + + + + +存储系统 + +- 块存储:存储软件栈里的底层系统,接口过于朴素 +- 文件存储:日常使用最广泛的存储系统,接口十分友好,实现五花八门 +- 对象存储:公有云上的王牌产品,immutable语义加持 +- key-value存储:形式最灵活,存在大量的开源/黑盒产品 + +数据库系统关系型数据库: + +- 基于关系和关系代数构建的,一般支持事务和SQL访问,使用体验友好的存储产品 +- 非关系型数据库:结构灵活,访问方式灵活,针对不同场景有不同的针对性产品 + +分布式架构 + +- 数据分布策略:决定了数据怎么分布到集群里的多个物理节点,是否均匀,是否能做到高性能 +- 数据复制协议:影响IO路径的性能、机器故障场景的处理方式 +- 分布式事务算法:多个数据库节点协同保障, 一个事务的ACID特性的算法,通常基于2pc的思想设计 + + + + + +课后作业实现一个(分布式)key-value存储系统要求: +1.基于本地文件系统实现,支持常用的put(k,v)、get(k,v)、scan_by_prefix(prefix)接口 +2.支持存储server独立进程部署,支持跨进程或者网络访问 +3.1O操作做到低时延4.*可选:支持扩展成分布式架构,多台存储server组成一个分布式key-value存储系统,并保证全局的数据一致性 + diff --git a/_posts/byte_tech/2023-08-08-redis.md b/_posts/byte_tech/2023-08-08-redis.md new file mode 100644 index 0000000..1901581 --- /dev/null +++ b/_posts/byte_tech/2023-08-08-redis.md @@ -0,0 +1,265 @@ +--- +layout: blog +banana: true +category: byte_tech +title: "Go_Redis" +date: 2023-08-08 15:04:16 +tags: +- byte_tech +- go +--- + +* content +{:toc} + + +### 基础知识 + + + +#### 1 什么是 Redis + +- redis是内存**数据库**、key-value 数据库、以及 数据结构数据库 +- **Redis 单线程指的是「接收客户端请求 -> 解析请求 -> 进行数据读写等操作 -> 发送数据给客户端」**, 但是 redis 程序不是单线程的, redis 在启动的时候,是会**启动后台线程** + + + +Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此**读写速度非常快**,常用于**缓存,消息队列、分布式锁等场景**。 + +Redis 提供了多种数据类型来支持不同的业务场景,比如 String (字符串)、Hash (哈希)、 List (列表)、Set (集合)、Zset (有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流),并且对数据类型的操作都是**原子性**的,因为执行命令由单线程负责的,不存在并发竞争的问题。 + +除此之外,Redis 还支持**事务 、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片机群模式)、发布 / 订阅模式,内存淘汰机制、过期删除机制**等等 + +- redis内存中的数据与redis磁盘一一对应 +- mysql有**少部分热数据**以及索引在mysql缓冲池 + + + +| 结构类型 | 结构存储的值 | 结构的读写能力 | +| ------------ | ----------------------------------------- | ------------------------------------------------------------ | +| String字符串 | 可以是字符串、整数或浮点数 | 对整个字符串或字符串的一部分进行操作:对整数或浮点数进行自增或自减操作 | +| List列表 | 一个链表,链表上的每个节点都包含一个字符串 | 对链表的两端进行push和pop操作,读取单个或多个元素:根据值查找或除元素 | +| Set集合 | 包含宇符串的无序集合 | 字符串的集合,包含基础的方法有看是否存在添加、获取、删除:还包合计算交集、并集、差集等 | +| Hash散列 | 包含键值对的无序散列表 | 包含方法有添加、获取、删除单个元素 | +| Zset有序集合 | 和散列一样,用于存储键值对 | 字符串成员与浮点数分数之间的有序映射:元素的排列顺序由分数的大小决定:包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素 | + + + + + + + +#### 2 安装 Redis + +- Windows 操作系统环境,[安装指引链接](https://link.juejin.cn/?target=https%3A%2F%2Fredis.io%2Fdocs%2Fgetting-started%2Finstallation%2Finstall-redis-on-windows%2F) +- Linux 操作系统环境,[安装指引链接](https://link.juejin.cn/?target=https%3A%2F%2Fredis.io%2Fdocs%2Fgetting-started%2Finstallation%2Finstall-redis-on-linux%2F) +- MacOS 操作系环境,[安装指引链接](https://link.juejin.cn/?target=https%3A%2F%2Fredis.io%2Fdocs%2Fgetting-started%2Finstallation%2Finstall-redis-on-mac-os%2F) + + + +#### 3 什么是 QPS + +- QPS(Queries Per Second)是一种衡量系统处理能力和性能的度量单位,表示每秒钟能够处理的查询请求数量。 +- QPS 通常用于衡量数据库、网络服务器、Web 服务、缓存系统等对查询请求的处理速度。它表示在每秒的时间间隔内,系统能够处理的平均请求数量。QPS 的值越大,说明系统的处理能力越强。 +- QPS 的计算方式是根据一段时间内的请求数量来进行统计。例如,如果一个系统在 1 秒钟内处理了 100 个查询请求,那么它的 QPS 就是 100。 +- 需要注意的是,QPS 仅仅是衡量系统在某一时刻或时间段内的瞬时处理能力,它并不能全面反映系统的性能。还有其他指标如响应时间、并发数等也需要综合考虑,以全面评估系统的性能。 +- QPS 的具体值会受到多种因素的影响,包括硬件配置、网络带宽、查询复杂度、系统负载等。因此,针对不同的应用场景和需求,对 QPS 的要求也不同。 +- 总之,QPS 是衡量系统查询处理能力的重要指标,用于评估系统的性能和稳定性。 + + + +#### redis基本工作原理 + +- 数据从内存中读写 +- 数据保存到硬盘上防止重启数据丢失 + - 增量数据保存到AOF文件 + - 全量数据RDB文件 +- **单线程**处理所有操作命令 ( 顺序执行 ) + + + + + +### 应用场景 + +#### 连续签到 + +- 设计一个 包含日期的 `key`, value 为 天数, 然后设置**过期**时间 + + + + + +#### 消息通知 + +- 例如当文章更新时,将更新后的文章推送到ES, 用户就能**搜索到**最新的文章数据 + + + + + +#### 排行榜 + +- 积分要变化时, 排名要实时变更 + +mysql 中 + +- `userid` + 积分, 对积分进行排序 + + + +#### 限流 + +- 要求1秒内放行的请求为N, 超过N则**禁止访问** + + + +key中有时间戳, 对这个Key调用incr,超过限制N则禁止访问 + + + + + +#### 分布式锁 + +- 并发场景,要求一次只能有一个协程执行. +- 执行完成后, 其它等待中的协程才能执行. + + + +可以使用redis的setnx实现,利用了两个特性 + +- Redis是单线程执行命令 +- setnx只有未设置过才能执行成功 + + + +不是高可用的分布式锁实现, 该实现存在的问题: + +- (1)业务**超时**解锁, 导致并发问题. => 业务执行时间超过锁超时时间 +- (2)redis主备切换临界点问题.主备切换后,A持有的锁还未同步到新的主节点时, B可在新主节点获取锁, 导致并发问题, +- (3)redis集群**脑裂**,导致出现多个主节点 + + + + + + + + + +#### pipeline + +- 一次设置多个 `key`, 减少网络传输 + +rehash:rehash操作是将ht[0]中的数据,全部迁移到ht[1]中.数据量小的场景下直接将数据从ht[0]拷贝到ht[1]速度是较快的.数据量大的场景,例如存有上百万的KV时,迁移过程将会明显阻塞用户请求 + +渐进式rehash: 为避免出现这种情况,使用了rehash方案.基本原理就是,每次用户**访问时**都会**迁移**少量数据.将整个迁移过程, **平摊**到所有的访问用不请求过程中. + + + +#### 2.2 list + +- List 列表是简单的字符串列表,**按照插入顺序排序**,(这不是就是队列的特性) 可以从头部或尾部向 List 列表添加元素。列表的最大长度为 `2^32 - 1`,也即每个列表支持超过 `40 亿`个元素。 +- List 类型的底层数据结构是由**双向链表或压缩列表**实现的: +- 但是**在 Redis 3.2 版本之后,List 数据类型底层数据结构就只由 quicklist 实现了,替代了双向链表和压缩列表** +- `quicklist` 每个节点都有很多数据, 结点内每个数据的大小相等的 + + + +### 问题 + + + + + +#### 大 key + +大Key的危害 + +- 读取成本高 +- 容易导致慢查询(过期、删除) +- 主从复制异常,服务阻塞无法正常响应请求 +- + +业务侧使用大Key的表现 + +- 请求Redis超时报错 + + + +消除 大 key方法 + +- 拆分, 将大key拆分为小key. 例如一个String拆分成多个String\ +- 压缩, 将value压缩后写入redis, 读取时**解压后再使用**. +- 集合类结构hash、list、set、set + (1)拆分:可以用hash取余、位掩码的方式决定放在哪个key中 + (2)区分**冷热**: 如榜单列表场景使用zset, 只缓存前10页数据, 后续数据走db, ( 只关心第一名, 后面的人不关心 ) + + + + + + + + + +#### 热Key的定义 + +- 用户访问一个Key的QPS特别高,导致Server实例出现CPU负载突增或者不均的情况. +- 热key没有明确的标准, QPS超过500 就有可能被识别为热Key + + + +设置Localcache + +- 在访问Redis前,在**业务服务侧**设置Localcache, 降低访问 Redis 的 QPS. LocalCache中缓存过期或未命中,则从Redis中将数据更新到LocalCache.Java的Guava、Golang的Bigcache就是这类LocalCache + +拆分 + +- 将key:value这一个热Key复制写入多份, 例如key1:value,key2:value, 访问的时候访问多个key, 但value是同一个以此将 qps 分散到不同实例上, 降低负载 .代价是, 更新时需要更新多个key, 存在数据短暂不一致的风险 + + + +解决热Key的方法2.使用Redis代理的热Key承载能力字节跳动的Redis访问代理就具备热Key承载能力.本质上是结合了"热Key发现"、"LocalCache"两个功能 + + + +#### 慢查询 + +导致慢查询的操作 + +- 批量操作一次性传入过多的key/value,如mset/hmset/sadd/zadd等O(n)操作建议单批次不要超过100,超过100之后性能下降明显. +- zset大部分命令都是O(log(n)),当大小超过5k以上时,简单的zadd/zrem也可能导致慢查询 +- 操作的单个value过大,超过10KB.也即,避免使用大Key +- 对大key的delete/expire操作也可能导致慢查询,Redis4.0之前不支持异步删除unlink,大key删除会阻塞Redis + + + + + +#### 缓存穿透、缓存雪崩 + +缓存穿透:热点数据查询绕过缓存,直接查询数据库 + +缓存雪崩:大量缓存同时过期 + +缓存穿透 + +- 查询一个一定不存在的数据通常不会缓存不存在的数据,这类查询请求都会直接打到db,如果有系统bug或人为攻击,那么容易导致db响应慢甚至宕机 + + + + + +如何减少缓存穿透 + +- (1)缓存空值 如一个不存在的userlD.这个id在缓存和数据库中都不存在.则可以缓存一个空值,下次再查缓存直接反空值. +- (2)布隆过滤器通过 bloom filter 算法来存储合法 Key, 得益于该算法超高的压缩率, 只需占用极小的空间就能存储大量 key 值 + + + +如何避免缓存雪崩 + +- 1)缓存空值将缓存失效时间分散开,比如在原有的失效时间**基础上**增加一个随机值, 例如不同Key过期时间可以设置为10分1秒过期,10分23秒过期,10分8秒过期.单位秒部分就是随机时间,这样过期时间就分散了对于热点数据,过期时间尽量设置得长一些,冷门的数据可以相对设置过期时间短一些. +- 2)使用缓存集群,避免单机宕机造成的缓存雪崩. diff --git a/_posts/byte_tech/2023-08-10-dui_xiang_cun_chu.md b/_posts/byte_tech/2023-08-10-dui_xiang_cun_chu.md new file mode 100644 index 0000000..f8b5767 --- /dev/null +++ b/_posts/byte_tech/2023-08-10-dui_xiang_cun_chu.md @@ -0,0 +1,157 @@ +--- +layout: blog +banana: true +category: byte_tech +title: "Go_对象存储" +date: 2023-08-10 10:04:35 +background: green +tags: +- byte_tech +- go +--- + +* content +{:toc} + + + + + + + + + + +#### 什么是对象存储 + +对象存储(Object Storage)是一种用于存储和管理非结构化数据的技术和架构。与传统的文件系统或块存储相比,对象存储更适用于大规模数据的存储和访问。 + +在对象存储中,数据以对象(Object)的形式进行存储。一个对象通常由数据本身、唯一的标识符(称为键或对象名)和相关的元数据(Metadata)组成。对象存储将这些对象分布在一个分布式的存储集群中,并提供了可靠性、可扩展性和高性能的数据存储解决方案。 + +对象存储的特点和优势包括: + +1. 无限扩展性:对象存储具有无限的存储容量,并可以轻松地扩展以适应不断增长的数据需求。 +2. 高可靠性:对象存储使用冗余数据备份机制,确保数据的持久性和可靠性。数据在存储集群中的多个节点之间进行复制,即使某个节点出现故障,数据仍然可用。 +3. 高性能:对象存储采用分布式存储和并行访问的方式,实现了高速的数据读写操作。同时,对象存储提供了低延迟的访问方式,适合于需要大规模数据快速检索和访问的场景。 +4. 灵活的元数据:对象存储中的对象可以包含丰富的元数据信息,这些元数据描述了对象的属性、标签和其他相关信息。这些元数据可以用于数据分类、搜索和管理。 +5. 强大的访问控制:对象存储提供灵活的访问权限控制机制,允许对存储的对象进行细粒度的权限管理。您可以根据需要设置公开访问或私有访问,并通过身份验证机制确保数据的安全性。 + +对象存储被广泛应用于各种场景,如云存储、大规模数据分析、备份和恢复、内容分发等。知名的对象存储服务提供商包括亚马逊 S3、微软 Azure Blob Storage 和腾讯云对象存储(TOS)等。 + +| | | | | +| ------------------------ | ---- | ------------------------------ | ---- | +| 存储备选海量支持单机存储 | No | 适合数据类型单机文件/KV | No | +| 单机数据库 | No | 少量(半)结构化数据 | No | +| 分布式数据库 | Yes | 大量(半)结构化数据 | No | +| 分布式存储 | YeS | 大数据计算中间结果/视频/图片等 | Yes | + + + +#### 虾仁猪心 + +当一口吃不成胖子时,你应该慢慢来,到最后你会发现,肚子总会比钱包先鼓起来! + + + + + + + +#### 业务场景: + +注意从三个方面来看, 容量, 查询次数, 安全性 + +- 海量容量场景: 业务持续产生大量数据,数据规模 >>PB 级别,存储容量和成本压力极大 + +- 海量 QPS 场景: 业务场景有高 QPS 读写请求,量级 >>100K/s,并且时延要求极高,对底层存储 IOPS 压力极大 + +- 高可用性场景:业务对于 SLA 要求非常高,要求避免全局性不可用事件发生,但对于一致性要求比较低 + + + +其中带来的工程挑战有: + +- 可扩展性:架构在存储容量 / 带宽吞吐 / QPS 等关键指标上,线性可扩展,能够承担业务在这些指标上的持续增长需求 + +- 持久度:数据存储成功后,需要能够抵抗单机 / 单机架 / 单机房等各种类型的故障而不丢失 + +- 可用性:系统不可用的时间在整体运行时间的占比需要尽可能小,系统不可用后需要具备快速恢复能力 + +- 性价比:在海量存储容量的情况下,需要尽力降低单位存储成本,以降低业务的成本支出 + + + + + +99.999% += 服务一年只能5分钟不可用 + + + + + +换算成人民币 **1000** 字的问答所消耗的费用 **2 分钱**左右。 + +$0.002/1K tokens + +通常 1000 个 Token 约等于 750 个英文单词或者 400~500 个汉字。GPT-3 每次调用允许处理的最大 Tokens 数量约为 4096。 + + + + + +x委都行啊, 长黄高委, 最好的是黄 + +级别不低 长委副省级 水文局正厅 下设处室人都很少 水文局混不上副处的属实太费了 + +长江委水文局, 啥都缺,就是不缺钱 + +事业单位 + +武汉 + + + +| 山东中医药高等专科学校 | 公办 | +| ------------------------ | ---- | +| 山东医学高等专科学校 | 公办 | +| 菏泽医学专科学校 | 公办 | +| 山东司法警官职业学院 | 公办 | +| 山东商业职业技术学院 | 公办 | +| 临沂职业学院 | 公办 | +| 山东特殊教育职业学院 | 公办 | +| 济南护理职业学院 | 公办 | +| 淄博职业学院 | 公办 | +| 山东外贸职业学院 | 公办 | +| 济南幼儿师范高等专科学校 | 公办 | +| 莱芜职业技术学院 | 公办 | +| 山东职业学院 | 公办 | +| 潍坊护理职业学院 | 公办 | +| 济南职业学院 | 公办 | +| 济南工程职业技术学院 | 公办 | +| 山东畜牧兽医职业学院 | 公办 | +| 聊城职业技术学院 | 公办 | +| 山东劳动职业技术学院 | 公办 | +| 日照职业技术学院 | 公办 | +| 烟台职业学院 | 公办 | +| 潍坊职业学院 | 公办 | +| 菏泽家政职业学院 | 公办 | +| 山东商务职业学院 | 公办 | +| 山东药品食品职业学院 | 公办 | +| 山东城市建设职业学院 | 公办 | +| 威海职业学院 | 公办 | +| 山东科技职业学院 | 公办 | +| 青岛职业技术学院 | 公办 | +| 山东经贸职业学院 | 公办 | +| 山东电子职业技术学院 | 公办 | +| 东营职业学院 | 公办 | +| 济宁职业技术学院 | 公办 | +| 山东**信息职业**技术学院 | 公办 | +| 青岛港湾职业技术学院 | 公办 | +| 青岛酒店管理职业技术学院 | 公办 | +| 山东水利职业学院 | | +| 潍坊工商职业学院 | 民办 | +| 枣庄职业学院 | | +| 山东交通职业学院 | | +| 枣庄科技职业学院 | | +| 山东服装职业学院 | | diff --git a/_posts/byte_tech/2023-08-11-xiao_xi_dui_lie.md b/_posts/byte_tech/2023-08-11-xiao_xi_dui_lie.md new file mode 100644 index 0000000..07259ea --- /dev/null +++ b/_posts/byte_tech/2023-08-11-xiao_xi_dui_lie.md @@ -0,0 +1,77 @@ +--- +layout: blog +banana: true +category: byte_tech +title: "Go_" +date: 2023-08-11 10:11:14 +background: green +tags: +- byte_tech +- go +--- + +* content +{:toc} + + + + + + +#### 四个场景,如何解决? + +- 系统奔溃-------消息队列, 解耦 +- 服务处理能力有限------削峰, 消息队列 +- 链路耗时长尾-------异步, 消息队列 +- 日志如何处理------ + + + + + +#### 常见的消息队列 + +- Kafka:分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色 +- RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些**实时**场景中运用较广 +- Pulsar:是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体、采用存算分离的架构设计 +- BMQ:和Pulsar架构类似, 存算分离, 初期定位是承接高吞吐的离线业务场景, 逐步替换掉对应的Kafka集群 + + + + + +#### 使用 kafka流程 + +- 创建集群 +- 新增Topic +- 编写生产者逻辑 +- 编写消费者逻辑 + + + +#### 基本概念 + +- Topic:逻辑队列, 不同Topic可以建立不同的Topic +- 每个 topic 内部有 很多 `partition`, 可以并行处理 +- Cluster: 物理集群,每个集群中可以建立多个不同的Topic +- Producer:生产者,负责将业务消息发送到Topic中 +- Consumer:消费者,负责消费Topic中的消息 +- ConsumerGroup:消费者组,不同组Consumer消费进度**互不干涉** + + + + + + + +leader 是 负责存储生产者的产品供消费者使用 + +follwer 努力保证 leader一样 + + + +从一条消息的视角,看看为什么Kafka能支撑这么高的吞吐? + +- 批量发送可以减少O次数, 从而加强发送能力 +- 通过压缩,减少消息大小,目前支持Snappy、Gzip、LZ4、ZSTD压缩算法 +- 采用顺序写的方式进行写入,以提高写入效率 diff --git a/_posts/byte_tech/2023-08-12-project.md b/_posts/byte_tech/2023-08-12-project.md new file mode 100644 index 0000000..d295104 --- /dev/null +++ b/_posts/byte_tech/2023-08-12-project.md @@ -0,0 +1,486 @@ +--- +layout: blog +banana: true +category: byte_tech +title: "Go_" +date: 2023-08-12 21:34:04 +background: green +tags: +- byte_tech +- go +--- + +* content +{:toc} + + + + +### 我的工作---发布视频 + + + +#### 简介 + +我的工作为发布视频, 将这个任务分解为几个小任务, 先看哪些任务能够自己独立完成,先完成这些任务, 之后再根据小组成员的接口, 实现完整的功能 + + + +环境 + +- 需要提前安装`ffmpeg` + + + + + +发布视频的流程 + +- 鉴权 ----- 使用别人的接口 +- 存储视频 ---- ( demo中 有 ) +- 抽取封面并存储 +- 视频 和 封面 上传到 `cdn` ( 没有, 因此没有做 ) +- 将收到的视频信息( 视频名称, 用户名, 播放地址, 封面的地址 )存储到数据库中 ---- 使用数据库的接口 +- 返回消息 ( 发布成功) + + + +因此最先做的工作就是 + +- 确定资源**存储的位置**, 通过查找**路由**得知, 有这样一个映射`r.Static("/static", "./public")`, 我们访问静态资源的时候, 网址为`xxx/static/fileName.txt`, 通过` c.Request.Host`字段, 来获得域名 : `2f781ee3592dd7a9ff0bbd0007fe40ce-app.1024paas.com`, 加头(协议)加尾(路径 + 文件名), 进行字符串拼接 +- 使用`ffmpeg`来抽取某一帧来做封面, 需要设置 其 **环境** + + + + + +```go +// controller/ publish.go +// 没有其他合作者的提供的接口 +func Publish(c *gin.Context) { + // token, 鉴权 + + // 存储 + err := c.SaveUploadedFile(data, saveFile); + + // 抽取并存储图片 + Vedio2Jpeg(saveFile, 6) + + // 拼接网址 + vedio_url := "https://"+ domain + "/static/"+ finalName + + // 放入数据库 + db.creat()..... + +} + + + +``` + + + +抽取图片 demo + +```go +// 将视频抽取一帧, 转化为流 +package examples + +import ( + "bytes" + "fmt" + "io" + "os" + + ffmpeg "github.com/u2takey/ffmpeg-go" +) + +func ExampleReadFrameAsJpeg(inFileName string, frameNum int) io.Reader { + buf := bytes.NewBuffer(nil) + err := ffmpeg.Input(inFileName). + Filter("select", ffmpeg.Args{fmt.Sprintf("gte(n,%d)", frameNum)}). + Output("pipe:", ffmpeg.KwArgs{"vframes": 1, "format": "image2", "vcodec": "mjpeg"}). + WithOutput(buf, os.Stdout). + Run() + if err != nil { + panic(err) + } + return buf +} +``` + + + +#### 队友的接口 + +```go +// 鉴权接口 +// 参数: token, 返回: username +func ParseToken(token string) (string, error) + + +// 数据库接口---用户 +func (*UserDao) FindUserByName(username string) (*User, error) +func (d *UserDao) FindUserById(id int64) (*User, error) +_, err := models.NewUserDaoInstance().FindUserByName("qong"); + +// 数据库接口--- 视频 +func (*VideoDao) CreateVideo(video *Video) (*Video, error) + +``` + + + + + +#### 使用了接口之后的伪代码 + +```go +func Publish(c *gin.Context) { + // token, 鉴权 + token := c.PostForm("token") + user_name, err := ParseToken(token); + user, err := models.NewUserDaoInstance().FindUserByName(user_name) + var user_id = user.UserId + + // 存储 + err := c.SaveUploadedFile(data, saveFile); + + // 抽取并存储图片 + Vedio2Jpeg(saveFile, 6) + + // 拼接网址 + vedio_url := "https://"+ domain + "/static/"+ finalName + + // 放入数据库 + video1 := models.Video{UserId : user_id, PlayUrl : vedio_url, CoverUrl : img_url , } + _, err = models.NewVideoDaoInstance().CreateVideo(&video1) + +} +``` + + + + + + + + + + + + + +| 主题 | 描述 | +| ---------- | ---------------------------------------------- | +| 计算机基础 | 数据结构、算法/ 计算机组成原理、计算机网络、操作系统、编译原理 | +| Linux | linux基础操作、unix环境编程、网络编程 | +| 数据库 | 基础理论ACID、MySQL、NoSQL | +| 编程语言 | Java、Go、C/C++、Rust | +| 设计模式 | 23种设计模式 | +| 中间件 | API网关、Web/RPC框架、消息队列、缓存、定时调度、数据库中间件ORM、日志系统、配置中型 | +| 分布式 | 一致性/CAP、事务、等、微服务、拓展性 | +| 高并发、高性能、高可用 | C10k、进程、线程、线程、异步、池化、缓存、CDN、集群、负载均衡、限流、容灾、多活 | +| | | + +linux 命令 + +- 查看目录 +- 打开文件 +- 两个命令 awk, sed + + + + + + + +SOA(Service-Oriented Architecture) +1.将应用的不同功能单元抽象为服务 +2.定义服务之间的通信标准微服务架构:SOA的去中心化演进方向 + + + + + + + +### user + +```go + +type Response struct { + StatusCode int32 `json:"status_code"` + StatusMsg string `json:"status_msg,omitempty"` +} +``` + + + + + + + + + + + +### 项目分析 + +#### service/ message.go + +- tcp 客户端, + +```go +package service + +import ..... + +// 并发安全的 映射类型 +// event.UserId_event.ToUserId +var chatConnMap = sync.Map{} + +func RunMessageServer() { + listen, err := net.Listen("tcp", "127.0.0.1:9090") + + + for { + conn, err := listen.Accept() + if err != nil { + fmt.Printf("Accept conn failed: %v\n", err) + continue + } + + go process(conn) + } + +} + +func process(conn net.Conn) { + defer conn.Close() + + var buf [256]byte + for { + n, err := conn.Read(buf[:]) + if n == 0 { + if err == io.EOF { + break + } + fmt.Printf("Read message failed: %v\n", err) + continue + } + + // 在 common.go #L39 + // 请求事件是什么 + var event = controller.MessageSendEvent{} + _ = json.Unmarshal(buf[:n], &event) + fmt.Printf("Receive Message:%+v\n", event) + + fromChatKey := fmt.Sprintf("%d_%d", event.UserId, event.ToUserId) + if len(event.MsgContent) == 0 { + chatConnMap.Store(fromChatKey, conn) + continue + } + + toChatKey := fmt.Sprintf("%d_%d", event.ToUserId, event.UserId) + writeConn, exist := chatConnMap.Load(toChatKey) + if !exist { + fmt.Printf("User %d offline\n", event.ToUserId) + continue + } + + pushEvent := controller.MessagePushEvent{ + FromUserId: event.UserId, + MsgContent: event.MsgContent, + } + // 转化为 json 字符串 + pushData, _ := json.Marshal(pushEvent) + _, err = writeConn.(net.Conn).Write(pushData) + if err != nil { + fmt.Printf("Push message failed: %v\n", err) + } + } +} + +``` + + + + + +#### API / 路由/ 基于 HTTP 协议 + +做的事情有 + +- 通过调用 `r.Static("/static", "./public")` 将 "/static" 路径**映射**到 "./public" 目录,用于提供静态资源文件。 +- 接下来,通过调用 `r.LoadHTMLGlob("templates/*")` 加载了所有位于 "templates" 目录下的 HTML 模板文件。 +- 之后,定义了一个处理根路径 ("/") 的 GET 请求的**路由**。 + + + + + +- 当GET 的路径为`douyin/feed/`时, 调用`controller.Feed`, 其他也一样 +- 注意: Gin 默认情况下会返回 404 错误 + +```go +func initRouter(r *gin.Engine) { + // public directory is used to serve static resources + r.Static("/static", "./public") + r.LoadHTMLGlob("templates/*") + + // home page + r.GET("/", func(c *gin.Context) { + c.HTML(http.StatusOK, "index.html", gin.H{ + "title": "Main website", + }) + }) + + apiRouter := r.Group("/douyin") + + // basic apis + apiRouter.GET("/feed/", controller.Feed) + apiRouter.GET("/user/", controller.UserInfo) + apiRouter.POST("/user/register/", controller.Register) + apiRouter.POST("/user/login/", controller.Login) + // -------我的工作在这里---------- + apiRouter.POST("/publish/action/", controller.Publish) + apiRouter.GET("/publish/list/", controller.PublishList) + + +} +``` + + + + + +#### 返回类型 + +```go +var DemoVideos = []Video{ + { + Id: 1, + Author: DemoUser, + // 静态资源 https://49e48d523a1b2e3ac60f4f7e9aec3628-app.1024paas.com/static/2_mmexport1692111641344.mp4 + PlayUrl: "https://www.w3schools.com/html/movie.mp4", + CoverUrl: "https://cdn.pixabay.com/photo/2016/03/27/18/10/bear-1283347_1280.jpg", + FavoriteCount: 0, + CommentCount: 0, + IsFavorite: false, + }, + +} + + +type Response struct { + StatusCode int32 `json:"status_code"` + StatusMsg string `json:"status_msg,omitempty"` +} +``` + + + + + + + +```go +// 存储 +func (c *gin.Context) SaveUploadedFile(file *multipart.FileHeader, dst string) error + +func (c *gin.Context) JSON(code int, obj interface{}) +``` + + + + + + + + + +### GORM 使用 + +[go 语言 gorm 基本使用_go gorm_含光君~的博客 - CSDN 博客](https://blog.csdn.net/yoyogu/article/details/109318626) + + + + + +### 其他库 + +#### 抽取图片 + +```go +// 将视频抽取一帧, 转化为流 +package examples + +import ( + "bytes" + "fmt" + "io" + "os" + + ffmpeg "github.com/u2takey/ffmpeg-go" +) + +func ExampleReadFrameAsJpeg(inFileName string, frameNum int) io.Reader { + buf := bytes.NewBuffer(nil) + err := ffmpeg.Input(inFileName). + Filter("select", ffmpeg.Args{fmt.Sprintf("gte(n,%d)", frameNum)}). + Output("pipe:", ffmpeg.KwArgs{"vframes": 1, "format": "image2", "vcodec": "mjpeg"}). + WithOutput(buf, os.Stdout). + Run() + if err != nil { + panic(err) + } + return buf +} +``` + + + +```go +package main + +import ( + "fmt" + "strings" +) + +func main() { + inFileName := "path/to/video.mp4" + + index := strings.LastIndex(inFileName, ".") + if index != -1 { + outFileName := strings.Join([]string{inFileName[:index+1], "jpeg"}, "") + fmt.Print(outFileName) + } else { + fmt.Println("Invalid file name") + } +} +``` + + + + + + + +#### sync.Map + +`sync.Map` 是 Go 语言提供的一种并发安全的映射(Map)结构。它可以在多个 goroutine 并发访问时保证数据的安全性,而不需要额外的加锁操作。 + +`sync.Map` 的主要特点如下: + +1. 无需显式初始化,可以直接声明并使用。 +2. 支持并发的读取和写入操作,可以在多个 goroutine 中同时访问。 +3. 内部自动进行了并发安全的处理,不需要额外的锁机制。 +4. 提供了几个常用的方法来对映射进行操作,如 Store、Load、Delete 等。 + +需要注意的是,`sync.Map` 相对于普通的 `map` 有一些限制: + +1. 不允许使用 `nil` 作为键值。 +2. 对于存储的值类型没有约束,可以是任意类型。 +3. 没有提供获取映射长度的方法。 diff --git a/_posts/byte_tech/2023-08-17-mult-thread.md b/_posts/byte_tech/2023-08-17-mult-thread.md new file mode 100644 index 0000000..006e2f8 --- /dev/null +++ b/_posts/byte_tech/2023-08-17-mult-thread.md @@ -0,0 +1,349 @@ +--- +layout: blog +banana: true +category: byte_tech +title: "Go_" +date: 2023-08-17 09:59:12 +background: green +tags: +- byte_tech +- go +--- + +* content +{:toc} + + + + + + +#### 携程 + +Go 语言中的 goroutine 就是这样一种机制,goroutine 的概念类似于线程,但 goroutine 是由 Go 的运行时(runtime)调度和管理的。Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。Go 语言之所以被称为现代化的编程语言,就是因为它在语言层面已经内置了调度和上下文切换的机制。 + +在 Go 语言编程中你不需要去自己写进程、线程、协程,你的技能包里只有一个技能–goroutine,当你需要让某个任务并发执行的时候,你只需要把这个任务包装成一个**函数**,开启一个 goroutine 去执行这个函数就可以了,就是这么简单粗暴。 + +协程:用户态,轻量级线程, 栈KB级别 + +线程:内核态,线程跑多个协程, 栈MB级别 + + + + + + + +```go +package main + +import ( + "fmt" + "time" +) + +func main() { + go hello() // 启动一个新的协程执行 hello() 函数 + + // 主线程继续执行其他任务 + for i := 0; i < 5; i++ { + fmt.Println("Main Thread:", i) + time.Sleep(time.Second) + } +} + +func hello() { + for i := 0; i < 5; i++ { + fmt.Println("Hello Goroutine:", i) + time.Sleep(time.Second) + } +} + +``` + + + +使用匿名函数启动协程 + +```go +package main + +import ( + "fmt" + "time" +) + +func main() { + // 定义匿名函数,作为协程的运行函数 + go func() { + fmt.Println("协程开始执行") + time.Sleep(2 * time.Second) // 模拟一些耗时操作 + fmt.Println("协程执行完成") + }() + + // 主线程继续执行其他任务 + fmt.Println("主线程执行其他任务") + + // 防止主线程退出,等待一些时间以便协程执行完毕 + time.Sleep(3 * time.Second) +} + +``` + + + + + + + + + + + + + +CSP (Communicating Sequential Processes) 通信顺序进程,是 Go 语言中重要的并发模型。 + +主要特征有 + +1. **顺序**进程:每个进程内部按顺序执行。 +2. 通信进程:进程间通过通信 (Message Passing) 来协作。 +3. 数据流:程序通过在进程间传递数据来工作。 + +Go 语言的 CSP 实现主要通过 goroutine 和 channel + +- goroutine 作为顺序执行的进程 +- channel 用于 goroutine 间的通信 + + + + + +#### 通信 / channel + +提倡通过**通信**共享内存而不是通过共享内存而实现通信 + +- 通过通信共享内存---通道 +- 通过共享内存实现通信---临界区 + +```go +var ch1 chan int // 声明一个传递整型的通道 +var ch2 chan bool // 声明一个传递布尔型的通道 +var ch3 chan []int // 声明一个传递int切片的通道 + +// 通道是引用类型,通道类型的空值是 nil。 +// 声明的通道后需要使用 make 函数初始化之后才能使用。 +ch4 := make(chan int) +ch5 := make(chan bool) +ch6 := make(chan []int) + +// 发送 将一个值发送到通道中。 +ch <- 10 // 把10发送到ch中 + +// 接收----从一个通道中接收值。 +x := <- ch // 从ch中接收值并赋值给变量x +<-ch // 从ch中接收值,忽略结果 + +// close 函数来关闭通道。关闭通道不是必须 +close(ch) +``` + +```go +func main() { + ch1 := make(chan int) + ch2 := make(chan int) + // 开启goroutine将0~100的数发送到ch1中 + go func() { + for i := 0; i < 100; i++ { + ch1 <- i + } + close(ch1) + }() + // 开启goroutine从ch1中接收值,并将该值的平方发送到ch2中 + go func() { + for { + i, ok := <-ch1 // 通道关闭后再取值ok=false + if !ok { + break + } + ch2 <- i * i + } + close(ch2) + }() + // 在主goroutine中从ch2中接收值打印 + for i := range ch2 { // 通道关闭后会退出for range循环 + fmt.Println(i) + } +} +``` + + + + + + + + + +#### 实例/ 生产者消费者模型 + +```go +package main + +import "fmt" + +func CalSquare() { + src := make(chan int) // 生产无缓冲 + dest := make(chan int, 3) // 消费缓冲3个元素 + + // 子协程发送0-9数字 + go func() { + defer close(src) + for i := 0; i < 10; i++ { + src <- i + } + }() + + // 子协程计算输入数字的平方 + go func() { + defer close(dest) + for i := range src { + dest <- i * i + } + }() + + // 主协程输出最后的平方数 + for i := range dest { + // 复杂操作 + // ... + fmt.Println(i) + } + +} + +func main() { + CalSquare() +} + +``` + + + + + + + +#### 互斥锁 + +- 互斥锁,确保同时只有一个 goroutine 可以**访问共享**数据。 + +```go +package main + +import ( + "fmt" + "sync" + "time" +) + +var ( + counter = 0 + // 保护临界区 + mutex sync.Mutex + // 保证所有的任务都能完成, 也就是主程序阻塞 + wg sync.WaitGroup +) + +func main() { + wg.Add(2) + + go increment("Routine 1") + go increment("Routine 2") + + wg.Wait() + fmt.Println("Final counter:", counter) +} + +func increment(name string) { + defer wg.Done() + + for i := 0; i < 5; i++ { + // 对公共资源进行加锁 + mutex.Lock() + + // 修改公共资源 + counter++ + fmt.Printf("[%s] Counter: %d\n", name, counter) + + // 解锁公共资源 + mutex.Unlock() + + // 模拟其他操作 + time.Sleep(time.Millisecond * 500) + } +} + +``` + + + + + + + +1. sync.RWMutex + +读写互斥锁,可以同时允许多个读,但写时独占。读写互斥锁实现了读写分离,相比普通的互斥锁可以提供更高的并发性能。 + +```go +var mu sync.RWMutex + +mu.RLock() +// 读共享资源 +mu.RUnlock() + +mu.Lock() +// 写共享资源 +mu.Unlock() + +``` + + + +sync.WaitGroup 是 Go 语言中的一个常用同步工具,可以用于等待一组 goroutine 结束。主要的使用方式是 + +- 创建一个 WaitGroup, 通常以参数传入函数 +- 在启动 goroutine 前调用 Add 添加计数 +- 在 goroutine 结束时调用 Done 减少计数 +- 等待 goroutine 结束,调用 Wait 阻塞 + +```go +package main + +import ( + "fmt" + "sync" +) + +func process(i int, wg *sync.WaitGroup) { + fmt.Println("Start goroutine", i) + // 结束时调用 Done 减少计数 + defer wg.Done() + fmt.Printf("End goroutine%d\n", i) +} + +func main() { + + var wg sync.WaitGroup + + for i := 1; i <= 3; i++ { + wg.Add(1) + go process(i, &wg) + } + + wg.Wait() + fmt.Println("All goroutines finished executing") +} + +``` + diff --git a/_posts/byte_tech/2023-08-17-package.md b/_posts/byte_tech/2023-08-17-package.md new file mode 100644 index 0000000..a46d518 --- /dev/null +++ b/_posts/byte_tech/2023-08-17-package.md @@ -0,0 +1,1942 @@ +--- +layout: blog +banana: true +category: byte_tech +title: "Go_常用框架/中间件" +date: 2023-08-17 09:43:00 +background: green +tags: +- byte_tech +- go +--- + +* content +{:toc} + + +#### 实现函数对象 + +在 Go 中,可以使用函数类型和闭包来实现类似于 C++ 函数对象(Functor)的功能。函数类型可以作为参数传递和返回值,而闭包可以捕获外部变量并形成一个可调用的函数对象。 + +```go +package main + +import "fmt" + +// 定义一个函数类型 +type MyFunc func(int) int + +// 函数对象, 返回类型为 MyFunc +func AddN(n int) MyFunc { + return func(x int) int { + return x + n + } +} + +func main() { + // 创建一个函数对象 + addTwo := AddN(2) + + // 调用函数对象 + result := addTwo(3) + fmt.Println(result) // 输出:5 +} +``` + + + + + + + +分层设计的问题 + +- 不同层次之间的如何转化 + +```go +type Response struct { + StatusCode int32 `json:"status_code"` + StatusMsg string `json:"status_msg,omitempty"` +} + +type Video struct { + Id int64 `json:"id,omitempty"` + Author User `json:"author"` + PlayUrl string `json:"play_url" json:"play_url,omitempty"` + CoverUrl string `json:"cover_url,omitempty"` + FavoriteCount int64 `json:"favorite_count,omitempty"` + CommentCount int64 `json:"comment_count,omitempty"` + IsFavorite bool `json:"is_favorite,omitempty"` +} + +type Comment struct { + Id int64 `json:"id,omitempty"` + User User `json:"user"` + Content string `json:"content,omitempty"` + CreateDate string `json:"create_date,omitempty"` +} + +type User struct { + Id int64 `json:"id,omitempty"` + Name string `json:"name,omitempty"` + FollowCount int64 `json:"follow_count,omitempty"` + FollowerCount int64 `json:"follower_count,omitempty"` + IsFollow bool `json:"is_follow,omitempty"` +} + +type Message struct { + Id int64 `json:"id,omitempty"` + Content string `json:"content,omitempty"` + CreateTime string `json:"create_time,omitempty"` +} + +type MessageSendEvent struct { + UserId int64 `json:"user_id,omitempty"` + ToUserId int64 `json:"to_user_id,omitempty"` + MsgContent string `json:"msg_content,omitempty"` +} + +type MessagePushEvent struct { + FromUserId int64 `json:"user_id,omitempty"` + MsgContent string `json:"msg_content,omitempty"` +} + +``` + + + + + + + +```go +type User struct { + UserId int64 `gorm:"primary_key"` + Name string + // FollowingCount int64 `gorm:"default:(-)"` + // FollowerCount int64 `gorm:"default:(-)"` + Password string + // Avatar string `gorm:"default:(-)"` + // BackgroundImage string `gorm:"default:(-)"` + Signature string + // TotalFavorited int64 `gorm:"default:(-)"` + // WorkCount int64 `gorm:"default:(-)"` + // FavoriteCount int64 `gorm:"default:(-)"` + // CreateAt time.Time + // DeleteAt time.Time +} + +type Video struct { + VideoId int64 `gorm:"primaryKey"` + UserId int64 + PlayUrl string + CoverUrl string + FavoriteCount int64 + CommentCount int64 + // Title string `gorm:"default:(-)"` + CreateAt time.Time + UpdateAt time.Time + DeleteAt time.Time +} + + +func GetUserDao() *UserDao + +func (*UserDao) CreateUser(user *User) (int64, error) +func (*UserDao) FindUserByName(username string) (*User, error) +func (d *UserDao) FindUserById(id int64) (*User, error) + + + +func GetVideoDao() *VideoDao + +func (*VideoDao) CreateVideo(video *Video) (*Video, error) +func (d *VideoDao) FindVideoById(id int64) (*Video, error) +func (*VideoDao) QueryVideoByUserId(userId int64) ([]*Video, error) + +// 根据时间和需要查询的条数,获取video列表 +func (*VideoDao) QueryVideo(date *string, limit int) []*Video +``` + + + +### test + +Go 语言中的测试依赖 go test 命令。编写测试代码和编写普通的 Go 代码过程是类似的,并不需要学习新的语法、规则或工具。 + +go test 命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go 为后缀名的源代码文件都是 go test 测试的一部分,不会被 go build 编译到最终的可执行文件中。 + +在 `*_test.go` 文件中有三种类型的函数,**单元测试函数**、基准测试函数和示例函数。 + +| 类型 | 格式 | 作用 | +| -------- | ---------------------- | ------------------------------ | +| 测试函数 | 函数名**前缀**为 Test | 测试程序的一些逻辑行为是否正确 | +| 基准函数 | 函数名前缀为 Benchmark | 测试函数的性能 | +| 示例函数 | 函数名前缀为 Example | 为文档提供示例文档 | + +Golang 单元测试对文件名和方法名,参数都有很严格的要求。 + +- 文件名必须以`xx_test.go`命名 + +- 方法必须是`Test[^a-z]`开头 + +- 方法参数必须` t *testing.T` + +- 使用go test执行单元测试 + + + +#### go test参数 + +```bash +go test [-c] [-i] [build flags] [packages] [flags for test binary] +``` + + + +```go +// split/split.go + +package split + +import "strings" + +// split package with a single split function. + +// Split slices s into all substrings separated by sep and +// returns a slice of the substrings between those separators. +func Split(s, sep string) (result []string) { + i := strings.Index(s, sep) + + for i > -1 { + result = append(result, s[:i]) + s = s[i+1:] + i = strings.Index(s, sep) + } + result = append(result, s) + return +} +``` + +在当前目录下,我们创建一个 split_test.go 的测试文件,并定义一个测试函数如下: + +```go +// split/split_test.go + +package split + +import ( + "reflect" + "testing" +) + +func TestSplit(t *testing.T) { // 测试函数名必须以Test开头,必须接收一个*testing.T类型参数 + got := Split("a:b:c", ":") // 程序输出的结果 + want := []string{"a", "b", "c"} // 期望的结果 + if !reflect.DeepEqual(want, got) { // 因为slice不能比较直接,借助反射包中的方法比较 + t.Errorf("excepted:%v, got:%v", want, got) // 测试失败输出错误提示 + } +} +``` + + + +测试结果 + +```bash +$ go test +PASS +ok main/ttt 0.002s +``` + + + + + + + + + +### log + +```go +``` + + + + + + + +### OS + +```go +// 如果文件已存在会截断它(为空文件)。如果成功,返回的文件对象可用于 I/O; +func Create(name string) (file *File, err error) + +func Open(name string) (file *File, err error) + +func Rename(oldpath, newpath string) error +``` + + + +### IO + + + +#### 1、Reader + + + +```go +type Reader interface { + Read(p []byte) (n int, err error) +} +``` + +Reader 是包装基本 Read 方法的接口。 + +Read 最多将 len (p) 个字节读入 p。它返回读取的字节数 (0 <= n <= len (p)) 和遇到的错误。即使 Read 返回 n < len (p),它也可能在调用期间使用所有 p 作为暂存空间。 + +如果有一些数据可用,但长度不为 len (p) ,则 Read 通常会返回可用的数据,而不是等待更多数据。 + +当 Read 遇到错误,或者在成功读取 n > 0 个字节后,遇到 end-of-file 条件时,返回读取的字节数。它可能会从同一次调用中返回(非空)错误,或者从后续调用中返回错误(并且 n == 0)。 + 这种情况一个例子是:Reader 在读取到输入流末尾时,返回一个非零的字节数,并返回 err == EOF 或者 err == nil。下一次读取应该返回 0,EOF。 + +在考虑错误错误之前,调用者应始终处理返回的 n > 0 字节。这样做可以正确处理读取某些字节后发生的 I/O 错误以及允许的 EOF 行为。 + +对于 Read 的实现,不鼓励同时返回零字节计数和 nil 错误,除非 len (p) == 0。 + 调用者应将返回 0 和 nil 视为表示没有发生任何事情;特别是它不表示 EOF。 + +实现不得持有 p。 + +#### 2、Writer + + + +```go +type Writer interface { + Write(p []byte) (n int, err error) +} +``` + +Writer 是封装了基本 Write 方法的接口。 + +Write 将 len (p) 个字节从 p 写入底层数据流。 + 它返回从 p (0 <= n <= len (p)) 写入的字节数,以及遇到的任何导致写入提前停止的错误。 + 如果返回 n ", + } + + // 输出 : {"lang":"GO\u8bed\u8a00","tag":"\u003cbr\u003e"} + c.AsciiJSON(http.StatusOK, data) + }) + + // 监听并在 0.0.0.0:8080 上启动服务 + r.Run(":8080") +} +``` + + + +#### 获取参数 + +- 可以通过 Context 的 Param 方法来获取 API 参数 + +```go +package main + +import ( + "net/http" + "strings" + + "github.com/gin-gonic/gin" +) + +func main() { + r := gin.Default() + r.GET("/user/:name/*action", func(c *gin.Context) { + name := c.Param("name") + action := c.Param("action") + //截取/ + action = strings.Trim(action, "/") + c.String(http.StatusOK, name+" is "+action) + }) + //默认为监听8080端口 + r.Run(":8000") +} +``` + +其中 `:name` 和 `*action` 都是**动态参数**。当客户端向服务器发送 `GET /user/小明/list` 的请求时,服务器将匹配到该路由,并将 `小明` 和 `list` 两个参数的值分别**赋值**给 `:name` 和 `*action`。 + +在 Go 语言的路由匹配中,`:` 和 `*` 符号具有**不同的含义**: + +- `:` 符号表示一个动态参数,它可以匹配**任意长度**的字符串,**包括空字符串**。例如,`r.GET("/user/:name")` 表示一个处理 `GET` 请求的路由,其中 `:name` 是一个动态参数,它可以匹配任意长度的字符串,包括空字符串。 +- `*` 符号表示一个**可选**的动态参数,它可以匹配任意长度的字符串,**但不能为空字符串**。例如,`r.GET("/user/:name/*action")` 表示一个处理 `GET` 请求的路由,其中 `:name` 是一个动态参数,而 `*action` 是一个可选的动态参数。当客户端向服务器发送 `GET /user/小明/list` 的请求时,服务器将匹配到该路由,并将 `小明` 和 `list` 两个参数的值分别赋值给 `:name` 和 `*action`。但是,如果客户端发送 `GET /user/小明` 的请求,则服务器将无法匹配该路由,因为 `*action` 参数不能为空字符串。 + + + +#### 路由 + +```go +package main + +import ( + "github.com/gin-gonic/gin" + "fmt" +) + +// gin的helloWorld + +func main() { + // 1.创建路由 + // 默认使用了2个中间件Logger(), Recovery() + r := gin.Default() + // 路由组1 ,处理GET请求 + v1 := r.Group("/v1") + // {} 是书写规范 + { + v1.GET("/login", login) + v1.GET("submit", submit) + } + v2 := r.Group("/v2") + { + v2.POST("/login", login) + v2.POST("/submit", submit) + } + r.Run(":8000") +} + +func login(c *gin.Context) { + name := c.DefaultQuery("name", "jack") + c.String(200, fmt.Sprintf("hello %s\n", name)) +} + +func submit(c *gin.Context) { + name := c.DefaultQuery("name", "lily") + c.String(200, fmt.Sprintf("hello %s\n", name)) +} +``` + + + + + +GET `/user//res`是合法的么 + +```go +GET /user/ /res +``` + +因为 `GET` 请求的路径中包含了两个连续的 `/` 符号,所以它将匹配到 `GET /user//res` 这个路由。在这个路由中,两个 `/` 符号之间的部分是一个可选的动态参数,它可以是任意长度的字符串,但不能为空字符串。因此,如果客户端向服务器发送 `GET /user//res` 的请求,则服务器将匹配到该路由,并将 `res` 参数的值赋值给该动态参数。 + + + + + +#### 中间件 + +```go +package main + +import ( + "fmt" + "time" + + "github.com/gin-gonic/gin" +) + +// 定义中间 +func MiddleWare() gin.HandlerFunc { + return func(c *gin.Context) { + t := time.Now() + fmt.Println("中间件开始执行了") + // 设置变量到Context的key中,可以通过Get()取 + c.Set("request", "中间件") + // 执行函数 + c.Next() + // 中间件执行完后续的一些事情 + status := c.Writer.Status() + fmt.Println("中间件执行完毕", status) + t2 := time.Since(t) + fmt.Println("time:", t2) + } +} + +func main() { + // 1.创建路由 + // 默认使用了2个中间件Logger(), Recovery() + r := gin.Default() + // 注册中间件 + r.Use(MiddleWare()) + // {}为了代码规范 + { + r.GET("/ce", func(c *gin.Context) { + // 取值 + req, _ := c.Get("request") + fmt.Println("request:", req) + // 页面接收 + c.JSON(200, gin.H{"request": req}) + }) + + } + r.Run() +} +``` + + + + + + + + + +#### 日志 + +```go +func main() { + // 禁用控制台颜色,将日志写入文件时不需要控制台颜色。 + gin.DisableConsoleColor() + + // 记录到文件。 + f, _ := os.Create("gin.log") + gin.DefaultWriter = io.MultiWriter(f) + + // 如果需要同时将日志写入文件和控制台,请使用以下代码。 + // gin.DefaultWriter = io.MultiWriter(f, os.Stdout) + + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { + c.String(200, "pong") + }) + + router.Run(":8080") +} +``` + + + +#### 回复 + +```go +// 回复 json 字符串 +func JSON(c *Context, code int, obj interface{}) error + + +c.JSON(200, map[string]interface{}{ + "message": "Hello, World!", +}) +``` + + + + + + + + + + + + + + + + + +#### gin 项目目录结构 + +其中: + +- **configs** 目录包含项目的配置文件 +- **controllers** 目录包含**控制器**文件 +- **middleware** 目录包含**中间件**文件 +- **models** 目录包含模型(ORM)文件 +- **routes** 目录包含**路由**文件 +- **services** 目录包含服务文件 +- **utils** 目录包含多个工具文件 +- **main.go** 是项目的入口文件,`README.md` 是项目的介绍文件。 + +```bash +├── configs +│ ├── config.yaml +│ └── db.yaml +├── controllers +│ ├── auth_controller.go +│ └── user_controller.go +├── middleware +│ ├── auth_middleware.go +│ └── logger_middleware.go +├── models +│ ├── db.go +│ ├── user.go +│ └── ... +├── routes +│ └── routes.go +├── services +│ ├── auth_service.go +│ └── user_service.go +├── utils +│ ├── response.go +│ └── ... +├── main.go +└── README.md + +``` + + + + + + + +### YAML + +[go-yaml/yaml: YAML support for the Go language. (github.com)](https://github.com/go-yaml/yaml) + +[官方文档](https://pkg.go.dev/gopkg.in/yaml.v3) + +YAML 全称是 ”YAML Ain’t a Markup Language” 的**递归**缩写,该语言的设计参考了 JSON / XML 和 SDL 等语言,强调以数据为中心,简洁易读,编写简单。 + +#### 语法特点 + +- **大小写敏感** +- 通过**缩进**表示层级关系 +- 禁止使用 tab 缩进,只能使用**空格**键 +- 缩进的空格**数目不重要**,只要相**同层级左对齐** +- 使用 # 表示注释 + +```bash +# 以下是yaml +languages: + - Ruby + - Perl + - Python +websites: + YAML: yaml.org + Ruby: ruby-lang.org + Python: python.org + Perl: use.perl.org + +# 以下是Json +{ + languages: [ + 'Ruby', + 'Perl', + 'Python' + ], + websites: { + YAML: 'yaml.org', + Ruby: 'ruby-lang.org', + Python: 'python.org', + Perl: 'use.perl.org' + } +} +``` + + + + + +#### 属性 + +- `omitempty` 是一个属性,用于指示该字段**是否**可以为空。如果这些字段没有值,它们将不会被序列化到 YAML 文件中 + + + + + + + + + +#### 使用说明 + +```go +func Marshal(in interface{}) (out []byte, err error) + +``` + + + + + + + +```go +package main + +import ( + "fmt" + "log" + + "gopkg.in/yaml.v3" +) + +var data = ` +a: Easy! +b: + c: 2 + d: [3, 4] +` + +// Note: struct fields must be public in order for unmarshal to +// correctly populate the data. +type T struct { + A string + B struct { + RenamedC int `yaml:"c"` + D []int `yaml:",flow"` + } +} + +func main() { + t := T{} + + err := yaml.Unmarshal([]byte(data), &t) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- t:\n%v\n\n", t) + + d, err := yaml.Marshal(&t) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- t dump:\n%s\n\n", string(d)) + + m := make(map[interface{}]interface{}) + + err = yaml.Unmarshal([]byte(data), &m) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- m:\n%v\n\n", m) + + d, err = yaml.Marshal(&m) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- m dump:\n%s\n\n", string(d)) +} +``` + + + +```yaml +--- t: +{Easy! {2 [3 4]}} + +--- t dump: +a: Easy! +b: + c: 2 + d: [3, 4] + + +--- m: +map[a:Easy! b:map[c:2 d:[3 4]]] + +--- m dump: +a: Easy! +b: + c: 2 + d: + - 3 + - 4 +``` + + + + + + + +### jwt + + + +#### 摘要 + +[golang-jwt/jwt: Community maintained clone of https://github.com/dgrijalva/jwt-go](https://github.com/golang-jwt/jwt) + +Starting with v4.0.0 this project adds Go module support + +在介绍 JWT 之前,我们先来回顾一下利用 `token` 进行用户**身份验证**的**流程**: + +1. 客户端使用用户名和密码请求登录 +2. 服务端收到请求,验证用户名和密码 +3. 验证成功后,服务端会签发一个 `token`,再把这个 `token` **返回**给客户端 +4. 客户端收到 token 后可以把它存储起来,比如放到 cookie 中 +5. 客户端**每次**向服务端请求资源时需要携带服务端签发的 token,可以在 `cookie` 或者 `header` 中携带 +6. 服务端收到请求,然后去验证客户端请求里面带着的 `token`,如果验证成功,就向客户端返回请求数据 + +这种基于 `token` 的认证方式相比传统的 `session` 认证方式更节约服务器资源,并且对移动端和分布式更加友好。其优点如下: + +[JWT 在线解码 - 开发工具箱 (box3.cn)](https://tool.box3.cn/jwt.html) + +```bash +eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJsaXF3ZXR0IiwiZXhwIjoxNjkzMjk1MDY3LCJpYXQiOjE2OTMyMDg2NjgsImlzcyI6ImRlbW8iLCJuYmYiOjE2OTMyMDg2Njh9.GWPbzwiNBsCuAeE_dbn21xjAlGpK7Xh683F4-X1NPJc + +{ + "alg": "HS256", + "typ": "JWT" +} + +{ + "aud": "liqwett", + "exp": 1693295067, + "iat": 1693208668, + # 发行人 + "iss": "demo", + "nbf": 1693208668 +} +``` + + + + + + + + + +#### 结构 + +JWT 由 3 部分组成:标头 (Header)、有效载荷 (Payload) 和签名 (Signature) + +Header + +**JWT 头**是一个描述 JWT 元数据的 JSON 对象,alg 属性表示签名使用的算法,默认为 HMAC SHA256(写为 HS256);typ 属性表示令牌的类型,JWT 令牌统一写为 JWT。最后,使用 Base64 URL 算法将上述 JSON 对象转换为字符串保存 + +```go +{ + "alg": "HS256", + "typ": "JWT" +} +``` + + + +Playload ---有效荷载部分 + +**默认情况下 JWT 是未加密的,因为只是采用 base64 算法,拿到 JWT 字符串后可以转换回原本的 JSON 数据,任何人都可以解读其内容,因此不要构建隐私信息字段,比如用户的密码一定不能保存到 JWT 中**,以防止信息泄露。 **JWT 只是适合在网络中传输一些非敏感的信息** + +jwt 指定七个默认字段共选择 + +```go +iss:发行人 +exp:到期时间 +sub:主题 +aud:用户 +nbf:在此之前不可用 +iat:发布时间 +jti:JWT ID用于标识该JWT + +``` + +也可以定义私有字段, 一般吧包含用户信息的数据放到`playload`中 + +```go +{ + "sub": "1234567890", + "name": "Helen", + "admin": true +} +``` + + + +signature + +- 需要指定一个密钥(secret)。该密码仅仅为保存在**服务器**中,并且**不能向用户公开**。 +- 使用 header 中指定的签名算法(默认情况下为 HMAC SHA256)根据以下公式生成签名 + +$\text{HMACSHA256}(\text{base}64\text{UrlEncode}(\text{header})+\text{“.”}+\text{base}64\text{UrlEncode}(\text{payload}),\text{secret})$ + +```go +``` + + + + + +在计算出签名哈希后,JWT 头,有效载荷和签名哈希的三个部分组合成一个字符串,每个部分用`.` 分隔,就构成整个 JWT 对象 + +```go +base64enc({ +"alg": "HS256", +"typ": "JWT" +}) +. +base64enc({ +"iss": "toptal.com", +"exp": 1426420800, +"company": "Toptal", +"awesome":true + }) +. +HMACSHA256( +base64enc(header)+ '.'+ base64enc(payload) +, secretKey ) + + +``` + + + +#### 签名算法 + +到目前为止,jwt 的签名算法有三种: + +- HMAC【哈希消息验证码 (对称)】:HS256/HS384/HS512 +- RSASSA【RSA 签名算法 (非对称)】(RS256/RS384/RS512) +- ECDSA【椭圆曲线数据签名算法 (非对称)】(ES256/ES384/ES512) + + + + + +#### jwt 产生的 token 还需要加密么 + +签名的目的是为了验证 JWT 的完整性和真实性。当服务器接收到 JWT 时,它可以使用相同的密钥对 JWT 进行解密和验证签名。如果签名验证成功,服务器可以相信 JWT 中的数据是可信的。 + +因此,一般情况下,JWT 的签名已经提供了足够的安全性,不需要额外的加密。然而,如果你对数据的保密性有更高的要求,你可以使用加密算法对载荷部分进行加密,然后将加密后的数据放入 JWT 的载荷中。 + + + +在传输 JWT 时可能会被其他人窃取,这确实存在一定的风险。JWT 本身是基于文本的,因此在传输过程中可能会被**截获或窃取**。 + +为了减轻这种风险,有几个常见的做法可以采用: + +1. 使用 HTTPS:使用 HTTPS 协议进行通信可以加密传输的数据,从而提供更高的安全性。这样,即使 JWT 被截获,攻击者也无法轻易解密和篡改其中的数据。 +2. 限制 JWT 的有效期:在生成 JWT 时,可以设置一个较短的有效期,使得 JWT 在一段时间后自动失效。这样即使 JWT 被截获,攻击者也只能在有效期内使用,有效期过后就无法继续使用。 +3. 避免在 JWT 中存储敏感信息:尽量避免将敏感信息直接存储在 JWT 的载荷中,特别是不要将密码等敏感凭据放在 JWT 中。如果需要传递敏感信息,可以考虑使用加密算法对敏感数据进行加密,然后将加密后的数据放入 JWT 的载荷中。 +4. 使用签名验证:在服务器端接收到 JWT 后,始终要进行签名验证,确保 JWT 的完整性和真实性。如果签名验证失败,说明 JWT 可能已被篡改,应该拒绝接受该 JWT。 + + + + + +#### 使用说明 + +```go +package main + +import ( + "fmt" + "github.com/golang-jwt/jwt/v4" +) +func main() { + // 创建秘钥 + key := []byte("aaa") + // 创建Token结构体 + claims := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ + "user": "zhangshan", + "pass": "123123", + }) + // 调用加密方法,发挥Token字符串 + signingString, err := claims.SignedString(key) + if err != nil { + return + } + fmt.Println(signingString) + + + // 根据Token字符串解析成Claims结构体 + _, err = jwt.ParseWithClaims(signingString, jwt.MapClaims{}, func(token *jwt.Token) (interface{}, error) { + fmt.Println(token.Header) + return []byte("aaa"), nil + }) + if err != nil { + fmt.Println(err) + return + } + + + +} + +//这边是输出结果 +&{ 0xc0000c2690 map[alg:ES256 typ:JWT] map[user:zhangshan] false} +// 这是加密后的字符串 +eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzIjoiMTIzMTIzIiwidXNlciI6InpoYW5nc2hhbiJ9.-2-xIJXMGKV-GyhM24OKbDVqWs4dsIANBsGhzXEfEFM + +``` + + + + + +### [structmapper (github.com)](https://github.com/wizardshan/structmapper) + + + +结构映射器 + +实际项目开发中,需要各个层的数据流转,entity 转换到 domain,domain 转换到 response,常见实现的方式基本都是通过反射机制实现,例如 Spring BeanUtils. copyProperties,Golang 的 copier 第三方库,反射的效率众所周知,基本都是惨不忍睹。 + +当然也可以手动一个个的赋值 + +```golang +type User struct { + ID int + Mobile string + Level int + Name string + RegisterTime time.Time +} + +func (u *User) Mapping (from *User) { + u.ID = from.ID + u.Mobile = from.Mobile + u.Level = from.Level + u.Name = from.Name + u.RegisterTime = from.RegisterTime +} +``` + +```go +//go:generate go run github.com/wizardshan/structmapper -toName User -fromName User -toPath ./response -fromPath ./domain -toVar resp -fromVar dom +//go:generate go run github.com/wizardshan/structmapper -toName Orders -fromName Orders -toPath ./response -fromPath ./domain -toVar resp -fromVar dom + + +package response + +type Users []*User + +type User struct { + ID int `json:"id"` + CreateTime DateTime `json:"createTime"` + UpdateTime *DateTime `json:"updateTime"` + DeleteTime *DateTime `json:"deleteTime"` + Mobile string `json:"mobile"` + Nickname string `json:"nickname"` + Money Money `json:"money"` + Level int `json:"level"` +} + + +package domain + +type Users []*User + +type User struct { + ID int + CreateTime time.Time + UpdateTime *time.Time + Mobile string + Nickname string + Money int +} + +func (dom *User) Level() int { + return 1 +} + + +user_mapping.go + +func (resp *User) Mapping(dom *domain.User) { + /**************** mapping start ****************/ + resp.ID = dom.ID + resp.CreateTime = DateTime(dom.CreateTime) + if dom.UpdateTime != nil { + updateTime := DateTime(*dom.UpdateTime) + resp.UpdateTime = &(updateTime) + } + + //resp.DeleteTime = fromStruct property not exist + resp.Mobile = dom.Mobile + resp.Nickname = dom.Nickname + resp.Money = Money(dom.Money) + resp.Level = dom.Level() + + /**************** mapping end ****************/ +} + + +orders_mapping.go + +func (resp *Orders) Mapping(dom domain.Orders) { + /**************** mapping start ****************/ + domOrdersLen := len(dom) + *resp = make(Orders, domOrdersLen) + if domOrdersLen > 0 { + for domOrdersIndex := 0; domOrdersIndex < domOrdersLen; domOrdersIndex++ { + domOrdersItem := dom[domOrdersIndex] + respOrder := new(Order) + respOrder.ID = domOrdersItem.ID + respOrder.Status = domOrdersItem.Status + respOrder.Consignee = domOrdersItem.Consignee + respOrder.Mobile = domOrdersItem.Mobile + respOrder.Province = domOrdersItem.Province + respOrder.City = domOrdersItem.City + respOrder.Expired = domOrdersItem.Expired() + + if domOrdersItem.Shop != nil { + respOrderShop := new(Shop) + respOrderShop.ID = domOrdersItem.Shop.ID + respOrderShop.Name = domOrdersItem.Shop.Name + respOrder.Shop = respOrderShop + } + + domOrdersItemItemsLen := len(domOrdersItem.Items) + respOrderItems := make([]*Item, domOrdersItemItemsLen) + if domOrdersItemItemsLen > 0 { + for domOrdersItemItemsIndex := 0; domOrdersItemItemsIndex < domOrdersItemItemsLen; domOrdersItemItemsIndex++ { + domOrdersItemItemsItem := domOrdersItem.Items[domOrdersItemItemsIndex] + respOrderItem := new(Item) + respOrderItem.ID = domOrdersItemItemsItem.ID + respOrderItem.Title = domOrdersItemItemsItem.Title + respOrderItem.Price = Money(domOrdersItemItemsItem.Price) + respOrderItems[domOrdersItemItemsIndex] = respOrderItem + } + } + + respOrder.Items = respOrderItems + (*resp)[domOrdersIndex] = respOrder + } + } + + /**************** mapping end ****************/ +} + +``` + + + + + + + + + +### hertz + + + + + +thriftgo是什么 + +`thriftgo` 是 Thrift 协议的 Go 语言实现。Thrift 是一种跨语言的服务框架,它可以帮助开发人员在不同的编程语言之间进行通信和数据交换。 + +`thriftgo` 是一个开源的项目,它提供了一个用于生成 Thrift 服务和客户端代码的 Go 语言库。使用 `thriftgo`,开发人员可以轻松地定义 Thrift 服务契约,生成服务端和客户端代码,并在不同的语言之间进行通信。 + +`thriftgo` 的主要特点如下: + +1. 支持多种语言:`thriftgo` 可以生成多种语言的代码,包括 Go、Java、C++、Python 等。 +2. 简单易用:`thriftgo` 提供了一个简单的 API,可以帮助开发人员快速生成 Thrift 服务和客户端代码。 +3. 高效:`thriftgo` 使用了 Thrift 协议的二进制编码方式,可以提高通信的效率。 +4. 可扩展:`thriftgo` 支持多种拓展功能,如可定制的生成代码、多种序列化方式等。 + +总之,`thriftgo` 是一个非常实用的工具,可以帮助开发人员快速实现跨语言的通信和数据交换。 + + + + + +protoc是什么 + +`protoc` 是 Protocol Buffers 协议的编译器,它用于将定义的 Protocol Buffers 协议文件(.proto 文件)转换成对应的编程语言代码,如 Java、C++、Python 等。Protocol Buffers 是一种用于数据交换的二进制格式,它可以在不同的编程语言和平台之间进行数据交换。 + +`protoc` 是一个命令行工具,可以在命令行中使用,也可以在代码中调用。使用 `protoc` 可以极大地简化 Protocol Buffers 协议的使用,减少代码的耦合度,提高代码的可读性和可维护性。 + +使用 `protoc` 编译 Protocol Buffers 协议文件的语法如下: diff --git a/_posts/byte_tech/2023-08-17-test.md b/_posts/byte_tech/2023-08-17-test.md new file mode 100644 index 0000000..5132482 --- /dev/null +++ b/_posts/byte_tech/2023-08-17-test.md @@ -0,0 +1,190 @@ +--- +layout: blog +banana: true +category: byte_tech +title: "Go_" +date: 2023-08-17 10:11:09 +background: green +tags: +- byte_tech +- go +--- + +* content +{:toc} +#### 三、测试 + +测试是避免事物的最后一道屏障。 + +- 回归测试 +- 集成测试 +- 单元测试 + +从上到下,覆盖率逐层变大,成本却逐层降低 + + + +Go 语言内置有对单元测试的支持,主要通过 testing 包实现。 + +- 所有测试文件以`_test.go`结尾 +- `func TestXxx(t *testing.T)` +- 初始化逻辑放到`TestMain`中 + + + +```go +func Add(a int, b int) int{ + return a+b +} + +func TestAdd(t *testing.T) { + output:=Add(1, 2) + expectOutput:=3 + if output != expectOutput{ + t.Error("Add failed") + } +} + +``` + + + +#### assert + +- Go 语言内置的 testing 包提供了 assert 包来进行单元测试的断言,assert 能大大简化测试代码,不需要过多的 if 条件判断,只要最终结果不符合断言,就会自动标记为测试失败。 + +```go +package Test + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func Add(a int, b int) int { + return a + b +} + +func TestAdd(t *testing.T) { + output := Add(1, 2) + expectOutput := 3 + assert.Equal(t, expectOutput, output) +} + +``` + + + + + + + + + + + +性能优化与软件质量 + +- 软件质量至关重要 +- 在保证接口**稳定**的前提下改进具体实现 +- 测试用例: 覆盖尽可能多的场景,方便回归, 测试驱动开发 +- 文档:做了什么,没做什么,能达到怎样的效果 +- 隔离:通过选项控制是否开启优化 +- 可观测:必要的日志输出 + + + + + + + +自动内存管理主要管理的是`动态内存`,`动态内存`指的是程序在运行时根据需求动态分配的内存,比如 C 语言中的 `malloc()` 函数分配的内存。 + +自动内存管理也称为`垃圾回收`,主要目的是由程序语言的运行时系统管理动态内存,这样做有以下两方面的好处: + +- 避免手动内存管理,专注于实现业务逻辑 +- 保证内存使用的正确性和安全性,比如 `C` 语言中的内存多次释放:`double-free problem`, 释放后再次使用 `use-after-free problem`。 + +由此可见,手动释放内存存在很多问题,如果使用不当的话,可能会引起程序的崩溃、漏洞,而自动内存管理可以帮我们自动处理这些问题。 + +自动内存管理有 3 个主要的核心任务: + +1. 为新对象分配空间 +2. 找到存活对象 +3. 回收死亡对象的内存空间 + + + + + + + +#### 基本概念 + +- `Mutator`:业务线程,分配新对象,修改对象指向关系 +- `Collector`:GC 线程,找到存活对象,回收死亡对象的内存空间 +- `Serial GC`:只有一个 `collector`,会暂停 (STW) +- `Parallec GC`:支持多个 `collectors` 同时回收 `GC` 算法,会暂停 (STW) +- `Concurrent GC`:`mutator(s)` 和 `collector(s)` 可以同时执行,`Collectors` 必须感知对象指向关系的改变。 + + + + + +#### gc 算法 + +接下来将介绍两种常见的 `GC` 相关的技术: + +- 追踪垃圾回收 (Tracing garbage collection) +- 引用计数 (Reference counting) + + + +#### 追踪垃圾分类 + +追踪垃圾回收,当一个对象的指针指向关系**不可达**的时候,该对象就要被回收了。 + +追踪垃圾回收算法垃圾回收步骤: + +1. 标记根对象 + - 标记包括 静态变量、全局变量、常量、线程栈等 +2. 标记:找到可达对象 + - 求指针指向关系的传递闭包:从根对象触发,找到所有可达对象 +3. 清理:所有不可达对象 + - 将存活对象复制到另外的内存空间 (`Copying GC`) + - 将死亡对象的内存标记为” 可分配 “(`Marking-sweep GC`) + - 移动并整理存活对象 (`Mark-compact GC`) + +清理策略有很多种,在实际清理的时候应该根据对象的生命周期,使用不同的标记和清理策略。 + + + +#### 分代 gc + +`分代GC`(`Generational GC`) 是一种常见的内存管理方式,思想是基于分代假说 (`Generational hypothesis`)—— 大多数对象很快就死掉了 (`most objects die young`),很多对象在分配出来后很快就不再使用了。 + +每个对象都有年龄,也就是对象经历过 `GC` 的次数,比如经历了 2 次 `GC` 那么他的年龄就为 2。 + +`分代GC` 根据对象年龄的不同,把对象放在不同的区域,年轻代对象放在 `Young Generation` 区域,老年代放在 `Old Generation` 区域,这样做的目的为对年轻和老年的对象,制定不同的 `GC策略`,降低整体内存管理的开销。 + +`年轻代`为常规的对象分配,由于存活对象很少,可以采用 `copying collection算法`,GC 吞吐量很高。 + +`老年代`内对象趋向于一直活着,反复复制开销较大,可以采用 `mark-sweep collection算法`。 + + + +#### 引用计数 + +引用计数管理内存的方式为每个对象都有一个与之相关联的引用数目,对象存活的条件为当且仅当引用数大于 0。 + +引用计数管理内存的优点如下: + +- 内存管理的操作被平摊到程序执行过程中 +- 内存管理不需要了解 `runtime` 的实现细节,有一些库可以帮助实现引用计数,比如 `C++` 智能指针 (`smart pointer`)。 + +当然引用计数也有缺点: + +- 维护引用计数的开销较大:通过原子操作保证对引用计数操作的原子性和可见性 +- 无法回收环形数据结构 ——`weak reference` +- 内存开销:每个对象都引入的额外内存空间存储引用数目 +- 回收内存时可能引发暂停 —— 大的数据结构 diff --git a/_posts/byte_tech/2023-08-18-hole.md b/_posts/byte_tech/2023-08-18-hole.md new file mode 100644 index 0000000..e1c172e --- /dev/null +++ b/_posts/byte_tech/2023-08-18-hole.md @@ -0,0 +1,144 @@ +--- +layout: blog +banana: true +category: byte_tech +title: "漏洞" +date: 2023-08-18 12:59:58 +background: green +tags: +- byte_tech +- go +--- + +* content +{:toc} + + + + + + + + + + +### 服务端漏洞 + + + +#### 安全事件 + +- 数据泄漏 +- 服务瘫痪 +- 成果失窃 +- 系统劫持 + + + + + +#### SQL注入 + +SQL语句静态模板和动态数据部分没有严格区分,如果在数据项中加入了某些SOL语句关键字(比如说SELECT、DROP等等),这些SQL语句就很可以在数据库写入或读取数据时得到**执行**. + + + +防护方式: + +- 1.尽量不要基于DB的Raw方法拼接构造SQL语句,而应该使用预编译、ORM框架 +- 2.使用ORM框架时,应该注意框架中的特性,可能存在不安全的写法导致的SQL注入问题. +- 3.在复杂场景一定要使用拼接SQL,需要对外部输入进行**转义**. + + + +#### 命令执行 + +代码中遇到需要调用某个命令才能完成的功能时候, 会涉及到命令拼接, 如果命令拼接没有做好安全过滤, 那么将会导致命令注入风险, 服务器权限将会被控制 + +防护方式: + +- 1.对动态的值尽可能设置白名单进行验证. +- 2.如果某些位置无法白名单,需要尝试对数据类型进行校验. +- 3.特殊字符黑名单的过滤,或者转义. + + + + + +#### 越权漏洞 + +- 未授权 +- 水平越权 +- 垂直越权 + + + + + +#### SSRF + +SSRF又称服务端请求伪造攻击,指攻击者利用后端服务器为跳板,让后端服务向非预期网络地址(主要指内网地址)发出恶意请求,获取敏感信息或执行恶意操作. + +实例: 设置头像, 输入一个网址 + + + + + +#### 文件上传漏洞 + +防护方案: + +- 1.限制文件类型:如果系统只需要图片类型, 可以从服务端解析文件格式, 限制只能传入特定的文件格式. +- 2.站库分离:应用部署的位置和上传的文件分离, 一般可以使用TOS、OSS等进行文件存储. +- 3.防止图床:对图片访问链接进行限制,包括时间限制, 访问身份限制等. + + + + + + + +### 客户端漏洞 + +#### 开放重定向 + +开放重定向: 某些需要重定向到其他站点的功能, 往往在参数中携带需要重定向的URL, 但实际程序逻辑没有控制好重定向的范围, 导致攻击者可以构造恶意链接, 诱导用户重定向到恶意站点. + +危害:钓鱼攻击. +修复方案:对重定向严格进行白名单控制并正确校验匹配白名单. + + + + + +#### XSS + +防护方法: + +- 1.输入过滤:对输入的特殊字符进行拦截,禁止前端提交**特殊字符** +- 2.输出过滤: + a.当字符输出到Dom时候,对危险字符进行html encode,避免XSS. + b.使用vue/react等框架时候,避免使用危险指令,而应该使用安全指令.v-html/v-text +- 3.富文本场景:比如文章发布场景,本身是需要提供富文本功能,这时候需要严格限制tag和attribute,可以在代码层面做白名单或者黑名单. + +- 4.CSP:用于缓解XSS,理念是对当前站点允许加载什么源的资源、发送什么请求能进行限制. + + + + + + + +#### CSRF + +跨站请求伪造(CSRF): 允许攻击者诱导用户访问恶意链接,执行用户非预期执行的操作. +危害: 用户执行敏感操作,如关注其他用户,或者更改账号的安全邮箱等. + +防护方式: 防护的**核心**是判断请求的来源 + +- CSRF tokens: **首次**访问时候给客户端传递一个token, 客户端每次访问时候都**必须带上**此 token 才能访问. +- SameSite cookies: Strick -> Lax(Default) -> None.核心是禁止某些场景发送第三方cookie. +- Referer-based validation:校验 Referer来源是否是合法站点. + 思考:大厂微服务场景,CSRF防护应该怎么做? + diff --git a/_posts/byte_tech/2023-08-24-zero-copy.md b/_posts/byte_tech/2023-08-24-zero-copy.md new file mode 100644 index 0000000..0f82560 --- /dev/null +++ b/_posts/byte_tech/2023-08-24-zero-copy.md @@ -0,0 +1,42 @@ +--- +layout: blog +banana: true +category: byte_tech +title: "Go_深入浅出零拷贝及应用" +date: 2023-08-24 16:12:16 +background: green +tags: +- byte_tech +- go +--- + +* content +{:toc} +深入浅出零拷贝及应用 + + + +当我们读取文件时 + +磁盘读取数据====>内核=====>应用程序 + +这还伴随着 **用户态** 和 **内核态** 的转换, (数字越小, 权限越高) + + + +当从磁盘读取到, `socket`时 + +- 磁盘读取数据====>内核=====>应用程序 +- 应用程序====>内核=====>网卡 + +#### 零拷贝的实现方式 + +DMA 传输 + +- 直接内存访问(DMA)允许设备直接访问内存,绕过 CPU。 +- 避免了 CPU 的介入,提高了数据传输速度。 + +文件描述符传递 + +- 文件描述符传递是 UNIX 系统中实现零拷贝的方式之一。 +- `sendfile` 和 `splice` 系统调用是典型的例子。 diff --git a/_posts/byte_tech/2023-0823-go-quick-book.md b/_posts/byte_tech/2023-0823-go-quick-book.md new file mode 100644 index 0000000..909fdc6 --- /dev/null +++ b/_posts/byte_tech/2023-0823-go-quick-book.md @@ -0,0 +1,2441 @@ +--- +layout: blog +banana: true +category: byte_tech +title: "Go_quick_book" +date: 2023-08-23 20:26:16 +background: green +tags: +- byte_tech +- go +--- + +* content +{:toc} + + + + +### 1 变量 + +- **函数外**的每个语句都**必须**以关键字开始(var、const、func等) +- `:=`不能使用在函数外。 +- _多用于占位,表示忽略值。 +- + +Go 语言是一种静态类型的编程语言,它提供了以下基本类型:Go 语言要求标识符以**一个字母或下划线**开头,后面可以跟任意数量的字母、数字、下划线。不能使用关键字作为标识符 + +- 布尔类型:bool +- 数字类型:int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64, complex64, complex128 +- 字符串类型:string +- 字符类型:rune (用于表示 Unicode 字符) +- 错误类型:error +- 指针类型:*T (T 为任意类型) +- 数组类型:[n] T (n 为数组长度,T 为元素类型) +- 切片类型:[] T (T 为元素类型) +- **字典**类型:map [K] V (K 为键类型,V 为值类型) +- 结构体类型:struct +- 接口类型:interface +- 函数类型:func +- 通道类型:chan T (T 为元素类型) + + + +#### 1.1 基础类型 + +- 类型**不需要导入** +- 可以使用 `const`修饰 +- **短变量声明**是一种简洁的变量声明方式,用于**同时声明和初始化**变量。但是这种方式**只能在函数内部使用**,不能在函数外部使用。当在函数外部声明变量时,只能使用 `var` + +```go +var b, c int = 1, 2 +var e float64 + +// 短变量声明 +f := a + +// 同时声明多个变量 +var i, j, k = 2, false, "asd" + +// 数组 +var a [5]int +b := [5]int{1, 2, 3, 4, 5} + +// 多维数组 +var twoD [2][3]int +``` + + + + + +#### 1.2 常量 + +- 常量的声明方式和变量差不多,区别在于常量需要用 `const` 关键字修饰,不能使用`:=` 进行声明。 + +```go +const num int = 555 +``` + + + + + + + +#### 1.3 string + +- `string` 类型用于表示文本字符串。它是一种**不可变**的序列,由多个 Unicode 字符组成,并使用**双引号** `"` 或**反引号** ` ` ` 包围。 +- 由于字符串是**不可变**的,如果需要对大量的字符串进行拼接操作,最好使用 `bytes.Buffer` 或 `strings.Builder` 类型,以提高性能和效率。 +- Go 语言中要定义一个多行字符串时,就**必须**使用**反引号**字符 + +```go +s1:= `第一行 +第二行 +第三行` +fmt.Println(s1) +``` + + + + + +| 方法 | | +| ------------------------------------ | -------------- | +| len(str) | 求长度 | +| +或ft.Sprintf | 拼接字符串 | +| strings.Split | 分割 | +| strings.contains | 判断是否包含 | +| strings.HasPrefix, strings.HasSuffix | 前缀/后缀判断 | +| strings.Inde(), strings.LastIndex0 | 子串出现的位置 | +| strings.Join(a[]string,sepstring) | join妈 | + + + +string包和 strings包有什么区别和联系 + +`strings` 包是 Go 语言的标准库,它提供了一些与字符串相关的函数和方法,例如字符串拼接、替换、切片等。 + +`string` 包是 Go 语言的基础数据类型,它表示一个固定长度的字符序列。与其他语言中的字符串不同,Go 语言中的字符串是不可变的,一旦被创建,就不能修改。 + + + + + +#### 1.4 字符 + +组成每个字符串的元素叫做 “字符”,可以通过遍历或者单个获取字符串元素获得字符。 字符用**单引号** (’) 包裹起来 + +Go 语言的字符有以下两种: + +1. `uint8` 类型,或者叫 byte 型,代表了 ASCII 码的一个字符。 +2. `rune` 类型,代表一个 UTF-8 字符。 + + + +```go +a :='中' +b :='x' +``` + +要修改字符串,需要先将其转换成 [] rune 或 [] byte,完成后再转换为 string。无论哪种转换,都会重新分配内存,并复制字节数组。 + +```go + +func changestring(){ + s1 := "big" + // 强制类型转换 + bytes1 := []byte(s1) + bytes1[0]='p fmt.Println(string(bytes1)) + s2:="白萝卜" + runes2:=[]rune(s2) + runes2[0]='红fmt. Println(string(runes2)) +} +``` + + + +#### 1.5 数值类型 + +整数类型分为: + +- 有符号数:`int`、`int8`、`int16`、`int32 (rune)`、`int64` +- 无符号数:`uint`、`uint8 (byte)`、`uint16`、`uint32`、`uint64`、 +- 其中,`uint8 `就是我们熟知的 byte 型,int16 对应 C 语言中的 short 型,int64 对应 C 语言中的 long 型。 + +| 类型 | 描述 | +| ------ | ------------------------------------------------ | +| uint8 | 无符号8位整型(o到255) | +| uint16 | 无符号16位整型(o到65535) | +| uint32 | 无符号32位整型(o到4294967295) | +| uint64 | 无符号64位整型(o到18446744073709551615) | +| int8 | 有符号8位整型(-128到127) | +| inti6 | 有符号16位整型(-32768到32767) | +| int32 | 有符号32位整型(-2147483648到2147483647) | +| int64 | 有符号64位整型(-9223372036854775808到92233部@6谱 | + + + +#### 1.6 类型转换 + +**使用表达式 `T(v)` 将变量 v 的值的类型转换为 T**。注意是转换的是 **变量的值**,变量本身的类型不变。 + +```go +c := int(52.6) + +``` + + + +#### 1. 生命周期 + +Go 语言中没有像其他一些编程语言(如 C++、Java 等)中那样的块级作用域。也就是说,Go 语言中没有在大括号内定义的生命周期。 + +在 Go 语言中,变量的生命周期是由它们的作用域决定的。Go 语言中的作用域分为两种:文件作用域和函数作用域。在文件作用域中,变量的生命周期从文件开始到文件结束。在函数作用域中,变量的生命周期从函数开始到函数结束。 + +因此,如果您想在一个大括号内定义一个变量的生命周期,您需要使用嵌套的函数或者其他的代码结构来实现。例如,您可以使用一个内部函数来定义一个变量的生命周期,并在外部函数中调用它。 + +总的来说,虽然 Go 语言中没有块级作用域,但它提供了其他的方法来控制变量的生命周期,并且这些方法通常更加简单和直观。 + + + +### 2 高级变量 + +#### 引用类型 + +Go 语言中的引用类型是指一种**特殊**的变量类型,它存储的不是值本身,而是对值的一个引用。当您使用引用类型变量时,实际上是在**操作**它所引用的值。 + +Go 语言中有三种引用类型: + +- 指针:指针是一种特殊的变量类型,它存储的是一个值的地址。通过指针,您可以操作它所指向的值。 +- 切片:切片是一种引用类型,它存储的是一组值的引用。通过切片,您可以操作它所引用的一组值。 +- 字典:字典是一种引用类型,它存储的是一组键值对的引用。通过字典,您可以操作它所引用的一组键值对。 + +与值类型不同,引用类型变量存储的是对值的引用,而不是值本身。这意味着,如果您修改了引用类型变量所引用的值,那么其他引用该值的变量也会看到**修改**的效果。 + +**数组** array 类型是**值类型**,那么在使用相同的类型的变量初始化另一个变量时,两个变量**互不影响** + + + + + + + +#### 数组 + +- 数组长度必须是常量,且是类型的组成部分。一旦定义,长度不能变。 +- 访问越界,如果下标在数组合法范围之外,则触发访问越界,会panic +- 传递数组到函数中时,实际上是传递了数组的**副本**。因此,在函数中修改数组的值**不会影响**原数组的值。 + +```go +a := [3]int{1, 2} // 未初始化元素值为 0。 +b := [...]int{1, 2, 3, 4} // 通过初始化值确定数组长度。 + + +func printArr(arr *[5]int) { + arr[0] = 10 + for i, v := range arr { + fmt.Println(i, v) + } +} + +``` + + + + + + + + + + + + + + + + + +#### 切片---可变的数组 + +- 声明切片和声明数组类似,但是**不指定长度**: +- `append, len, cap`是全局函数, 不是方法 + +```go +// 声明一个 int 类型, 名为 a的切片 +// a == nil +var a []int + +// b != nil, 以下两个形式等价 +b := []int {} +var s1 []int = []int{} + +// 可以在声明的时候直接初始化 +var a = []int {1, 2, 3, 4} + +// 短变量声明 +a := []int {1, 2, 3, 4} + + +// 使用 make 函数可以在创建切片时指定长度和容量。 +// 创建一个 //[0 0 0 0 0] len = 5 cap = 5 +a := make([]int, 5) + +// 从数组或者切片中 获取切片 +// 前闭后开 [), 因此相减就是数组长度 +a := [5]string {"a", "b", "c", "d", "e"} //数组 +b := []int {1, 2, 3, 4} //切片 +sliA := a[2:4] // [c d] +sliB := b[1:3] // [2 3] + + +// 获取长度 +len (a) +// 获取容量 +cap(s) + + +// 多维切片 +ss := [][]int { + []int {1, 2, 3}, //切片元素的类型可以省去 + []int {4, 5, 6}, + []int {7, 8, 9}, +} + + +// 复制切片 +// dst 是目标切片,src 是源切片,该函数会将 src 中的元素复制到 dst 中,并返回复制的元素个数(该返回值是两个切片长度中的小值) +func copy(dst []Type, src []Type) int + +``` + + + + + +#### 切片的容量 + +前面提到:切片为我们提供了 “动态数组”。但该 “动态数组” 并不是真正意义上的能扩展长度的动态数组。 + +**切片并不存储任何数据,它只是一个引用类型,切片总是指向一个底层的数组,描述这个底层数组的一段。** + +```go +package main + +import "fmt" + +func main() { + array := [5]string {"aa", "bb", "cc", "dd", "ee"} //数组 + fmt.Println(array) //[aa bb cc dd ee] + + slice1 := array[0:2] //切片1 + slice2 := array[1:3] //切片2 + slice3 := array[2:5] //切片3 + + fmt.Println(slice1) //[aa bb] + fmt.Println(slice2) //[bb cc] + fmt.Println(slice3) //[cc dd ee] + + slice1[0] = "xx" //修改切片1中的值 + slice2[1] = "yy" //修改切片2中的值 + slice3[2] = "zz" ////修改切片3中的值 + + fmt.Println(array) //[xx bb yy dd zz] + fmt.Println(slice1) //[xx bb] + fmt.Println(slice2) //[bb yy] + fmt.Println(slice3) //[yy dd zz] +} + +``` + + + +#### 切片扩容过程 + +- 在 Go 语言中,当切片添加的元素数量超过了底层数组的容量时,切片会发生扩容,即系统会**创建**一个新的底层数组,并将原来的元素复制到新数组中。这是由于切片的底层数组具有自动扩容的特性。 + +- 具体来说,当切片的容量不足以容纳新添加的元素时,Go 语言会按照一定的策略(**通常是成倍增加容量**)重新分配底层数组,并将原来的元素复制到新的底层数组中。这意味着在添加元素过程中,可能会涉及内存的重新分配和数据的复制操作,因此可能会导致性能上的开销。 + + 需要注意的是,扩容过程不会改变原来切片的引用,而是返回一个新的切片,因此我们在使用切片时需要使用扩容后的新切片来接收扩容后的结果。 + +#### 初始切片 + +- 切片的零值是 `nil`,当声明一个切片,但不出初始化它,该切片便为 `nil` 切片。`nil` 切片的长度和容量为 0 且没有底层数组。 + +```go +func main() { + var s []int + fmt.Println(s, len(s), cap(s)) + if s == nil { + fmt.Println("s切片是nil切片") + } +} + +``` + + + + + + + +#### map + +- 无序的 +- Go 语言中使用 for range 遍历 map。 + +```go +var mp = map[string]int {"数学":100, "语文":90, "Go":100} + +// 可以先声明再使用,注意这样需要使用 make 函数初始化后才能使用: +var scores map[string]int +scores = make(map[string]int) + + +// 建议这样直接写 +m := make(map[string]int) + +// 增加键值对 +// 当 key 不存在时为增加,当 key 存在时为修改 +scores["数学"] = 100 + +// 删除键值对 +delete(scores, "语文") + +// 查找 +// 如果查找的 key 不存在,则会返回 value 类型的 “零值”: +score, exist := scores["数学"] //使用两个返回值 +fmt.Println(score, exist) //100 true + +score1 := scores["语文"] //使用一个返回值 +fmt.Println(score1) //90 + +score2, exist2 := scores["Java"] //查找不存在的key +fmt.Println(score2, exist2) //0 false + + +// 获取数量 +keyNum := len(scores) //获取scores这个map中key的数量 + + +// Go 语言中使用 for range 遍历 map。 +for key, value := range scores { + fmt.Println(key, value) +} + +// 只想遍历 key +for k := range scoreMap { + fmt.Println(k) +} + +``` + + + +#### map 也是引用 + +`map` 也是引用类型,则意味着,如果有几个 `map` 同时指向一个底层 `map`,其中一个 `map` 改变某个键值对,那么其他的也会做出同样的改变(因为底层 `map` 变了)。 + +```go +package main + +import "fmt" + +func main() { + map0 := make(map[string]string) //底层map0 + map0["name"] = "XingXiaoguan" //增加一个键值对 + + //map1 map2 引用map0 + map1 := map0 + map2 := map0 + + fmt.Println(map0["name"], map1["name"], map2["name"]) //都是XingXiaoguan + + map1["name"] = "XingRenGuanXue" //改变map1的name对应的值 + fmt.Println(map0["name"], map1["name"], map2["name"]) //全部变为XingRenGuanXue +} + +``` + + + + + +#### 指针 和 new + +- 和 `C`中的很像 +- 区别于 C/C++ 中的指针,Go 语言中的指针**不能进行偏移和运算**,是安全指针。 +- 当一个指针被定义后没有分配到任何变量时,它的值为 nil + +```go +// p == nil +var p *int +var a int = 66 //a是值为66的int变量 +p = &a //将a的地址赋给指针p +var b = *p //根据p中的值找到a,将其值赋给b +fmt.Println(b) //66 + +*p = 99 //根据p中的值找到a,改变a的值 +fmt.Println(a) //99 + + + +``` + + + + + +- new 是一个内置的**函数** +- 并且创建后内存对应的值为**类型零值** + +```go +func new(Type) *Type + +p := new(dog) +fmt.Printf("%T\n", p) //*main.dog +fmt.Println(p) //&{ 0} +fmt.Println(*p) //{ 0} +``` + + + +#### make + +- make 也是用于内存分配的,区别于 new,它只用于 slice、map 以及 chan 的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型 +- 是内置函数 + +```go +func make(t Type, size ...IntegerType) Type + +var b map[string]int +b = make(map[string]int, 10) +``` + + + + + +#### 结构体 + +- struct 在方法中传参时是值类型而非引用类型,所以当需要在方法内改变这个对象的字段值时,应该使用的是 struct 变量的指针,而非 struct 变量。 + +```go +type 结构体名字 struct { + 字段名1 类型1 + 字段名2 类型2 + ... +} + +type man struct { + name string + age int +} + +var a human +a.name = "zhang san" +a.age = 14 + +// 直接赋值 +// 按顺序赋值 +a :={"zhagnsan", 14} +a := {age:3, name:"zhang san"} +``` + + + +#### 结构体指针 + +```go +d := dog{"哮地犬", 2} +p := &d //获取到d的地址 +n := (*p).name +fmt.Println(n) //哮天犬 +// 上面的方式比较麻烦, Go 语言提供了隐式间接引用: +n := p.name //这样也行 +fmt.Println(n) + +``` + + + + + +#### 结构体嵌套 + +- 一个结构体也可以作为另一个结构体的字段 + +```go +package main + +import "fmt" + +type score struct { + English int + Chinese int +} + +type people struct { + name string + age int + grades score +} + +func main () { + a := people {"zhangsan", 18, score {English: 90, Chinese: 95}} + fmt.Println (a) //{zhangsan 18 {90 95}} + fmt.Println (a.grades.English) //90 + fmt.Println (a.grades.Chinese) //95 +} + +``` + + + +使用匿名字段, 它是指只提供类型,不写字段名: + +```go +package main + +import "fmt" + +type score struct { + English int + Chinese int +} + +type people struct { + name string + age int + score +} + +func main () { + a := people {"zhangsan", 18, score {English: 90, Chinese: 95}} + fmt.Println (a) //{zhangsan 18 {90 95}} + fmt.Println (a.English) //90 + fmt.Println (a.Chinese) //95 + +} + +``` + + + +#### interface + +- 为了保护你的 Go 语言职业生涯,请牢记接口(interface)是一种**类型**。 + +Go 语言中的接口(interface type)是一种抽象的数据类型,它定义了一组**方法签名**,但不具体实现这些方法。接口只定义了方法的外部行为,而不关心方法的内部实现。 + +在 Go 语言中,接口是通过关键字 `interface` 来定义的。一个接口定义了一组方法签名,这些方法签名**必须**在任何实现该接口的类型中实现。 + + + +```go +type 接口类型名 interface{ + 方法名1( 参数列表1 ) 返回值列表1 + 方法名2( 参数列表2 ) 返回值列表2 + … +} +``` + + + + + +例如,下面是一个简单的接口定义: + +```go +type MyInterface interface { + Method1() + Method2() +} +``` + +这个接口定义了两个方法签名 `Method1` 和 `Method2`。任何实现这个接口的类型都必须实现这两个方法。 + +在 Go 语言中,接口是一种类型,可以像其他类型一样被使用。您可以定义变量、常量和数组等,它们的类型都是接口。 + +例如,下面是一个使用接口的示例: + +```go +type MyImplementation struct {} + +func (m MyImplementation) Method1() { + // implementation of Method1 +} + +func (m MyImplementation) Method2() { + // implementation of Method2 +} + +var myVar MyInterface = MyImplementation{} +``` + +在这个示例中,我们定义了一个类型 `MyImplementation`,它实现了接口 `MyInterface`。我们还定义了一个变量 `myVar`,它的类型是接口 `MyInterface`,并将其赋值为一个 `MyImplementation` 类型的值。 + +通过使用接口,我们可以将不同的类型统一起来,使它们能够以相同的方式进行交互。这有助于实现代码的模块化和可复用性。 + +总之,接口是 Go 语言中一种非常重要的类型,它们可以帮助您实现抽象和多态性,提高代码的灵活性和可复用性。 + + + +Go 语言中的接口类似于 C++ 中的**接口类**的概念。在 C++ 中,接口类是一个抽象基类,它定义了一组**纯虚函数**,这些函数需要在任何继承该接口类的类中实现。与 C++ 中的接口类类似,Go 语言中的接口也是一种抽象的数据类型,它定义了一组方法签名,但不具体实现这些方法。任何类型都可以实现一个或多个接口,从而使其具有接口定义的方法。 + +与 C++ 中的接口类不同的是,Go 语言中的接口不能继承,也不能包含数据成员。Go 语言中的接口更加简单和轻量级,它们只定义了方法签名,而没有任何其他的实现细节。这使得 Go 语言中的接口更加灵活和易于使用,同时也使得代码更加简洁和易于维护。 + + + + + + + +### 流程控制--- 没有括号 与 下划线 + +#### if + +```go +if { // 必须和 if 在同一行 + +}else{// else 必须在 { 后面 +} + +} +``` + +if 还有一种特殊的写法,可以在 if 表达式之前添加一个**执行语句**,再根据变量值进行判断,代码如下: + +```go +if err := Connect(); err != nil { + fmt.Println(err) + return +} +``` + +登录后复制 + +#### for + +```go +for 初始化语句; 条件表达式; 后置语句 { + //循环体代码 +} + +``` + +`for` 循环的另一种形式,在某种数据类型的**区间**(range)上遍历,如字符串或切片。 + +```go +func main() { + s, sep := "", "" + for _, arg := range os.Args[1:] { + s += sep + arg + sep = " " + } + fmt.Println(s) +} +``` + + + + + +#### switch + +```go +switch 变量 { + case 选项1 : + //操作1代码 + case 选项2 : + //操作2代码 + case 选项3 : + //操作3代码 + case 选项n: + //操作n代码 + default : + //默认操作 +} + +``` + + + + + + + +#### 下划线 + +- **import 下划线**(如:`import _ hello/imp`)的作用:当导入一个包时,该包下的文件里所有 init () 函数都会被执行,然而,有些时候我们并不需要把整个包都导入进来,仅仅是是希望它执行 init () 函数而已。这个时候就可以使用 import引用该包。即使用【import _ 包路径】只是引用该包,仅仅是为了调用 init () 函数,所以无法通过包名来调用包中的其他函数。 +- 代码中: 忽略这个变量. + + + + + + + + + + + + + +### 函数和方法 + +#### 函数 + +- 类型在变量名后 +- 如果你有多个**参数**的类型相同,你可以进行简写,只需要在这几个相同的参数**最后写一遍**类型即可。 +- 函数可以有 **0 个或多个返回值**。和参数不同,有几个返回值就写几个返回值类型,不能简写。 + +```go +package main + +import "fmt" + +func add(x int, y int) int { + return x + y +} + +func main() { + fmt.Println(add(1, 2)) +} + +``` + + + +通过给返回值进行**命名**,使用空 `return` 语句,这样会直接返回已命名的返回值。 + +```go +func sumAndDiff(x, y int) (sum int, diff int) {//提前命名返回值 + sum = x + y + diff = x - y //返回值在函数中被初始化 + return //返回值已经初始化了,不需要再在return语句中写变量了 +} +``` + + + +#### 导出 + +- 在 Go 语言中,如果一个名字以大写字母开头,那么它就是已导出的,这意味着别的包可以使用它。(相当于 Java 中的 `public` 的作用) +- 比如我们常用的打印函数 `fmt.Println(...)`,可以看到 `Println()` 的首字母是大写的,所以我们能够导入 `fmt` 包后使用该方法。 + + + + + +#### 函数重载 + +Go 语言支持函数重载,但是它的方式与其他语言有所不同。 + +在 Go 语言中,函数重载是通过不同的函数签名来实现的。函数签名是指函数的名称、参数类型和顺序。如果两个函数具有不同的函数签名,那么它们就可以被认为是重载的函数。 + +例如: + +```go +func myFunction(a int) { + // implementation here +} + +func myFunction(a int, b string) { + // implementation here +} +``` + +在这个例子中,`myFunction` 函数被重载了两次,一次只有一个整数参数,另一次有一个整数参数和一个字符串参数。 + +需要注意的是,Go 语言中函数的**返回类型**并不是函数签名的一部分,因此不能通过返回类型来实现函数重载。 + +总的来说,Go 语言的函数重载是通过函数签名来实现的,这与其他语言有所不同,但是它仍然是一种非常强大的功能,可以帮助我们更好地组织代码。 + + + + + + + + + + + + + + + +#### 方法 + +- Go 中也有类似于面向对象中方法的概念,也叫方法(`method`),这种方法其实是一种**特殊的函数**(`function`)—— 带有接收者(`receiver`)的函数。 +- 通过`.` 可以调用方法 +- 通过交换`函数名`以及 `函数参数`来区分函数以及方法 +- 有点类似于传入指针 + +```go +package main + +import "fmt" + +type dog struct { + name string +} + +func (d dog) say() {//方法 + fmt.Println(d.name + " 汪汪汪。。。方法") +} + +func main() { + d := dog{"哮天犬"} + d.watchDoor() +} + + +``` + + + +可以实现一种多态性 + +- 相同的方法名, 但是不同的对象(结构体)调用 + +```go +package main + +import "fmt" + +type dog struct { + name string +} + +type cat struct { + name string +} + +type rabbit struct { + name string +} + +// 使用 函数来实现, 需要不同的函数名 +func dogSay(d dog) { + fmt.Println(d.name + " 汪汪汪。。。函数") +} + +func catSay(c cat) { + fmt.Println(c.name + " 喵喵喵。。。函数") +} + +func (d dog) say() { + fmt.Println(d.name + " 汪汪汪。。。方法") +} + +// 使用方法来实现, 相同的函数名就可以 +func (c cat) say() { + fmt.Println(c.name + " 喵喵喵。。。方法") +} + +func (r rabbit) say() { + fmt.Println(r.name + " 吱吱吱。。。方法") +} + +func main() { + d := dog{"哮天犬"} + c := cat{"加菲猫"} + r := rabbit{"玉兔"} + + d.say() //调用 + c.say() + r.say() +} + +``` + + + +#### 指针和方法 + +- 接收者使用指针传的是引用,不使用指针传的是值拷贝。 + +- 如果**函数**的参数是一个指针参数,那么该函数就必须接收一个指针才行,如果是值则报错:如果函数的参数是**值**,而不是指针,那么该函数必须接受值,否则会报错: + +- 而如果**方法**的接收者是一个**指针**,那么该方法被调用时,接收者既可以是**指针**,又可以是**值**:如果方法的接收者是一个**值**,那么该方法被调用时,接收者既可以是值,又可以是指针: + +- + + + +```go +package main + +import "fmt" + +type dog struct { + name string +} + +// 修改成功 +func (d *dog) rename(name string) { + d.name = name + fmt.Println("方法内:" + d.name) +} + +// 修改不成功 +func (d dog) rename1(name string) { + d.name = name + fmt.Println("方法内:" + d.name) +} + +``` + + + +```go +// 必须是 double(&i) +func double(x *int) { + *x = *x * 2 +} + +// d.rename("小黑黑") +func (d *dog) rename(name string) { + d.name = name + fmt.Println("方法内:" + d.name) +} + +d := dog{"哮天犬"} +p := &d +p.rename1("小红红") +func (d dog) rename1(name string) { + d.name = name + fmt.Println("方法内:" + d.name) +} +``` + + + + + +#### 类型选择 + +- `x.(type)` 的语法只能在 `switch` 语句内部使用,用于判断 `x` 的类型。它会返回一个特殊的类型 `type`,表示 `x` 的实际类型。 + +```go +switch value := x.(type) { + case string: + fmt.Printf("%s是个字符串。开心", value) + case int: + value *= 2 + fmt.Printf("翻倍了,%d是个整数。哈哈", value) + case human: + fmt.Println("这是个结构体。", value) + default: + fmt.Printf("前面的case都没猜对,x是%T类型", value) + fmt.Println("x的值为", value) +} +``` + + + + + +### 错误处理 + +#### panic + +panic 语句用于引发一个运行时错误,并使程序崩溃。在 Golang 中,panic 语句的语法如下: + +```go +go +复制代码panic("error message") +``` + +其中,"error message" 是一个字符串,用于描述错误信息。当程序执行到 panic 语句时,会引发一个 panic 错误,并将程序崩溃。 + + + + + +#### recover + +recover 语句用于恢复程序的执行,如果程序发生了 panic 错误,可以使用 recover 语句来捕获该错误,并进行相应的处理。在 Golang 中,recover 语句的语法如下: + +recover 语句用于恢复程序的执行,如果程序发生了 panic 错误,可以使用 recover 语句来捕获该错误,并进行相应的处理。在 Golang 中,recover 语句的语法如下: + +```go +go复制代码package main + +import "fmt" + +func main() { + defer func() { + if err := recover(); err != nil { + fmt.Println("recover error:", err) + } + }() + panic("panic error") +} +``` + +输出结果为: + +```go +go +复制代码recover error: panic error +``` + +在上面的示例中,使用 defer 语句来定义一个匿名函数,用来捕获 panic 错误,并输出错误信息。 + + + + + +#### error 接口 + +接口签名, 只有一个 **Error**() 方法,返回一个 **string**,用来备注错误信息。任何实现了这个方法的结构体都实现了 **error** 接口。 + +```go +type error interface { + Error() string +} + +``` + + + +实例分析 + +```go +// Go1.12/src/net/net.go 的 AddrError +type AddrError struct { + Err string + Addr string +} + +//使用 **指针** 接收器实现该Error()接口 +func (e *AddrError) Error() string { + if e == nil { + return "" + } + s := e.Err + if e.Addr != "" { + s = "address " + e.Addr + ": " + s + } + return s +} + +``` + + + +在 Go 里面,使用指针实现接口有两个主要用途: + +1. 为了在实现该函数处可以修改指针调用者 +2. 大结构使用指针可以减小拷贝,另外可以保证共享,维持全局一个类型,类似于单例。 + + + + + +### 多线程 + +#### defer + +- 用于注册延迟调用 +- 直到return前才会被执行, 可以用来做资源管理 +- 多个 `defer`语句, 先进后出的方式( 栈 )执行 +- defer 后面的语句在执行的时候,函数调用的参数会被保存起来,但是不执行。 + + + +```go +func main() { + var whatever [5]struct{} + + for i := range whatever { + defer fmt.Println(i) // 4 3 2 1 0 + } + +} + +``` + +```go +type Test struct { + name string +} + +func (t *Test) Close() { + fmt.Println(t.name, " closed") +} +func main() { + ts := []Test{{"a"}, {"b"}, {"c"}} + for _, t := range ts { + defer t.Close() + } +} + +// c closed +// c closed +// c closed +``` + + + + + +#### 携程 + +Go 语言中的 goroutine 就是这样一种机制,goroutine 的概念类似于线程,但 goroutine 是由 Go 的运行时(runtime)调度和管理的。Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。Go 语言之所以被称为现代化的编程语言,就是因为它在语言层面已经内置了调度和上下文切换的机制。 + +在 Go 语言编程中你不需要去自己写进程、线程、协程,你的技能包里只有一个技能–goroutine,当你需要让某个任务并发执行的时候,你只需要把这个任务包装成一个**函数**,开启一个 goroutine 去执行这个函数就可以了,就是这么简单粗暴。 + +协程:用户态,轻量级线程, 栈KB级别 + +线程:内核态,线程跑多个协程, 栈MB级别 + + + + + + + +```go +package main + +import ( + "fmt" + "time" +) + +func main() { + go hello() // 启动一个新的协程执行 hello() 函数 + + // 主线程继续执行其他任务 + for i := 0; i < 5; i++ { + fmt.Println("Main Thread:", i) + time.Sleep(time.Second) + } +} + +func hello() { + for i := 0; i < 5; i++ { + fmt.Println("Hello Goroutine:", i) + time.Sleep(time.Second) + } +} + +``` + + + +使用匿名函数启动协程 + +```go +package main + +import ( + "fmt" + "time" +) + +func main() { + // 定义匿名函数,作为协程的运行函数 + go func() { + fmt.Println("协程开始执行") + time.Sleep(2 * time.Second) // 模拟一些耗时操作 + fmt.Println("协程执行完成") + }() + + // 主线程继续执行其他任务 + fmt.Println("主线程执行其他任务") + + // 防止主线程退出,等待一些时间以便协程执行完毕 + time.Sleep(3 * time.Second) +} + +``` + + + + + + + + + + + + + +CSP (Communicating Sequential Processes) 通信顺序进程,是 Go 语言中重要的并发模型。 + +主要特征有 + +1. **顺序**进程:每个进程内部按顺序执行。 +2. 通信进程:进程间通过通信 (Message Passing) 来协作。 +3. 数据流:程序通过在进程间传递数据来工作。 + +Go 语言的 CSP 实现主要通过 goroutine 和 channel + +- goroutine 作为顺序执行的进程 +- channel 用于 goroutine 间的通信 + + + + + +#### 通信 / channel + +提倡通过**通信**共享内存而不是通过共享内存而实现通信 + +- 通过通信共享内存---通道 +- 通过共享内存实现通信---临界区 + +```go +var ch1 chan int // 声明一个传递整型的通道 +var ch2 chan bool // 声明一个传递布尔型的通道 +var ch3 chan []int // 声明一个传递int切片的通道 + +// 通道是引用类型,通道类型的空值是 nil。 +// 声明的通道后需要使用 make 函数初始化之后才能使用。 +ch4 := make(chan int) +ch5 := make(chan bool) +ch6 := make(chan []int) + +// 发送 将一个值发送到通道中。 +ch <- 10 // 把10发送到ch中 + +// 接收----从一个通道中接收值。 +x := <- ch // 从ch中接收值并赋值给变量x +<-ch // 从ch中接收值,忽略结果 + +// close 函数来关闭通道。关闭通道不是必须 +close(ch) +``` + +```go +func main() { + ch1 := make(chan int) + ch2 := make(chan int) + // 开启goroutine将0~100的数发送到ch1中 + go func() { + for i := 0; i < 100; i++ { + ch1 <- i + } + close(ch1) + }() + // 开启goroutine从ch1中接收值,并将该值的平方发送到ch2中 + go func() { + for { + i, ok := <-ch1 // 通道关闭后再取值ok=false + if !ok { + break + } + ch2 <- i * i + } + close(ch2) + }() + // 在主goroutine中从ch2中接收值打印 + for i := range ch2 { // 通道关闭后会退出for range循环 + fmt.Println(i) + } +} +``` + + + + + + + + + +#### 实例/ 生产者消费者模型 + +```go +package main + +import "fmt" + +func CalSquare() { + src := make(chan int) // 生产无缓冲 + dest := make(chan int, 3) // 消费缓冲3个元素 + + // 子协程发送0-9数字 + go func() { + defer close(src) + for i := 0; i < 10; i++ { + src <- i + } + }() + + // 子协程计算输入数字的平方 + go func() { + defer close(dest) + for i := range src { + dest <- i * i + } + }() + + // 主协程输出最后的平方数 + for i := range dest { + // 复杂操作 + // ... + fmt.Println(i) + } + +} + +func main() { + CalSquare() +} + +``` + + + + + + + +#### 互斥锁 + +- 互斥锁,确保同时只有一个 goroutine 可以**访问共享**数据。 + +```go +package main + +import ( + "fmt" + "sync" + "time" +) + +var ( + counter = 0 + // 保护临界区 + mutex sync.Mutex + // 保证所有的任务都能完成, 也就是主程序阻塞 + wg sync.WaitGroup +) + +func main() { + wg.Add(2) + + go increment("Routine 1") + go increment("Routine 2") + + wg.Wait() + fmt.Println("Final counter:", counter) +} + +func increment(name string) { + defer wg.Done() + + for i := 0; i < 5; i++ { + // 对公共资源进行加锁 + mutex.Lock() + + // 修改公共资源 + counter++ + fmt.Printf("[%s] Counter: %d\n", name, counter) + + // 解锁公共资源 + mutex.Unlock() + + // 模拟其他操作 + time.Sleep(time.Millisecond * 500) + } +} + +``` + + + + + + + +1. sync.RWMutex + +读写互斥锁,可以同时允许多个读,但写时独占。读写互斥锁实现了读写分离,相比普通的互斥锁可以提供更高的并发性能。 + +```go +var mu sync.RWMutex + +mu.RLock() +// 读共享资源 +mu.RUnlock() + +mu.Lock() +// 写共享资源 +mu.Unlock() + +``` + + + +sync.WaitGroup 是 Go 语言中的一个常用同步工具,可以用于等待一组 goroutine 结束。主要的使用方式是 + +- 创建一个 WaitGroup, 通常以参数传入函数 +- 在启动 goroutine 前调用 Add 添加计数 +- 在 goroutine 结束时调用 Done 减少计数 +- 等待 goroutine 结束,调用 Wait 阻塞 + +```go +package main + +import ( + "fmt" + "sync" +) + +func process(i int, wg *sync.WaitGroup) { + fmt.Println("Start goroutine", i) + // 结束时调用 Done 减少计数 + defer wg.Done() + fmt.Printf("End goroutine%d\n", i) +} + +func main() { + + var wg sync.WaitGroup + + for i := 1; i <= 3; i++ { + wg.Add(1) + go process(i, &wg) + } + + wg.Wait() + fmt.Println("All goroutines finished executing") +} + +``` + + + + + + + + + + + +### 面向"对象" + +> **尽管 Go 拥有类型和方法,也允许面向对象风格的编程,但它没有类型层级**。 在 Go 中 “接口” 的概念提供了不同的方法,我们相信它易于使用且在某些方面更通用。 也有一些在其它类型中嵌入类型的方法,来提供类似(而非完全相同)的东西进行子类化。 此外,Go 中的方法比 C++ 或 Java 中的更通用:它们可被定义为任何种类的数据。 甚至是像普通的 “未装箱” 整数这样的内建类型。它们并不受结构(类)的限制。 +> +> 此外,**类型层级的缺失也使 Go 中的 “对象” 感觉起来比 C++ 或 Java 的更轻量级**。 + + + +#### "继承"成员---匿名字段 + +```go +package main + +import "fmt" + +type people struct { + name string + age int +} + +type student struct { + people + school string +} + +func (s student) say() { + fmt.Printf("我是%s,今年%d岁了,在%s上学。", s.name, s.age, s.school) +} + +func main() { + stu := student{people{"行小观", 1}, "阳光小学"} + stu.say() +} + +``` + + + +出现了字段冲突,Go 会先访问外层的字段。比如,`stu.name` 是`李向前`(外层),`stu.people.name` 是`李二狗`(内层)。 + +```go +package main + +import "fmt" + +type people struct { + name string //人名 + age int +} + +type student struct { + people + name string //学生名 + school string +} + +func main() { + stu := student{people{"李二狗", 1}, "李向前", "阳光学校"} + fmt.Println(stu.name) //李向前 + fmt.Println(stu.people.name) //李二狗 +} + +``` + + + + + +#### "继承"方法 + +```go +package main + +import "fmt" + +// 定义父类 +type Parent struct { + name string + age int +} + +// 父类的方法 +func (p *Parent) SayHello() { + fmt.Printf("Hello, I'm %s. ", p.name) + fmt.Printf("I'm %d years old.\n", p.age) +} + +// 定义子类 +type Child struct { + Parent // 组合父类 + school string +} + +// 子类的方法 +func (c *Child) SayHello() { + // 调用父类的方法 + c.Parent.SayHello() + fmt.Printf("I study at %s school.\n", c.school) +} + +func main() { + p := &Parent{ + name: "John", + age: 35, + } + p.SayHello() + + c := &Child{ + Parent: Parent{ + name: "Tom", + age: 8, + }, + school: "ABC", + } + c.SayHello() +} + + +Hello, I'm John. I'm 35 years old. +Hello, I'm Tom. I'm 8 years old. +I study at ABC school. + +``` + + + +#### 重写 字段 + +```go +package main + +import "fmt" + +type people struct { + name string //乳名 + age int +} + +type student struct { + people + name string //大名 + school string +} + +func (s student) say() { + fmt.Printf("我是%s,今年%d岁了,和我一起学习Go语言吧!\n", s.name, s.age) +} + +func main() { + stu := student{people{"李二狗", 1}, "李向前","阳光小学"} + stu.say() +} + +``` + + + +#### "重写"方法 + +```go +package main + +import "fmt" + +type people struct { + name string + age int +} + +type student struct { + people + school string +} + +type programmer struct { + people + language string +} + +func (p people) say() { //people的say方法 + fmt.Printf("我是%s,今年%d岁了,和我一起学习Go语言吧!\n", p.name, p.age) +} + +func (s student) say() { //student重写people的say方法 + fmt.Printf("我是%s,是个学生,今年%d岁了,我在%s上学!\n", s.name, s.age, s.school) +} + +func (p programmer) say() { //programmer重写people的say方法 + fmt.Printf("我是%s,是个程序员,今年%d岁了,我使用%s语言!\n", p.name, p.age, p.language) +} + +func main() { + stu := student{people{"李向前", 1}, "阳光小学"} + stu.say() + prmger := programmer{people{"张三", 1}, "Go"} + prmger.say() +} + + +我是李向前,是个学生,今年1岁了,我在阳光小学上学! +我是张三,是个程序员,今年1岁了,我使用Go语言! +``` + + + + + +### 接口 + +简单地来说,接口就是规范,如果你的类实现了接口,那么该类就必须具有接口所要求的一切功能、行为。接口中通常定义的都是方法。 + + + +#### 接口的声明 + +```go +type human interface { //定义human接口 + say() + eat() +} + +// 调用接口 +h.say() +h.eat() + +type adult interface { //定义adult接口 + say() + eat() + drink() + work() +} + +type teenager interface { //定义teenager接口 + say() + eat() + learn() +} + +``` + + + + + +```go +package main + +import "fmt" + +type people struct { + name string + age int +} + +type student struct { + people //"继承"people + subject string + school string +} + +type programmer struct { + people //"继承"people + language string + company string +} + +type human interface { //定义human接口 + say() + eat() +} + +type adult interface { //定义adult接口 + say() + eat() + drink() + work() +} + +type teenager interface { //定义teenager接口 + say() + eat() + learn() +} + +func (p people) say() { //people实现say()方法 + fmt.Printf("我是%s,今年%d。\n", p.name, p.age) +} + +func (p people) eat() { //people实现eat()方法 + fmt.Printf("我是%s,在吃饭。\n", p.name) +} + +func (s student) learn() { //student实现learn()方法 + fmt.Printf("我在%s学习%s。\n", s.school, s.subject) +} + +func (s student) eat() { //student重写eat()方法 + fmt.Printf("我是%s,在%s学校食堂吃饭。\n", s.name, s.school) +} + +func (pr programmer) work() { //programmer实现work()方法 + fmt.Printf("我在%s用%s工作。\n", pr.company, pr.language) +} + +func (pr programmer) drink() {//programmer实现drink()方法 + fmt.Printf("我是成年人了,能大口喝酒。\n") +} + +func (pr programmer) eat() { //programmer重写eat()方法 + fmt.Printf("我是%s,在%s公司餐厅吃饭。\n", pr.name, pr.company) +} + + +func main() { + xiaoguan := people{"行小观", 20} + zhangsan := student{people{"张三", 20}, "数学", "银河大学"} + lisi := programmer{people{"李四", 21},"Go", "火星有限公司"} + + var h human + h = xiaoguan + h.say() + h.eat() + fmt.Println("------------") + var a adult + a = lisi + a.say() + a.eat() + a.work() + fmt.Println("------------") + var t teenager + t = zhangsan + t.say() + t.eat() + t.learn() +} + +``` + + + +#### 接口值 + +- 是不是可以理解为, 有着共同`方法`的一组对象 +- 接口也是值,这就意味着接口能像**值一样进行传递**,并可以作为函数的参数和返回值。 +- 如果定义了一个接口类型变量,那么该变量中可以存储实现了该接口的任意类型值: +- 不能存储未实现该 `interface` 接口的类型值: + +```go +func main() { + //这三个人都实现了human接口 + xiaoguan := people{"行小观", 20} + zhangsan := student{people{"张三", 20}, "数学", "银河大学"} + lisi := programmer{people{"李四", 21},"Go", "火星有限公司"} + + var h human //定义human类型变量 + //所以h变量可以存这三个人 + h = xiaoguan + h = zhangsan + h = lisi +} + + +// 不可以 +func main() { + xiaoguan := people{"行小观", 20} //实现human接口 + zhangsan := student{people{"张三", 20}, "数学", "银河大学"} //实现teenager接口 + lisi := programmer{people{"李四", 21},"Go", "火星有限公司"} //实现adult接口 + + var a adult //定义adult类型变量 + //但zhangsan没实现adult接口 + a = zhangsan //所以a不能存zhangsan,会报错 +} +``` + + + + + +#### 空接口 + +```go +interface {} + +a := people{"zhang san", 14} +var ept interface{} +ept = 10 +ept = a +``` + + + +#### 接口做返回值 + +```go +package main + +import "fmt" + +type sayer interface {//接口 + say() +} + +func foo(a sayer) { //函数的参数是接口值 + a.say() +} + +type people struct { //结构体类型 + name string + age int +} + +func (p people) say() { //people实现了接口sayer + fmt.Printf("我是%s,今年%d岁。", p.name, p.age) +} + +type MyInt int //MyInt类型 + +func (m MyInt) say() { //MyInt实现了接口sayer + fmt.Printf("我是%d。\n", m) +} + +func main() { + xiaoguan := people{"行小观", 20} + foo(xiaoguan) //结构体类型作为参数 + + i := MyInt(5) + foo(i) //MyInt类型作为参数 +} + +``` + + + + + +#### "继承"接口 + +就是把一个接口当做**匿名字段**嵌入另一个接口中 + +- 它定义了两个结构体 `animal` 和 `dog`,`dog` 结构体使用匿名字段 `animal` 来实现继承。 +- 接口 `runner` 和 `watcher` 定义了方法 `run()` 和 `watch()`,`watcher` 接口继承了 `runner` 接口。 +- 然后,在 `main()` 函数中创建了一个 `animal` 类型的变量 `a` 和一个 `dog` 类型的变量 `d`。最后调用了 `a.run()`、`d.run()` 和 `d.watch()` 方法来输出结果。 + +```go +package main + +import "fmt" + +type animal struct { //结构体animal + name string + age int +} + +type dog struct { //结构体dog + animal //“继承”animal + address string +} + +type runner interface { //runner接口 + run() +} + +type watcher interface { //watcher接口 + runner //“继承”runner接口 + watch() +} + +func (a animal) run() { //animal实现runner接口 + fmt.Printf("%s会跑\n", a.name) +} + +func (d dog) watch() { //dog实现watcher接口 + fmt.Printf("%s在%s看门\n", d.name, d.address) +} + +func main() { + a := animal{"小动物", 12} + d := dog{animal{"哮天犬", 13}, "天庭"} + a.run() + d.run() //哮天犬可以调用“继承”得到的接口中的方法 + d.watch() +} + +``` + + + + + + + + + +### 依赖管理 + +go 依赖管理主要经历以下三个阶段: + +- GOPATH +- GO VENDOR +- GO Module + + + + + +#### gopath + + + +`GOROOT` 和 `GOPATH` 是两个与 Go 语言开发环境相关的环境变量,它们有不同的作用和含义。 + +1. GOROOT(Go Root):`GOROOT` 是指向你的 Go 安装目录的环境变量。它用于告诉 Go 编译器和工具在哪里找到 Go 的**标准库**和其他**系统**级别的包。当你安装 Go 时,会自动设置 `GOROOT` 环境变量。 +2. GOPATH(Go Path):`GOPATH` 是指向你的 Go 工作区的环境变量。它是你的**项目代码**和**第三方包**的存放路径。在 `GOPATH` 下,按照约定的目录结构,你可以创建 `src`、`pkg` 和 `bin` 三个目录。`src` 目录用于存放你的项目代码,`pkg` 目录用于存放编译后的包对象文件,`bin` 目录用于存放可执行文件。 + +联系: + +- `GOPATH` 可以包含多个路径,用冒号(Unix/Linux)或分号(Windows)分隔,以指定多个工作区。 +- 在 `GOPATH` 下的 `src` 目录中,你可以创建多个项目目录,每个目录对应一个独立的项目。 +- 在项目目录中,你可以使用 `import` 语句引入其他项目或第三方包,Go 编译器会在 `GOPATH` 下的相应目录中查找这些包。 + +区别: + +- `GOROOT` 是指向 Go 的安装目录,用于找到 Go 的标准库和系统级别的包。 +- `GOPATH` 是指向你的工作区目录,用于存放你的项目代码和第三方包。 + + + +gopath 是 go 语言支持的一个环境变量,value 是 Go 项目的工作区。 + +```bash +cd $GOPATH +|---bin 项目编译的二进制文件 +|---pkg 项目编译的中间产物加速编译 +|---src 项目源码 +``` + +- 项目代码直接依赖src下的代码 +- `go get`下载最新版本的包到src 目录下 + +同一个 pkg,但是 pkg 有不同版本 pkg v1 和 pkg v2, 里面包含两个方法。而 src 下只能有一个版本存在,那 AB 项目无法保证都能编译通过。 + +就是在 gopath 管理模式下,如果多个项目依赖同一个库,则依赖该库是同一份代码,所以不同项目不能依赖同一个库的不同版本,这很显然不能满足我们的项目依赖需求。无法实现 package 的多版本控制。 + +为了解决这个问题,go vendor 出现了。 + + + + + + + + + +#### Go Vendor + +- 项目目录下增加 vendor 文件, 所有依赖包**副本**形式放在`$ProjectRoot/vendor` +- 依赖寻址方式:vendor=>GOPATH + + + +问题 + +- A依赖于 B C +- B C 依赖于 D不同的版本 + + + + + +#### go module + +有了 Go module 之后,可以方便地管理项目的依赖关系,并且**不需要手动**下载库。使用 Go module,你可以在代码中引入需要的库,并通过指定版本或者版本范围来自动获取相应的库。当你首次引入一个新的库时,Go module 会自动下载该库及其依赖到本地的缓存中。这样,你就可以随意引入库,而无需手动下载。 + + + +依赖管理三要素 + +- 1.配置文件, 描述依赖go.mod +- 2.中心仓库管理依赖库 Proxy +- 3.本地工具 go get/mod + + + +```go +module example/project/ap // p依赖管理基本单元 +go 1.16 // 原生库 +require ( // 单元依赖 + example/lib1 v1.0.2 + example/lib2 v1.0.0 // indirect + example/lib3 v0.1.0-20190725025543-5a5fe074e612 + example/lib4 v0.0.0-20180306012644-bacd9c7ef1dd // indirect example/lib5/v3 v3.0.2 +) +``` + + + +依赖配置 - indirect 关键字 + +- A->B->C,A->B 属于**直接**依赖,A->C 属于**间接**依赖。 +- 在 go.mod 中,对于没有直接导入该依赖模块的包,也就是非直接依赖,标识间接依赖。所以加上 indirect 后缀。 + + + +为什么需要 Proxy + +直接使用版本管理仓库下载依赖,存在多个问题, + +- 无法保证构建确定性:软件作者可以直接代码平台增加 / 修改 / 删除软件版本,导致下次构建使用另外版本的依赖,或者找不到依赖版本。 +- 无法保证依赖可用性:依赖软件作者可以直接代码平台删除软件,导致依赖不可用。 +- 增加第三方代码托管平台的压力,代码托管平台负载问题。 + +使用 go proxy 之后,构建时会直接从 go proxy 站点拉取依赖。类比项目中,下游无法满足我们上游的需求。 + + + +```go +GOPROXY="https://proxy1.cn, https://proxy2.cn ,direct" +``` + + + + + + + +#### 工具 - go get/mod + +开头提到 go model 有两个本地工具,go get/mod。 + +| 指令功能 | | +| -------- | ------------------------ | +| @update | 默认 | +| @none | 删除依赖 | +| @v1.1.2 | 下载指定tag版本,语义版本 | +| @23dfdd5 | 下载特定的commit版本 | +| @master | 下载分支的最新commit | + + + + + +go mod + +| 指令 | 功能 | +| ---- | ------------------------------- | +| init | 初始化,创建go.mod文件 | +| tidy | 增加需要的依赖,删除不需要的依赖 | + + + + + + + + + + + + + + + + + +#### go module 使用方法 + +1. 确保你的项目目录下有一个有效的 `go.mod` 文件。如果没有,可以通过运行 `go mod init` 命令来初始化一个新的模块。 +2. 在你的项目中,使用 `import` 语句导入你需要的依赖项。 +3. 运行 `go mod tidy` 命令来自动分析你的代码并下载缺少的依赖项。这个命令会根据你的代码中的导入语句自动更新 `go.mod` 文件,并下载相应的依赖项。 +4. 如果你想手动下载特定的依赖项,可以使用 `go get` 命令,例如 `go get github.com/example/package`。 + + + +```bash +$ go env +GO111MODULE="on" +GOARCH="amd64" +GOBIN="" +GOCACHE="/home/runner/.cache/go-build" +GOENV="/home/runner/.config/go/env" +GOEXE="" +GOEXPERIMENT="" +GOFLAGS="" +GOHOSTARCH="amd64" +GOHOSTOS="linux" +GOINSECURE="" +GOMODCACHE="/home/runner/go/pkg/mod" +GONOPROXY="" +GONOSUMDB="" +GOOS="linux" +GOPATH="/home/runner/go" +GOPRIVATE="" +GOPROXY="https://goproxy.cn,direct" +GOROOT="/nix/store/4m1nfq0xhc9p1hi6dnxbcpppcgz22yf9-go-1.17.5/share/go" +GOSUMDB="sum.golang.org" +GOTMPDIR="" +GOTOOLDIR="/nix/store/4m1nfq0xhc9p1hi6dnxbcpppcgz22yf9-go-1.17.5/share/go/pkg/tool/linux_amd64" +GOVCS="" +GOVERSION="go1.17.5" +GCCGO="gccgo" +AR="ar" +CC="gcc" +CXX="g++" +CGO_ENABLED="1" +GOMOD="/home/runner/app/go.mod" +CGO_CFLAGS="-g -O2" +CGO_CPPFLAGS="" +CGO_CXXFLAGS="-g -O2" +CGO_FFLAGS="-g -O2" +CGO_LDFLAGS="-g -O2" +PKG_CONFIG="pkg-config" +GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build2769124553=/tmp/go-build -gno-record-gcc-switches" + + + +# 设置 +go env -w GO111MODULE=on +go env -w GOPROXY=https://goproxy.cn,direct + +``` + + + +GO111MODULE 有三个值:off、on 和 auto (默认值) + +- `GO111MODULE=off` :go 命令行将不会支持 module 功能,寻找依赖包的方式将会沿用旧版本那种通过 vendor 目录或者 GOPATH 模式来查找。 + +- `GO111MODULE=on` :go 命令行会使用 modules,而一点也不会去 GOPATH 目录下查找。 + +- ``` + GO111MODULE=auto + ``` + + + + :默认值,go 命令行将会根据当前目录来决定是否启用 module 功能。这种情况下可以分为两种情形: + + - 当前目录在 GOPATH/src 之外且该目录包含 go.mod 文件 + - 当前文件在包含 go.mod 文件的目录下面。 + + + + + + + + + + + +[go mod 使用 | 全网最详细 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/482014524?utm_id=0) + +直接在文件里 import 然后运行 go mod tidy就行吗 + +go build 编译的时候会根据 `go.mod` 里自己**下载**包 + +```bash +go mod init packagename + + +Go mod provides access to operations on modules. + +Note that support for modules is built into all the go commands, +not just 'go mod'. For example, day-to-day adding, removing, upgrading, +and downgrading of dependencies should be done using 'go get'. +See 'go help modules' for an overview of module functionality. + +Usage: + + go mod [arguments] + +The commands are: + + download download modules to local cache + edit edit go.mod from tools or scripts + graph print module requirement graph + init initialize new module in current directory + tidy add missing and remove unused modules + vendor make vendored copy of dependencies + verify verify dependencies have expected content + why explain why packages or modules are needed + +Use "go help mod " for more information about a command. +``` + + + +#### 如何指定包版本 + +在 Go 中,可以使用 Go Modules 来管理和指定包的版本。Go Modules 是 Go 1.11 版本引入的一种包管理机制,它允许你在项目中明确指定所使用的包的版本。 + +以下是一些常用的指定包版本的方法: + +1. 使用固定版本号:在你的项目的 go.mod 文件中,可以直接指定包的固定版本号。例如: + + ```go + go 1.16 + + require ( + github.com/gin-gonic/gin v1.7.4 + ) + ``` + + 在这个例子中,我们明确指定了使用 `github.com/gin-gonic/gin` 的 v1.7.4 版本。 + +2. 使用语义化版本控制:除了指定固定版本号,你还可以使用语义化版本控制来指定包的版本。例如,你可以使用 `^` 符号来指定兼容的最新版本。例如: + + ```go + go 1.16 + + require ( + github.com/gin-gonic/gin ^1.7.0 + ) + ``` + + 在这个例子中,我们指定了使用 `github.com/gin-gonic/gin` 的兼容版本大于等于 1.7.0 且小于 2.0.0 的最新版本。 + +3. 使用特定的版本范围:除了使用 `^` 符号,你还可以使用其他运算符来指定特定的版本范围。例如,你可以使用 `>`、`>=`、`<`、`<=` 等符号来指定版本的范围。例如: + + ```go + go 1.16 + + require ( + github.com/gin-gonic/gin >=1.7.0, <1.8.0 + ) + ``` + + 在这个例子中,我们指定了使用 `github.com/gin-gonic/gin` 的版本大于等于 1.7.0 且小于 1.8.0。 + + + + + +### 项目构建/ 编译 + + + +一个 Go 工程中主要包含以下三个目录: + +``` + src:源代码文件 + pkg:包文件 + bin:相关bin文件 +``` + +1: 建立工程文件夹 goproject + +2: 在工程文件夹中建立 src,pkg,bin 文件夹 + +3: 在 GOPATH 中添加 projiect 路径 例 e:/goproject + +4: 如工程中有自己的包 examplepackage,那在 src 文件夹下建立以包名命名的文件夹 例 examplepackage + +5:在 src 文件夹下编写主程序代码代码 goproject.go + +6:在 examplepackage 文件夹中编写 examplepackage.go 和 包测试文件 examplepackage_test.go + +7:编译调试包 + +go build examplepackage + +go test examplepackage + +go install examplepackage + +这时在 pkg 文件夹中可以发现会有一个相应的操作系统文件夹如 windows_386z, 在这个文件夹中会有 examplepackage 文件夹,在该文件中有 examplepackage.a 文件 + +8:编译主程序 + +go build goproject.go + +成功后会生成 goproject.exe 文件 + +至此一个 Go 工程编辑成功。 + +```bash +1.建立工程文件夹 go +$ pwd +/Users/***/Desktop/go +2: 在工程文件夹中建立src,pkg,bin文件夹 +$ ls +bin conf pkg src +3: 在GOPATH中添加projiect路径 +$ go env +GOPATH="/Users/liupengjie/Desktop/go" +``` + + + + + +#### go命令 + +- `go env` 用于打印 Go 语言的环境信息。 + +- `go run` 命令可以编译并运行命令源码文件。 + +- `go get` 可以根据要求和实际情况从互联网上**下载**或更新指定的代码包及其依赖包,并对它们进行编译和安装。 + +- go build 命令用于编译我们指定的源码文件或代码包以及它们的依赖包。 + +- go install 用于编译并安装指定的代码包及它们的依赖包。 + +- go clean 命令会删除掉执行其它命令时产生的一些文件和目录。 + +- go doc 命令可以打印附于 Go 语言程序实体上的文档。我们可以通过把程序实体的标识符作为该命令的参数来达到查看其文档的目的。 + + go test 命令用于对 Go 语言编写的程序进行测试。 + + go list 命令的作用是列出指定的代码包的信息。 + + go fix 会把指定代码包的所有 Go 语言源码文件中的旧版本代码修正为新版本的代码。 + + go vet 是一个用于检查 Go 语言源码中静态错误的简单工具。 + + go tool pprof 命令来交互式的访问概要文件的内容。 diff --git a/_posts/byte_tech/assets/image-20230731154712540.png b/_posts/byte_tech/assets/image-20230731154712540.png new file mode 100644 index 0000000000000000000000000000000000000000..0027136de91c2ab32e639d509f322376684178d6 GIT binary patch literal 381059 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

R}M0btX2aIx+pY70sD9N91S(mai`+1u3v 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≠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�av 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 literal 0 HcmV?d00001 diff --git a/_posts/cpp/0_md_generator.sh b/_posts/cpp/0_md_generator.sh new file mode 100644 index 0000000..dd5d1df --- /dev/null +++ b/_posts/cpp/0_md_generator.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +filename=$(date +"%Y-%m-%d-.md") + +cat > "$filename" << EOF +--- +layout: blog +banana: true +category: cpp +title: +date: $(date +"%Y-%m-%d %H:%M:%S") +background: green +tags: +- cpp +--- + +* content +{:toc} +EOF + +echo "文件已生成:$filename" diff --git a/_posts/cpp/2023-07-03-cpp-others-ptr.md b/_posts/cpp/2023-07-03-cpp-others-ptr.md new file mode 100644 index 0000000..9c1395e --- /dev/null +++ b/_posts/cpp/2023-07-03-cpp-others-ptr.md @@ -0,0 +1,118 @@ +--- +layout: blog +banana: true +title: "c++感想之指针1" +background: green +date: 2023-07-03 23:13:54 +category: cpp +tags: +- cpp +- ptr +--- + +* content +{:toc} + + + + +## cpp感想(1)---指针 + +版本号: V1.2 + +### 1 第一版本感想 + +一开始认为只是一个**存储地址**的变量, 但是发现有些片面了 + +### 2 第二版感想 + +想了很久发现, 没有一个词能够很好的形容指针, 感觉协议还靠边一点 + +协议, 协议就是一些特殊的规则集合 + +指针 是我们自己定义的操纵内存的接口 + +我现在的理解就是 **指针 = 地址 + 协议** + +地址是指在内存中的位置, 协议是指如何管理指向的内存, + +#### 2.1 void指针 + +>​ void指针不是空指针, 而是可以没有约束( 协议 )的指针, 任何指针指都可以赋值给他, 但是不能用void指针进行操作, 要转换后才能进行操作 +>​ 因为void*可以接受任何类型指针,就是所谓的上转型(upcasting),将一个更具体的指针转换成一个类型更泛化的指针。编译器知道这种类型转换并不会带来风险。如果进行下转型(downcasting),就告诉编译器,我现在有一个类型更加泛化的指针,我知道此指针具体类型是什么,但是如果涉及引用就想要进行强制转换。 + +```c +char a[10]; +void *b = a; +``` + + + +#### 2.2 malloc 函数 + +> malloc 函数 返回的指针就是void * 类型, 也就是没有协议的类型 + +#### 2.3 链表---来自数据结构 + +```c++ +typedef struct Listnode{ + datatype data; + struct Listnode *next; +}listnode; +``` + +为什么可以做到嵌套定义 : + +- Listnode 类型的变量可以有两个元素, 一个是数据域, 另一个是指针.这两个的大小和组织形式都是固定的, 例如, datatype为int时, 占据8个字节, 指针一般占据8个字节. 这就占据16个字节. +- Listnode 指针的协议就可以这么来描述: 大小为16个字节, 类内元素排列是 int ( 8 )+ 指针 ( 8 ) + + + +#### 2.4 obj---来自SGIGCC2.9 + +```c++ + union obj { + union obj * free_list_link; + char client_data[1]; /* The client sees this. */ + }; +//其实就是告诉指针, 这块内存中存储的是个地址, 并且占用8个字节的内存 +``` + + + +```c++ +struct listnode{ + listnode *next; +}; +typedef struct listnode listnode; + +int main() { + // your code goes here + listnode a,b; + a.next = &b; + cout<< "sizeof listnode = "<< sizeof(listnode)<< endl; + cout<< "the address of a ="<< &a<< "the address of b ="<< &b<< endl; + cout<< "the a.next = "<< a.next < +int compare(const T &a, const T &b){ + if(a b) return 1; + else return 0; +} + +//使用函数模板时, 编译器会自己推断哪个或者哪些模板实参绑定到形参 +//一旦编译器确定了实际的模板实参, 就是, 实例化了函数模板的一个实例 +cout<< compare(1, 0); +``` + + + + + +#### 3.3 类模板 + +类模板与函数模板区别主要有两点: + +- 类模板没有自动类型推导的使用方式 + +- 类模板在模板参数列表中可以有默认参数 + +类模板中成员函数和普通类中成员函数创建时机是有区别的: + +- 普通类中的成员函数一开始就可以创建 +- 类模板中的成员函数在调用时才创建 + +#### 3.4 类模板的使用 + +```c++ +template +class Person{}; + +void test01(){ + // 错误 类模板使用时候,不可以用自动类型推导 + // Person p("孙悟空", 1000); + + //必须使用显示指定类型的方式,使用类模板 + Person p("孙悟空", 1000); +} + +void test02(){ + //类模板中的模板参数列表 可以指定默认参数 + Person p("猪八戒", 999); +} +``` + + + +#### 3.5 类模板 做 函数参数 + +一共有三种传入方式: + +- 指定传入的类型 --- 直接显示对象的数据类型**( 最常用 )** +- 参数模板化 --- 将对象中的参数变为模板进行传递 +- 整个类模板化 --- 将这个对象类型 模板化进行传递 + +```c++ +template +class Person{}; + +//1、指定传入的类型 +void printPerson1(Person &p){ + p.showPerson(); +} +void test01(){ + Person p("孙悟空", 100); + printPerson1(p); +} + +//2、参数模板化 +template +void printPerson2(Person&p){ + p.showPerson(); + cout << "T1的类型为: " << typeid(T1).name() << endl; + cout << "T2的类型为: " << typeid(T2).name() << endl; +} + +void test02(){ +Person p("猪八戒", 90); +printPerson2(p); +} + +//3、整个类模板化 +template +void printPerson3(T & p){ + cout << "T的类型为: " << typeid(T).name() << endl; + p.showPerson(); +} +void test03(){ + Person p("唐僧", 30); + printPerson3(p); +} +int main() { + test01(); + test02(); + test03(); + system("pause"); + return 0; +} +``` + + + + + +#### 3.6 类内的 模板对象 + +```c++ +template +class stack{ +private: + vector elem(n); +public: + void pop(); + void push(T); +}; + + +//可以有非模板类型参数, 非模板类型参数是有限制的, 可以是长整数, 或者指向外部链接对象的指针 +template stack{}; + +//在定义函数时, 模板定义了几个形参就要带着几个形参 +template stack :: pop(){ + +} +``` + + + + + +#### 3.7 特化 + +- 有时候我们可能需要为某些特定类型或特定情况提供特殊的实现方式。这就是模板的特化的作用。 +- 偏特化与完全特化类似,但存在一定的区别。完全特化是对模板的所有类型参数都进行具体化,而偏特化则只对其中的部分类型参数进行特化。所以偏特化以后, 依旧是 **模板** + +偏特化的定义: 提供另一份 template 的定义式, 本是一就是templatized + +```c++ +// 泛化, 特化 +template +class vector +{ +}; + +// 个数的偏特化 - 原来是两个模板参数, 现在是一个 +// 针对某个类型做特别的优化 +template +class vector +{ +}; + +//范围的偏特化 -指针类型 +template +class demo{}; + +template +class demo{ +}; +``` + diff --git a/_posts/cpp/2023-07-26-cpp_STL_1_allocator.md b/_posts/cpp/2023-07-26-cpp_STL_1_allocator.md new file mode 100644 index 0000000..5825bdd --- /dev/null +++ b/_posts/cpp/2023-07-26-cpp_STL_1_allocator.md @@ -0,0 +1,427 @@ +--- +layout: blog +title: "cpp_STL_1_alloctor" +date: 2023-07-25 21:19:24 +categories: cpp +background: green +tags: +- cpp +- STL +--- + + + +* content +{:toc} + + + + +### 1 allocator( 配置器 ) + +#### 1.1 代码分布 + +- 定义了全局函数construct()和destroy(),负责对象的构造和析构。 +- 定义了一二级配置器,配置器统称为alloc而非allocator! +- 定义了一些全局函数,用来填充(fill)或者复制(copy)大块内存数据,也隶属于STL标准规范。 + +G 2.9 使用的是 alloc, 在G4.9中,分配器变成了new_allocator,旧的分配器alloc改名为_pool_alloc。STL标准告诉我们, 分配器在****中, + +考虑到小型区块所可能造成的内存破碎问题,SGI设计了双层级配置器, + +**第一级配置器直接使用malloc()和free()**, SGI第一级配置器的 allocate()和realloc都是在调用malloc和realloc();不成功后,改调用oom_malloc()和oom_realloc();后两者都有内循环不断调用客户端注册的"__malloc_alloc_oom_handler “,以期望在某次调用之后获得足够的内存而圆满完成任务,但是如果没有注册”__malloc_alloc_oom_handler ",那么oom_malloc()和oom_realloc()便直接丢出bad_alloc异常信息或者exit(1)硬生生终止程序。 + +第二级配置器则视情况采用不同的策略:当配置区块超过128 bytes时, 视之为"足够大",便调用第一级配置器;**当配置区块小于128 bytes时,视之为"过小",为了降低额外负担, 便采用复杂的memory pool**整理方式,而不再求助于第一级配置器 . + +所谓C++ new handler 机制是,你可以要求系统在内存配置需求无法被满足时,调用一个你所指定的函数。换句话说,-旦::operator new无法完成任务,在丢出std::bad_alloc异常状态之前,会先调用由客端指定的处理例程,该处理例 + + 整个 STL 的操作对象 都放在容器之内, 容器一定需要空间以配置资料 + + STL规则告诉我们配置器定义与中, + +```c +//----------memory.h---------- +#include +#include +``` + + + +#### 1.2 defalloc.h + +```c++ +// 文件目录 defalloc.h +//仅仅是对 malloc 的包装 +template +class allocator { +public: + pointer allocate(size_type n) { + return ::allocate((difference_type)n, (pointer)0);//函数2 + } + void deallocate(pointer p) { ::deallocate(p); } + pointer address(reference x) { return (pointer)&x; } + const_pointer const_address(const_reference x) { + return (const_pointer)&x; + } + size_type init_page_size() { + return max(size_type(1), size_type(4096/sizeof(T))); + } + size_type max_size() const { + return max(size_type(1), size_type(UINT_MAX/sizeof(T))); + } +}; + +//函数2 +template +inline T* allocate(ptrdiff_t size, T*) { + set_new_handler(0); + T* tmp = (T*)(::operator new((size_t)(size * sizeof(T)))); + if (tmp == 0) { + cerr << "out of memory" << endl; + exit(1); + } + return tmp; +} + +``` + +#### 1.3 stl_alloc.h __malloc_alloc_template + +```c++ +// stl_alloc.h __malloc_alloc_template + +// 第一级配置器 +// 该泛型类没有类型参数; +//“__inst”是一个写死的int类型,但无实际意义 +template +class __malloc_alloc_template { + +private: + //以下两个函数是,malloc 申请失败后(内存不足时)的处理方法 + //用来申请空间,参数是申请的大小 + static void* _S_oom_malloc(size_t); + //用来扩增一个旧的内存空间 + //参数1,是旧的空间地址;参数2,是重新申请的大小 + static void* _S_oom_realloc(void*, size_t); + +#ifndef __STL_STATIC_TEMPLATE_MEMBER_BUG + //这是一个函数指针(指向函数的指针) + static void (* __malloc_alloc_oom_handler)(); +#endif + +public: + static void* allocate(size_t __n) { + // 调用 malloc() + void* __result = malloc(__n); + // 如果申请失败,改用 _S_oom_malloc() + if (0 == __result) __result = _S_oom_malloc(__n); + return __result; + } + + //释放空间,参数1,地址指针;参数2,大小 + //(很显然这里的第二参数没有意义) + // 调用 free()释放空间 + static void deallocate(void* __p, size_t /* __n */) + { + free(__p); + //(为何__n 没有意义,c语言得知,free释放空间,是全部释放,不存在只释放一部分的情况) + } + + //对一段旧空间扩容 + static void* reallocate(void* __p, size_t /* old_sz */, size_t __new_sz) + { + void* __result = realloc(__p, __new_sz); + // 如果申请失败,改用 _S_oom_malloc() + if (0 == __result) __result = _S_oom_realloc(__p, __new_sz); + return __result; + } + + //动态指定,针对内存不足时的处理方法(注意书写格式) + static void (* __set_malloc_handler(void (*__f)()))() + { + void (* __old)() = __malloc_alloc_oom_handler; + __malloc_alloc_oom_handler = __f; + return(__old); + } +}; + +// malloc_alloc 针对内存不足时的处理方法 +#ifndef __STL_STATIC_TEMPLATE_MEMBER_BUG +// 默认为0 +template +void (* __malloc_alloc_template<__inst>::__malloc_alloc_oom_handler)() = 0; +#endif + +template +void* +__malloc_alloc_template<__inst>::_S_oom_malloc(size_t __n) +{ + void (* __my_malloc_handler)(); //声明一个处理内存不足的函数指针; + void* __result; + + // 一直申请直到失败或成功 + for (;;) { + __my_malloc_handler = __malloc_alloc_oom_handler; + //当 "内存不足处理方法" 并未被设置,便调用 __THROW_BAD_ALLOC,抛出异常信息 + if (0 == __my_malloc_handler) { __THROW_BAD_ALLOC; } + // 调用内存不足时的处理函数 + (*__my_malloc_handler)(); + __result = malloc(__n); // 再次尝试申请内存 + if (__result) return(__result); + } +} + +// 给一个已经分配了地址的指针重新分配空间 +template +void* __malloc_alloc_template<__inst>::_S_oom_realloc(void* __p, size_t __n) +{ + void (* __my_malloc_handler)(); + void* __result; + for (;;) { + __my_malloc_handler = __malloc_alloc_oom_handler; + if (0 == __my_malloc_handler) { __THROW_BAD_ALLOC; } + (*__my_malloc_handler)(); + __result = realloc(__p, __n); + if (__result) return(__result); + } +} +``` + +#### 1.4 stl_alloc.h __default_alloc_template + +> 两级结构, 第一级是 链表( free list ) 第二级是内存池 内存池不够的话, 继续 malloc +> +> 其实 free list 可以和内存池相互转换, +> +> 当 free list 某个大小的结点不足时, 可以调用内存池中的内存 +> +> 当内存池空的时候, 可以从free list中 调用 内存 + +```python +if(链表够): + 从链表中取 +else: + if(内存池够): + 从内存池中取(static refill(size_t __n)函数) + refill调用 static _chunk_alloc(ize_t __size, int &__nobjs)函数 + +``` + + + +```c++ +// stl_alloc.h __default_alloc_template + +template +class __default_alloc_template +{ +private: + static const int _ALIGN = 8; // 调整到 8字节 + static const int _MAX_BYTES = 128; // 最大字节数 + static const int _NFREELISTS = 16; // free lists 数目 _MAX_BYTES/_ALIGN + + static size_t _S_round_up(size_t __bytes){// 调整到 8字节 + return (((__bytes) + (size_t) _ALIGN-1) & ~((size_t) _ALIGN - 1)); + } + + union _Obj{ + union _Obj* _M_free_list_link; + char _M_client_data[1]; + };//感觉定义一个结构体, 元素只有一个 指向 自己的 地址也可以 + + // 静态变量 + static _Obj* volatile _S_free_list[]; + + // 确定应在哪个 list + static size_t _S_freelist_index(size_t __bytes){ + return (((__bytes) + (size_t)_ALIGN-1)/(size_t)_ALIGN - 1); + } + + + static void* _S_refill(size_t __n); + static char* _S_chunk_alloc(size_t __size, int &__nobjs); + + // Chunk allocation state, chunk_alloc 里使用 + static char* _S_start_free; // 内存池起始地址 + static char* _S_end_free; // 内存池结束地址 + static size_t _S_heap_size; // 内存池大小 + +public: + //-------接口---------- + static void *allocate(size_t __n){ + void *__ret = 0; + + if (__n > (size_t) _MAX_BYTES){ + __ret = malloc_alloc::allocate(__n); + } + else{ + //volatile 告诉编译器 不进行优化 + _Obj* volatile* __my_free_list = _S_free_list + _S_freelist_index(__n); + + _Obj* __result = *__my_free_list; + if (__result == 0) + __ret = _S_refill(_S_round_up(__n)); //重填链表 + else{ + //和链表一样, 指向下一个结点 + *__my_free_list = __result -> _M_free_list_link; + __ret = __result; + } + } + + return __ret; + }; + + static void deallocate(void* __p, size_t __n){ + // 小于128的存储块, 要将他返回到那个链表中 + if (__n > (size_t) _MAX_BYTES) + malloc_alloc::deallocate(__p, __n); + else + { + _Obj* volatile* __my_free_list = _S_free_list + _S_freelist_index(__n); + _Obj* __q = (_Obj*)__p; + + __q -> _M_free_list_link = *__my_free_list; + *__my_free_list = __q; + } + } + + static void* reallocate(void* __p, size_t __old_sz, size_t __new_sz){ + void *__result; + size_t __copy_sz; + + if (__old_sz > (size_t) _MAX_BYTES && __new_sz > (size_t) _MAX_BYTES){ + //原来的大小比128大 + return(realloc(__p, __new_sz)); + } + if (_S_round_up(__old_sz) == _S_round_up(__new_sz)) return(__p); + __result = allocate(__new_sz); + __copy_sz = __new_sz > __old_sz? __old_sz : __new_sz; + memcpy(__result, __p, __copy_sz); + deallocate(__p, __old_sz); + return(__result); + } +}; + + +template +char* __default_alloc_template<__threads, __inst>::_S_start_free = 0; + +template +char* __default_alloc_template<__threads, __inst>::_S_end_free = 0; + +template +size_t __default_alloc_template<__threads, __inst>::_S_heap_size = 0; + +template +typename __default_alloc_template<__threads, __inst>::_Obj* volatile +__default_alloc_template<__threads, __inst> ::_S_free_list[ + __default_alloc_template<__threads, __inst>::_NFREELISTS +] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +``` + +```c++ +// 返回一个大小为 n 的对象(假定 n 已经适当上调至 8 的倍数), +// 因为free list中没有了节点, 所以尝试为对应的 free list 增加节点数目 +// 默认取得20个新节点, 但如果内存池空间不足,获得的节点数可能小于20, 其中一个节点返回给调用者, 剩下的节点添入对应 free list + +template +void *__default_alloc_template<__threads, __inst>:: +_S_refill(size_t __n){ + //重填链表, 默认重新要20个节点 + int __nobjs = 20; + // 注意参数 nobjs 是引用类型 + char* __chunk = _S_chunk_alloc(__n, __nobjs); + _Obj* volatile* __my_free_list; + _Obj* __result; + _Obj* __current_obj; + _Obj* __next_obj; + + // 仅获得一个区块, 分配给调用者用, free list 无新节点 + if (1 == __nobjs) return(__chunk); + + // 将多余区块纳入 free list + __my_free_list = _S_free_list + _S_freelist_index(__n); + __result = (_Obj*)__chunk; + *__my_free_list = __next_obj = (_Obj*)(__chunk + __n); + + // 因为原始的内存里面的内容都是空的, 或者没有意义的, 需要将各节点串联起来, 第0个区块将返回给调用者 + for (int __i = 1; __i < __nobjs - 1; __i++){ + __current_obj = __next_obj; + __next_obj = (_Obj*)((char*)__next_obj + __n); + __current_obj -> _M_free_list_link = __next_obj; + } + __next_obj -> _M_free_list_link = 0; + return(__result); +} + + +// 被 refill() 调用, 从内存池中取空间给 free list 使用 +// 个人感觉没有必要, 毕竟这一个函数也只有 refill 调用(错误) +// 为了递归调用自己(从freelist中找到了能用的 块 ) +// 分配 nobjs 个大小为 size 的区块, +template +char *__default_alloc_template<__threads, __inst>:: +_S_chunk_alloc(size_t __size, int &__nobjs){ + char *__result; + size_t __total_bytes = __size * __nobjs; + size_t __bytes_left = _S_end_free - _S_start_free; // 内存池剩余空间 + + if (__bytes_left >= __total_bytes){ + // 内存池剩余空间完全满足需求量 + __result = _S_start_free; + _S_start_free += __total_bytes; + return(__result); + } + else if (__bytes_left >= __size){ + // 内存池剩余空间不能完全满足需求量, 但能够供应至少一个区块 + __nobjs = (int)(__bytes_left/__size); + __total_bytes = __size * __nobjs; + __result = _S_start_free; + _S_start_free += __total_bytes; + return(__result); + } + else{ + // 内存池剩余空间连一个区块的大小能不能提供 + // 利用 malloc() 从 heap 中配置内存, 大小为需求量的两倍, 再加上一个随着配置次数增加而越来越大的附加量 + size_t __bytes_to_get = 2 * __total_bytes + _S_round_up(_S_heap_size >> 4); + // 因为要创建新的内存池了, 所以 将 旧的 内存池中剩余的残余空间分配到适当的 free list 中 + if (__bytes_left > 0){ + _Obj* volatile* __my_free_list = _S_free_list + _S_freelist_index(__bytes_left); + + ((_Obj*)_S_start_free) -> _M_free_list_link = *__my_free_list; + *__my_free_list = (_Obj*)_S_start_free; + } + + // 尝试从 heap 中配置内存 + _S_start_free = (char*)malloc(__bytes_to_get); + if (0 == _S_start_free){ + // heap 空间不足, malloc() 失败, 无法获得内存 + size_t __i; + _Obj* volatile* __my_free_list; + _Obj* __p; + // 从free list 找, 因为可能有些块比你需要的块 大 可以把他切割掉 + for (__i = __size; __i <= (size_t)_MAX_BYTES; __i += (size_t)_ALIGN){ + __my_free_list = _S_free_list + _S_freelist_index(__i); + __p = *__my_free_list; + if (0 != __p){ + *__my_free_list = __p -> _M_free_list_link; + _S_start_free = (char*)__p; + _S_end_free = _S_start_free + __i; + // 现在至少能提供一个区块了, 递归调用自己以修正 nobjs + return(_S_chunk_alloc(__size, __nobjs)); + } + } + + // 连 free list 里也没有可用内存了 + _S_end_free = 0; + // 调用一级配置器看能不能有点用 + // 一级配置器有 out-of-memory 处理机制, 或许有机会改善现在的情况, 如果无法改善, 抛出bad_alloc异常 + _S_start_free = (char*)malloc_alloc::allocate(__bytes_to_get); + } + _S_heap_size += __bytes_to_get; + _S_end_free = _S_start_free + __bytes_to_get; + return(_S_chunk_alloc(__size, __nobjs)); + } +} +``` \ No newline at end of file diff --git a/_posts/cpp/2023-07-30-commit-style.md b/_posts/cpp/2023-07-30-commit-style.md new file mode 100644 index 0000000..cd09d73 --- /dev/null +++ b/_posts/cpp/2023-07-30-commit-style.md @@ -0,0 +1,54 @@ +--- +layout: blog +banana: true +category: cpp +title: commit 规范 +date: 2023-07-30 19:08:53 +background: green +tags: +- cpp +- standard +--- + +* content +{:toc} + + + + +#### 规范 + +``` +(): + + + +