From 9c8da5f83cc1b0da68692358c0e4a0b7bb2a76e6 Mon Sep 17 00:00:00 2001 From: Morgan Date: Sat, 21 Oct 2023 16:05:44 +0900 Subject: [PATCH] Changed bunch --- README.md | 1 + archetypes/default.md | 6 + assets/css/gowun.woff2 | Bin 0 -> 445276 bytes config.yml | 133 +++ content/archive.md | 7 + ...attacks-exploiting-peculative-execution.md | 22 + .../posts/20210620-siheomeul-iljuil-apdugo.md | 18 + .../posts/ad-techwa-tonggyeyi-sseuimsae.md | 20 + content/posts/attitude-for-criticism.md | 26 + ...buteo-ram-flash-geurigo-intel-4004ggaji.md | 12 + ...eulrogeu-geulsseugineun-neomu-himdeuleo.md | 30 + ...e-jinjja-sangsangdo-moshaessdeon-ilinde.md | 12 + content/posts/cryptography.md | 126 +++ .../posts/daehag-ibsiga-handangye-namassda.md | 42 + .../dareun-jibe-eonjhyeo-sandaneun-geoseun.md | 28 + content/posts/datacenter.md | 21 + content/posts/gaeinjeongbo-privacy.md | 22 + content/posts/godeunghaggyo-dolabogi.md | 40 + ...manheun-peijireul-eoddeohge-cajanaelgga.md | 22 + content/posts/gyoyug-silpae.md | 25 + .../haggyoeseo-haessdeon-peurojegteudeul.md | 18 + content/posts/hardware-security.md | 70 ++ content/posts/how-i-wanted-to-do.md | 18 + content/posts/insaeng-dubeonjjae-silpae.md | 20 + ...jeeoyi-segyein-mirae-geu-boanyi-wihyeob.md | 22 + ...-cfd-with-python-navier-stokes-equation.md | 899 ++++++++++++++++++ .../pyphy-mulrienjin-1pyeon-gibon-aidieo.md | 66 ++ content/posts/security-of-iot.md | 27 + content/posts/wasting-time.md | 8 + content/posts/what-i-want-to-do.md | 58 ++ content/posts/what-i-wanted-to-do.md | 62 ++ .../what-the-hell-is-usb-c-dp-alt-mode.md | 33 + .../what-the-hell-is-usb-c-dp-alt-mode.md~ | 35 + .../yangja-keompyuteowa-yangja-eonilring.md | 32 + content/posts/yangjadeulyi-teuraenjiseuteo.md | 28 + content/profile.md | 6 + public/404.html | 14 + public/archives/index.html | 14 + ...8adeae85edf7230c82064f82ab2449b47e997f.css | 7 + ...98ef67e38caa385385a2e25860723f687b6ead.css | 7 + ...b20c543637007ef52c9569979a282a0d454192.css | 7 + ...a2fa755f6ade7c55866bdb96e44c6bcaf6cfbb.css | 7 + ...aa2fff9e8a8ca9ef99d610b376bf820fafb0f6.css | 7 + ...803f159cf9edaa0f3227711cd1bc4ad3757dc0.css | 7 + ...41912a49898f651e686f85a3afc91f56185f87.css | 7 + ...be4d95134f7701fc118235b9905b47d67ed567.css | 7 + ...9acaf6347ebe8d106a4fb5545b6cc7ffe22801.css | 7 + ...01a4ce7971dc7f8e6d46c2edeeb3bb1555198b.css | 7 + ...10866286dfff3a27bfb6e489adbe8235ebfb64.css | 7 + ...5ce5dce6f31e41266c2227af80fea59903abc7.css | 7 + ...4f359b64dc3689527b6a6b100ed040291ea5e2.css | 7 + ...338ec5bfc11001d7c225dc92cc4b0e6d29c8e6.css | 7 + ...632408e58ac146fbdbe62747134bea2fa3415e0.js | 44 + public/categories/index.html | 14 + public/categories/index.xml | 13 + public/favicon.ico | Bin 0 -> 102089 bytes public/index.html | 16 + public/index.xml | 316 ++++++ .../index.html | 16 + .../index.html | 19 + public/posts/2022041406/index.html | 19 + .../ad-techwa-tonggyeyi-sseuimsae/index.html | 22 + .../posts/attitude-for-criticism/index.html | 19 + .../index.html | 16 + .../index.html | 19 + .../index.html | 16 + public/posts/cryptography/index.html | 27 + .../index.html | 25 + .../index.html | 19 + public/posts/datacenter/index.html | 19 + public/posts/gaeinjeongbo-privacy/index.html | 19 + .../posts/godeunghaggyo-dolabogi/index.html | 22 + .../index.html | 16 + .../index.html | 16 + public/posts/hardware-security/index.html | 16 + public/posts/how-i-wanted-to-do/index.html | 16 + public/posts/index.html | 29 + public/posts/index.xml | 306 ++++++ .../insaeng-dubeonjjae-silpae/index.html | 25 + .../index.html | 16 + .../index.html | 776 +++++++++++++++ public/posts/page/1/index.html | 1 + public/posts/page/2/index.html | 32 + .../index.html | 35 + public/posts/security-of-iot/index.html | 19 + public/posts/wasting-time/index.html | 16 + public/posts/what-i-want-to-do/index.html | 22 + public/posts/what-i-wanted-to-do/index.html | 18 + .../index.html | 34 + .../index.html | 22 + .../yangjadeulyi-teuraenjiseuteo/index.html | 19 + public/profile/index.html | 15 + public/robots.txt | 3 + public/sitemap.xml | 110 +++ public/tags/index.html | 14 + public/tags/index.xml | 23 + public/tags/security/index.html | 16 + public/tags/security/index.xml | 24 + public/tags/security/page/1/index.html | 1 + push.sh | 3 + ...s_b17b8b3fd5dba5bd88a508c1c1f3b99b.content | 10 + ...scss_b17b8b3fd5dba5bd88a508c1c1f3b99b.json | 1 + static/favicon.ico | Bin 0 -> 102089 bytes themes/mytheme/LICENSE | 22 + themes/mytheme/README.md | 96 ++ themes/mytheme/asd | 51 + themes/mytheme/assets/css/common/404.css | 11 + themes/mytheme/assets/css/common/archive.css | 44 + themes/mytheme/assets/css/common/footer.css | 60 ++ themes/mytheme/assets/css/common/header.css | 93 ++ themes/mytheme/assets/css/common/main.css | 68 ++ .../mytheme/assets/css/common/post-entry.css | 104 ++ .../mytheme/assets/css/common/post-single.css | 403 ++++++++ .../assets/css/common/profile-mode.css | 42 + themes/mytheme/assets/css/common/search.css | 45 + themes/mytheme/assets/css/common/terms.css | 18 + themes/mytheme/assets/css/core/license.css | 6 + themes/mytheme/assets/css/core/reset.css | 121 +++ themes/mytheme/assets/css/core/theme-vars.css | 38 + themes/mytheme/assets/css/core/zmedia.css | 49 + themes/mytheme/assets/css/extended/blank.css | 5 + .../assets/css/hljs/an-old-hope.min.css | 63 ++ .../assets/css/includes/scroll-bar.css | 63 ++ themes/mytheme/assets/js/fastsearch.js | 147 +++ themes/mytheme/assets/js/fuse.basic.min.js | 9 + themes/mytheme/assets/js/highlight.min.js | 44 + themes/mytheme/assets/js/license.js | 6 + themes/mytheme/go.mod | 3 + themes/mytheme/i18n/ar.yaml | 22 + themes/mytheme/i18n/bg.yaml | 16 + themes/mytheme/i18n/bn.yaml | 28 + themes/mytheme/i18n/ca.yaml | 19 + themes/mytheme/i18n/ckb.yaml | 25 + themes/mytheme/i18n/da.yaml | 28 + themes/mytheme/i18n/de.yaml | 33 + themes/mytheme/i18n/en.yaml | 33 + themes/mytheme/i18n/eo.yaml | 25 + themes/mytheme/i18n/es.yaml | 33 + themes/mytheme/i18n/fa.yaml | 28 + themes/mytheme/i18n/fr.yaml | 33 + themes/mytheme/i18n/he.yaml | 19 + themes/mytheme/i18n/hi.yaml | 19 + themes/mytheme/i18n/hu.yaml | 16 + themes/mytheme/i18n/id.yaml | 33 + themes/mytheme/i18n/it.yaml | 27 + themes/mytheme/i18n/ja.yaml | 33 + themes/mytheme/i18n/ko.yaml | 33 + themes/mytheme/i18n/ku.yaml | 25 + themes/mytheme/i18n/mn.yaml | 25 + themes/mytheme/i18n/ms.yaml | 28 + themes/mytheme/i18n/nl.yaml | 33 + themes/mytheme/i18n/pl.yaml | 28 + themes/mytheme/i18n/pt.yaml | 21 + themes/mytheme/i18n/ru.yaml | 39 + themes/mytheme/i18n/sv.yaml | 28 + themes/mytheme/i18n/tr.yaml | 25 + themes/mytheme/i18n/uk.yaml | 25 + themes/mytheme/i18n/uz.yaml | 20 + themes/mytheme/i18n/vi.yaml | 25 + themes/mytheme/i18n/zh-tw.yaml | 33 + themes/mytheme/i18n/zh.yaml | 33 + themes/mytheme/images/screenshot.png | Bin 0 -> 141511 bytes themes/mytheme/images/tn.png | Bin 0 -> 15898 bytes themes/mytheme/layouts/404.html | 3 + .../_default/_markup/render-image.html | 1 + themes/mytheme/layouts/_default/archives.html | 49 + themes/mytheme/layouts/_default/baseof.html | 23 + themes/mytheme/layouts/_default/index.json | 7 + themes/mytheme/layouts/_default/list.html | 112 +++ themes/mytheme/layouts/_default/rss.xml | 50 + themes/mytheme/layouts/_default/search.html | 29 + themes/mytheme/layouts/_default/single.html | 59 ++ themes/mytheme/layouts/_default/terms.html | 27 + .../layouts/partials/anchored_headings.html | 2 + themes/mytheme/layouts/partials/author.html | 9 + .../mytheme/layouts/partials/breadcrumbs.html | 19 + themes/mytheme/layouts/partials/comments.html | 14 + themes/mytheme/layouts/partials/cover.html | 40 + .../mytheme/layouts/partials/edit_post.html | 8 + .../layouts/partials/extend_footer.html | 3 + .../mytheme/layouts/partials/extend_head.html | 4 + themes/mytheme/layouts/partials/footer.html | 135 +++ themes/mytheme/layouts/partials/head.html | 170 ++++ themes/mytheme/layouts/partials/header.html | 160 ++++ .../mytheme/layouts/partials/home_info.html | 13 + .../layouts/partials/index_profile.html | 59 ++ .../layouts/partials/post_canonical.html | 9 + .../mytheme/layouts/partials/post_meta.html | 21 + .../layouts/partials/post_nav_links.html | 19 + .../mytheme/layouts/partials/share_icons.html | 71 ++ .../layouts/partials/social_icons.html | 8 + themes/mytheme/layouts/partials/svg.html | 649 +++++++++++++ .../layouts/partials/templates/opengraph.html | 52 + .../partials/templates/schema_json.html | 119 +++ .../partials/templates/twitter_cards.html | 33 + themes/mytheme/layouts/partials/toc.html | 97 ++ .../layouts/partials/translation_list.html | 19 + themes/mytheme/layouts/robots.txt | 7 + themes/mytheme/layouts/shortcodes/chat.html | 12 + .../mytheme/layouts/shortcodes/collapse.html | 8 + themes/mytheme/layouts/shortcodes/figure.html | 31 + .../mytheme/layouts/shortcodes/inTextImg.html | 5 + themes/mytheme/layouts/shortcodes/ltr.html | 15 + .../mytheme/layouts/shortcodes/rawhtml.html | 2 + themes/mytheme/layouts/shortcodes/rtl.html | 15 + themes/mytheme/theme.yaml | 41 + update.sh | 7 + 207 files changed, 9213 insertions(+) create mode 100644 README.md create mode 100644 archetypes/default.md create mode 100644 assets/css/gowun.woff2 create mode 100644 config.yml create mode 100644 content/archive.md create mode 100644 content/posts/1-spectre-attacks-exploiting-peculative-execution.md create mode 100644 content/posts/20210620-siheomeul-iljuil-apdugo.md create mode 100644 content/posts/ad-techwa-tonggyeyi-sseuimsae.md create mode 100644 content/posts/attitude-for-criticism.md create mode 100644 content/posts/bandoceyi-weonri-jongryu-soja-yeogsa-saneob-mosfetbuteo-ram-flash-geurigo-intel-4004ggaji.md create mode 100644 content/posts/beulrogeu-geulsseugineun-neomu-himdeuleo.md create mode 100644 content/posts/cam-nae-jinjja-sangsangdo-moshaessdeon-ilinde.md create mode 100644 content/posts/cryptography.md create mode 100644 content/posts/daehag-ibsiga-handangye-namassda.md create mode 100644 content/posts/dareun-jibe-eonjhyeo-sandaneun-geoseun.md create mode 100644 content/posts/datacenter.md create mode 100644 content/posts/gaeinjeongbo-privacy.md create mode 100644 content/posts/godeunghaggyo-dolabogi.md create mode 100644 content/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga.md create mode 100644 content/posts/gyoyug-silpae.md create mode 100644 content/posts/haggyoeseo-haessdeon-peurojegteudeul.md create mode 100644 content/posts/hardware-security.md create mode 100644 content/posts/how-i-wanted-to-do.md create mode 100644 content/posts/insaeng-dubeonjjae-silpae.md create mode 100644 content/posts/jeonja-jeeoyi-segyein-mirae-geu-boanyi-wihyeob.md create mode 100644 content/posts/jeonsanyuceyeoghag-cfd-with-python-navier-stokes-equation.md create mode 100644 content/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo.md create mode 100644 content/posts/security-of-iot.md create mode 100644 content/posts/wasting-time.md create mode 100644 content/posts/what-i-want-to-do.md create mode 100644 content/posts/what-i-wanted-to-do.md create mode 100644 content/posts/what-the-hell-is-usb-c-dp-alt-mode.md create mode 100644 content/posts/what-the-hell-is-usb-c-dp-alt-mode.md~ create mode 100644 content/posts/yangja-keompyuteowa-yangja-eonilring.md create mode 100644 content/posts/yangjadeulyi-teuraenjiseuteo.md create mode 100644 content/profile.md create mode 100644 public/404.html create mode 100644 public/archives/index.html create mode 100644 public/assets/css/stylesheet.0c567cdb3cebd0d379aa8cad5d8adeae85edf7230c82064f82ab2449b47e997f.css create mode 100644 public/assets/css/stylesheet.1bcbda8c7ce05a9f797f39955298ef67e38caa385385a2e25860723f687b6ead.css create mode 100644 public/assets/css/stylesheet.27a50fc99f97709c2602a00374b20c543637007ef52c9569979a282a0d454192.css create mode 100644 public/assets/css/stylesheet.31527a12923607f33c1cac9636a2fa755f6ade7c55866bdb96e44c6bcaf6cfbb.css create mode 100644 public/assets/css/stylesheet.48d20c88c89e0ba76c8614d826aa2fff9e8a8ca9ef99d610b376bf820fafb0f6.css create mode 100644 public/assets/css/stylesheet.49aeea58062c6f9ed716ca009b803f159cf9edaa0f3227711cd1bc4ad3757dc0.css create mode 100644 public/assets/css/stylesheet.636d5654670dcdc7ed178fde0a41912a49898f651e686f85a3afc91f56185f87.css create mode 100644 public/assets/css/stylesheet.64013ace36f887a1be8abc1df1be4d95134f7701fc118235b9905b47d67ed567.css create mode 100644 public/assets/css/stylesheet.688e9283c99a71ee5818e794a19acaf6347ebe8d106a4fb5545b6cc7ffe22801.css create mode 100644 public/assets/css/stylesheet.6fb38170e6e1e68be3f8be786701a4ce7971dc7f8e6d46c2edeeb3bb1555198b.css create mode 100644 public/assets/css/stylesheet.79528d080532744ab99d7e1ee310866286dfff3a27bfb6e489adbe8235ebfb64.css create mode 100644 public/assets/css/stylesheet.a2c159d6026cb355c26fac9b3d5ce5dce6f31e41266c2227af80fea59903abc7.css create mode 100644 public/assets/css/stylesheet.c9a7485e6b21b03f4aada853aa4f359b64dc3689527b6a6b100ed040291ea5e2.css create mode 100644 public/assets/css/stylesheet.cee0caf510d739f89358556ea7338ec5bfc11001d7c225dc92cc4b0e6d29c8e6.css create mode 100644 public/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js create mode 100644 public/categories/index.html create mode 100644 public/categories/index.xml create mode 100644 public/favicon.ico create mode 100644 public/index.html create mode 100644 public/index.xml create mode 100644 public/posts/1-spectre-attacks-exploiting-peculative-execution/index.html create mode 100644 public/posts/20210620-siheomeul-iljuil-apdugo/index.html create mode 100644 public/posts/2022041406/index.html create mode 100644 public/posts/ad-techwa-tonggyeyi-sseuimsae/index.html create mode 100644 public/posts/attitude-for-criticism/index.html create mode 100644 public/posts/bandoceyi-weonri-jongryu-soja-yeogsa-saneob-mosfetbuteo-ram-flash-geurigo-intel-4004ggaji/index.html create mode 100644 public/posts/beulrogeu-geulsseugineun-neomu-himdeuleo/index.html create mode 100644 public/posts/cam-nae-jinjja-sangsangdo-moshaessdeon-ilinde/index.html create mode 100644 public/posts/cryptography/index.html create mode 100644 public/posts/daehag-ibsiga-handangye-namassda/index.html create mode 100644 public/posts/dareun-jibe-eonjhyeo-sandaneun-geoseun/index.html create mode 100644 public/posts/datacenter/index.html create mode 100644 public/posts/gaeinjeongbo-privacy/index.html create mode 100644 public/posts/godeunghaggyo-dolabogi/index.html create mode 100644 public/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga/index.html create mode 100644 public/posts/haggyoeseo-haessdeon-peurojegteudeul/index.html create mode 100644 public/posts/hardware-security/index.html create mode 100644 public/posts/how-i-wanted-to-do/index.html create mode 100644 public/posts/index.html create mode 100644 public/posts/index.xml create mode 100644 public/posts/insaeng-dubeonjjae-silpae/index.html create mode 100644 public/posts/jeonja-jeeoyi-segyein-mirae-geu-boanyi-wihyeob/index.html create mode 100644 public/posts/jeonsanyuceyeoghag-cfd-with-python-navier-stokes-equation/index.html create mode 100644 public/posts/page/1/index.html create mode 100644 public/posts/page/2/index.html create mode 100644 public/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo/index.html create mode 100644 public/posts/security-of-iot/index.html create mode 100644 public/posts/wasting-time/index.html create mode 100644 public/posts/what-i-want-to-do/index.html create mode 100644 public/posts/what-i-wanted-to-do/index.html create mode 100644 public/posts/what-the-hell-is-usb-c-dp-alt-mode/index.html create mode 100644 public/posts/yangja-keompyuteowa-yangja-eonilring/index.html create mode 100644 public/posts/yangjadeulyi-teuraenjiseuteo/index.html create mode 100644 public/profile/index.html create mode 100644 public/robots.txt create mode 100644 public/sitemap.xml create mode 100644 public/tags/index.html create mode 100644 public/tags/index.xml create mode 100644 public/tags/security/index.html create mode 100644 public/tags/security/index.xml create mode 100644 public/tags/security/page/1/index.html create mode 100755 push.sh create mode 100644 resources/_gen/assets/scss/scss/main.scss_b17b8b3fd5dba5bd88a508c1c1f3b99b.content create mode 100644 resources/_gen/assets/scss/scss/main.scss_b17b8b3fd5dba5bd88a508c1c1f3b99b.json create mode 100644 static/favicon.ico create mode 100644 themes/mytheme/LICENSE create mode 100644 themes/mytheme/README.md create mode 100644 themes/mytheme/asd create mode 100644 themes/mytheme/assets/css/common/404.css create mode 100644 themes/mytheme/assets/css/common/archive.css create mode 100644 themes/mytheme/assets/css/common/footer.css create mode 100644 themes/mytheme/assets/css/common/header.css create mode 100644 themes/mytheme/assets/css/common/main.css create mode 100644 themes/mytheme/assets/css/common/post-entry.css create mode 100644 themes/mytheme/assets/css/common/post-single.css create mode 100644 themes/mytheme/assets/css/common/profile-mode.css create mode 100644 themes/mytheme/assets/css/common/search.css create mode 100644 themes/mytheme/assets/css/common/terms.css create mode 100644 themes/mytheme/assets/css/core/license.css create mode 100644 themes/mytheme/assets/css/core/reset.css create mode 100644 themes/mytheme/assets/css/core/theme-vars.css create mode 100644 themes/mytheme/assets/css/core/zmedia.css create mode 100644 themes/mytheme/assets/css/extended/blank.css create mode 100644 themes/mytheme/assets/css/hljs/an-old-hope.min.css create mode 100644 themes/mytheme/assets/css/includes/scroll-bar.css create mode 100644 themes/mytheme/assets/js/fastsearch.js create mode 100644 themes/mytheme/assets/js/fuse.basic.min.js create mode 100644 themes/mytheme/assets/js/highlight.min.js create mode 100644 themes/mytheme/assets/js/license.js create mode 100644 themes/mytheme/go.mod create mode 100644 themes/mytheme/i18n/ar.yaml create mode 100644 themes/mytheme/i18n/bg.yaml create mode 100644 themes/mytheme/i18n/bn.yaml create mode 100644 themes/mytheme/i18n/ca.yaml create mode 100644 themes/mytheme/i18n/ckb.yaml create mode 100644 themes/mytheme/i18n/da.yaml create mode 100644 themes/mytheme/i18n/de.yaml create mode 100644 themes/mytheme/i18n/en.yaml create mode 100644 themes/mytheme/i18n/eo.yaml create mode 100644 themes/mytheme/i18n/es.yaml create mode 100644 themes/mytheme/i18n/fa.yaml create mode 100644 themes/mytheme/i18n/fr.yaml create mode 100644 themes/mytheme/i18n/he.yaml create mode 100644 themes/mytheme/i18n/hi.yaml create mode 100644 themes/mytheme/i18n/hu.yaml create mode 100644 themes/mytheme/i18n/id.yaml create mode 100644 themes/mytheme/i18n/it.yaml create mode 100644 themes/mytheme/i18n/ja.yaml create mode 100644 themes/mytheme/i18n/ko.yaml create mode 100644 themes/mytheme/i18n/ku.yaml create mode 100644 themes/mytheme/i18n/mn.yaml create mode 100644 themes/mytheme/i18n/ms.yaml create mode 100644 themes/mytheme/i18n/nl.yaml create mode 100644 themes/mytheme/i18n/pl.yaml create mode 100644 themes/mytheme/i18n/pt.yaml create mode 100644 themes/mytheme/i18n/ru.yaml create mode 100644 themes/mytheme/i18n/sv.yaml create mode 100644 themes/mytheme/i18n/tr.yaml create mode 100644 themes/mytheme/i18n/uk.yaml create mode 100644 themes/mytheme/i18n/uz.yaml create mode 100644 themes/mytheme/i18n/vi.yaml create mode 100644 themes/mytheme/i18n/zh-tw.yaml create mode 100644 themes/mytheme/i18n/zh.yaml create mode 100644 themes/mytheme/images/screenshot.png create mode 100644 themes/mytheme/images/tn.png create mode 100644 themes/mytheme/layouts/404.html create mode 100644 themes/mytheme/layouts/_default/_markup/render-image.html create mode 100644 themes/mytheme/layouts/_default/archives.html create mode 100644 themes/mytheme/layouts/_default/baseof.html create mode 100644 themes/mytheme/layouts/_default/index.json create mode 100644 themes/mytheme/layouts/_default/list.html create mode 100644 themes/mytheme/layouts/_default/rss.xml create mode 100644 themes/mytheme/layouts/_default/search.html create mode 100644 themes/mytheme/layouts/_default/single.html create mode 100644 themes/mytheme/layouts/_default/terms.html create mode 100644 themes/mytheme/layouts/partials/anchored_headings.html create mode 100644 themes/mytheme/layouts/partials/author.html create mode 100644 themes/mytheme/layouts/partials/breadcrumbs.html create mode 100644 themes/mytheme/layouts/partials/comments.html create mode 100644 themes/mytheme/layouts/partials/cover.html create mode 100644 themes/mytheme/layouts/partials/edit_post.html create mode 100644 themes/mytheme/layouts/partials/extend_footer.html create mode 100644 themes/mytheme/layouts/partials/extend_head.html create mode 100644 themes/mytheme/layouts/partials/footer.html create mode 100644 themes/mytheme/layouts/partials/head.html create mode 100644 themes/mytheme/layouts/partials/header.html create mode 100644 themes/mytheme/layouts/partials/home_info.html create mode 100644 themes/mytheme/layouts/partials/index_profile.html create mode 100644 themes/mytheme/layouts/partials/post_canonical.html create mode 100644 themes/mytheme/layouts/partials/post_meta.html create mode 100644 themes/mytheme/layouts/partials/post_nav_links.html create mode 100644 themes/mytheme/layouts/partials/share_icons.html create mode 100644 themes/mytheme/layouts/partials/social_icons.html create mode 100644 themes/mytheme/layouts/partials/svg.html create mode 100644 themes/mytheme/layouts/partials/templates/opengraph.html create mode 100644 themes/mytheme/layouts/partials/templates/schema_json.html create mode 100644 themes/mytheme/layouts/partials/templates/twitter_cards.html create mode 100644 themes/mytheme/layouts/partials/toc.html create mode 100644 themes/mytheme/layouts/partials/translation_list.html create mode 100644 themes/mytheme/layouts/robots.txt create mode 100644 themes/mytheme/layouts/shortcodes/chat.html create mode 100644 themes/mytheme/layouts/shortcodes/collapse.html create mode 100644 themes/mytheme/layouts/shortcodes/figure.html create mode 100644 themes/mytheme/layouts/shortcodes/inTextImg.html create mode 100644 themes/mytheme/layouts/shortcodes/ltr.html create mode 100644 themes/mytheme/layouts/shortcodes/rawhtml.html create mode 100644 themes/mytheme/layouts/shortcodes/rtl.html create mode 100644 themes/mytheme/theme.yaml create mode 100755 update.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..de966a4 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# blog diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..00e77bd --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,6 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +draft: true +--- + diff --git a/assets/css/gowun.woff2 b/assets/css/gowun.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a863e3f689b0ec9204bbf90c59685465058e3c16 GIT binary patch literal 445276 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 z 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

9k2N$*}h+Gu=(mJO4?e3*3`L|zrC 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 z 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⁣VLZpmuNYFEFAEUD7;d}` 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⪪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�u_{GmX|yEsR00pi%_o@knbHV8Z}HGQIxA*U?UOwH z(!_6%#%LJOBjw%>#T5m~_J}2TVoH!qT7nu?mVKDsv)q0%iTXp2|zGj$vul6+!SGCESgZ(IiLBF-FGuV>+9M)UC;oxjBaK8z{*K@;8=VV`g+GwmdOkYaE zz7U+Em-<2%?vgAiMFMNFD=s?johGoThc;6v?gKj1W-0_4DKI8Km=3YB(DFipf8Z_I zr%zI%+HO_YGE4iLJHQ!K_B+vnmLD-cnjX$4;$)1Srrh2+`gof86ezU&8|zE^eMB&avl zKX2(jiml*7(!`cZJIqM-u`Tv&Cb!p6QgCqvd&dcfKwXiRkqsPr!Ffs!Uu>kE{g)y8<5=u9udvl%3CJtA^7aL|K< z+zd-4$y2&fph+Z)qb(ftRCTD2KhGX|u?TLdSaeI?`@MSa*3t7r%a0&fgz1KS=OXJ* zq1T-oZp?8IBS3q7Dmql1e5A5^*C~W{k1bBKu^-n*Q5w`}yYWtu#}w2k#Y`cG+4xXE z5myE|gsLs+K;1%B}t#$DcMF5^w1pFdija&6Hugel}2?R?O5) z+@N%{XX|~H$D;H8X!A-(cnkb>+R_y~pB)wj%By@zwnRu*-fkK^4S~90Y`7K)E#)b= z_cSDmZifU<`~86eop@k~ey=xsoRANkVPproZ>NhxPDL|rB6bXI$dpF}Rb8uVVw(pE z_9~vX9N!``69t_d9#?`rV_y$qbXhlx+5U#-THidj4j*qx^_UX=lXkEaj&2*q-adXq z@BJIM9viH@wQfpFiK)pPa7Ir0P?uDGy`ha8Q<=4&u?Gtd!?m4AAa75WT@~LBMAES$xPMwXba4~G# zTfC zXL@f2oOU{NlotMbK5p##-MI*kY*365x);} z(D4pAX&W*^3ixvZ#lU}+||U4^tc@+*5IiP=`8SWRcFcLIg#Y<>o% zPArMDDT)@mt&X4T7gosy?nfxMHt)`i#+5GLUT?Xu8#%tkE9IKGDUx@Zl!L$X$II zGNi*YudTb{&J-0C5zJ!)o*5cl3&Wd`WUP_dDRP1Xt=7-u@b#Lsa33}gN631|DA3s` zs>W%#oSSFz{dAX=vmJUH%8i)oB11aEo=#kqqvvCJqhg>lRNd?gm&QbX{2wJ=I~B}N zg|XuaAlphHc75(4gv{IT!xq?}lZ7S^>z0znc6VI$(Y&OB?M>ePa8^K-)ciTEzpIM- zu*%^GOQ0rB|0~>2n=Pd>6J4VAXcFaCa#t9h4+=tgWs)POh7rTwx=QLHj9Qo}huJ+u zpPZhe-Kp0hI+wNrm{*-zbMy5@DIUpov0j9T2VR_Ok+%3;<`gj4Y}nM&(g}5m!KHa6P&#jNC`iT9`d$SvMp`X zmx3v7E_mEX-wkdGW(*3UQXDFYMBBpYK-G9VH#O*UfshY^szYsTQHyum_P!p>1Xr_P zq7J00SdOW3yGS>q7EAW=;2lx~o88(l!pU0)OI66jDla)%sGr1Q+E7+TLq4AY-UlLX8j" # optional +# imageTitle: "" # optional +# imageWidth: 120 # custom size +# imageHeight: 120 # custom size + buttons: + - name: Profile + url: "profile/" + - name: Posts + url: "posts/" + - name: Archive + url: "archive/" +# homeInfoParams: +# Title: Hi, I'm Morgan. +# Content: I am student developer in Korea, studying Embedded system and Cryptography. + + socialIcons: # optional + - name: git + url: "https://git.morgan.kr" + - name: twitter + url: "https://twitter.com/morgan8e" + - name: github + url: "https://github.com/morgan9e" + - name: email + url: "mailto:me@morgan.kr" + + assets: + # disableHLJS: true # to disable highlight.js + # disableFingerprinting: true + favicon: "https://blog.morgan.kr/favicon.ico" + # favicon16x16: "<link / abs url>" + # favicon32x32: "<link / abs url>" + apple_touch_icon: "https://blog.morgan.kr/favicon.ico" + safari_pinned_tab: "https://blog.morgan.kr/favicon.ico" + + label: + icon: /favicon.ico + iconHeight: 1 + + analytics: + google: + SiteVerificationTag: "XYZabc" + bing: + SiteVerificationTag: "XYZabc" + yandex: + SiteVerificationTag: "XYZabc" + + cover: + hidden: true # hide everywhere but not in structured data + hiddenInList: true # hide on list pages and home + hiddenInSingle: true # hide on single page + + # for search + # https://fusejs.io/api/options.html + fuseOpts: + isCaseSensitive: false + shouldSort: true + location: 0 + distance: 1000 + threshold: 0.4 + minMatchCharLength: 0 + keys: ["title", "permalink", "summary", "content"] + +menu: + main: + - identifier: posts + name: Posts + url: /posts/ + weight: 30 + - identifier: categories + name: Categories + url: /categories/ + weight: 10 + - identifier: tags + name: Tags + url: /tags/ + weight: 20 +# Read: https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#using-hugos-syntax-highlighter-chroma + +pygmentsUseClasses: true +markup: + highlight: + noClasses: false + # anchorLineNos: true + # codeFences: true + # guessSyntax: true + # lineNos: true + # style: monokai diff --git a/content/archive.md b/content/archive.md new file mode 100644 index 0000000..ddc3067 --- /dev/null +++ b/content/archive.md @@ -0,0 +1,7 @@ +--- +title: "Archive" +layout: "archives" +url: "/archives/" +summary: archives +--- + diff --git a/content/posts/1-spectre-attacks-exploiting-peculative-execution.md b/content/posts/1-spectre-attacks-exploiting-peculative-execution.md new file mode 100644 index 0000000..8f2c293 --- /dev/null +++ b/content/posts/1-spectre-attacks-exploiting-peculative-execution.md @@ -0,0 +1,22 @@ ++++ +date = 2021-10-30T07:19:36Z +description = "" +draft = false +slug = "1-spectre-attacks-exploiting-peculative-execution" +title = "Spectre Attacks: Exploiting Speculative Execution" + ++++ + + +The Central Processing Unit (CPU) is a device that plays a major role as the brain of a computer. The CPU controls four main functions: memory, interpretation, computation, and control, which are based on the role of interpreting the commands of a given program to perform operations with data. In CPU, there are the program counter, a command register, an ALU (arithmetic logic unit), a control unit, a bus, and a register. Modern CPUs include cache memory or error correction devices for faster performance and more accurate computation. + +The current CPU follows the Von-Neumann structure, which includes four functions: Fetch, Deocde, Execute, and Writeback. Ancient CPUs interpret instructions in order to convert data, which only can be slow. Modern CPUs speed up through out-of-order. Out-of-Order means that the CPU executes commands dynamically as the input data and execution units, rather than in a original order. This requires the cache memory as mentioned above, and uses Branch Prediction and Specific Memory Disambiguation, which results in Meltdown and Spectre vulnerabilities. + +One day, I heard a news about Spectre and Meltdown Attack with my father. It said that it can affect within all of modern CPU manufactured in Intel, and also other companies. To defent that massive attack, we have to take a decrement of CPU’s performance about half of entire CPU or more. Me and father thought that it is a big event that will effect the history of architecture of modern CPUs. And also will effect on the semiconductor development. After that day, I wanted to learn about the modern architecture of CPUs and basic operations of modern semiconductors. So I searched internet about it, read a university books to understand it, and also a paper written by many eminent researchers, like professor of KAIST and Samsung Semiconductor research center. After the days of learing CPUs, I finally read the paper of Spectre attack and Meltdown attack. It was hard for me to read, but I rarely can understand the way they found it. I also could understand how it works, and how to prevent it to happen. My knowledge about computer and semiconductors increased very fast after I read the entire paper. I can understand how CPU ultimately works, how to make a semiconductor, and also what I have to do to do what I want. Futhermore, I wanted to know the real of semiconductor design, manufacturing, and CPU designing. To learn that thing, I want to learn semiconductor professionally in universities. + +Physical techniques and physically performed computations for improving and stabilizing the performance of modern CPUs often exhibit errors. Side-Channel attck aims to exploit vulnerabilities in these physical computational defects to obtain information that could not be obtained. Among these Side-Channel attacks, Spectre attack uses a buffer for Branch Prediction and Prediction History. This physical operation allows access to unacceptable memory. Branch prediction is a feature that improves execution performance by predicting true/false conditions when a processor executes code containing conditional statements such as if. When the processor encounters a conditional statement, it first predicts the outcome of the conditions it encounters, and first continues to execute the code based on the prediction. The processor calculates the results of the conditions while the code is running as predicted. When the results of the conditions are calculated, the processor verifies the results of the previously made predictions. If a prediction is previously correct, the execution continues and thus gains performance benefits. On the other hand, if the prediction is determined to be incorrect during execution as predicted, the result of the condition is returned to the predicted point and executed again. Spectre attack uses an attack method that allows an attacker with control flow to follow fragments of the machine language code of the targeted process and perform the desired task. An attacker discovers and executes parts of the target process that have the command he or she wants before returning. Since the attacker is free to change the control flow, changing the address of the return command to the address of the next instruction that the attacker wants to execute, even though the execution flow proceeds only within the target process. + +There are two typical cases of Spectre discovered by researchers. Exploiting Conditional Branches and Bounds Check Bypass or Exploiting Indirect Branches and Branch Target Injection are known as Spectre attack. The way Bound Check Bypass work lies in the Speculative Execution by Branch Prediction. If there is an “if” or “while” statement in front of a code that causes Fault when accessed, the CPU is tricked into accessing data in the restricted area and stored in cache to allow this check to be checked. The value of the cache can then be determined using a time difference measurement to read the memory in the inaccessible zone. Branch Target Injection also uses Speculative Execution by Branch Prediction. If the attacker's precess repeats the branch to the location where the attack code, the code to be rejected, the location is stored in the Branch Target Buffer. The characteristic that all processes share the same Branch Target Buffer allows them to reject attack codes into the victim process. + +Wikipedia / Spectre & Meltdown Original Paper + diff --git a/content/posts/20210620-siheomeul-iljuil-apdugo.md b/content/posts/20210620-siheomeul-iljuil-apdugo.md new file mode 100644 index 0000000..f663594 --- /dev/null +++ b/content/posts/20210620-siheomeul-iljuil-apdugo.md @@ -0,0 +1,18 @@ ++++ +date = 2021-09-10T09:23:28Z +description = "" +draft = false +slug = "20210620-siheomeul-iljuil-apdugo" +title = "시험을 일주일 앞두고" + ++++ + + +지금까지 내 인생에서 가장 중요한 시험. 그 시험이 일부일 앞으로 다가왔다. 하루종일 시험공부 비슷한걸 하면서 심신이 지쳐 더 이상 집중을 할 수 없을 것 같다. 이제 이 고비만 넘기면 인생에서 가장 날아다닌다는 시기, 대학생이 된다. 앞으로 뭘 하고 살아야 할지, 무엇을 하고 싶은지, 내가 아는 게 많아지고 현실을 깨달으면서 철이 드니 생각이 복잡해지고 앞길이 막막하기만 하다. + +몇일 전, 작년에 대학 원서 자기소개서를 다시 읽다 보니 내가 아는 게 많아졌음을 새삼 깨달았다. SW나 해킹이나 반도체에 대해 몇달동안 파고 들어 공부하고, 조사하고 생각하다 보니 전에보다 더 자세하게, 깊게 알게 되었고, 예전과는 살짝 다른 생각을 하게 되었다. 예전에는 마냥 컴퓨터공학이나 해킹이 하고 싶었던 반면 지금은 더 자세하게 무엇이 하고 싶은지에 대한 목록을 작성할 수 있게 되었다. 각종 주제에 대해서도 흥미를 갖게 되었고 특히 예전에는 그냥 넘어갔던 책들을 다시 읽어보고 싶어졌다. 앎에 대한 욕구가 끝없이 증가해 버렸다. 지금 교보문고에 있는 읽고싶은 책들만 합해도 100만원이 넘어가니 말이다. + +아마 올해 자기소개서를 쓸 때에는 정말 깔끔하고 자세한 자기소개서를 쓸 수 있지 않을까 싶다. 개발자 이력서 쓰는 법이나 회사 취직에 관한 글을 꽤 읽었으니 기술적으로도 단정한 글이 되지 않을까 싶다. 항상 느끼는 것이, 이건 대학 자소서 준비인지 아니면 그냥 개발자의 자기소개서인지 의문이 든다. 그럴 정도로 기술적인 내용을 많이 집어넣는데, 이게 과학고생의 글인지 아니면 디미고 같은 개발중점 학교 학생의 글인지 햇갈린다. + +짧은 회고록이 되었지만 2주 후, 자소서를 쓰고 있을 나를 상상하니 빨리 지나갔으면 좋겠다는 생각밖에 들지 않는다. + diff --git a/content/posts/ad-techwa-tonggyeyi-sseuimsae.md b/content/posts/ad-techwa-tonggyeyi-sseuimsae.md new file mode 100644 index 0000000..9550045 --- /dev/null +++ b/content/posts/ad-techwa-tonggyeyi-sseuimsae.md @@ -0,0 +1,20 @@ ++++ +date = 2021-10-30T07:10:34Z +description = "" +draft = false +slug = "ad-techwa-tonggyeyi-sseuimsae" +title = "Ad-Tech와 통계의 쓰임새" + ++++ + + +CTR(클릭률) Click-through rate)는 특정 링크를 클릭한 사용자의 비율. Z지수는 표준점수로, 통계학적인 정규분포를 만들고 각각의 경우가 표준편차상의 어떤 위치를 차지하는지를 보여주는 차원없는 수치이다. Z-지수는 원수치가 평균에서 얼마나 떨어져 있는지를 나타내는 지수로, $ z = \frac{z - \mu}{\sigma} $로 나타난다. ($\sigma$ 표준편차, $\mu$는 모집단의 평균이다. + +중심극한정리란 표본의 크기가 커질수록 표본 평균의 분포는 모집단의 분포 모양과는 관계없이 정규분표에 가까워진다는 정리이다. + +점추정은 모집단의 특성을 단일한 값으로 추정하는 방법으로, 표본평균과 표본분산을 이용해 모집단의 평균과 분산을 계산해 내는 방법이 대표적인 예이다. 평소에 신뢰구간 95%와 같이 구간추정하는 것과는 달리 적률방법을 이용하여 하나의 수치로 나타낸다. 표본분산의 기댓값이 모분산이 되고, 표본평균이 모평균이 된다. 더욱 정확한 수치를 계산하기 위해서 적률법을 이용한다. 모집단의 평균이 표본평균과 일치하는 모수를 찾는 방법으로 진행한다. 적률 생성함수는 $M_x(t) = E(e^tX)$로 표현되어 확률분포의 적률은 $ E(X^n) = M_x^(n) (0)$으로 표현할 수 있다. 적률생성함수를 몇번 미분하냐에 따라 n차 적률이라고 한다. + +이제 Ad-Tech에서 사용하는 각종 광고 비용계산과 그 지수 산출을 알아본다. + +CTR은 노출수 대 클릭수 비율로 구할 수 있다. 일반적으로 계산한 CTR수치는 CTR의 표본 평균이라고 할 수 있다. CTR수치는 매일마다 다르고, 또 언제 어떻게 바뀔지 모르는 랜덤 모집단이기 때문이다. 따라서, 오랜 기간동안 CTR수치를 측정하여 예측을 하는 방법으로 신뢰구간을 얻을 수 있다. 하지만, 오랜기간동안 광고수치를 계산하여 그 비용을 지불하기에는 오랜 기간이 걸리며 유행이 빠른 광고의 특성상 정확하지 않을 가능성이 있다. 따라서, 광고에서 CTR을 계산하여 캠페인의 대표 수치를 구하기 위해 표본에서 모집단의 수치를 계산할 수 있도록 중심극한 정리를 가정 하에 점추정을 통해 캠페인의 대표 CTR수치를 나타낸다. + diff --git a/content/posts/attitude-for-criticism.md b/content/posts/attitude-for-criticism.md new file mode 100644 index 0000000..dc6ae7a --- /dev/null +++ b/content/posts/attitude-for-criticism.md @@ -0,0 +1,26 @@ ++++ +date = 2021-09-10T07:30:10Z +description = "" +draft = false +slug = "attitude-for-criticism" +title = "Attitude for criticism" + ++++ + + +요즘 우리 학교에 학교를 개혁하겠다는 학생회장이 나타나고 나서부터 친구들이 학교에 대한 여러 가지 불만들을 풀어내기 시작했다. 나도 마찬가지로 학교에 대한 여러 가지 불만사항들이 많았다. 나는 매 학기마다 개정된 학교 교칙이나 규정들을 정독하는 이벤트를 가지는데, 그때마다 항상 '아, 학생들이 당연히 너무 불리하다..' 라던가, '이 조항은 너무 아닌데, 너무 구시대적인 생각이 아닌가?'라는 생각이 들기도 한다. + +대학을 가야하는 시기라서 여러 학교들의 생활이나 공부방법, 대학 진학 상황들에 대해서 더욱 관심을 가지게 되었다. 특히 전국급 자사고나 타 지역 과학고의 생활과 공부습관? 등에 대해서 많이 조사(나무위키 정독)해보았는데, 한 가지 우리 학교랑 공통으로 비교되는 것이 있었다. 점점 상승세를 보이거나, 기존부터 진학 상황이 좋았던 학교들은 당연히 공부에 대해 많이 엄격하다. 하지만, 엄격한 만큼 그것에 대한 보상이나 회유에 대한 것도 많았다. 기숙사에서의 자유는 보장해준다던지, 상담실을 운영한다던지, 혹은 실제로 보상을 해 주는 경우도 있고, 진짜 자유시간을 주는 경우도 있다. + +우리 학교를 살아가면서 몸이 망가지도 마음이 지쳐가는 것을 확실히 느낄 수 있었다. 100명, 혹은 60명 정도의 소수의 인원이 3년 동안 계속 붙어서 살아간다고 한다면, 아무리 성격이 좋아도 인간관계에 대한 스트레스가 한두 번 쌓이는 것이 아닐 것이다. 또한, 이 열악한 환경 속에서 내신이라는 것에 의해 끝까지 몰아붙여져서, 틈도 없이 공부를 해야 한다는 현실이 피부에 와 닿았다. 우리가 이렇게 말한다면 반대쪽에서는 이렇게 반발할 것이다. 친구관계는 선생님과 상담해보고, 또 스트레스는 격주로 집에 갈 때 해소해도 되고.. 근데 실제로 하는 거 보면 쉴 틈이 많이 있는데, 왜 그렇게 호들갑을 떠느냐고. + +학생의 생활에 관해서나 우리나라 입시제도에 의한 학생들의 스트레스에 대하여, 학생들의 편의를 위해서 학생들이 단체로 학교에 청원을 하거나 개선을 요구하면, 학교는 그 요구를 결국에는 들어줄 수 밖에 없다. 학교는 결국 학생이 주체이고, 학교를 믿고 학생을 맡긴 학부모가 있기 때문이다. 교직원들도 결국에는 한 가정의 일원이다. 학생들이 요구한 것에 대해 미성년자라서 잘 진행되지 않는다? 그러면 학부모회도 있고, 교육청도 있다. 아니면, 가장 확실한 방법으로 학생 대표가 교장선생님께 직접 찾아는 방법도 있다. 교장은 모든 교직원이 속해있는 학교의 '장'이니까. + +하지만 우리가 하는 이야기는 성립되지 않는다. 특히 내가 하는 이야기도 성립하지 않는다. 우리, 또는 내가 학교에 대해 비판을 하고, 그 개선을 요구하기 위해서 대개는 그 조건이 충족되지 못했기 때문이다. 인도의 소금 행진, 홍콩 시위 등 사회적으로 받아들여지지 않는 소수민족이나 식민지가 최종적으로 변화를 만들어 낸 경우는 수도 없이 존재한다. 이와 같이 '교권'이나 '교칙'이라는 틀 속에 갇혀있는, '학생들'도 이와 같이 변화를 만들어 낼 수 있다. 하지만, 우선 이런 변화를 만들어 내기 위해서 위 운동들의 공통점, 비폭력 운동의 규칙에 대해 생각해 보아야 할 것이다. 도덕책에는 이렇게 적혀있었다. '비폭력 시위를 행하고 나서는 그 행위에 대한 처벌을 마다하지 않아야 합니다.'라고. 이 문구가 도대체 우리랑 무슨 관련이 있는가. 학생들이 시위를 하고 나서 그 책임을 지고 퇴학이라도 하라는 이야기인가? 물론 아니다. 나는 이 문구를 이 문구 그대로 생각하지 않았다. 약간 억지일 수도 있겠으나, 나는 반대의 방면으로 바라보았다. 행위에 대한 책임이 아니라, 행위를 위한 의무에 대해서 생각해 보았다. + +학생들이, 또는 군중들이 학교, 또는 정부에 무언가를 요구하려면 어떻게 해야 할까? 먼저 기존 체제의 문제점에 대해서 설명하고, 논리적으로 반박해 나갈 것이다. 학교나 정부는 그에 대한 반박을 할 것이고, 그 이유를 설명할 것이다. 학생이나 군중이 이에 대해 다시 반박하고, 전체와 구성원이 서로 타협해 나가면서 결국 변화를 만들게 될 것이다. 나의 생각은 그 행위 제일 처음부터 시작한다. 이들이 제일 처음으로 기존 체제의 문제점에 대해 설명할 때, 만약 이들이 범죄 조직이거나 불량 학생이라면 어떻겠는가. 당연히 정부는 그 말을 무시할 것이다. 학교나 교직원들도 불량 학생의 일탈이라 생각할 것이다. 심지어는 그 외 군중들이나 그 외 학생들도 그 요구에 대해서 쉽사리 찬성하기에도 무리가 있을 것이다. + +결론적으로 하고 싶었던 말은 이것이다. 변화를 요구하기 전에, 한번 제대로 따라보고, 그 문제점을 지적하라고. 물론 이 말은 당연한 말이며 누구든지 할 수 있는 말이다. 하지만, 우리학교 친구들이 무언가를 비판하고 요구할 때 이러한 것들이 잘 지켜지지 않는 것 같다. 우리 학교뿐만 아니라 사회적으로도 이러한 '당연한' 전제조건이 잘 지켜지지 않는 것 같았다. 나도 마찬가지였다. + +그래서 나는 친구들에게 말하고 싶다. 마냥 불만만 품거나 일탈만 하지 말고, 한번 계속 지켰다가 그 문제점을 정리해서 사람을 모아, 제대로 한번 개혁을 만들어 보라고. + diff --git a/content/posts/bandoceyi-weonri-jongryu-soja-yeogsa-saneob-mosfetbuteo-ram-flash-geurigo-intel-4004ggaji.md b/content/posts/bandoceyi-weonri-jongryu-soja-yeogsa-saneob-mosfetbuteo-ram-flash-geurigo-intel-4004ggaji.md new file mode 100644 index 0000000..d22fa1e --- /dev/null +++ b/content/posts/bandoceyi-weonri-jongryu-soja-yeogsa-saneob-mosfetbuteo-ram-flash-geurigo-intel-4004ggaji.md @@ -0,0 +1,12 @@ ++++ +date = 2021-07-09T17:21:52Z +description = "" +draft = false +slug = "bandoceyi-weonri-jongryu-soja-yeogsa-saneob-mosfetbuteo-ram-flash-geurigo-intel-4004ggaji" +title = "반도체의 원리, 종류, 소자, 역사, 산업. (MOSFET부터 RAM, FLASH, 그리고 Intel 4004까지." + ++++ + + +.1번 반도체란?.2번 반도체 소자의 종류.3번 기본소자 – 다이오드.4번 기본소자 – 트랜지스터…1번째 MOFSETMOFSET(Metal-Oxide Semiconductor Field-Effect Transistor) 금속-산화 반도체 전계효과 트랜지스터1번째 금속산화 반도체란? 도핑된 반도체 기판 위에 SiO2로 된 절연층과 금속을 적층시켜 제작한 구조. 2번째 MOSFET TransistorNPN의 구조입니다. 두 N을 각각 Drain과 Source라고 합니다. Source에는 Ground가, Drain에는 전압이 인가됩니다. 위에서 서술했듯이 Drain과 Source사이에 채널이 형성됩니다. 이때 Gate와 Back Gate(아랫쪽 P반도체)사이에 전압을 인가해 주면 게이트와 P사이에 전기장 형성, 이에 의해 전자가 게이트쪽으로 올라갑니다. 이 때문에 Drain과 Source 사이 전류가 흐를 수 있다. 이 Gate와 Back Gate 사이에 전기장을 조절함으로써 Drain과 Source 사이의 전류를 조정할 수 있다. …2번째 BJT Transistor생략. 너무 귀찮아(사실 이해 못함..).4.5번 MOS…MOS의 응용MOS Metal Oxide SemiconductorPMOS NMOS CMOS가 있다.Pmos는 Body가 P반도체, NMOS는 Body가 N반도체인 차이가 있습니다. Body와 Source/Drain 사이에는 바이어스가 형성되어 있다. 이때 정 바이어스가 형성되어선 안되겠죠.. 전류가 이상한 곳으로 흐르는 거니까따라서! 항상 Source.Drain과 Body사이에는 역바이어스가 형성되어야 합니다.  보통 Source와 Body를 묶어 같은 전압을 걸어줍니다. 이 전압은 NMOS에서 Ground, PMOS에서는 양전압(Vdd)를 인가합니다.NMOS의 작동. Gate에 양전압을 걸어줍니다. 이때 위에서 말했듯이 전기장에 의해 채널이 형성됩니다. 따라서, Source(0V)에서 Drain으로 전류가 흐르게 됩니..다.PMOS의 작동 Gate에 0V를 걸어주면 Gate와 BackGate사이 전기장, 전기장에 의해 채널이 형성 마찬가지로 Source(Vdd)에서 Drain(-V)로 전류가 흐릅니다.여기서 주의! 전류는 전지의 (+)에서 (-)로 흐른다는 것은 약간 애매합니당 왜냐하면 여기서는 Ground가 있으니까요. (-)는 Ground이고 (+)(-)는 그 기준으로니까요.그다음으로 CMOS는 NMOS와 PMOS를 합했어요 ||가 NFET, 동그라미 달린게 PFET입니다. CMOS의 역할은 인버터입니다. CMOS Inverter라고 하죠.. A는 입력 전압, Vdd는 임의의 양전압, Vss는 Ground입니당 Q가 출력이겠죠 입력 전압으로 0V가 인가되었다고 가정해봅시다. NMOS는 OFF, PMOS는 ON 동작을 하므로 PMOS의 소스에 인가되어 있는 Vdd 전압이 출력됩니다. 반대로 Vdd가 인가되면, NMOS가 ON, PMOS가 OFF되므로 NMOS의 소스에 인가되어 있는 0V가 출력됩니다.…MOS를 이용한 NAND< NOR게이트  AND, OR, NOR, XOR 다 만들 수 있음요!!..그렇습니다. MOS를 이용해서 논리 게이트를 만들 수 있고, 이러면 우리는 모든 회로를 다 반도체로 작게 작게 만들 수 있어요!.5번 응용소자 - DRAM…RAM이란?RAM(Random Access Memory) 임의 접근 메모리정보를 캐패시터에 저장하는 장치입니다. 전원이 인가되는 한 그 정보는 유지될 수 있습니다. (휘발성)임의로 어디에 접근하든지 동일한 시간이 걸리는 저장장치라서 RAM…DRAM이란?Dynamic RAM 다이나믹한 램  개개의 비트를 각기 분리된 축전기(Capacitor)에 저장하는 기억 장치전자의 수(전자의 상대적인 양)을 기준으로 0과 1이 나눠집니다. 축전기가 전자를 점점 잃어서 Refresh작업을 해줘야 합니다.  Dynamic하다!!회로의 원리. ||는 NFET  Source에 0V, 스위칭 통해 Drain에 Vdd 형성.Select에 Vdd가 인가될 경우에 NFET는 On상태이다. WRITE:: 이때 Data가 TRUE이면, Capacitor에 TRUE를 저장.READ:: Capacitor가 TRUE라면 DATA(Bitline)이 TRUE가 된다  전체 에너지가 약간 감소  언젠가 소실됨. 한 사이클마다 Recycle...5.5번 응용소자 - SRAM…SRAM이란Static RAM. DRAM과는 달리 전원이 없어지지 않는 한 정보를 그대로 유지  리프레쉬 불필요서로 대칭 구조 두 쌍의 인버터에 정보가 저장된다. 인버터가 전압의 상태를 안정적으로 유지시켜 줍니다. 이것.. 비슷한것으로 Dtype FlipFlop이 있습니다. 생략빠른 입출력이 장점입니다..6번 응용소자 – NAND Flash…Flash많이들 들어보셨을 듯 우리가 컴 맞출때나 외장하드 살 때 요즘에는 SSD라는 말이 많이 들리죠? 이 SSD에 들어있는 것이 우리의 USB에 들어있는 칩과 같은 칩입니다. Flash 칩이라고 합니다.비휘발성 메모리입니다. NonVolatile Memory입니당. NVM이욥. 이것도 NVMe하면서 들어보셨을까요….전압을 주지 않아도 정보가 저장될 수 있는 것입니다. 정말 혁신적이네.. 그래서!! 정보를 저장하는 방식은 비슷하지만 구조에 따라 읽고 쓸수 있는 범위와 방식이 다릅니다. 바이트(8비트)와 워드(32비트 아니면 처리하는 비트)로 다릅니다. 이것을 구분하여 NOR Flash, NAND Flash라고 합니다. …NAND Flash 구조MOFSET과 비슷합니다만, 약간 다릅니다. 터널링 효과를 이용하여 전자를 가둬둔다는 것을 알아두세요. 전자 주사라고도 한답니다..7,8번 시스템 소자 – 인텔 4004…인텔 CPU의 역사에 대한 설명…인텔 4004 CPU의 구성 성분  이 성분이 엄청 많이 집적되어 있는 것이 현대의 CPU 다를게 없음.0/ ALU!!!! 산술계산장치 가장 중요하고도 가장 중요한 CPU의 대뇌역할을 하는 장치입니다!1/ FLIPFLOP 이거 뭐라했죠? 이게 메모리와 같은 역할입니다. 정보 저장이요10/ Register 메모리 동일 조금 더 많고 크다.11/ MUX MUX란, 데이터 선택 장치입니다. 입력 선이 4개있으면 2개짜리 선택선에서 00이면0, 01이면 1, 10이면 2, 11이면 3입니다.이렣게 분류하는 것입니다. 마치 2진 <-> 선택의 느낌으로반대는 DEMUX 100/ ACC누산기 레지스터입니다….101/ Clock 클럭 빠르게 왔다갔다함. CpU 동작의 기초 타이밍을 재줍니다. 이게 클수록 연산이 더 빠르겠죠? CPU클럭과 동일합니다.110/ ENCODER, DECODER디코더는 n*m디코더는 들어오는 입력에 따라 대응되는 자리만 1로 만들어줌. 들어오는 숫자를 10진법으로 해석한 출력만 1이에요. 반대는 인코더겠죠?111 / 계수기, Counter 는 클럭에 왔다갔다함에 따라 1씩 증가하는 장치입니다..9번 반도체 개발의 역사.10번 반도체 산업 시장 + diff --git a/content/posts/beulrogeu-geulsseugineun-neomu-himdeuleo.md b/content/posts/beulrogeu-geulsseugineun-neomu-himdeuleo.md new file mode 100644 index 0000000..906c74e --- /dev/null +++ b/content/posts/beulrogeu-geulsseugineun-neomu-himdeuleo.md @@ -0,0 +1,30 @@ ++++ +date = 2021-10-08T05:19:00Z +description = "" +draft = false +slug = "beulrogeu-geulsseugineun-neomu-himdeuleo" +title = "블로그 글쓰기는 너무 힘들어.." + ++++ + + +야심차게 티스토리 블로그를 만들어 몇몇 글을 쓰고 나서, 한참동안이나 글을 쓰지 않았다. 하지만 나중에 돌아보면 쓰일 곳이 있지 않을까 하여 내 소장을 위해 Ghost + Vultr로 넘어왔고, 돈도 내야 하니까 글을 조금씩이라도 쓰지 않을까 생각했지만.... 결국 글을 쓰지도 않은 채 달마다 돈만 나가고 있다... + + + +블로그 글을 왜 쓰지 않았지..? 고등학교 생활을 하느라 힘들고 바빠서 (노느라) 글을 쓰지 않았을 수도 있고, 마땅하게 글을 쓸만한 소재도 없고, 마땅하게 글을 쓸 기기 또한 없다. 나에게 있는거라고는 집에 있는 아버지 노트북과 내 아이폰 밖에 없으니까.. + +그래도 일기같은 형식으로 글을 써 내려갔다면 좋을 것 같은데 그 역할을 트위터가 하고 있는 바람에 더욱 쓰지 않게 되었다. 물론 길게길게 회고록을 쓰거나 감상을 쓰거나 후회를 하기 위해서라면 블로그만큼 좋은것도 없기는 한데, 나는 타자가 느리고, 글을 너무 못쓴다. 이과생특 + +하지만 애초에 내가 코딩을 하지 않은것도 몇달째 되어가고 있고, 내가 아이패드나 노트북을 구매하지 않는 이상 글을 절대 꾸준히 쓸 수 없을 것 같다. 물론 아침에 일어나면 남는 자투리 시간을 이용하여 글을 틈틈히 쓸수도 있지만, 역시 그 역할을 트위터가 하고 있다. + +글쓰기가 너무 힘들다. 다른 블로그들을 보면 글도 길고 길지만 쉽게 읽히며 뭘 말하고 싶은지 탁탁 이해가 쉽다. 하지만 내가 글을 쓰자니 길제 쓰기도 힘들고 시간도 걸리고 머리도 아프고 할 이야기도 없다. + +글을 쓰고 싶다. 멋지게 글을 쓰고 싶다. 다른 사람에게 도움이 되는 글을 쓰고 싶다. 내 글을 가지고 사람들이 기꺼이 대가를 지불할 만큼의 가치를 가지는 글을 쓰고 싶다. (그 대가란, 그 사람들의 시간..) + +열심히 해봐야 겠다. 앞으로 대학 입시까지 2달 적게 남기도 했고, 내 몸이 망가져가는 걸 많이 실감했기에 건강하고 규칙적인 생활습관을 가지려 하고 있고, 그 첫걸음이 일찍 자서 일찍 일어나고, 남는 시간에 글쓰기이다. + +화이팅! 할 수 있다..! + + + diff --git a/content/posts/cam-nae-jinjja-sangsangdo-moshaessdeon-ilinde.md b/content/posts/cam-nae-jinjja-sangsangdo-moshaessdeon-ilinde.md new file mode 100644 index 0000000..efdb699 --- /dev/null +++ b/content/posts/cam-nae-jinjja-sangsangdo-moshaessdeon-ilinde.md @@ -0,0 +1,12 @@ ++++ +date = 2022-10-03T15:25:08Z +description = "" +draft = false +slug = "cam-nae-jinjja-sangsangdo-moshaessdeon-ilinde" +title = "(Untitled)" + ++++ + + + + diff --git a/content/posts/cryptography.md b/content/posts/cryptography.md new file mode 100644 index 0000000..013ff7e --- /dev/null +++ b/content/posts/cryptography.md @@ -0,0 +1,126 @@ ++++ +date = 2021-07-09T10:24:00Z +description = "" +draft = false +slug = "cryptography" +title = "Cryptography" + ++++ + + +## **Cryptography** + +### **공개키 암호화 알고리즘.** + +#### 1. Diffie-Hellman + +디피-헬먼 키 교환 방식은 암호화 통신을 위한 키를 교환하는 방식 중 하나이다. 두 통신 주체가 공통의 비밀 키를 사용할 수 있도록 하는 안전한 알고리즘이다. 디피-헬먼 방식은 기초적인 암호 통신 방법으로, 이 알고리즘에 RSA나 ECC같은 암호화 알고리즘을 합쳐서 암호화 통신이 성립된다. 공개키는 암호화할 수 있는 키이고, 개인키는 복호화할 수 있는 키이다. + +디피-헬먼 키 교환은 공개키 암호화 방식에 기반한다. 공개키 암호화 방식이란, 자신의 공개키를 상대방에게 전송하고, 그 상대방은 그 공개키로 데이터를 암호화해서 전송하면, 자신은 자신의 개인키로 복호화 할 수 있어, 통신이 성립되는 방식이다. 이때 상호통신을 위해서는 서로의 개인키를 공개키를 이용하여 공유하고, 각각 공유한 개인키와 공유키를 이용하여 공통된 비밀키를 계산하여 그것으로 통신하거나, 서로 각자의 개인키로 복호화하여 통신할 수 있다. 공통된 비밀키를 사용한다면 대칭 키 알고리즘, 서로 다른 키를 사용한다면 비대칭 키 알고리즘이라 한다. + +디피-헬먼 키 교환 방식은 이산수학의 난해성에 기초한다. 먼저, 상호에 매우 큰 소수 P와 임의의 정수 N을 교환한다. 이는 공개적으로 전송해도 문제가 없다. 이때, 서로 P보다 작은 정수 a, b를 임의로 설정하고, N의 a, N의 b승의 mod P를 서로 전송한다. 이후에, 서로 전송받은 N의 b, a승 mod P를 자신이 가지고 있는 정수 a, b를 이용해 N의 b승의 a승과 N의 a승의 b승 mod P를 계산한다. N의 ab승과 N의 ba승은 지수법칙에 의해 동일하므로 이 값을 서로 공통의 비밀키로 사용할 수 있다. + +위 상황에서 중간의 사람은 N과 P, N의 a, N의 b승의 mod P를 알 수 있다. 키 값을 알기 위해서는 N^ab mod P를 구해야 하는데, 이를 위해서는 a나 b 둘 중 하나는 알아야 한다. 여기서, 이산수학의 난해성에 의해 중간자는 a, b값을 알 수 없고, 이에 기밀성이 유지된다. + +하지만, DH알고리즘은 가장 중요한 취약점이 있다. MITM공격에는 아주 무력하고, 기밀성만 보장할 뿐 무결성, 인증 등 기타 보안의 필수 조건을 만족시키지 못한다. 인증이란, 서로간의 정체를 확실이 하는가에 대한 문제이다. MITM 공격이란, 중간에 다른 사람이 송신자의 정보를 가로채고, 수신자에게 위조된 정보, 즉 자신의 계산값을 전송하는 상황에서 일어난다. 이때 수신자는 그 정보가 중간자가 아닌 송신자에게서 온 정보라 믿고 비밀키를 만들 것이고, 이에 중간자는 그 비밀키를 알게 된다. 받은 정보가 제대로 된 송신자에게서 온 정보인지 확신할 수 있어야 한다는 것이 인증의 개념인데, 디피-헬먼 키 교횐은 이러한 방법이 없다. 이러한 취약점을 해결하기 위해 DH와 RSA, ECDH등 다른 암호화 알고리즘과 합쳐서 PKI 등을 사용하는 것이다. + +#### 2. RSA + +RSA는 일반적으로 알려져 있듯이 매우 큰 소수는 소인수 분해할 수 없다. (매우 힘들다)는 것을 기초로 하고 있다. RSA는 이 방식의 개발자인 세 사람 이름의 앞글자를 따서 만들어 졌다. RSA도 DH와 마찬가지로 공개키 암호화 알고리즘이다. 현재 인터넷에 사용되는 거의 모든 보안 체계는 RSA이며, 이는 RSA가 오랫동안 인정된, 안정적인 암호화 알고리즘이라는 뜻이다. + +원리를 바로 설명하자면, 서로 각자 매우 큰 소수 p, q를 준비한다. (p-1), (q-1)과 서로소인 e에 대해, ed mod (p-1)(q-1)이 1인 d의 값을 찾고, N=pq와 e를 공개한다. 이들이 공개키가 되고, d는 개인키가 된다. + +공개키 N, e로 평서문 m을 암호화하기 위해서는 m^e mod N을 계산하면 된다. 개인키 d를 가지고 있는 사람이 이를 복호화 하기 위해서는 $ (m^e)^d mod N $을 계산하면, m을 알아낼 수 있다. 이 고정에서 페르마의 소정리가 이용되는데, 페르마의 소정리란, 어떤 수 N이 있을 때, 이 수와 서로소인 수 a에 대하여, $ a^(\phi(N)) = 1 mod N $가 성립한다는 법칙이다. 이때 $ \phi(n) $은 오일러 파이 함수로, 1-N까지궁 N와 서로소인 수의 개수를 의미한다. N이 두 소인수로 이루어진 합성수라면, $ \phi(N) = (p-1)(q-1) $로 나타난다. 바로 이 값을 이용해서 복호화를 진행한다. $ E*d $는 $ (p-1)(q-1)A + 1 $ 로 나타낼 수 있고, 따라서 $ m^(ed) = m^(A(p-1)(q-1) +1) $인데, $ m^(p-1)(q-1) $은 1이므로, 이 값이 $m$이 된다. + +$M^e mod N$과 $N, $e로는 원문 $m$과 개인키 $d$를 계산할 수 없다. 이를 계산하기 위해서는 + +RSA암호화 알고리즘과 DH알고리즘의 차이가 별로 없다고 생각할 수 있다. 뭐 알고리즘 상으로는 비슷하다. 다를게 없다. 하지만 제일 중요하게 다른 것은, RSA의 경우는 공개키와 비밀키를 메시지를 암호화할 때 사용한다는 것이고, DH는 개인키와 공개키를 이용하여 새로운 공통의 비밀키를 만든다는 점이다. 따라서, DH와 RSA의 차이는 키들의 용도이다. 애초에 DH는 키를 교환하는 방식이고 RSA는 암호화/복호화 알고리즘이니까 용도가 다르지만. + +RSA도 마찬가지로 MITM에 매우 약하다. 오는 정보에만 의존해서 키를 사용하기 때문이다. 따라서 RSA도 인증의 면에서는 부족한 암호화 알고리즘이며, 이를 해결하기 위해서 PKI, Public Key Infrastructure를 사용한다. 이는 사람들의 공개키를 한 인증기관이 모아서 관리하여, 상호에 신원을 보장해주는 방식이다. 송신자는 이 인증기관에 수신자의 공개키를 조회하여, 제대로 된 공개키인지 확인할 수 있다. 하지만, 이러한 방식은 인증기관에 확인하는 과정이 필요하므로, 인증기관과 연결되어 있어야 한다는 점과, 이 과정에서 시간이 오래 걸린다는 단점이 있다. + +이 점을 해결하기 위해 웹 보안에서 사용하는 HTTPS에서는 TLS/SSL이라는 더 응용한 암호가 적용된다. TLS는 상호 알고리즘 교환, 키 교환과 인증, 대칭키 생성과 통신이라는 세 단계로 나누어 통신한다. + +#### 3. ECC + +ECC는, Elliptic Curve Cryptography로, 타원곡선 이론에 기반한 암호화 알고리즘이다. RSA에서는 소수를 사용했다면, ECC에서는 GF에서 EC연산의 비가역성을 이용한다. EC는 RSA보다 키의 길이가 짧아도 보안성이 우수하며, 연산 시간이 더 짧다는 장점이 있어, 블록체인이나 IoT 보안 등 현재의 암호에는 ECC가 주로 사용된다. + +타원곡선이란 무엇일까? 타원곡선이란, _ y2=x3+Ax+B_ 의 형식으로 나타나는 음함수이다. 타원곡선은 타원의 둘레를 계산하기 위해 타원을 적분하려다 나타난 식이라고 하는데, 그 함수의 역함수가 위의 형식이라고 한다. 더 자세하게 말하면, 체 k에서, 타원곡선은 특정 조건들을 만족시키며 원점이 주어진 k에 대한 사영 대수 곡선이다. 첫번째 특이점을 가지지 않으며, 둘째 위상수학적으로 원환면이며, 셋째 적어도 하나의 유리점을 가진다는 조건이다. 하나하나씩 알아보자. + +체는 무엇이고, 사영 대수 곡선이란 말은 어떤 말일까? + +일단 체(Field)란, 사칙연산(덧셈, 뺄셈, 곱셈, 나눗셈)에 대해 닫혀있는 집합을 의미한다. 이는 하나의 체 안에 있는 원소들끼리 사칙연산을 해도 그 값이 체 안에 속해있다는 의미이다. 가장 대표적인 체는 유리수 집합, 실수 집합, 복소수 집합이 있다. + +즉, 체 k에서 특정한 조건을 만족시키며 특정 원점을 가지는 대수 곡선이라는 의미는, 위에서 언급했던 타원 방정식을 만족시키면서 A, B로 표기되어 있는 계수가 하나로 정해져 있는 점들의 집합을 의미한다. 타원 곡선이 체라고 하는 이유는, 타원 곡선에서 새롭게 정의한 덧셈을 이용해 서로 다른 점끼리 덧셈을 하면, 타원곡선 위에 있기 때문에, 사칙연산에 대해 닫혀있기 때문이다. 타원 곡선을 어떤 체 위에서 정의하느냐에 따라 달라지겠지만, 암호학에서 사용할 때에는 정수 위에서 정의하는 것으로 하자. 정수는 체가 아닌데요?라는 의문을 가진다면, 정수의 나눗셈을 해결할 수 있는, 모듈러 연산을 이용한 갈루아체 위에서 정의한다고 알아두자, 이는 나중에 설명하겠다. 타원 곡선상의 덧셈의 특징을 설명하기 전에, 무한점 O에 대해 설명하겠다. 무한점 O는 말 그대로 타원곡선 상에서 무한대로 극한을 보냈을 때의 점을 의미한다. 무한점은 타원곡선 상의 점A에 대해 (앞으로 점 A라고 하면 타원곡선 위에 있는 점을 의미한다.) A+O=A를 만족시킨다. 따라서, 타원곡선 체에 대해서 무한점O는 항등원이다. 또한, 점P와 점Q에 대해서 P+Q=O를 만족시키는 점 Q는 점P에 대한 역원이고, Q=-P로 표현할 수 있겠다. 이때, -P는 P를 x축 대칭한 점이 된다. 또한 교환법칙도 성립한다. 뭐라해도 타원곡선은 체이니까 말이다. + +그렇다면 타원곡선 위에서 덧셈을 정의하자. 덧셈을 정의하면 곱셈이나 뺼셈이 정의되고, 그렇면 나눗셈도 정의된다. 점P를 (P_x, P_y)라 하고 마찬가지로 점Q를 (Q_x, Q_y)라고 하자. 특이하게도 타원곡선 상의 덧셈은 두 점이 같은 경우와 다른 경우를 나누어서 정의하는데, 그래도 쓰면 무한점이 나오기 떄문이다. + +If P=Q, P+Q = 2*P + +If P!=Q, P+Q = (,) + +이 연산을 타원연산의 덧셈으로 정의한다. 곱셈은 덧셈을 여러 번 하면 되고, 나눗셈은 갈루아 체에서 정의되는 대로 역모듈러 연산을 사용한다. + +타원 곡선 암호는 RSA에서 소인수분해의 난해성을 이용한 것 처럼 타원곡선에서 갈루아 소수가 커질 경우 x값을 만족시키는 y의 값을 찾기 힘든 점을 이용한다. 갈루아 소수란, 갈루아 체에서 이용하는 소수로, 모듈러 상수를 의미한다. + +ECC는 RSA와 다르게 개인키를 먼저 생성한다. 갈루아 소수 P를 상호에 정하고, 송신자는 P보다 작은 한 소수 k를 임의로 정한다. 후에, 생성자라고 불리우는 상호 동일한 타원곡서 상의 임의의 점 G에 대해 k*G를 연산하면 그 값이 공개키 Q가 된다. k*G는 계산하기 쉬운 반면에 갈루아 체에서는 G와 Q를 이용해 k를 구하기 어렵다는 점을 이용한다. + +ECC는 RSA에 비해 반절정도로 작은 키로 같은 보안을 얻어낼 수 있다. 하지만, ECC도 취약한 부분이 존재하는데, 임의의 소수를 정하는 데에 그것이 있다. 만약 그 난수를 구하는 알고리즘이 유출된다면 ECC는 무용지물이 되기 때문이다. 실제로, ECDSA를 이용하는 서명 체계에서 난수 생성 알고리즘이 알려져 무용지물 된 사건이 있었다. 따라서, 현재는 밀러-라빈 후보와 오일러 판정법을 이용하여 임의의 소수를 도출하거나, 하드웨어적으로 블랙박스안에 넣는 방식으로 이를 방지한다. + +ECC에서 사용하는 타원 곡선의 종류에 따라 암호화 알고리즘을 나눈다. 비트코인에서 주로 사용하는 것으로 유명한 secp256k1 곡선도 있고, 생성자와 갈루아 소수를 정해놓지 않고 이것도 임의의 t로 교환하는 방식으로 이것에서 보안을 더 높인 SECP256R1 곡선을 이용한 암호도 있다. P256은 256비트짜리 소수를 이용한다는 의미이고, k는 곡선 y^2 = x^3 + 7을 의미, r은 random을 의미한다. + +ECC는 개인키, 공개키 발급 방식 중 하나이고, DH과 ECC를 엮어서 만든 암호화 방식이 ECDH이며, ECC와 서명 알고리즘을 엮은 것이 ECDSA이다. + + + +### **블록 암호화 알고리즘.** + +#### 1. DES + +본문 + +#### 2. AES + +본문 + +#### 3. SEED + +본문 + +#### 4. PRINCE + +PRINCE 블록암호는 AES와 마찬가지로 여러 개의 라운드로 구분되는 블록암호이다. Mix Column부터 ShiftBits까지 AES와 매우 비슷하지만, 연산을 더욱 간단화하고 라운드 수를 줄여 저성능 프로세서에서도 많은 비용과 시간을 들이지 않고도 암호화, 복호화를 진행할 수 있도록 한 암호화 방식이다. 기초적인 것들은 AES와 비슷하므로 바로 암호화, 복호화 과정을 살펴보자. 여기서는 PRINCE-64/128을 기준으로 설명할 것이다. 128bit 비밀키를 이용하여 64비트 키로 분할하여 사용한다는 의미이다. + +먼저, 당연하게도 비트열 개수를 맞춰 가공하고, 키의 길이를 확장하는 과정이 필요하다. 그래서 가장 첫단계는 Key Expansion 과정이 있다. 그 후, 화이트닝 과정을 거치고 키를 더하고 라운드 상수를 더하고 S-box연산을 하고, SB연산을 하고 M`연산을 하고 그 역연산을 하고 키를 더 더하고 라운드 상수를 더 더하는 순서로 진행된다. AES의 축소판이라 해도 무방할 만큼 비슷하게 구성된다. + +1) Key Expansion + +2) Whitening + +3) Round I + +4) Round II + +5) M-Layer + +6) Round III + +7) Round IV + +8) Whitening + +위 과정을 통해서 암호화하는 알고리즘을 4-Round 알고리즘이라 하며, 표준 Prince알고리즘은 총 12-Round를 사용한다. 이처럼 연산의 용이성을 위해 라운드를 줄인 Prince를 Round-Reduced Prince라고 한다. 4-Round PRINCE-64/128 나 6-Round PRINCE-64/128는 고정키 대입 공격등 Side-Channel공격에 면역이 없기 때문에 IoT나 소형 기기에서는 적당히 타협하여 12-Round PRINCE-64/128를 사용하거나 한다고 한다. + +### **해시 알고리즘.** + +#### 1. MD5 + +본문 + +#### 2. SHA + +본문 + +#### 3. HMAC (?) + +본문 + diff --git a/content/posts/daehag-ibsiga-handangye-namassda.md b/content/posts/daehag-ibsiga-handangye-namassda.md new file mode 100644 index 0000000..ce3f663 --- /dev/null +++ b/content/posts/daehag-ibsiga-handangye-namassda.md @@ -0,0 +1,42 @@ ++++ +date = 2021-12-01T08:09:52Z +description = "" +draft = false +slug = "daehag-ibsiga-handangye-namassda" +title = "대학 입시가 한단계만 남았다." + ++++ + + +대학 입시가 한단계만을 앞두고 있다. + +합격자 발표와 등록. + +뭐 공부하고 대비해야하는 시험은 다 끝났으니 마음껏 놀고 있지만 마음의 한편에는 아직 불안함이 많이 존재하고 있다. 또 공부와 시험대비라는 정해져 있는 계획만을 12년 동안 따르던 나에게서 갑자기 계획이나 강제성이 사라졌다. 이제부터는 내가 무엇을 할 것인지를 나 혼자서 알아서 결정해야 하고 또한 그 책임도 내가 져야할 것이다. 예를 들어 늦게자도 누군가 깨워주지 않는다는 것에서 그것을 처음으로 느꼈다. + +지금 하고싶은 것도 없다. 무언가 해야하는 것도 딱히 없다. 그래서 그게 더 스트레스다. 운동을 해야할 걸 알고 운동을 하고싶지만 무엇부터 시작해야 할지 막막하다. 영어공부를 해야하는 것을 알지만 막상 하려니 하기 싫다. 운전면허는 학원을 다니므로 예외. 남겨놓은 책도 읽어야 하지만 눈에 들어오지 않는다. 모두 핑곗거리 뿐이지만 나에게는 하지 않을 충분한 계기가 된다. + +마음가짐을 고쳐잡아야 한다. 미련하고 기계이기만 했던 지난 학생 시절을 벗어나 자율적으로 움직이는 어른, 하나의 사람이 되어야 한다. 이러고만 있을 수는 없다. 그래서 다짐을 했다. 내일부터는 사람이 되어보자. + +그 다짐은 물론 다음날 아침에 깨졌다. 늦게 깨어난 것은 물론 일어나자 마자 의욕을 잃었다. 아직 나는 사람이 될 마음가짐이 안되었구나. 옛날만큼이나 아니 오히려 더다짐에 대한 마음가짐과 독기가 풀렸구나.. + +어쨋든 무거운 얘기는 여기까지만 하고 이제 앞으로의 계획을 정하든가 해야겠다. + +일단 첫번째로 운전면허. 이번주 주말부터 시작해 매일 1시에 수업이 있다고 들었다. 1차 필기시험을 통과할 수 있도록 집중해서 듣자. + +두번째로 운동. 입시하던 도중에 항상 입시 끝나면 다이어트 하고 헬스를 해서 몸을 건강하게 만들어보자! 마인드였는데 지금은 헬스는 개뿔 먹고 자고 눕기만 하고 있다. 하지만 오늘 뻘짓으로 2시간이나 걸어다녔으니 운동의 초석을 다진것이라 보고 내일부터 or 담주부터 헬스를 끊어야 겠다. PT를 끊던가 하면 식단도 조절되고 그걸 따르는 건 할 수 있으니까 해보자구! + +세번째 영어. TOEFL. 토익말고 토플이 나에게는 익숙하다. 토플 주니어를 거의 매년 치다시피 했고 중딩때 IBT를 여러번 쳤으니 토플이 제일 익숙할 것이다. 일단 나는 기본 영어 감은 충분하고 넘치다고 자부하고 있..으니(???) 문법이나 문제푸는 요령같은 것들을 인강을 듣고 문제집을 풀고 해서 꾸준히 영어공부를 해야겠다. 뭐 많이는 못하더라고 꾸준히는 할 수 있잖아? 할 것도 없는데.. 일단 교재부터 알아보고 (뭐 해커스가 되겠지만) 인강도 알아보고 해서 책을 빨리 구입하던가 해야겠다. + +네번째. 자산. 돈관리. 원래 내 통장은 어머니가 관리하셨다. 금액이 *만 가까이 되니 내가 건들기 힘든 금액이기도 했고, 세금때문에 마음대로 건들면 안된다고 했다. 하지만 만 17세가 되면서 내가 내 금융을 관리할 수 있게 되었고 그때 카뱅이나 씨티같은 계좌를 몰래 만들어 놨다. (나중에 씨티는 해지하느라 애를 엄청 먹었지만) 뭐 지금은 다 알지만.. 내가 쓰는 계좌는 카뱅, 토뱅 두개이다. 어머니가 만들어 놓으신 계좌는 농협에 여러개인데 나도 잘 모른다. 근데 내가 그 고액 저축통장을 찔끔찔끔 빼서 써서 약간 일이 커지게 될 것 같이 되어버리긴 했다. 그리고 문제는 내 경제관념이다. 어디다 빼먹고 왔다. 고3 주제에 한달 사용액이 50만원 가까이 된다. 이건 진짜 고쳐야 한다고 생각한다. 통장정리 하고 어머니께 잔소리 좀 들으며 자산관리에 대해서알아가야 겠다. 국가장학금도 있고 해서.. + +다섯째. 뭐 독서려나. 사놓고 안읽은 책이 90%이다.권수로 치면 대강 40권이고 금액으로 치면 대충 100만원 정도이네..? 빨리 읽어야 한다. 대학가기 전에 30권 이상 읽는게 목표이다. 하지만 어림도 없지. 기술서는 빼고 읽으면 그정도는 할 수 있을 것 같다. 독서는 마음의 양식! 나는 독서를 좋아한다. + +여섯째 자기계발! 프로그래밍 공부, 컴퓨터 공부!? 파이썬은 많이 했고 C++도 기초는공부했다. 이제 두꺼운 C++책과 TAoCP, EMC++, 하드웨어 보안, 전기전자 등등 이런 책들 가지고 공부해야 겠다! 재밌겠구만!! 이런거 좋아함.. 요즘에는 코테도 많이 보는 듯 하니 알고리즘 공부도 해놓고 내가 좋아하는 보안 공부도 하고.. + +일곱째 인간관계 청산. 이게 좀 많이 필요할 것 같다. 일단 고등학교 3년을 100명이랑 보내서 안 친할래야 안 친할 수 없다. 그 중 도움이 될것 같은 친구가 있고 아닌 친구도 있지만 나는 현생에 충실하지 않았으면서도 충실했어서 대강 다들하고 이어져 있다. 이 상태 유지만 하면 좋을 것 같다. 내 주요 인간관계는 모 SNS의 분들과 몇몇 친구들이니.. + +이게 이걸 바탕으로 계획을 짜보자! 애들 공부하는 VLOG도 보면서 '나도 그랬었지' 와 '그랬었으니 지금도 가능'을 동시에 느낄 수 있다. + +화이팅! 이제 끝이고, 이제 진정으로 새로운 시작이다!!!!! + diff --git a/content/posts/dareun-jibe-eonjhyeo-sandaneun-geoseun.md b/content/posts/dareun-jibe-eonjhyeo-sandaneun-geoseun.md new file mode 100644 index 0000000..2d57ea8 --- /dev/null +++ b/content/posts/dareun-jibe-eonjhyeo-sandaneun-geoseun.md @@ -0,0 +1,28 @@ ++++ +date = 2022-04-09T04:02:17Z +description = "" +draft = false +slug = "dareun-jibe-eonjhyeo-sandaneun-geoseun" +title = "다른 집" + ++++ + + +우리 집은 창원이다.어렸을 때 서울에 살다가 초증학교때 창원으로 내려왔고, 고등학교 3학년까지 거기서 살아왔다. 고등학교는 기숙사 학교를 가기는 했지만, 내가 가장 마음의 안식을 느끼고 진정으로 쉴 수 있는 곳은 오직 우리 집이다. + +대학을 서울로 와서 대학 기숙사에 들어가게 되었다. 고등학교때 기숙사는 들어오자마자 화장실과 샤워실을 리모델링 하기도 했고, 전국에서 아마 가장 넓은 방을 가지고 있었지 않을까 싶다. 각 방마다 냉장고도 있고. 하지만 대학교 기숙사는 참담했다. 2/3로 줄어든 엄청 좁은 방에, 낮은 천장, 허술한 난방, 게다가 못 쓸정도로 더러운 화장실과 때와 곰팡이로 가득한 샤워실까지. 고등학교때와는 차원을 달리할 정도로 극악의 기숙사였다. 그래서 그런지, 공용 공간의 위생을 병적으로 집착하는 나에게는 너무 스트레스였다. 여기저기 남이 쓰던 쓰레기나 껌같은 흔적들이 방 곳곳에 있었고, 애초에 너무 더러웠다. 그래서 결국 기숙사에일주일을 못 버티고도망쳐 나왔다. 그렇게 조부모님 댁에 얹혀 살기 시작했고, 1시간의 통학생활이 시작되었다. + +처음에 통학을 했을 때에는 학교를 가기만 하는게 너무 힘들었고, 어떻게 이렇게 힘들게 학교를다니지라는 걱정만 있었지만, 막상 한달째 통학을 하고 나니 일상 운동도 되고 기숙사와는 달리 정신을 빠릿빠릿하게 세우고 생활을 하게되는 장점도 많았다. 특히 강제적으로라도 기상시간이 앞당겨진다는 것은 일상의 더 빠른 시작을 일으켜 가장 강점이 되었다. 강권의 약속과 술약에서 수월히 빠져나올 수 있는 구실이 된다는 것은 덤. + +원래의 집에서 생활하는 여타 통학과는 달리 나는 조부모님 댁에서 생활을 하니 삶의 제한이 꽤 자유롭다. 통금 시간도 없고, 부모님의 잔소리도 없어(솔직히 이건 필요하다.) 기숙사의 자유도와 비슷하지 않을까 싶다. 하지만 그만큼의 자유에는 할머니 할아버지의 생활도 최대한 배려하고 눈치를 많이 보면서 살아야 한다는 의무가 따른다. + +내가 가장 질색하는 몇가지가 있다. 강박에 가까워 고치기 정말 힘든데다 관련된 사소한 것에도 진짜 엄청난 스트레스를 받는다. 첫번째는 먼지. 두번째는 음식, 마지막은 간섭. 바닥에 먼지가 있는 것을 극도로 싫어한다. 발은 항상 깨끗해야 한다. 침대에서 거꾸로 누울때도 걱정없이 잘 수 있을 정도로 발은 청결해야 한다. 하지만 조부모님댁(이하 본가)은 연립주택인데다, 도심에 있어 먼지가 많이 쌓인다. 게다가 청소를 잘 안하신다. 발에 계속 뭔가 달라붙고 먼지가 쌓이고 그것으로 스트레스를 엄청 받았는데, 내가 청소를 하는 것으로 해결되었다. 난 청소를 좋아한다. + +두번째는 음식. 나는 비만이다. 비만이지만 먹는 것을 좋아하지도 않고, 많이 먹지도 못한다. 하지만 강박이 있어 밥을 남기지를 못한다. 죽을 것 같아도 밀어 넣는다. 그런 강박이 있다. 그래서 평소에는 음식 냄새를 맡으면 토가 쏠린다. 그런것은 문을 닫으면 해결될 수 있다. 하지만 본가의 세탁기는 부엌을 지나 베란다에 있다. 빨래를 해주시고 말리시는 과정에서 음식에 대해서 많은 일들이 일어난다. 첫번째 항목에와 마찬가지로 음식 먼지, 즉 고춧가루 소금이나 음식에 관련된 사소한 찌꺼기들에 엄청난 스트레스를 받는다. 빨래를 가져오시는 과정에서 음식 먼지가 많이 붙는다. 이건 어떻게 해결해야 할지 감이 안온다. 런드리고라고 빨래 대행까지 생각했는데, 도리가 아닌것 같아서 포기했다. 뭔가를 요구하기에는 얹혀 사는 입장이라 너무 불편하다. + +마지막으로 간섭. 이거는 누구나 마찬가지이겠다. 내 방은 아무도 청소하지 않았으면 한다. 사생활 그런 문제는 아니고 그냥 '있던 그대로'라는 강박 때문이다. 물건이 나도 모르는 새에 위피가 바뀌어 있으면 사소한 것에도 스트레스를 받는다. 이건 어쩔 수 없는 성격상의 결점이라 부탁드리는 수밖에 없을 것 같다. + +조부모님은 진짜 어려운 관계인 것 같다. 부모님보다는 거리감이 있지만 그 외에서는 가장 가까운 관계이다. 조부모님과 나의 관계는 극단적으로 생각하면 남이지만 사실 가장 친밀한 가족의 소중한 가족이다. 편해진다면 얼마든지 편해질 수 있지만 불편해지면 얼마든지 불편해질 수도 있다.. + +하지만 아무리 불편하고 그렇게 생각해도, 항상 고맙습니다. + diff --git a/content/posts/datacenter.md b/content/posts/datacenter.md new file mode 100644 index 0000000..cf0f835 --- /dev/null +++ b/content/posts/datacenter.md @@ -0,0 +1,21 @@ ++++ +date = 2021-10-23T08:15:14Z +description = "" +draft = false +slug = "datacenter" +title = "데이터센터" + ++++ + +구글같은 검색엔진이 늘어나고, 다양한 기업들과 서비스들이 사용자들의 개인정보와 데이터를 마구 수집한다. 이로 인해 생겨나는 기하급수적인 양의 데이터들을 보관할 스토리지와 그것들을 사용할 수 있는 데이터로 가공하기 위해 필요한 수없이 큰 컴퓨팅 파워를, 큰 기업들이 대형으로 지어놓은 데이터 센터가 담당하고 있다. 게다가 이제는 작은 기업이나 서비스들은 AWS나 GCP, Oracle과 같은 서비스를 통해 Cloud로 Computing하기까지 하니, 아마존이나 구글의 데이터 센터는 얼마나 커다랗고, 커다래야 하는지 알 수 있다. + +아마존과 구글의 데이터센터뿐 아니라 네이버, MS, 오라클, 및 작은 데이터센터들이 지어질때 중요하게 작용하는 것이 있다. 발열과 전력문제이다. 어디보다도 전력을 사용하여 열이 덥혀질 시설이 겨울만큼 춥다는 것으로 얼마나 냉각시스템이 신경쓰는지 알 수 있다. 심지어 우리집에 있는 노트북만 사용해도 80도 가까이 올라가고, 방이 더워지는데 수백, 수천, 수만대의 컴퓨터가 설치되어있는 데이터센터는 오죽할까. 연료를 태워 그 열기로 전기를 만들고 그 전기를 다시 열로 바꾸고, 그 열을 내보내기 위해 또 다시 전기를 쓰다니. + +나도 집에 작은 서버 하나를 운영하고 있다. 매달 받는 전기세가 가히 신비롭다. 그리고 방도 매우 덥다. 한대로 이 정도인데, 데이터센터는 엄청난 전기를 먹고 있다. 게다가 요즘에는 비트코인 열풍이 불어서 채굴이 한창 떠오르고 있다. 어떻게 보면 채굴장도 하나의 데이터 센터라고 볼 수 있지 않은가. Visa나 마스터카드와 같은 카드사들의 데이터센터가 각 나라로 각 개인으로 분산되어 분포하는 것과 비슷하게 볼 수 있으니 말이다. 이러한 와중에 전력이 부족해지고 있다는 뉴스가 자주 떠오른다. + +그 많은 데이터센터의 대부분은 아마 인텔 제온 프로세서, 하드 디스크와 엔비디아의 그래픽카드를 구축해 놓았을 것이다. MS의 Bing 데이터 센터는 FPGA를 이용해 조금 더 성능을 높였다는데, ASIC이나 FPGA를 이용한 데이터센터도 많을 것 같다. 다들 전기를 많이 먹는 장비들이다. 그렇다면 전성비를 고려하는 건 어떨까. 가령 전성비 최강인 ARM이나 RISC를 사용한다던가, Bing처럼 FPGA를 이용하던가. + +사실 전성비가 좋은만큼 서버 프로세서만큼의 수율이 나오지 않을 것이며 그 정도의 성능을 낼 정도의 대형 프로세서는 나오기 힘들 것 같다. 아직까지 모바일로 사용하는 이유기도 하고. 하지만 괴물급 기업들이 ARM 개발을 위해 한창 노력중이니. 엔비디아도 ARM코어로 데이터센터 개발중이라 하고, 그 애플이 ARM으로 노력중이니 곧 데스크탑급 되는 시스템이 나오고, 좀 있으면 서버급도 나올 수 있지 않을까 기대하고 있다. ARM 는 극강의 전성비를 고려한 설계인 만큼 물량으로 밀어붙여도 x86에 전력으로는 이길지 않을까 싶다. 서버에서는 코어수도 중요하게 작용하니까 다중코어로는 훨씬 유리하지 않을까 싶다. + +화이팅! ARM으로 개발하시는 기업들 모두! + diff --git a/content/posts/gaeinjeongbo-privacy.md b/content/posts/gaeinjeongbo-privacy.md new file mode 100644 index 0000000..6b2a641 --- /dev/null +++ b/content/posts/gaeinjeongbo-privacy.md @@ -0,0 +1,22 @@ ++++ +date = 2021-10-23T08:31:52Z +description = "" +draft = false +slug = "gaeinjeongbo-privacy" +title = "개인정보.. Privacy.." + ++++ + + +나는 구글이 싫었다. + +구글에 반대하며 지메일도 거의 쓰지 않고 있고, 다른 구글 플랫폼을 벗어나 다른 플랫폼으로 옮기고 있다. 하지만, 아이폰으로 옮기고 나서 몇주간을 생각해보니 내 분노의 대상은 구글이 아니라 애플이여야 한다는 것을 알게 되었다. 카카오, 구글에 가지고 있던 분노의 이유가 애플이라는 기업 자체를 강타한다. 물론 나도 알고 있었고, 구글 못지 않게 애플을 싫어하고 있었다. 새롭게 휴대폰을바꿀 때에도 OS만 구글이고 제조사는 다양한 (삼성이..겟지만..) 안드로이드 휴대폰과 휴대폰 하드웨어, 악세사리, OS, 결제, 게다가 웹엔진까지 제한하고 독점해버린 애플과는 비교가 된지 않는다고 생각했고, 이번에 플립이 잘 나와서 그것으로 바꾸려 했다. 물론 에어팟 수리를 하러 갔다가 아이폰에 홀리듯이 들어가버렸다. 한동안 애플의 통합 생태계의 편리함에 매료되어 내가 빅테크 기업에 어떤 이미지를 가지고 있으며 어떤 불만과 어떤 사상을 가지고 있는지 잊었었다. + +하지만 이 문제는 구글이나 애플만의 문제가 아닐 것이다. 따라서 애플과 구글만을 싫어한다고 해서 해결될 문제가 아니다. 이건 모든 빅데이터 산업과 모든 데이터 기업들이 가지고 있는 문제이고, 현대 사회에서 피할 수 없는 문제인 것 같다. 개인에 맞추기 위해, 광고주와 개인을 동시에 만족시키기 위해선 개인정보의 수집이 불가피하다. 최소한의 개인정보 수집이라 해고 결국 수집해야 하는 개인정보는 한둘이 아니다. 따라서 우리는 우리의 개인정보에 대해 어떤 것을 기업에게 주고 어떤 것을 주지 않을지 선택할 권리가 있어야 하고, 선택에 신경써야 한다. 특정 앱을 잘못 설치했다가 지금 모습이 데이터센터에 축적되고 있을 수도 있으니까. 이러한 점에서 개인의 Privacy 선택권을 최대한으로 존중하는 애플은 본받을 만 하다. 애플이 선구적으로 도입한 Ask app not to track이나 앱별 개인정보 관리, 카메라 사용과 마이크 사용 표시는 안드로이드에서도 도입하려 하고 있으니까 이건 정말 잘했다고 생각한다. 애플은 광고 받는 장사가 아니니까 할 수 있는 거겠지만 말이다. + +하지만 구글은 태생이 검색엔진이고 광고 받는게 중요하고 가장 큰 수입원인 기업인 만큼 개인정보 수집에 가장 신경써야 하면서도 가장 필요한 기업이다. 앞으로 어떻게 할지 궁금하다. + +난 아이폰을 사용한다. 앱 트래킹은 다 차단했고, 필요한 것 외에는 카메라를 절대 허용하지 않는다. IP별 개인화도 좋아하지 않아 Private Relay도 잘 쓰고 있다. 하지만 매일매일 구글을 사용하고, 어쩔 수 없이 트래킹이 발생할 수 밖에 없다. 따라서 우리는 개인정보를 흘리고 다니지 않고 꽉 매고 다니는게 중요하다. 계정 보안과 로그아웃은 당연히 중요하고, 무분별하게 계정 연동을 하거나 가입하는 것도, 공개된 웹 상에 자신의 전화번호나 주소, 이메일 주소들을 과도하게 공개하지 않는것도 중요하다. + +HTTPS 연결 확인도 중요하고, WiFi가 믿을 만 한지, 이 네트워크가 믿을 만 한건지도 중요하다. 신경써야 할 게 많지만 철저히 익명으로, 해킹당하지 않을 예방법을 생각하면 쉽다. 개인정보 보호와 해킹 방지는 방법이 비슷하다. 주의해야 할 것은 믿을 만한 곳에 흘리는 개인정보이다. 구글이나, 네이버. 믿을 만 하지만 가장 필요한 회사이다. 가장 이용해먹는 회사이고. 이 점만 주의한다면 일반적으로 자신의 개인정보를 관리한다고 할 수 있지 않을까..? + diff --git a/content/posts/godeunghaggyo-dolabogi.md b/content/posts/godeunghaggyo-dolabogi.md new file mode 100644 index 0000000..ad64f1d --- /dev/null +++ b/content/posts/godeunghaggyo-dolabogi.md @@ -0,0 +1,40 @@ ++++ +date = 2021-12-21T16:23:55Z +description = "" +draft = false +slug = "godeunghaggyo-dolabogi" +title = "고등학교 돌아보기" + ++++ + + +2021년을 돌아보며. + +2021.12.22 + +벌써 12월 22일이다. 12월달에는 열심히 살아야지 하던게 어제같은데 벌써 새해가 다가온다. 나는 내년 성인이 되지만, 아직 실감이 안난다. 술담배를 할 수 있는 나이라기 보다는 내 행동에 내가 책임져야 하는 때가 되었다는 게 더 실감이 난다. 대학을 고민하며 내가 앞으로 뭘 하면서 먹고 살아야할지 꽤 오랫동안 고심했는데, 그 결과로 조금 성장한 것 같아 이제와서는 약간 기쁘기도 하고 무섭기도 하면서 슬픈 약간 오묘한 기분이다. 어찌되었든 이제 성인이 되니까 조금 변해야겠다고 다짐하고 있다. + +2021년을 돌아보면 2020년을 돌아봐야 하고, 그러면 당연히 2019년이 생각난다. 여튼 고등학교 3년 생활이었기에 항상 쌍으로 돌아다녀야지. 고등학교 생활을 돌아본다. + +**2019년, 고등학교 입학.** + +나는 초등학교 때부터 영재교육원을 다니면서 내 미래가 결정되다 싶이 했다. 이렇게 계속 하다보면 동네 중학교에 진학하여, 과학고를 준비하고, 과학고에 진학하여 과기원을 가는게 정해져있었던것 같다. 그때는 지금 이렇게 될지는 몰랐겠지만, 그 길을 모범적으로 걸어서 지금의 내가 되었다. + +2018년 연말, 나는 과학고 입시를 봤다. 자기소개서를 쓰면서 학원에서 선생님과 친구들과 새벽 3시까지 남아 첨삭을 했던 기억이 있다. 불 꺼진 건물에서 술래잡기를 하면서 즐거웠던 기억이 있는데, 지금 돌아보면 즐거워서는 안되었것 같지만 중학생이니 그럴 수 있다고 생각한다. 그때쯤에는 학원에 12시까지 남아서 서류준비를 하고는 했는데, 이때 항상 데리러 와주셨던 아버지께 정말 감사하다고 이제와서 생각한다. 초등학교 6학년때부터 올림피아드를 준비하면서 매 주말마다 학원에 갔고, 내가 숙제를 안해서 학원에 늦게 남아야 했던 적도 많은데, 그럴때마다 항상 아무말 없이 데려다 주셨다. 영재원도 다녔기에 먼 거리를 항상 운전해 주셨다. 2주마다 창원에서 진주까지 가고, 거기서 4시간을 기다려주시고, 집에 데려다 주셨다. 이제와서 생각하니 정말 너무 감사하다는 말 밖에 안나온다. + +서류를 통과하고, 면접을 준비해야 했다. 나는 말을 잘 못했다. 정확히는 너무 긴장을 하는 타입이었다. 평소에는 그렇게 시끄럽고 잘 놀았는데, 면접은 너무 긴장되었다. 그래서인지 준비하는데도 애를 먹었지만, 결과적으로는 잘 되었다. 뭐 통과했으니 말이다. + +면접시험은 너무 못봤다고 생각했고, 그래서 면접을 보고 와서 공부를 했을 정도이다. 아무래도 고등학교를 간다는 낮선 감정과 못봤다는 불안감이 교차해서 잠깐 철이 들었나보다. 하지만 뭐 합격을 했고, 합격 페이지를 봤을 때 그 희열은 아직까지도 기억이 난다. 합격을 했어서, 나는 의욕이 붙었었다. 과고 대비반, 과고를 들어가기 전 방학때 잠깐 하는 총정리 수업을 정말 열심히 했었다. 아마 그정도로 열정을 가지고 공부했던 적은 거의 없던것 같다. 고등학교때는 열정이 아니라 강박에 의해서 공부를 했으니… 그때 물리와 수학, 화학을 한번 쭉 배웠는데, 수학은 둘째치고 그때 배웠던 화학 지식은 고등학교 3년동안 우려먹었고, 그때 배웠던 물리 덕분에 상위권?을 유지할 수 있었다. 정말 재미있었고, 원리가 신기했다. 정말 지금 생각해도 그때 새로운걸 배운다는 느낌을 다시 느낄 수 없을 것 같다. 여튼 방학동안 정말 열심히 공부했고, 덕분에 1학년때에는 최상위권을 할 수 있었다. + +내가 진학하는, 과학고는 기숙사 학교였다. 이때 처음으로 집을 떠나 멀리서 생활하기 시작했다. 처음에는 정말 정말 무서웠다. 들뜬 감정도 있었지만, 중3 그 어린 나이에 집을 나온다는 건 아무래도 많이 불안했던 것 같다. 과학고는 브릿지라고, 입학 전에 2주간 두번 학교에서 미리 생활하면서 기숙사 생활과 고등학교 일상에 미리 익숙해지고, 미리미리 여러가지 시험을 치면서 각종 반을 결정하는 기간을 가진다. 2월 초 처음으로 브릿지를 가면 기숙사 방을 배정받고 생애 처음으로 룸메이트를 배정받았다. 생판 모르는 친구랑 같은 방에서 자고 생활해야 하는 거였는데, 나는 새 친구를 잘 사귀지 못하는 편이라 약간 두려웠다. 물론 말만 한번 트면 급속도로 친밀감을 좁히는 스타일인데, 그 처음 말을 트는게 힘들었다. 하지만 착한 친구였고, 덕분에 2주동안 여러 친구도 사귀고 잘 지냈다. 기억나는건, 우리 방에 귀신이 나오기로 알려진 괴담이 있는 방이었는데, 무서워서 몇일은 못잤던 기억이 있다. 기숙사 생활은 생각보다 괜찮았다. 첫날 빼고는 바로 익숙해졌다. 아침 6시 20분에 일어나는 것과 점호, 그리고 공동 샤워실에서 씻는것이 정말 낮설었지만 성격상 금방 적응했다. 너무 적응해서 문제지만.. 아침에 일어나서 운동장을 한바퀴 도는 구보를 하고 기숙사로 돌아와 씻는 시간을 가진다. 이후 아침 자습을 하는데, 이때 시험을 쳤다. 진단고사라고, 아마 자신의 위치를 확인해보라고 시행했던 시험이었던 것 같다. 아침에 머리를 굴리는건 낮설었고, 그때에는 그게 지대한 영향을 끼칠 것 같아 최선을 다해서 쳤다. 물론 두번째 브릿지에서는 잔다고 치지도 못했지만..ㅎㅎ + +입학을 하고 정식으로 학생이 되었다. 방학때 공부했던 기세로 1학기는 정말 열심히 했던 것 같다. 아마 고등학교 때중에서 최고로 집중했던 시기이다. 덕분에 뭐 점수는 잘 받았고, 원하던 영재학급도 들어갈 수 있었지만 원하던 동아리는 떨어졌다. 시험이 처음보는 개념들 투성이었고, 부산이나 서울에까지 가서 공부했던 친구들과 싸움은 힘들었다. 이때 한계를 첨으로 느꼈다. 1학기 기말고사가 끝나고 고등학교 생활의 전환점이 찾아온다. 한 친구를 알게 된다. 중3때 나는 덕후.. 였다. 1학기때에는 공부하느라 바빠서 다른거에 신경쓸 겨를이 없었지만 처음으로 방학을 맞이하면서 여유가 생겼고, 자유시간이 많이지면서 약간은 문화생활을 즐기게 되었다. 이때 내 내면에 있던 잠재력이 부활을 했고, 그때 같이 덕후인 한 친구를 만나게 된다. 나랑 너무 잘 맞았다. 성격도 잘 맞았고, 관심사도 잘 맞았던 그 친구와 나는 급속도로 친해졌다. 그러다 우리는 연애를 한다. 그것도 중간고사 5일전에 사귀기 시작했다. 당연히 공부는 하지 않았고, 연애에 몰두하느라 2학기는 통으로 날리게 된다. 하루종일 놀고, 문자하고, 편지쓰고 그랬다. 단 둘이 있기 좋은 시골학교라 산책도 자주 갔고, 정말 행복했다. 성적이 많이 떨어졌다. 그래도 중위권은 유지했는데, 부모님은 당연히 당황하셨을 것이다. 갑자기 그렇게 성적이 떨어졌으니.. 그래서 결국 부모님과 틈만 나면 싸웠고, 그 친구와도 정말 자주 싸웠다. 지금와서 내가 왜그랬을까 싶다. 정말 좋은 친구였고 정말 잘 맞았는데, 내가 너무 잘못했던것 같다. 시간이 많이 흘러서 알게 되는건가 싶다. 그 친구와는 몇번에 다툼 이후로 영영 멀어지게 되었다. + +한번 공부를 놓으니 그 뒤로 공부하기 어려웠고 낮아진 성적은 높이기 힘들었다. 그렇게 나는 2학년을 맞이했다. + +**2020년에는..** + +2020년 나는 2학년이 된다. 1학년 친구들이 새롭게 들어오며 2학년이 되었다는 것을 실감했다. 새롭게 마음을 다잡고 공부를 하기로 마음먹었다. 그나마 공부를 해서, 성적을 높이는 데에는 성공했다. 2학년 1학기를 잘 쳐서, 조기진학이 가능한 성적이 되었다. IQ도 140을 넘겨서 조기졸업도 가능했다. 2학년 여름방학때는 고민을 한다. 조기졸업을 할지 조기진학을 할지. + +그 전에, 2학년에 올라가는 시기에 코로나를 맞이한다. 전 수업이 온라인 수업이 되었고, 입학식뿐만 아니라 진급식, 그리고 그 사이 수업도 전체 다 온라인으로 진행하게 되었다. 온라인으로 진행하면서 장비를 셋팅하기 시작했다. 내가 아침에 수업을 제대로 들을리 없었기 때문에 캡쳐보드며 다른 여러 장비도 장만했다. 그러면서 오디오 문제가 생겼다. 에어팟은 녹음을 하면서 동시에 재생할 때 통화로 연결이 되어 음질이 정말 너무 구리기 때문에 이를 해결하기 위해 오디오 장치를 따로 썼고, 캡처보드에 오디오를 넣기 위해 가상 오디오 드라이버까지 찾아가며 준비했다. 그러면서 오디오 드라이버에 관심을 가졌고, 그러면서 컴퓨터에 대해서 관심을 가지게 된다. + diff --git a/content/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga.md b/content/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga.md new file mode 100644 index 0000000..b0cf3ca --- /dev/null +++ b/content/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga.md @@ -0,0 +1,22 @@ ++++ +date = 2021-10-30T07:07:55Z +description = "" +draft = false +slug = "gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga" +title = "구글은 그 많은 페이지를 어떻게 찾아낼까." + ++++ + + +구글은 방대한 웹페이지를 자사 데이터베이스에 기록하고 있으며, 이를 토대로 사용자가 검색한 검색결과와 가장 매치되는 페이지를 보여줌으로써 검색엔진의 역할을 할 수 있다. 구글이 이렇게까지 클 수 있었던 이유는 정확한 검색 결과를 보여주는 알고리즘 덕분이다. 그렇다면 이 알고리즘은 무엇일까? 구글이 웹페이지들의 관계를 산출하고 그 수치를 계산해내는 알고리즘인 페이지랭크 알고리즘은 구글의 창시자중 한명인 래리 페이지라는 사람이 석사논문으로 발명한 알고리즘이다. PageRank 알고리즘은 각각의 웹 페이지의 상대적 가중치를 계산하여 각각의 중요도와 연관성을 표현하는 방식을 이용하는데, 이를 이용하여 한 페이지와 가장 연관된 다른 페이지를 Rank를 매겨 정확한 연관성을 보여줄 수 있다. PageRank에서는 각각의 웹페이지를 노드로 보고, 상호 참조와 인용으로 각각의 노드를 연결하여 하나의 거대한그래프를 만든다. 각각의 페이지는 랭크값이라는 고유한 수치를 가지고 있고, 그 페이지에서 인용된 각각의 페이지는 인용한 페이지의 랭크값을 동등하게 나눠가진다. 많이 인용된 페이지는 랭크값이 높을 것이고 적게 인용된 페이지는 랭크값이 낮을 것이므로 이 랭크값으로 페이지들의 중요도를 줄세울 수 있다. 하지만 다중연결 그래프에서 각각의 노드가 각각의 노드의 값을 참조하기 때문에 순환참조 구조가 되어 무한적으로 계산하게 되는 문제가 있고, 결과적으로 노드의 값을 계산할 수 없다는 문제가 있다. 페이지랭크 알고리즘에서는 이 각각의 페이지의 랭크값이 계산을 계속하다 보면 각각 하나의 값으로 수렴한다는 것을 증명하여 문제를 해결하였다. 아니, 애초에 문제가 되지 않았던 것이다. 이 과정에서 그래프의 각 노드 랭크값을 표현한 행렬에 변환연산을 함으로써 계산의 단계를 나아가는데, 이때 이용되는 마르코프 행렬을 구글행렬이라고 한다. 페이지랭크 알고리즘은 이러한 각각의 랭크값을 계산하는 정규화공식과 계산과정의 규칙성, 그리고 수렴한다는 증명으로 완성된다. 물론 산출 과정중에 초기 산출 방법과 루프의 해결 그리고 보정을 위한 서퍼가 존재한다. + +**(Step1) 초기화**각 노드들의 중요도 초기값은 1N1N으로 설정.(이때 NN은 전체 웹페이지의 개수) + +**(Step2) 업데이트**노드 K의 t번째 시도에서 중요도를 $PR(K;t)$ 라고 할때, $ PR(K;t+1)$ 은 $ PR(K;t+1) = \frac{1−d}{N} + d \Sigma{P∈K} \frac{PR(P;t)}{|Γ_P|} $ 이다. 여기서 $d(0≤d≤1)$는 제동(damping)계수이고, $Γ_K$는 K에서 인용한 노드들의 집합이다. 그리고 $|ΓP|$는 P를 인용한 노드의 개수이다. + +구글행렬은 행렬분리를 하기 좋은 구조로 이루어져 있으며 이 덕분에 반복연산을 행하기에 매우 좋은 구조로 되어있다. 그래프를 인접행렬로 표현한 후, 각각의 페이지값을 확률행렬로 나타낸다. 인접행렬을 n승하면 n번 순회하여 도달하는 페이지를 의미한다. 하지만 인접행렬로 계산하면 수렴성을 보장할 수 없기 때문에 수렴성의 확보를 위해 확률행렬로 변환한 후, 각 열의 합이 1이 되고 나서 n승 계산을 수행한다. 따라서 행렬 S는 다음과 같이 정의한다. $S = H + \frac{1e^T}{N}$ N은 총 노드의 갯수, 벡터 1인 전체 1인 열벡터이고, e는 특정 열의 합이 0이면 원소값이 1인 열벡터이다. + +이제 이 확률행렬을 수렴하게 계산하기 위해 구글행렬 G를 계산한다. + +$G = dS + (1-d)E$이고, 이때 d는 Damping 계수이다. 이렇게 계산한 구글행렬을 페이지랭크 알고리즘에 대입하면 가장 큰 고윳값이 1인 행렬이 되어 Frobenius 정리에 의해 초기값에 관계없이 일정한 값으로 수렴한다. + diff --git a/content/posts/gyoyug-silpae.md b/content/posts/gyoyug-silpae.md new file mode 100644 index 0000000..47f1312 --- /dev/null +++ b/content/posts/gyoyug-silpae.md @@ -0,0 +1,25 @@ ++++ +date = 2022-04-14T06:55:25Z +description = "" +draft = false +slug = "2022041406" +title = "선택실패" ++++ + + +고등학교 3학년 때까지만 해도 나는 무조건 컴퓨터 공학과나 전기전자 공학과. 학과만 보고 대학교에 진학하리라 마음먹었었다. 진짜 학교 이름은 절대 보지 않을 것이라 생각했다. 하지만 막상 입시에 처하고 선택의 갈림길에 있으니 그 다짐은 물거품이 되었다. + +역시나, 아니나 다를까 원서 접수 기간이 되니 진로 담당 선생님은 실적을 위해 상위 대학교의 낮은 학과에 원서를 넣어볼 것을 추천하셨다. 말이 추천이지 반 강제로 넣게 되었다. 아무런 관심도 없었고, 3년동안 생각도 없었는데다 자기소개서도 짜맞춰야 쓸 수 있는 학과에 지원했다. 붙어도 안간다는 생각으로. 하지만 내가 희망했던 대학을 떨어지고, 상위 학교 하위 학과와 하위 학교 자유 학과중에 선택해야 했다. 내가 3년동안 해왔던 것과 내가 무엇을 하고 싶은지를 생각해 본다면 당연히 학과를 보고 진학을 해야 했었는데, 막상 상위 학교의 합격증을 받으니 당연히 마음 한켠에서는 이걸 버린다고?!?라는 마음이 있었고, 그 마음에 휘둘려 등록예치금을 보낸다. 아직 등록 기간이 남았으니 등록 취소를 해도 되겠지만, 사실상 마음을 다잡은 것이나 마찬가지였다. 등록금 환불 신청서까지 적어놓고 책상에 올려두었다. 도장과 보호자 서명까지 받아놓고 고민했다. 후회하지 않을까? 어느 쪽으로 가나 조금 다니고 후회하게 될텐데, 학교를 후회하는게 학과를 후회하는 것보다 더 심하지 않을까 생각해 결국 그대로 원서는 놔둔 채 날이 넘어간다. 날짜가 넘어가는 걸 보고 얼마나 힘이 풀렸는지 모르겠다. 이제는 돌이킬 수 없구나. + +그런 선택을 한 후 몇일간은 대학교 이름에 심취해 우리 학과도 선녀처럼 보였다. 전망 좋은 공과 학과로만 보였다. 하지만 시간이 지나면서 심취해 있던 생각이 풀리기 시작했고, 학과의 현실을 마주하기 시작하면서 후회가 밀려왔다. 서양에서는 주로 취급하지도 않는 사양산업의 책임으로만 끌고 온 이름만 대학인 학과. 이게 우리 조선해양 공학과의 현실이었고, 미래였다. 미래도 없는 학과. 이런 학과인줄 알고는 있었다. 하지만 실제 전공 수업을 들으면서 더욱이 실감났다. 왜 이런 학교에 와서 이딴 옛날 정보를 배워야 하는가. 왜 교수님은 열등감에 산업을 과장하고 잘 될거라고 세뇌하고 애원하듯이 수업을 하실까. 그 정도로 사양산업의 학과라는 것을 깨닫게 되었고, 탈출을 결심했다. + +결국 탈출을 결심하게 될 줄은 알았다. 반수를 하던, 유학을 결심하던, 군대를 가던 어떻게든 이런 현실을 벗어나고자 하게 될 것이란 것을 알고 있었다. 학교도 내가 생각했던 것처럼 엄청 막 좋은 곳은 마냥 아니었다. 역사가 오래되어 뿌리깊은 명문이지만 보수적 교육과 보수적 관념 그 자체인 학교인 듯 했다. 대학교 수업은 고등학교의 주입식 교육 그 연장선 뿐이었다. 많은 것에 너무 큰 상실감을 느꼈다. 학과에서도, 학교에서도. 그래서 결국 대한민국 교육의 한계인가 싶었다. 대학교도 같은 처지의 교육이구나 했다. + +지금 학과에 대한 열등감으로 그렇게 느끼는 것일 수도 있다. 하지만 만약 ‘학과’때문에 학교도 그렇게 느껴진다면 그만큼 그 학과에 문제가 크다는 것이 아닐까? + +난 유학을 결심했다. + +대한민국의 교육을 벗어나고 싶다. 아직 기초를 공부하는 입장으로서 얼만큼의 주입식인 필요하다는 것은 인정한다. 하지만 이것이 대학원까지 이어지고 심지어 그 이상에도 이어지는 교육 체계와 대학 교수들 아래에서 배우고 싶지 않다. 난 이루고 싶은 꿈과 하고 싶은 일, 애타게 배우고 싶은 것이 있다. 지금까지 내가 노력할 수 있었던 사명감이라 할 수도 있다. 이것이 깨져버린 이상, 그리고 여기서 계속 공부를 이어나가는 이상 내 꿈은 영원히 짓밟힐 것이다. 지금 여기에는 어떤 수를 써도 그것을 이룰 수 있는 길은 없다고 생각한다. 누구는 회피라 할테지만, 난 여기에서는 내가 할 수 있는 능력의 최선을 다했다고 생각한다. 과거를 후회하면서 이뿐인 자리에 있느니, 차라리 이 현실을 회피해 새 길을 열어나가련다. + +제일 중요한 것은 이것이 지금 하기 싫은 일에 대한 회피가 목적이 되어 버리면 안된다는 것이다. + diff --git a/content/posts/haggyoeseo-haessdeon-peurojegteudeul.md b/content/posts/haggyoeseo-haessdeon-peurojegteudeul.md new file mode 100644 index 0000000..31a5eff --- /dev/null +++ b/content/posts/haggyoeseo-haessdeon-peurojegteudeul.md @@ -0,0 +1,18 @@ ++++ +date = 2021-10-23T08:51:44Z +description = "" +draft = false +slug = "haggyoeseo-haessdeon-peurojegteudeul" +title = "학교에서 했던 프로젝트들.." + ++++ + + +1. 귀가시간 수집 프로그램 +2. 기상곡 수집 프로그램 +3. 컴퓨터실 사용현황 +4. 학교 내부 정보공유망 +5. 문서파일 자동저장 및 복구 시스템 +6. 학교 저지 사이트 API 정리 및 제출시스템 프록시 +7. 선생님들이 부탁하셨던 수많은 프로그램들 + diff --git a/content/posts/hardware-security.md b/content/posts/hardware-security.md new file mode 100644 index 0000000..aa54d0e --- /dev/null +++ b/content/posts/hardware-security.md @@ -0,0 +1,70 @@ ++++ +date = 2021-08-06T10:31:09Z +description = "" +draft = false +slug = "hardware-security" +title = "Hardware Security" + ++++ + + +## Hardware Security + +### **신뢰성과 관련된 기술** + +#### 1. RoT (Root of Trust) + +Root of Trust, 신뢰점이란, 전자기기 안에서 별도로 존재하는 프로세싱 유닛으로, 메인 프로세서의 보조로서 다양한 암호화 기법이나 솔루션을 제공하거나 이를 제어하기 위한 보안 기능들을 의미한다. RoT가 궁극적으로 달성하고자 하는 것은 TC(Trusted Computing)으로, 신뢰할 수 있는 컴퓨팅, 즉 믿을 만 하고 무결성이 보장되는 계산 및 기능을 이야기한다. 이를 달성하기 위한, RoT에 포함되는 여러가지 기술들이나 알고리즘이 있고, 각 단계들을 순차적으로 달성되어 신뢰할 수 있는 보안적인 프로세스가 진행된다. RoT의 대표적인 기법이나 기기는 TPF, TEE등 신뢰할 수 있는 플랫폼 모듈이나 신뢰할 수 있는 실행 환경이 있다. + +#### 2. TPF + +TPF, Trusted Platform Module이란, 신뢰할 수 있는 플랫폼 모듈을 의미한다. 어떤 어플리케이션이나 프로세스가 신뢰성 있도록 실행되기 위해 별도의 플랫폼 모듈을 설치한다. 이 플랫폼은 다양한 암호화 기법을 제공한다. TPF는 외부에서 접근이 불가하도록 설계된 암호화 키와 저장공간 및 연산장치를 별도로 제공함으로써 외부에서는 암호화 키나 암호화 과정 및 알고리즘, 그 설계를 알 수 없도록 만들어져 소프트웨어적으로 취약할 수 밖에 없는 키 유출을 해결한 장치/기술이다. TPF는 내부 키(서명)이 존재하고, 이를 바탕으로 다양한 암호화 프로세스를 제공한다. RSA암호화나 ECC암호화 및 서명 및 검증을 제공하며, Hashing이나 HMAC, 어플리케이션이 응용할 수 있는 암호화된 저장공간을 제공하기도 한다. + +TPF는 외부에서는 절대 접근할 수 없게 만들어져 있다. 하드웨어적으로 메인 프로세스와 분리되어 있어 해킹 당하거나 키가 탈취당할 확률이 적으며, 별도의 메모리를 사용한다. 하지만, TPF도 물리적인 해킹에는 취약할 수 밖에 없으며, 직접 칩을 탈취하여 역공학이나 부채널 공격을 시행하면 키가 탈취당할 위험이 있다. + +#### 3. TEE + +TEE, Trusted Execution Environment란 신뢰할 수 있는 실행 환경을 의미한다. TPF를 따로 설치할 수 없는 환경이거나 TPF를 설치한 환경이라도 더욱 보안을 강화하기 위해 메인 프로세서를 보안 영역과 일반 사용자 영역으로 나누어 사용하는 것을 의미한다. 보안 영역에서는 TPF에서와 마찬가지로 보안 정보의 저장과 처리를 수행하고, 암호화 프로세스를 실행한다. 일반 사용자 영역에서는 보안 프로세스가 필요하면, 이를 보안 영역에서 실행함으로써 이를 신뢰 가능한 별도의 환경에서 실행하도록 하는 기술이다. 결제 및 인증 과정이나 DRM 과정이 TEE에서 주로 실행된다. 보안영역은 일반영역과 물리적으로 분리되어 있어, TPF와 마찬가지로 일반영역에서 TEE에 접근할 수 있는 방법은 TEE가 제공하는 방법밖에 없다. TEE는 TPF와는 다르게 일반 영역에 있던 잡다한 프로세스도 실행하고 처리할 수 있다. TPF에서는 비밀번호 입력 등의 온전히 메인 프로세스의 일인 것들을 처리할 수 없었지만, TEE는 메인 프로세서에 포함되어 있으므로 이러한 사소한 것들까지 모두 담당할 수 있어 보안을 더욱 향상시켜 준다. 완전히 신뢰 가능한 환경을 조성하기 위해서는 TEE와 TPF를 혼용하여 TPF는 TEE에게만 통신하고, TEE는 기타 사소한 것들까지 처리한다면 최고수준의 보안을 유지할 수 있다. + +대표적으로는 삼성전자에서 자사 휴대폰에 기본적으로 탑재하는 보안 솔루션 Knox가 있다. Knox는 휴대폰의 CPU를 보안 영역과 일반 영역으로 나누어 TEE를 제공한다. + +### **Side-Channel Attack 대책** + +#### 1. Side-Channel Attack + +Side-Channel Attack, 부채널 공격이란, 암호화 과정이나 보안 프로세스가 진행중일 때 프로세서에서 부가적으로 얻을 수 있는 다양한 정보들을 이용하여 구조를 파악하거나 키를 탈취하는 방법이다. 부가적으로 얻을 수 있는 정보는 칩에서 나오는 열이나 전자기파, 연산이 수행되는 시간, 전력 소비량, 에러 처리(Fault)등이 있다. + +#### 2. 방어 기술 + +Side-Channel Attack의 방어에는 Hiding과 Masking기법이 가장 많이 사용된다. 마스킹이란, 연산의 중간에 사용되는 값을 랜덤하게 결함으로써 원래의 연산에서 사용되는 값들의 입력값과 연산값과의 관계를 불명확하게 하여 특성키 공격이나 알려진 평문 공격에 대비할 수 있도록 하며, 전력 사용량의 규칙성을 모호하게 만든다. 마스킹의 어떤 과정에서 랜덤한 값을 사용하는지에 따라 다양한 마스킹 기법이 존재한다. 하지만, 랜덤 알고리즘이 밝혀지거나 역공학을 통해 알아낸다면, 혹은 또 다른 공격에서는 이 방법은 효과적이지 않을 수 있다. 랜덤 알고리즘이 밝혀졌을 때의 문제점은 거의 모든 암호화 알고리즘에서의 문제이다. + +SABL, WDDL, t-private Logic등이 있다. + +EM(Electro-Magnetic) SCA의 대비하는 방법으로는 랜덤한 전자기파를 방출하는 방법이 있다. 암호화 퍼리 과정에서 더미 연산과 불필요한 값들을 중간중간에 넣어줌으로써 더미 전가지파를 만들어 낼 수 있다. 하지만, 결국 주요한 연산의 전자기파는 모두 누출되는 것이기에 칩을 설계할 시에 이를 대비할 방법을 모색하여 전자파를 최대한 약하게 방출하도록 하거나 차폐 솔루션을 도입하는 등의 과정이 필요하다. + +Fault Injection SCA의 경우에는 예측 불가능한 다양한 상황에 대해서 많은 가능성을 두고 Fault처리를 할 수밖에 없다. 하지만, 이는 많은 연산 성능 하락을 유발하며, 알고리즘을 매우 무겁게 할 수 있다. + +Timing SCA의 경우에는 각각의 입력에 대해 연산시간이 모두 동일하게 처리되도록 설계하거나, 각각의 연산에 더미 타임을 넣는 방법이 있다. + +### **Reversing 대책** + +#### 1. 역공학 + +역공학(Reversing)이란, 소프트웨어에서는 특정한 프로세스가 처리되는 과정에서 데이터 흐름이나 역어셈블, CPU처리 분석을 통해 원래의 알고리즘을 알아내거나 원리를 알아내어 크래킹하는 과정을 의미한다. 한편, 하드웨어의 경우에는 다양한 칩을 뜯어내어 그 구조를 확인하거나 전류 흐름을 측정하는 등의 물리적인 분석을 통해 반도체의 구조를 알아내거나 연산 중 어떤 데이터가 어떤 흐름을 통해 이동하는지에 대해 알아내는 것을 의미한다. 반도체 칩의 사진을 찍어 현미경을 통해 분석하는 과정등을 통해 데이터의 이동 버스(BUS)를 알아내는 과정이 포함된다. + +칩의 리버싱은 디캡슐레이션, 디레이어링, 게이트 레벨 넷리스트 추출등의 과정이 있다. 먼저 패키지에선 다이를 제거하고, IC를 디캡슐레이션하여 반도체 칩에 직접 접근할 수 있도록 한다. 후에, 디레이어링을 통해 각각을 싱글 레이어로 분리하여 분석하는데, 이때에는 SEM촬영을 통하여 얻은 사진 설계도를 얻어내는 과정이 있고, 후에 이 사진을 이용하여 이를 회로도로 변환하는 과정이 있다. + +데이터 BUS를 알아내게 된다면, 연산 중간중간에 사용되는 값들을 알 수 있으며, 입력과 출력값을 비교하여 어떤 부위가 어떤 연산을 처리하는지 알 수 있고, 이를 통해 전자기파 주입 공격을 하거나, 키를 알아낼 수 있다. 또한, 같은 역할을 하는 칩을 제작하여 이를 공격하는데 사용될 수 있다. + +#### 2. 메모리 추출 방지 + +메모리가 유출되는 경우를 방어하기 위한 방법으로는 PUF가 있다. PUF는 Physically Unclonable Function으로, 물리적으로 복제가 불가능한 함수를 의미한다. PUF는 칩이 각각의 고유한 값을 가지도록 하며, 이를 예측 불가능하도록 하여 칩에 직접 접근해도 이를 알 수 없도록 한다. + +#### 3. 역공학 대책 + +Reversing에 대비하는 방안에는 메모리 유출 방지에서 사용했던 방법을 사용한다. PUF를 이용함으로써 각각의 칩에 따라 연산값이 달라지게 되고, 따라서 칩의 구조를 알아내거나 Bus를 분석할 수 있어도 PUF에서의 값은 Bus를 지나가지 않으므로 키를 알 수 없다. + +**UART? PSA?** + +**출처> Wikipedia, [ 하드웨어 칩 기반 보안시스템 밒 해킹 동향, 한양대학교 ]** + diff --git a/content/posts/how-i-wanted-to-do.md b/content/posts/how-i-wanted-to-do.md new file mode 100644 index 0000000..8671edd --- /dev/null +++ b/content/posts/how-i-wanted-to-do.md @@ -0,0 +1,18 @@ ++++ +date = 2021-10-23T08:52:15Z +description = "" +draft = false +slug = "how-i-wanted-to-do" +title = "How I wanted to do." + ++++ + + +프로그래밍에 매력을 느껴 프로그래밍에 입덕하게 된 건 2학년때쯤.. 이후 그 재미를 느끼고 많은 것들을 시도해보곤 했다. HTML과 CSS를 배워 가장 기본적인 웹사이트를 만들고, 이를 더 화려하게 꾸미기 위해 JS를 공부했다. 이를 배포하기 위해 서버 구축에 대해 공부했고, PHP나 MySQL을 이용해 기능성을 부여하면서 DB와 SQL에 대해 공부했다. 이후 고전적인 서버를 넘어 SSR이나 CSR에 대해 알아보려 NodeJS를 공부했다. 학교 입학시 과제였던 C로 하는 PS를 하면서 C나 C++에 관심을 가졌고, 왜 C로 코딩하는데 C++를 써야하는지 의문을 가지고 C++을 공부했다. C++이 완전히 다르다는 것에 충격을 먹었고, 이후 비슷한 객체지향에 대해 알아보며 Python에 입문했다. C에 비해 너무 쉬운 코딩과 너무 간단한 개발에 충격을 먹었고, PS하는데만 쓸 수 있던 C와는 다르게 다양한 분야에 접목하기 너무나도 쉬운 Python은 나를 개발 세계에 빠뜨렸다. + +Python의 다양한 모듈을 사용하며 Requests와 같은 웹을 다루는 모듈을 쓰며 대체 웹은 어떤 구조일까 의문이 들어 네트워킹이나 HTTP, HTTPS에 대해 공부했고, 이런 것들을 응용해 나가며 실질적인 코딩에 가깝게 가면서도 주어진 기능 외로 작동하게 만드는 것에 맛을 들려 해킹에 대해 점점 흥미를 가지기 시작했다. Python은 빠르게 무언가 기능하는 하나의 완성품을 만들기 너무 적당했고, 실행했을 때 원하는 대로 작동했을 때의 쾌감에 빠져버렸다. 이후 생각나는 아이디어란 아이디어는 다 파이썬으로 구현했고, 나 자신의 아이디어 뿐 아니라 주변의 아이디어를 신경쓰게 되었고, 그게 학교 서비스 구현 프로젝트로 이어졌다. 파이썬으로 간단하게 했던 것들을 친구들이 노가다로 하는 모습을 보고 아 저거 파이썬으로 할 수 있겠는데라고 생각했고, 그렇게 만들어본게 수십개는 될 것이다. 한편으로는 내 호기심에 딱 알맞게 점점 깊은 곳으로 내려가고 있었다. 원리의 원리를 계속 파고들며 컴퓨터 구조까지 내려갔고, 내려가면서 다른 땅굴을 파는 게 너무 재미있었다. 해킹이. + +결국 반도체까지 내려가서 더 이상 이해할 수 없을 때까지 내려갔고, 해킹은 더 이상 내가 알던 해킹이라는 학문이 아니게 다 통합되었다. 해킹을 할 수 있던 원인중 대부분 그 아랫단계에서 기초된 버그였고, 아래로 내려갈수록 하나로 합쳐졌다. 그래서 내가 읽은 책을 살펴보면 다양한 분야가 많이 있지만 다 상하관계로 얽혀있음을 알 수 있다. 네트워크에서 기초해서 TCP/IP로, 거기서 물리계층인 데이터 통신까지, 그리고 신호처리와 신호를 처리하는 소자까지 이어져 있다. + +관심사에 따라 공부해서 재미있게 공부했고, 관심사에 따라 공부하니 꼬리물기 공부가 가능했다. 서로 얽혀서 각자의 이해를 도왔고, 서로의 흥미를 돋구었다. 그냥 '컴퓨터'라는 분야 하나가 너무 재미있었고, 나에게는 천직이라고 생각됐다. 전체가 재미있으니 가장 기초인 '반도체'나 '컴퓨터 구조'가 자연스럽게 내 진로이자, 내 주요 관심사가 되었다. + diff --git a/content/posts/insaeng-dubeonjjae-silpae.md b/content/posts/insaeng-dubeonjjae-silpae.md new file mode 100644 index 0000000..0673958 --- /dev/null +++ b/content/posts/insaeng-dubeonjjae-silpae.md @@ -0,0 +1,20 @@ ++++ +date = 2021-10-23T08:52:59Z +description = "" +draft = false +slug = "insaeng-dubeonjjae-silpae" +title = "인생 두번째 실패. 두번째 대학탈락." + ++++ + + +내 첫번째 실패는 조기진학 실패이다. 대학을 떨어졌다. + +내 두번째 실패도 대학 탈락이다. 이번엔 아직 9번 더 있지만, 작년에 떨어지고 느꼈던 그 참담함과 그 마음가짐을 다시 한번 느낄 수 있게 한 그 세글자 '불합격'. 역시 이번에도 참담함을 느꼈고, 여전히 안타까움과 공허함을 느낄 수 있었다. + +내심 기대했었다. 붙기를 간절히 기도했다. 하지만 세상은 냉정했다. + +바라던게 이제는 이룰 수 없다고 생각하니 공허했다. 하지만 그것도 잠깐이었다. 멘탈이 강하고 회복력도 강한게 내 장점이라 공허함으로 쳐져있는 것도 잠깐이었고, 앞으로를 다시 생각하고 마음가짐을 고치는 계기가 되었다. + +할 수 있는 모든 것을 해보자. 후회없이. + diff --git a/content/posts/jeonja-jeeoyi-segyein-mirae-geu-boanyi-wihyeob.md b/content/posts/jeonja-jeeoyi-segyein-mirae-geu-boanyi-wihyeob.md new file mode 100644 index 0000000..0b80f34 --- /dev/null +++ b/content/posts/jeonja-jeeoyi-segyein-mirae-geu-boanyi-wihyeob.md @@ -0,0 +1,22 @@ ++++ +date = 2021-10-30T07:17:47Z +description = "" +draft = false +slug = "jeonja-jeeoyi-segyein-mirae-geu-boanyi-wihyeob" +title = "전자 제어의 세계인 미래, 그 보안의 위협" + ++++ + + +미래 사회에는 전기자동차와 자율주행 자동차가 성하게 유행할 것이다. 사람 운전자의 역할이 거의 축소되고, AI나 전자적으로 제어될 것인데, 지금도 많이 일어나고 있는 논란은 바로 보안이다. 만약 자율주행 자동차가 해킹을 당하게 된다면 어떨까? 해커는 자동차에 타고 있는 사람의 생사여탈권을 가지게 될 정도로 심각한 문제가 있는 것이다. 그러므로, 이러한 생활환경에 직접적인 영향을 주는 전자기기의 보안은 매우 중요한 것으로 판단된다. 미래에 우리의 생활을 가장 많은 부분 담당할 사물인터넷도 마찬가지이다. 우리의 생활과 강하게 연관되어 있고, 그러므로 보안이 가장 주요한 요인이 된다. 전자적으로 제어되는 보일러가 해킹당하면 어떻게 될까? 해커는 보일러를 과하게 제어함으로써 실 사용자에게 영향을 미칠 수 있다. 더 심각하게는 가스밸브나 의료 기기가 누군가의 악의대로 조종된다면 사용자를 죽음의 위기에 처하게까지 할 수 있다. 에어컨이나 히터, 그리고 화장실, 환풍기, 및 여러 가구들이 연결되어 있으며, 우리의 삶에 큰 영향을 미칠 수 있다. 실제로 IoT기기들에 대해 우리의 사생활의 침해도 문제가 된다. 미래 사회에서는 모든 기기가 연결되어 있을 것이며, 자동차나 버스, 그리고 비행기까지도 무선으로 연결되어 있을 것이다. 그러면 여기서 가장 문제가 되는 것이 무선통신의 보안이다. 무선통신은 유선통신과는 다르게 모든 사람들이 시호를 감청할 수 있기에 그 보안이 매우 중요하고 심각하게 느껴진다. 그렇다면 이러한 사항들에 대해 지금은 어떻게 보안이 이루어졌으며, 또한 앞으로는 어떻게 발전되어야 할까? + +첫번째로는 AI상의 보안이다. 지금 보안의 상황으로는 공격자들이 시스템에 대해 예측이 어려운 신종 변종 공격을 많이 진행하고 있다. 이것의 바탕이 되는 기술은 바로 자동화이다. 보안이라는 것 자체가 공격 시 대응 및 방지가 주요한 특징이기 때문에 자동화나 변종 공격에 대해서는 취약할 수 밖에 없다. 완벽한 시스템이란 없는 것이다. 이런 공격에 대처하는 방안으로는 인공지능을 사용하는 방법이 있다. 실제 대규모로 전송되는 공격의 경우 인공지능으로 해킹에 대한 지도 및 비지도 학습을 통해 해킹 패턴을 자동적으로 분석해 막아줄 수 있기 때문이다. 또한 악성코드 분석에 인공지능을 접목시키면, 실제 사람이 분석하는 것보다 더욱 빠르게 분석할 수 있다. 하지만, 인공지능 보안에도 문제가 있다. 특히 인공지능은 실제 보안에 의지하는 것이 아니기 때문에 과하게 보안하거나 또는 이미 일어난 데이터들의 경향성 때문에 제대로 된 예측을 못하는 것이다. 인공지능도 선입견이 있는 것이다. 이와 관련지어서 인공지능에 의한 해킹을 고려해 보아야 한다. 인공지능 자체가 해킹을 하는 것이다. 해킹이란 것 자체가 반복성이 중요하고 난수성이 중요하기 때문에 이와같은 작업에 인공지능만큼 딱 맞는 것은 없을 것이다. 이와같은 공격에는 인공지능에 의한 대처밖에 답이 없는 것이다. + +인공지능에 의한 해킹과 보안에 대해 알아보았으니 인공지능 시스템에 대한 보안을 어떨까? 이것이 이에서 언급했던 자율주행 자동차에 관한 보안이 될 수 있다. 기본적으로 업다운 인공지능이 아닌 다운업 인공지능인 현재의 인공지능으로서는 주어진 데이터가 가장 기초적인 원리로 작용한다. 데이터를 기반으로 학습하고 행동하기 때문에 데이터의 정확성이나 신뢰성이 중요하게 작용한다. 이때 문제가 될 수 있는 것이 데이터의 오염이다. 데이터를 인위적으로 조작하여 인공지능의 행동을 조작하는 방법이다. 인공지능이 해킹당하기 쉬운 (어떤 방면에서) 이유가 바로 이것이다. 데이터가 악위적인 방향으로 조작된다면 인공지능의 행동의 패턴을 유추할 수 있고, 또한 자율적으로 조작할 수도 있다. 따라서, 인공지능에 대해서는 데이터의 유입의 신빙성을 중요시하게 고려해야 할 것이며, 데이터의 무결성이나정확성에 검증을 위한 인공지능을 도입하여 방어를 한다고 한다. + +두번째로는 사물인터넷에 대한 보안이다. 사물인터넷은 실질적으로 우리의 생활과 밀접하게 관련이 있고, 가장 많은 전자기기가 이 기술에 접목될 것이기 때문에 가장 중요한 보안이라고 생각할 수도 있다. IoT, Internet of Things는 기본적으로 인터넷에 대한 기술이기 때문에 가장 보안에 취약해 질 수밖에 없다. 또한 IoT기기는 저전력과 저성능이 가장 중요하고 소형화가 중요하기 때문에 특별한 보안 솔루션을 도입하기가 어렵다. 집에 커다란 보안서버를 하나씩 구비해 놓지 않는 이상. 따라서 IoT의 경우는 해킹에 가장 취약하면서 해킹에 있어서 가장 위험한 존재이다. 그 누가 자신의 집에서의 모습을 전 세계로 생중계되기를 원하겠는가. + +따라서 IoT에 대한 보안 솔루션은 굉장히 후발적일 수 밖에 없다. 따라서 소프트 웨어적으로 강력한 솔루션을 집어넣거나 취약점을 분석하게 후에 조치하는 방법밖에 없다. 전 세계적으로 IoT기기에 대한 보안 규제를 강화하거나 보안 기준을 제시하고 있고, 이를 처리하거나 대처하는 인력이나 전략을 제대로 정비하기만 한다면 현재 가능한 보안 솔루션 중 가장 상위의 솔루션이지 않을까 싶다. + +이와 같이 우리의 삶과 인터넷, 전자기기가 밀접하게 연결될 수록 그 보안의 영향력은 비약적으로 커진다. 보안 업계나 기업들은 이 점을 유의하여 서비스를 제공해야 할 것이다. + diff --git a/content/posts/jeonsanyuceyeoghag-cfd-with-python-navier-stokes-equation.md b/content/posts/jeonsanyuceyeoghag-cfd-with-python-navier-stokes-equation.md new file mode 100644 index 0000000..703b296 --- /dev/null +++ b/content/posts/jeonsanyuceyeoghag-cfd-with-python-navier-stokes-equation.md @@ -0,0 +1,899 @@ ++++ +date = 2021-07-10T08:23:47Z +description = "" +draft = false +slug = "jeonsanyuceyeoghag-cfd-with-python-navier-stokes-equation" +title = "[전산유체역학] CFD with Python (Navier-Stokes Equation)" + ++++ + + +## 1-D Linear Convection + +1차원 선형 열전도 방정식은 가장 심플하면서도 가장 기초적인 방정식입니다. + +$$ \frac{\partial u}{\partial t} + c \frac{\partial u}{\partial x} = 0 $$ + +이 식을 오일러 방정식으로 변환하여 수치해석적으로 해를 구할 수 있도록 변환을 해줍니다. + +$$ u_i^{n+1} = u_i^n - c \frac{\Delta t}{\Delta x}(u_i^n-u_{i-1}^n) $$ + +이제 이 오일러 방정식을 파이썬으로 구현해봅니다. + +```python +import numpy +from matplotlib import pyplot +import time, sys +%matplotlib inline + +nx = 41 # try changing this number from 41 to 81 and Run All ... what happens? +dx = 2 / (nx-1) +nt = 25 #nt is the number of timesteps we want to calculate +dt = .025 #dt is the amount of time each timestep covers (delta t) +c = 1 #assume wavespeed of c = 1 + +u = numpy.ones(nx) #numpy function ones() +u[int(.5 / dx):int(1 / dx + 1)] = 2 #setting u = 2 between 0.5 and 1 as per our I.C.s + +un = numpy.ones(nx) #initialize a temporary array + +for n in range(nt): #loop for values of n from 0 to nt, so it will run nt times + un = u.copy() ##copy the existing values of u into un + for i in range(1, nx): ## you can try commenting this line and... + #for i in range(nx): ## ... uncommenting this line and see what happens! + u[i] = un[i] - c * dt / dx * (un[i] - un[i-1]) + +pyplot.plot(numpy.linspace(0, 2, nx), u); +``` + +{{< figure src="https://blog.kakaocdn.net/dn/ZbM8j/btq9fWovXzY/D1HOqkCqgkw9YLDpyMFxb1/img.png" >}} + +## 1-D Convection Equation (Non-Linear) + +$$ \frac{\partial u}{\partial t} + u \frac{\partial u}{\partial x} = 0 $$ + +$$ u_i^{n+1} = u_i^n - u_i^n \frac{\Delta t}{\Delta x} (u_i^n - u_{i-1}^n) $$ + +```python +import numpy # we're importing numpy +from matplotlib import pyplot # and our 2D plotting library +%matplotlib inline + + +nx = 41 +dx = 2 / (nx - 1) +nt = 20 #nt is the number of timesteps we want to calculate +dt = .025 #dt is the amount of time each timestep covers (delta t) + +u = numpy.ones(nx) #as before, we initialize u with every value equal to 1. +u[int(.5 / dx) : int(1 / dx + 1)] = 2 #then set u = 2 between 0.5 and 1 as per our I.C.s + +un = numpy.ones(nx) #initialize our placeholder array un, to hold the time-stepped solution + +for n in range(nt): #iterate through time + un = u.copy() ##copy the existing values of u into un + for i in range(1, nx): ##now we'll iterate through the u array + + ###This is the line from Step 1, copied exactly. Edit it for our new equation. + ###then uncomment it and run the cell to evaluate Step 2 + + ###u[i] = un[i] - c * dt / dx * (un[i] - un[i-1]) + + +pyplot.plot(numpy.linspace(0, 2, nx), u) ##Plot the results +``` + +## 1-D Diffusion Equation + +$$ \frac{\partial u}{\partial t}= \nu \frac{\partial^2 u}{\partial x^2} $$ + +$$ u_{i}^{n+1}=u_{i}^{n}+\frac{\nu\Delta t}{\Delta x^2}(u_{i+1}^{n}-2u_{i}^{n}+u_{i-1}^{n}) $$ + +```python +import numpy #loading our favorite library +from matplotlib import pyplot #and the useful plotting library +%matplotlib inline + +nx = 41 +dx = 2 / (nx - 1) +nt = 20 #the number of timesteps we want to calculate +nu = 0.3 #the value of viscosity +sigma = .2 #sigma is a parameter, we'll learn more about it later +dt = sigma * dx**2 / nu #dt is defined using sigma ... more later! + + +u = numpy.ones(nx) #a numpy array with nx elements all equal to 1. +u[int(.5 / dx):int(1 / dx + 1)] = 2 #setting u = 2 between 0.5 and 1 as per our I.C.s + +un = numpy.ones(nx) #our placeholder array, un, to advance the solution in time + +for n in range(nt): #iterate through time + un = u.copy() ##copy the existing values of u into un + for i in range(1, nx - 1): + u[i] = un[i] + nu * dt / dx**2 * (un[i+1] - 2 * un[i] + un[i-1]) + +pyplot.plot(numpy.linspace(0, 2, nx), u); +``` + +{{< figure src="https://blog.kakaocdn.net/dn/oaKgN/btq9iA57vBH/weCFyYoImjFkasFiDMir3k/img.png" >}} + + + +## Burger's Equation + +$$ \frac{\partial u}{\partial t} + u \frac{\partial u}{\partial x} = \nu \frac{\partial ^2u}{\partial x^2} $$ + +$$ u_i^{n+1} = u_i^n - u_i^n \frac{\Delta t}{\Delta x} (u_i^n - u_{i-1}^n) + \nu \frac{\Delta t}{\Delta x^2}(u_{i+1}^n - 2u_i^n + u_{i-1}^n) $$ + +```python +import numpy +import sympy +from sympy import init_printing +from matplotlib import pyplot +from sympy.utilities.lambdify import lambdify + +%matplotlib inline +init_printing(use_latex=True) + +x, nu, t = sympy.symbols('x nu t') +phi = (sympy.exp(-(x - 4 * t)**2 / (4 * nu * (t + 1))) + + sympy.exp(-(x - 4 * t - 2 * sympy.pi)**2 / (4 * nu * (t + 1)))) + +phiprime = phi.diff(x) + +u = -2 * nu * (phiprime / phi) + 4 +ufunc = lambdify((t, x, nu), u) + +###variable declarations +nx = 101 +nt = 100 +dx = 2 * numpy.pi / (nx - 1) +nu = .07 +dt = dx * nu + +x = numpy.linspace(0, 2 * numpy.pi, nx) +un = numpy.empty(nx) +t = 0 + +u = numpy.asarray([ufunc(t, x0, nu) for x0 in x]) + +for n in range(nt): + un = u.copy() + for i in range(1, nx-1): + u[i] = un[i] - un[i] * dt / dx *(un[i] - un[i-1]) + nu * dt / dx**2 *\ + (un[i+1] - 2 * un[i] + un[i-1]) + u[0] = un[0] - un[0] * dt / dx * (un[0] - un[-2]) + nu * dt / dx**2 *\ + (un[1] - 2 * un[0] + un[-2]) + u[-1] = u[0] + +u_analytical = numpy.asarray([ufunc(nt * dt, xi, nu) for xi in x]) + +pyplot.figure(figsize=(11, 7), dpi=100) +pyplot.plot(x,u, marker='o', lw=2, label='Computational') +pyplot.plot(x, u_analytical, label='Analytical') +pyplot.xlim([0, 2 * numpy.pi]) +pyplot.ylim([0, 10]) +pyplot.legend(); +``` + +{{< figure src="https://blog.kakaocdn.net/dn/cE7P8B/btq9dF2BVpt/J6GbNhRT4dX1nfB2GPkurK/img.png" >}} + +## 2-D Linear Convection + +$$ \frac{\partial u}{\partial t}+c\frac{\partial u}{\partial x} + c\frac{\partial u}{\partial y} = 0 $$ + +$$ u_{i,j}^{n+1} = u_{i,j}^n-c \frac{\Delta t}{\Delta x}(u_{i,j}^n-u_{i-1,j}^n)-c \frac{\Delta t}{\Delta y}(u_{i,j}^n-u_{i,j-1}^n) $$ + +```python +from mpl_toolkits.mplot3d import Axes3D ##New Library required for projected 3d plots + +import numpy +from matplotlib import pyplot, cm +%matplotlib inline + +###variable declarations +nx = 81 +ny = 81 +nt = 100 +c = 1 +dx = 2 / (nx - 1) +dy = 2 / (ny - 1) +sigma = .2 +dt = sigma * dx + +x = numpy.linspace(0, 2, nx) +y = numpy.linspace(0, 2, ny) + +u = numpy.ones((ny, nx)) ##create a 1xn vector of 1's +un = numpy.ones((ny, nx)) ## + +###Assign initial conditions + +##set hat function I.C. : u(.5<=x<=1 && .5<=y<=1 ) is 2 +u[int(.5 / dy):int(1 / dy + 1),int(.5 / dx):int(1 / dx + 1)] = 2 + +###Plot Initial Condition +##the figsize parameter can be used to produce different sized images +fig = pyplot.figure(figsize=(11, 7), dpi=100) +ax = fig.gca(projection='3d') +X, Y = numpy.meshgrid(x, y) +surf = ax.plot_surface(X, Y, u[:], cmap=cm.viridis) +``` + +{{< figure src="https://blog.kakaocdn.net/dn/MH3sO/btq9fmIfvXs/Tbral2sgJxUQHfJgs1hG61/img.png" >}} + +## 2-D Convection + +$$ \frac{\partial u}{\partial t} + u \frac{\partial u}{\partial x} + v \frac{\partial u}{\partial y} = 0 $$$$ \frac{\partial v}{\partial t} + u \frac{\partial v}{\partial x} + v \frac{\partial v}{\partial y} = 0 $$$$ u_{i,j}^{n+1} = u_{i,j}^n - u_{i,j} \frac{\Delta t}{\Delta x} (u_{i,j}^n-u_{i-1,j}^n) - v_{i,j}^n \frac{\Delta t}{\Delta y} (u_{i,j}^n-u_{i,j-1}^n) $$$$ v_{i,j}^{n+1} = v_{i,j}^n - u_{i,j} \frac{\Delta t}{\Delta x} (v_{i,j}^n-v_{i-1,j}^n) - v_{i,j}^n \frac{\Delta t}{\Delta y} (v_{i,j}^n-v_{i,j-1}^n) $$ + +```python +from mpl_toolkits.mplot3d import Axes3D +from matplotlib import pyplot, cm +import numpy +%matplotlib inline + +###variable declarations +nx = 101 +ny = 101 +nt = 80 +c = 1 +dx = 2 / (nx - 1) +dy = 2 / (ny - 1) +sigma = .2 +dt = sigma * dx + +x = numpy.linspace(0, 2, nx) +y = numpy.linspace(0, 2, ny) + +u = numpy.ones((ny, nx)) ##create a 1xn vector of 1's +v = numpy.ones((ny, nx)) +un = numpy.ones((ny, nx)) +vn = numpy.ones((ny, nx)) + +###Assign initial conditions +##set hat function I.C. : u(.5<=x<=1 && .5<=y<=1 ) is 2 +u[int(.5 / dy):int(1 / dy + 1), int(.5 / dx):int(1 / dx + 1)] = 2 +##set hat function I.C. : v(.5<=x<=1 && .5<=y<=1 ) is 2 +v[int(.5 / dy):int(1 / dy + 1), int(.5 / dx):int(1 / dx + 1)] = 2 +fig = pyplot.figure(figsize=(11, 7), dpi=100) +ax = fig.gca(projection='3d') +X, Y = numpy.meshgrid(x, y) + +ax.plot_surface(X, Y, u, cmap=cm.viridis, rstride=2, cstride=2) +ax.set_xlabel('$x$') +ax.set_ylabel('$y$'); +``` + +{{< figure src="https://blog.kakaocdn.net/dn/bbiKmO/btq9hyAHR99/3KeBvxXPvCzXXYqrTlSj9k/img.png" >}} + + + +## 2D Diffusion + +$$ \frac{\partial u}{\partial t} = \nu \frac{\partial ^2 u}{\partial x^2} + \nu \frac{\partial ^2 u}{\partial y^2} $$$$ \begin{split}u_{i,j}^{n+1} = u_{i,j}^n &+ \frac{\nu \Delta t}{\Delta x^2}(u_{i+1,j}^n - 2 u_{i,j}^n + u_{i-1,j}^n) \\&+ \frac{\nu \Delta t}{\Delta y^2}(u_{i,j+1}^n-2 u_{i,j}^n + u_{i,j-1}^n)\end{split} $$ + +```python +import numpy +from matplotlib import pyplot, cm +from mpl_toolkits.mplot3d import Axes3D ##library for 3d projection plots +%matplotlib inline +###variable declarations +nx = 31 +ny = 31 +nt = 17 +nu = .05 +dx = 2 / (nx - 1) +dy = 2 / (ny - 1) +sigma = .25 +dt = sigma * dx * dy / nu + +x = numpy.linspace(0, 2, nx) +y = numpy.linspace(0, 2, ny) + +u = numpy.ones((ny, nx)) # create a 1xn vector of 1's +un = numpy.ones((ny, nx)) + +###Assign initial conditions +# set hat function I.C. : u(.5<=x<=1 && .5<=y<=1 ) is 2 +u[int(.5 / dy):int(1 / dy + 1),int(.5 / dx):int(1 / dx + 1)] = 2 + +###Run through nt timesteps +def diffuse(nt): + u[int(.5 / dy):int(1 / dy + 1),int(.5 / dx):int(1 / dx + 1)] = 2 + + for n in range(nt + 1): + un = u.copy() + u[1:-1, 1:-1] = (un[1:-1,1:-1] + + nu * dt / dx**2 * + (un[1:-1, 2:] - 2 * un[1:-1, 1:-1] + un[1:-1, 0:-2]) + + nu * dt / dy**2 * + (un[2:,1: -1] - 2 * un[1:-1, 1:-1] + un[0:-2, 1:-1])) + u[0, :] = 1 + u[-1, :] = 1 + u[:, 0] = 1 + u[:, -1] = 1 + + + fig = pyplot.figure() + ax = fig.gca(projection='3d') + surf = ax.plot_surface(X, Y, u[:], rstride=1, cstride=1, cmap=cm.viridis, + linewidth=0, antialiased=True) + ax.set_zlim(1, 2.5) + ax.set_xlabel('$x$') + ax.set_ylabel('$y$'); + +diffuse(14) +``` + +{{< figure src="https://blog.kakaocdn.net/dn/eLwQEW/btq9e0ysgnx/YVHruuNPlMa6pJODaIGJdK/img.png" >}} + + + +## Burgers' Equation in 2D + +$$ \frac{\partial u}{\partial t} + u \frac{\partial u}{\partial x} + v \frac{\partial u}{\partial y} = \nu \; \left(\frac{\partial ^2 u}{\partial x^2} + \frac{\partial ^2 u}{\partial y^2}\right) $$$$ \frac{\partial v}{\partial t} + u \frac{\partial v}{\partial x} + v \frac{\partial v}{\partial y} = \nu \; \left(\frac{\partial ^2 v}{\partial x^2} + \frac{\partial ^2 v}{\partial y^2}\right) $$$$ \begin{split}v_{i,j}^{n+1} = & v_{i,j}^n - \frac{\Delta t}{\Delta x} u_{i,j}^n (v_{i,j}^n - v_{i-1,j}^n) - \frac{\Delta t}{\Delta y} v_{i,j}^n (v_{i,j}^n - v_{i,j-1}^n) \\&+ \frac{\nu \Delta t}{\Delta x^2}(v_{i+1,j}^n-2v_{i,j}^n+v_{i-1,j}^n) + \frac{\nu \Delta t}{\Delta y^2} (v_{i,j+1}^n - 2v_{i,j}^n + v_{i,j-1}^n)\end{split} $$ + +```python +import numpy +from matplotlib import pyplot, cm +from mpl_toolkits.mplot3d import Axes3D +%matplotlib inline +###variable declarations +nx = 41 +ny = 41 +nt = 120 +c = 1 +dx = 2 / (nx - 1) +dy = 2 / (ny - 1) +sigma = .0009 +nu = 0.01 +dt = sigma * dx * dy / nu + + +x = numpy.linspace(0, 2, nx) +y = numpy.linspace(0, 2, ny) + +u = numpy.ones((ny, nx)) # create a 1xn vector of 1's +v = numpy.ones((ny, nx)) +un = numpy.ones((ny, nx)) +vn = numpy.ones((ny, nx)) +comb = numpy.ones((ny, nx)) + +###Assign initial conditions + +##set hat function I.C. : u(.5<=x<=1 && .5<=y<=1 ) is 2 +u[int(.5 / dy):int(1 / dy + 1),int(.5 / dx):int(1 / dx + 1)] = 2 +##set hat function I.C. : u(.5<=x<=1 && .5<=y<=1 ) is 2 +v[int(.5 / dy):int(1 / dy + 1),int(.5 / dx):int(1 / dx + 1)] = 2 +###(plot ICs) +for n in range(nt + 1): ##loop across number of time steps + un = u.copy() + vn = v.copy() + + u[1:-1, 1:-1] = (un[1:-1, 1:-1] - + dt / dx * un[1:-1, 1:-1] * + (un[1:-1, 1:-1] - un[1:-1, 0:-2]) - + dt / dy * vn[1:-1, 1:-1] * + (un[1:-1, 1:-1] - un[0:-2, 1:-1]) + + nu * dt / dx**2 * + (un[1:-1,2:] - 2 * un[1:-1, 1:-1] + un[1:-1, 0:-2]) + + nu * dt / dy**2 * + (un[2:, 1:-1] - 2 * un[1:-1, 1:-1] + un[0:-2, 1:-1])) + + v[1:-1, 1:-1] = (vn[1:-1, 1:-1] - + dt / dx * un[1:-1, 1:-1] * + (vn[1:-1, 1:-1] - vn[1:-1, 0:-2]) - + dt / dy * vn[1:-1, 1:-1] * + (vn[1:-1, 1:-1] - vn[0:-2, 1:-1]) + + nu * dt / dx**2 * + (vn[1:-1, 2:] - 2 * vn[1:-1, 1:-1] + vn[1:-1, 0:-2]) + + nu * dt / dy**2 * + (vn[2:, 1:-1] - 2 * vn[1:-1, 1:-1] + vn[0:-2, 1:-1])) + + u[0, :] = 1 + u[-1, :] = 1 + u[:, 0] = 1 + u[:, -1] = 1 + + v[0, :] = 1 + v[-1, :] = 1 + v[:, 0] = 1 + v[:, -1] = 1 +fig = pyplot.figure(figsize=(11, 7), dpi=100) +ax = fig.gca(projection='3d') +X, Y = numpy.meshgrid(x, y) +ax.plot_surface(X, Y, u, cmap=cm.viridis, rstride=1, cstride=1) +ax.plot_surface(X, Y, v, cmap=cm.viridis, rstride=1, cstride=1) +ax.set_xlabel('$x$') +ax.set_ylabel('$y$'); +``` + +{{< figure src="https://blog.kakaocdn.net/dn/PL2CD/btq9fcyC1VV/MC1B8I2YedaaCFr5Lr06KK/img.png" >}} + + + +## 2D Laplace Equation + +$$ \frac{\partial ^2 p}{\partial x^2} + \frac{\partial ^2 p}{\partial y^2} = 0 $$$$ p_{i,j}^n = \frac{\Delta y^2(p_{i+1,j}^n+p_{i-1,j}^n)+\Delta x^2(p_{i,j+1}^n + p_{i,j-1}^n)}{2(\Delta x^2 + \Delta y^2)} $$ + +```python +import numpy +from matplotlib import pyplot, cm +from mpl_toolkits.mplot3d import Axes3D +%matplotlib inline + +def plot2D(x, y, p): + fig = pyplot.figure(figsize=(11, 7), dpi=100) + ax = fig.gca(projection='3d') + X, Y = numpy.meshgrid(x, y) + surf = ax.plot_surface(X, Y, p[:], rstride=1, cstride=1, cmap=cm.viridis, + linewidth=0, antialiased=False) + ax.set_xlim(0, 2) + ax.set_ylim(0, 1) + ax.view_init(30, 225) + ax.set_xlabel('$x$') + ax.set_ylabel('$y$') + +def laplace2d(p, y, dx, dy, l1norm_target): + l1norm = 1 + pn = numpy.empty_like(p) + + while l1norm > l1norm_target: + pn = p.copy() + p[1:-1, 1:-1] = ((dy**2 * (pn[1:-1, 2:] + pn[1:-1, 0:-2]) + + dx**2 * (pn[2:, 1:-1] + pn[0:-2, 1:-1])) / + (2 * (dx**2 + dy**2))) + + p[:, 0] = 0 # p = 0 @ x = 0 + p[:, -1] = y # p = y @ x = 2 + p[0, :] = p[1, :] # dp/dy = 0 @ y = 0 + p[-1, :] = p[-2, :] # dp/dy = 0 @ y = 1 + l1norm = (numpy.sum(numpy.abs(p[:]) - numpy.abs(pn[:])) / + numpy.sum(numpy.abs(pn[:]))) + + return p + +nx = 31 +ny = 31 +c = 1 +dx = 2 / (nx - 1) +dy = 2 / (ny - 1) + + +##initial conditions +p = numpy.zeros((ny, nx)) # create a XxY vector of 0's + + +##plotting aids +x = numpy.linspace(0, 2, nx) +y = numpy.linspace(0, 1, ny) + +##boundary conditions +p[:, 0] = 0 # p = 0 @ x = 0 +p[:, -1] = y # p = y @ x = 2 +p[0, :] = p[1, :] # dp/dy = 0 @ y = 0 +p[-1, :] = p[-2, :] # dp/dy = 0 @ y = 1 + +p = laplace2d(p, y, dx, dy, 1e-4) + +plot2D(x, y, p) +``` + +{{< figure src="https://blog.kakaocdn.net/dn/bxvdGX/btq9goyjEC1/YkjgRDKkIZuAe2isKNsv60/img.png" >}} + + + +## 2D Poisson Equation + +$$ \frac{\partial ^2 p}{\partial x^2} + \frac{\partial ^2 p}{\partial y^2} = b $$$$ p_{i,j}^{n}=\frac{(p_{i+1,j}^{n}+p_{i-1,j}^{n})\Delta y^2+(p_{i,j+1}^{n}+p_{i,j-1}^{n})\Delta x^2-b_{i,j}^{n}\Delta x^2\Delta y^2}{2(\Delta x^2+\Delta y^2)} $$ + +```python +import numpy +from matplotlib import pyplot, cm +from mpl_toolkits.mplot3d import Axes3D +%matplotlib inline +# Parameters +nx = 50 +ny = 50 +nt = 100 +xmin = 0 +xmax = 2 +ymin = 0 +ymax = 1 + +dx = (xmax - xmin) / (nx - 1) +dy = (ymax - ymin) / (ny - 1) + +# Initialization +p = numpy.zeros((ny, nx)) +pd = numpy.zeros((ny, nx)) +b = numpy.zeros((ny, nx)) +x = numpy.linspace(xmin, xmax, nx) +y = numpy.linspace(xmin, xmax, ny) + +# Source +b[int(ny / 4), int(nx / 4)] = 100 +b[int(3 * ny / 4), int(3 * nx / 4)] = -100 + +for it in range(nt): + + pd = p.copy() + + p[1:-1,1:-1] = (((pd[1:-1, 2:] + pd[1:-1, :-2]) * dy**2 + + (pd[2:, 1:-1] + pd[:-2, 1:-1]) * dx**2 - + b[1:-1, 1:-1] * dx**2 * dy**2) / + (2 * (dx**2 + dy**2))) + + p[0, :] = 0 + p[ny-1, :] = 0 + p[:, 0] = 0 + p[:, nx-1] = 0 + +def plot2D(x, y, p): + fig = pyplot.figure(figsize=(11, 7), dpi=100) + ax = fig.gca(projection='3d') + X, Y = numpy.meshgrid(x, y) + surf = ax.plot_surface(X, Y, p[:], rstride=1, cstride=1, cmap=cm.viridis, + linewidth=0, antialiased=False) + ax.view_init(30, 225) + ax.set_xlabel('$x$') + ax.set_ylabel('$y$') + +plot2D(x, y, p) +``` + +## + +## Cavity Flow with Navier–Stokes + +$$ \frac{\partial \vec{v}}{\partial t}+(\vec{v}\cdot\nabla)\vec{v}=-\frac{1}{\rho}\nabla p + \nu \nabla^2\vec{v} $$$$ \frac{\partial u}{\partial t}+u\frac{\partial u}{\partial x}+v\frac{\partial u}{\partial y} = -\frac{1}{\rho}\frac{\partial p}{\partial x}+\nu \left(\frac{\partial^2 u}{\partial x^2}+\frac{\partial^2 u}{\partial y^2} \right) $$$$ \frac{\partial^2 p}{\partial x^2}+\frac{\partial^2 p}{\partial y^2} = -\rho\left(\frac{\partial u}{\partial x}\frac{\partial u}{\partial x}+2\frac{\partial u}{\partial y}\frac{\partial v}{\partial x}+\frac{\partial v}{\partial y}\frac{\partial v}{\partial y} \right) $$$$ \begin{split}p_{i,j}^{n} = & \frac{\left(p_{i+1,j}^{n}+p_{i-1,j}^{n}\right) \Delta y^2 + \left(p_{i,j+1}^{n}+p_{i,j-1}^{n}\right) \Delta x^2}{2\left(\Delta x^2+\Delta y^2\right)} \\& -\frac{\rho\Delta x^2\Delta y^2}{2\left(\Delta x^2+\Delta y^2\right)} \\& \times \left[\frac{1}{\Delta t}\left(\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x}+\frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\right)-\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x}\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x} -2\frac{u_{i,j+1}-u_{i,j-1}}{2\Delta y}\frac{v_{i+1,j}-v_{i-1,j}}{2\Delta x}-\frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\right]\end{split} $$ + +```python +import numpy +from matplotlib import pyplot, cm +from mpl_toolkits.mplot3d import Axes3D +%matplotlib inline +nx = 41 +ny = 41 +nt = 500 +nit = 50 +c = 1 +dx = 2 / (nx - 1) +dy = 2 / (ny - 1) +x = numpy.linspace(0, 2, nx) +y = numpy.linspace(0, 2, ny) +X, Y = numpy.meshgrid(x, y) + +rho = 1 +nu = .1 +dt = .001 + +u = numpy.zeros((ny, nx)) +v = numpy.zeros((ny, nx)) +p = numpy.zeros((ny, nx)) +b = numpy.zeros((ny, nx)) + +def build_up_b(b, rho, dt, u, v, dx, dy): + + b[1:-1, 1:-1] = (rho * (1 / dt * + ((u[1:-1, 2:] - u[1:-1, 0:-2]) / + (2 * dx) + (v[2:, 1:-1] - v[0:-2, 1:-1]) / (2 * dy)) - + ((u[1:-1, 2:] - u[1:-1, 0:-2]) / (2 * dx))**2 - + 2 * ((u[2:, 1:-1] - u[0:-2, 1:-1]) / (2 * dy) * + (v[1:-1, 2:] - v[1:-1, 0:-2]) / (2 * dx))- + ((v[2:, 1:-1] - v[0:-2, 1:-1]) / (2 * dy))**2)) + + return b + +def pressure_poisson(p, dx, dy, b): + pn = numpy.empty_like(p) + pn = p.copy() + + for q in range(nit): + pn = p.copy() + p[1:-1, 1:-1] = (((pn[1:-1, 2:] + pn[1:-1, 0:-2]) * dy**2 + + (pn[2:, 1:-1] + pn[0:-2, 1:-1]) * dx**2) / + (2 * (dx**2 + dy**2)) - + dx**2 * dy**2 / (2 * (dx**2 + dy**2)) * + b[1:-1,1:-1]) + + p[:, -1] = p[:, -2] # dp/dx = 0 at x = 2 + p[0, :] = p[1, :] # dp/dy = 0 at y = 0 + p[:, 0] = p[:, 1] # dp/dx = 0 at x = 0 + p[-1, :] = 0 # p = 0 at y = 2 + + return p + +def cavity_flow(nt, u, v, dt, dx, dy, p, rho, nu): + un = numpy.empty_like(u) + vn = numpy.empty_like(v) + b = numpy.zeros((ny, nx)) + + for n in range(nt): + un = u.copy() + vn = v.copy() + + b = build_up_b(b, rho, dt, u, v, dx, dy) + p = pressure_poisson(p, dx, dy, b) + + u[1:-1, 1:-1] = (un[1:-1, 1:-1]- + un[1:-1, 1:-1] * dt / dx * + (un[1:-1, 1:-1] - un[1:-1, 0:-2]) - + vn[1:-1, 1:-1] * dt / dy * + (un[1:-1, 1:-1] - un[0:-2, 1:-1]) - + dt / (2 * rho * dx) * (p[1:-1, 2:] - p[1:-1, 0:-2]) + + nu * (dt / dx**2 * + (un[1:-1, 2:] - 2 * un[1:-1, 1:-1] + un[1:-1, 0:-2]) + + dt / dy**2 * + (un[2:, 1:-1] - 2 * un[1:-1, 1:-1] + un[0:-2, 1:-1]))) + + v[1:-1,1:-1] = (vn[1:-1, 1:-1] - + un[1:-1, 1:-1] * dt / dx * + (vn[1:-1, 1:-1] - vn[1:-1, 0:-2]) - + vn[1:-1, 1:-1] * dt / dy * + (vn[1:-1, 1:-1] - vn[0:-2, 1:-1]) - + dt / (2 * rho * dy) * (p[2:, 1:-1] - p[0:-2, 1:-1]) + + nu * (dt / dx**2 * + (vn[1:-1, 2:] - 2 * vn[1:-1, 1:-1] + vn[1:-1, 0:-2]) + + dt / dy**2 * + (vn[2:, 1:-1] - 2 * vn[1:-1, 1:-1] + vn[0:-2, 1:-1]))) + + u[0, :] = 0 + u[:, 0] = 0 + u[:, -1] = 0 + u[-1, :] = 1 # set velocity on cavity lid equal to 1 + v[0, :] = 0 + v[-1, :] = 0 + v[:, 0] = 0 + v[:, -1] = 0 + + + return u, v, p + +u = numpy.zeros((ny, nx)) +v = numpy.zeros((ny, nx)) +p = numpy.zeros((ny, nx)) +b = numpy.zeros((ny, nx)) +nt = 100 +u, v, p = cavity_flow(nt, u, v, dt, dx, dy, p, rho, nu) +fig = pyplot.figure(figsize=(11,7), dpi=100) +# plotting the pressure field as a contour +pyplot.contourf(X, Y, p, alpha=0.5, cmap=cm.viridis) +pyplot.colorbar() +# plotting the pressure field outlines +pyplot.contour(X, Y, p, cmap=cm.viridis) +# plotting velocity field +pyplot.quiver(X[::2, ::2], Y[::2, ::2], u[::2, ::2], v[::2, ::2]) +pyplot.xlabel('X') +pyplot.ylabel('Y'); +``` + +{{< figure src="https://blog.kakaocdn.net/dn/VgtZK/btq9flvNFsA/4d03urU7VcLPRqzS5g40m1/img.png" >}} + +```python +u = numpy.zeros((ny, nx)) +v = numpy.zeros((ny, nx)) +p = numpy.zeros((ny, nx)) +b = numpy.zeros((ny, nx)) +nt = 700 +u, v, p = cavity_flow(nt, u, v, dt, dx, dy, p, rho, nu) +fig = pyplot.figure(figsize=(11, 7), dpi=100) +pyplot.contourf(X, Y, p, alpha=0.5, cmap=cm.viridis) +pyplot.colorbar() +pyplot.contour(X, Y, p, cmap=cm.viridis) +pyplot.quiver(X[::2, ::2], Y[::2, ::2], u[::2, ::2], v[::2, ::2]) +pyplot.xlabel('X') +pyplot.ylabel('Y'); +``` + +{{< figure src="https://blog.kakaocdn.net/dn/boYcRB/btq9fmasDP2/6w1UPPVU4mG7frDcjQtBIK/img.png" >}} + +```python +fig = pyplot.figure(figsize=(11, 7), dpi=100) +pyplot.contourf(X, Y, p, alpha=0.5, cmap=cm.viridis) +pyplot.colorbar() +pyplot.contour(X, Y, p, cmap=cm.viridis) +pyplot.streamplot(X, Y, u, v) +pyplot.xlabel('X') +pyplot.ylabel('Y'); +``` + +{{< figure src="https://blog.kakaocdn.net/dn/0J2aJ/btq9e57PmFB/UqArsnX9hzJ84H4rW5AtB1/img.png" >}} + +## Channel Flow with Navier–Stokes + +$$ \frac{\partial u}{\partial t}+u\frac{\partial u}{\partial x}+v\frac{\partial u}{\partial y}=-\frac{1}{\rho}\frac{\partial p}{\partial x}+\nu\left(\frac{\partial^2 u}{\partial x^2}+\frac{\partial^2 u}{\partial y^2}\right)+F $$$$ \frac{\partial^2 p}{\partial x^2}+\frac{\partial^2 p}{\partial y^2}=-\rho\left(\frac{\partial u}{\partial x}\frac{\partial u}{\partial x}+2\frac{\partial u}{\partial y}\frac{\partial v}{\partial x}+\frac{\partial v}{\partial y}\frac{\partial v}{\partial y}\right) $$$$ \begin{split}p_{i,j}^{n} = & \frac{\left(p_{i+1,j}^{n}+p_{i-1,j}^{n}\right) \Delta y^2 + \left(p_{i,j+1}^{n}+p_{i,j-1}^{n}\right) \Delta x^2}{2(\Delta x^2+\Delta y^2)} \\& -\frac{\rho\Delta x^2\Delta y^2}{2\left(\Delta x^2+\Delta y^2\right)} \\& \times \left[\frac{1}{\Delta t} \left(\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x} + \frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\right) - \frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x}\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x} - 2\frac{u_{i,j+1}-u_{i,j-1}}{2\Delta y}\frac{v_{i+1,j}-v_{i-1,j}}{2\Delta x} - \frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\right]\end{split} $$ + +```python +import numpy +from matplotlib import pyplot, cm +from mpl_toolkits.mplot3d import Axes3D +%matplotlib inline + +def build_up_b(rho, dt, dx, dy, u, v): + b = numpy.zeros_like(u) + b[1:-1, 1:-1] = (rho * (1 / dt * ((u[1:-1, 2:] - u[1:-1, 0:-2]) / (2 * dx) + + (v[2:, 1:-1] - v[0:-2, 1:-1]) / (2 * dy)) - + ((u[1:-1, 2:] - u[1:-1, 0:-2]) / (2 * dx))**2 - + 2 * ((u[2:, 1:-1] - u[0:-2, 1:-1]) / (2 * dy) * + (v[1:-1, 2:] - v[1:-1, 0:-2]) / (2 * dx))- + ((v[2:, 1:-1] - v[0:-2, 1:-1]) / (2 * dy))**2)) + + # Periodic BC Pressure @ x = 2 + b[1:-1, -1] = (rho * (1 / dt * ((u[1:-1, 0] - u[1:-1,-2]) / (2 * dx) + + (v[2:, -1] - v[0:-2, -1]) / (2 * dy)) - + ((u[1:-1, 0] - u[1:-1, -2]) / (2 * dx))**2 - + 2 * ((u[2:, -1] - u[0:-2, -1]) / (2 * dy) * + (v[1:-1, 0] - v[1:-1, -2]) / (2 * dx)) - + ((v[2:, -1] - v[0:-2, -1]) / (2 * dy))**2)) + + # Periodic BC Pressure @ x = 0 + b[1:-1, 0] = (rho * (1 / dt * ((u[1:-1, 1] - u[1:-1, -1]) / (2 * dx) + + (v[2:, 0] - v[0:-2, 0]) / (2 * dy)) - + ((u[1:-1, 1] - u[1:-1, -1]) / (2 * dx))**2 - + 2 * ((u[2:, 0] - u[0:-2, 0]) / (2 * dy) * + (v[1:-1, 1] - v[1:-1, -1]) / (2 * dx))- + ((v[2:, 0] - v[0:-2, 0]) / (2 * dy))**2)) + + return b + +def pressure_poisson_periodic(p, dx, dy): + pn = numpy.empty_like(p) + + for q in range(nit): + pn = p.copy() + p[1:-1, 1:-1] = (((pn[1:-1, 2:] + pn[1:-1, 0:-2]) * dy**2 + + (pn[2:, 1:-1] + pn[0:-2, 1:-1]) * dx**2) / + (2 * (dx**2 + dy**2)) - + dx**2 * dy**2 / (2 * (dx**2 + dy**2)) * b[1:-1, 1:-1]) + + # Periodic BC Pressure @ x = 2 + p[1:-1, -1] = (((pn[1:-1, 0] + pn[1:-1, -2])* dy**2 + + (pn[2:, -1] + pn[0:-2, -1]) * dx**2) / + (2 * (dx**2 + dy**2)) - + dx**2 * dy**2 / (2 * (dx**2 + dy**2)) * b[1:-1, -1]) + + # Periodic BC Pressure @ x = 0 + p[1:-1, 0] = (((pn[1:-1, 1] + pn[1:-1, -1])* dy**2 + + (pn[2:, 0] + pn[0:-2, 0]) * dx**2) / + (2 * (dx**2 + dy**2)) - + dx**2 * dy**2 / (2 * (dx**2 + dy**2)) * b[1:-1, 0]) + + # Wall boundary conditions, pressure + p[-1, :] =p[-2, :] # dp/dy = 0 at y = 2 + p[0, :] = p[1, :] # dp/dy = 0 at y = 0 + + return p + +##variable declarations +nx = 41 +ny = 41 +nt = 10 +nit = 50 +c = 1 +dx = 2 / (nx - 1) +dy = 2 / (ny - 1) +x = numpy.linspace(0, 2, nx) +y = numpy.linspace(0, 2, ny) +X, Y = numpy.meshgrid(x, y) + + +##physical variables +rho = 1 +nu = .1 +F = 1 +dt = .01 + +#initial conditions +u = numpy.zeros((ny, nx)) +un = numpy.zeros((ny, nx)) + +v = numpy.zeros((ny, nx)) +vn = numpy.zeros((ny, nx)) + +p = numpy.ones((ny, nx)) +pn = numpy.ones((ny, nx)) + +b = numpy.zeros((ny, nx)) + +udiff = 1 +stepcount = 0 + +while udiff > .001: + un = u.copy() + vn = v.copy() + + b = build_up_b(rho, dt, dx, dy, u, v) + p = pressure_poisson_periodic(p, dx, dy) + + u[1:-1, 1:-1] = (un[1:-1, 1:-1] - + un[1:-1, 1:-1] * dt / dx * + (un[1:-1, 1:-1] - un[1:-1, 0:-2]) - + vn[1:-1, 1:-1] * dt / dy * + (un[1:-1, 1:-1] - un[0:-2, 1:-1]) - + dt / (2 * rho * dx) * + (p[1:-1, 2:] - p[1:-1, 0:-2]) + + nu * (dt / dx**2 * + (un[1:-1, 2:] - 2 * un[1:-1, 1:-1] + un[1:-1, 0:-2]) + + dt / dy**2 * + (un[2:, 1:-1] - 2 * un[1:-1, 1:-1] + un[0:-2, 1:-1])) + + F * dt) + + v[1:-1, 1:-1] = (vn[1:-1, 1:-1] - + un[1:-1, 1:-1] * dt / dx * + (vn[1:-1, 1:-1] - vn[1:-1, 0:-2]) - + vn[1:-1, 1:-1] * dt / dy * + (vn[1:-1, 1:-1] - vn[0:-2, 1:-1]) - + dt / (2 * rho * dy) * + (p[2:, 1:-1] - p[0:-2, 1:-1]) + + nu * (dt / dx**2 * + (vn[1:-1, 2:] - 2 * vn[1:-1, 1:-1] + vn[1:-1, 0:-2]) + + dt / dy**2 * + (vn[2:, 1:-1] - 2 * vn[1:-1, 1:-1] + vn[0:-2, 1:-1]))) + + # Periodic BC u @ x = 2 + u[1:-1, -1] = (un[1:-1, -1] - un[1:-1, -1] * dt / dx * + (un[1:-1, -1] - un[1:-1, -2]) - + vn[1:-1, -1] * dt / dy * + (un[1:-1, -1] - un[0:-2, -1]) - + dt / (2 * rho * dx) * + (p[1:-1, 0] - p[1:-1, -2]) + + nu * (dt / dx**2 * + (un[1:-1, 0] - 2 * un[1:-1,-1] + un[1:-1, -2]) + + dt / dy**2 * + (un[2:, -1] - 2 * un[1:-1, -1] + un[0:-2, -1])) + F * dt) + + # Periodic BC u @ x = 0 + u[1:-1, 0] = (un[1:-1, 0] - un[1:-1, 0] * dt / dx * + (un[1:-1, 0] - un[1:-1, -1]) - + vn[1:-1, 0] * dt / dy * + (un[1:-1, 0] - un[0:-2, 0]) - + dt / (2 * rho * dx) * + (p[1:-1, 1] - p[1:-1, -1]) + + nu * (dt / dx**2 * + (un[1:-1, 1] - 2 * un[1:-1, 0] + un[1:-1, -1]) + + dt / dy**2 * + (un[2:, 0] - 2 * un[1:-1, 0] + un[0:-2, 0])) + F * dt) + + # Periodic BC v @ x = 2 + v[1:-1, -1] = (vn[1:-1, -1] - un[1:-1, -1] * dt / dx * + (vn[1:-1, -1] - vn[1:-1, -2]) - + vn[1:-1, -1] * dt / dy * + (vn[1:-1, -1] - vn[0:-2, -1]) - + dt / (2 * rho * dy) * + (p[2:, -1] - p[0:-2, -1]) + + nu * (dt / dx**2 * + (vn[1:-1, 0] - 2 * vn[1:-1, -1] + vn[1:-1, -2]) + + dt / dy**2 * + (vn[2:, -1] - 2 * vn[1:-1, -1] + vn[0:-2, -1]))) + + # Periodic BC v @ x = 0 + v[1:-1, 0] = (vn[1:-1, 0] - un[1:-1, 0] * dt / dx * + (vn[1:-1, 0] - vn[1:-1, -1]) - + vn[1:-1, 0] * dt / dy * + (vn[1:-1, 0] - vn[0:-2, 0]) - + dt / (2 * rho * dy) * + (p[2:, 0] - p[0:-2, 0]) + + nu * (dt / dx**2 * + (vn[1:-1, 1] - 2 * vn[1:-1, 0] + vn[1:-1, -1]) + + dt / dy**2 * + (vn[2:, 0] - 2 * vn[1:-1, 0] + vn[0:-2, 0]))) + + + # Wall BC: u,v = 0 @ y = 0,2 + u[0, :] = 0 + u[-1, :] = 0 + v[0, :] = 0 + v[-1, :]=0 + + udiff = (numpy.sum(u) - numpy.sum(un)) / numpy.sum(u) + stepcount += 1 + +fig = pyplot.figure(figsize = (11,7), dpi=100) +pyplot.quiver(X[::3, ::3], Y[::3, ::3], u[::3, ::3], v[::3, ::3]); +``` + +{{< figure src="https://blog.kakaocdn.net/dn/du6hla/btq9fdKZP6o/ifKi67Tsr8khMmReNSHn5K/img.png" >}} + +출처> [CFD Python: 12 steps to Navier-Stokes :: Lorena A. Barba Group (lorenabarba.com)](https://lorenabarba.com/blog/cfd-python-12-steps-to-navier-stokes/) + diff --git a/content/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo.md b/content/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo.md new file mode 100644 index 0000000..98befd1 --- /dev/null +++ b/content/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo.md @@ -0,0 +1,66 @@ ++++ +date = 2021-05-21T13:18:27Z +description = "" +draft = false +slug = "pyphy-mulrienjin-1pyeon-gibon-aidieo" +title = "파이썬으로 구현한 뉴턴의 방정식과 적분방정식" + ++++ + + +우리의 세계에서 물체의 역학적 운동을 지배하는, 지배방정식이 있죠.뉴턴의 법칙, 방정식입니다.뉴턴의 법칙은 총 세개의 방정식이 있죠. 이 세가지 법칙만을 이용해서 물체의 운동을 계산할 수 있습니다.이것을 바탕으로 만들어진 역설이 라플라스의 역설이죠. 만약 모든 분자의 가속도, 속도, 위치 세가지 정보를 알고 있다면, 뉴턴의 법칙에 근거하여 그 다음 상황을 예측할 수 있고, 따라서 이 세상, 아니면 그것을 넘어서서 모든 분자의 정보를 알 수 있습니다.우리가 여기서 분석할 것은 가장 쉬운 법칙, 뉴턴의 제 2법칙, 가속도의 법칙입니다.뉴턴의 가속도 법칙은 $ F = \frac{dp}{dt} $ 로 표현할 수 있습니다. 이 법칙에 의하면, 질량의 변화가 없는 물체에서, $ a $ 는 $ F$ 에 비례합니다. 따라서 각 순간 물체에 작용하는 힘의 크기를 안다면, 그 물체의 가속도를 알 수 있겠죠? + +이때, 가속도와 속도, 변위의 정의를 이용하면 $ a = \frac{dv}{dt} $ 이고, $ v = \frac{dx}{dt} $입니다.가속도를 안다면 적분을 통해 속도를 알 수 있고, 속도를 안다면 변위를 알 수 있죠.정상상태에서는 물체에 작용하는 힘의 방정식을 구할 수 있습니다. 이것을 질량으로 나눠 가속도를 얻을 수 있고, 속도와 변위의 방정식을 얻을 수 있습니다. + +하지만, 컴퓨터는 대수적으로 적분할 수 없습니다. (물론 할 수 있는 알고리즘도 있지만 불완전하죠)그렇다면 어떻게 각 시점에서 가속도의 값을 알고, 속도와 변위의 값을 알 수 있을까요?이렇게 미분방정식을 통해서 각 시점의 이산적인 변수값을 알 수 있도록 하는 것이 오일러 근사법입니다.오일러 근사법을 통틀어 이렇게 수치적으로 방정식을 해석하는 학문을 통틀어 수치해석학이라고 합니다.이렇게 물리를 시뮬레이션 하거나 컴퓨터로 해를 구할 때는 수치해석학을 사용합니다. + + + +### 오일러 방정식이란, + +$$ \frac{dy}{dx} = f(x) $$라고 표현되어지는 미분 방정식이 있을 때, 오일러 근사법을 이용하면 일정한 지점의 $y$ 값을 근사로 구할 수 있습니다. + +$$ y_{n+1} = y_n + \frac{dy}{dx}|_{x_n} \Delta x $$ 라는 식으로 말이죠. + +이 식을 이용하면 특정 원점으로부터 $\Delta x$만큼의 일정한 간격을 띄어가며 $y$ 를 근사할 수 있습니다. + + + +이 방법으로 물체에 작용하는 힘을 알 때 변위와 속도를 구할 수 있습니다. 특정 $\Delta t$를 기준으로 $\Delta$의 $n$배만큼의 시점에서 구할 수 있습니다. + +$$ v_{n+1} = v_n + \frac{dv}{dt}|_{t_n} \Delta t $$ + +$$ x_{n+1} = x_n + \frac{dx}{dt}|_{t_n} \Delta t $$ + +으로 말이죠.. + + + +### 이제 파이썬으로 오일러 근사법을 구현해 봅시다. + +이렇게 데이터의 배열끼리의 연산을 취급할 때에는 파이썬의 수치분석 모듈인 Numpy를 사용합니다. 하지만, 간단한 시뮬레이션에서는 파이썬 기본으로도 충분합니다. 그래프를 표현하기 위해 matplotlib과 수식을 위해 math를 이용합니다. + +```python +import matplotlib.pyplot as plt +import math +x0 = 0.0 +y0 = 1.0 +dx = 0.01 +step = 1000 +dydx = lambda x, y: 1/y +x = [x0 + dx*i for i in range(step)] +y = [y0] + +for n in range(step-1): + y.append(y[n] + dydx(x[n],y[n]) * dx) + +plt.plot(x, y) +plt.grid() +plt.xlabel("x") +plt.ylabel("y") +plt.legend() +plt.show() +``` + +{{< figure src="https://blog.kakaocdn.net/dn/KMPAl/btq9fmV0ntZ/HPdiTkaknSISR4yGvxKUSK/img.png" caption="$ \frac{dy}{dx} = \frac{1}{y} $" >}} + diff --git a/content/posts/security-of-iot.md b/content/posts/security-of-iot.md new file mode 100644 index 0000000..87523f5 --- /dev/null +++ b/content/posts/security-of-iot.md @@ -0,0 +1,27 @@ ++++ +date = 2021-08-06T10:32:57Z +description = "" +draft = false +slug = "security-of-iot" +title = "Security of IoT" +tags = ["security"] + ++++ + + +## Security of IoT + +### **IoT란?** + +IoT (Internet of Things)란, 사물인터넷으로, 예전에는 독립적으로 존재했던 각종 전자기기 및 사물들이 인터넷으로 엮여 한번에 관리할 수 있게 되거나, 상호 정보교환과 데이터 수집을 통해 사용자에게 최상의 서비스를 제공하는 기술을 의미이다. 여기에서 사물이라 함은 모든 사물을 포함한다. 데이터를 분석하는 과정에서 인공지능을 주로 사용하므로 IoT는 인공지능 기술이기도 하다. + +IoT는 2013년부터 쭉 개발되어 왔으며, 우리 집에서 흔히 볼 수 있는 에어컨, 냉장고등 큰 가구들부터 연결되어 왔다. 그 이후 시간이 지나면서 점점 작은 기구들까지 연결되면서, TV, 전자레인지, 오븐부터 커피포트, 선풍기, 전등 뿐 아니라 변기, 샤워기, 거울, 헤어 드라이기까지 연결되어 있지 않은 것이 없을 정도로 발전되어 왔다. + +IoT 서비스 제공자들은 사용자들의 데이터를 분석하는 더욱 발전한 알고리즘을 개발하면서 사용자들의 데이터를 수집한다. 이것들은 모여 방대한 빅 데이터가 된다. 물론 고객의 개인정보 무단수집과 남용의 논란도 계속 이어져 왔지만, 서비스를 이용하기 위해서 어쩔 수 없이 개인정보와 사생활을 팔아야 하는 것은 안타까운 일이다. + +### **IoT 보안** + +IoT에서는 보안이 매우 중요하다. 개인의 사생활을 담당하고 있기도 하지만, 생활환경을 조정할 수 있어 자칫하면 목숨까지 위협할 수 있기 떄문이다. IoT기기는 소형화되어 있으며, 또한 저성능으로 구성되고 하드웨어에 접근이 쉽다는 근거로 해킹에 매우 취약하다. 또한, 자동화된 생산에서 만약 반도체 설계부터 문제가 있거나 트로이 목마가 존재한다면 매우 심각하고 영구적인 보안 결함이 될 것이다. 따라서, 반도체 설계, 생산 과정에서 모듈 점검을 정확하게 진행하여야 하며, 점대점(Point-to-Point) 보안을 확립하는 것이 중요하다. 또한, 저성능 프로세서에 대비하기 위해 주변에 보안칩(암호 Co-Processor)를 장치하는 것이 좋다. 소프트웨어적인 보안은 업데이트하기 용이하고, 대처하기 쉽다는 장점이 있지만, 하드웨어 보안을 확립한다면 그것이 거의 필요없을 뿐 아니라 물리적 보안, 암호 알고리즘, 보안 부팅, 키 암호화, 모듈 서명 등 다양한 보안 기능과 해킹 방지를 탑재하고 있어, 이를 확립하는 것이 무엇보다 중요하다. + +반도체 물리적 복제 방지 (PUF)나 보안 칩(TPF)등의 탑재가 가장 중요할 것이며, 이는 키가 소프트웨어적으로 탈취당할 확률을 기하급수적으로 낮춰주며, Side-Channel Attack에 대한 방어까지 탐재하는 것이 좋을 것이다. + diff --git a/content/posts/wasting-time.md b/content/posts/wasting-time.md new file mode 100644 index 0000000..46336be --- /dev/null +++ b/content/posts/wasting-time.md @@ -0,0 +1,8 @@ +--- +title: "Wasting Time" +date: 2023-04-20T08:07:41+09:00 +draft: false +slug: wasting-time +--- + +#### **Wasting Time of My Life** diff --git a/content/posts/what-i-want-to-do.md b/content/posts/what-i-want-to-do.md new file mode 100644 index 0000000..2486902 --- /dev/null +++ b/content/posts/what-i-want-to-do.md @@ -0,0 +1,58 @@ ++++ +date = 2021-09-11T01:20:00Z +description = "" +draft = false +slug = "what-i-want-to-do" +title = "What I want to do." + ++++ + + +저번에 What I wanted to do라는 글을 쓴 적이 있는데, 이번에는 What I want to do라는 제목으로 내가 대학을 다시 지원할 때 까지의 경험을 풀어보려고 한다. + +## 대학 탈락 이후 + +나는 대학을 한번 떨어진 경험이 있다. 과학고등학교 재학생 중 중상위권이었던 나는 조기진학의 기회를 받았고, KAIST만을 넣은 채로 떨어졌다. 그 때는 붙을 줄 알고 있어서 2학년 2학기 시험을 말아먹었고, 지금도 그 영향을 받아 피를 흘리고 있다. + +다행히 그 이후 각성을 한건지 철이 든건지 3학년 1학기는 최상위권 성적을 받아 원래대로 유지는 할 수 있었다. 3-4등 정도 했으니까 망정이지 태도를 안고치고 그대로 했더라면 나는 그대로 멘탈이 없어져버렸을 것이다. + +오늘까지 자기소개서를 작성했다. 3번 대학별 지원동기를 쓰면서 계속 내가 하고 싶은 것이 무엇인지 내가 지금까지 무엇을 했는지에 대해 고민을 했다. + +내가 항상 하던 생각. 무엇을 공부하던지 간에 항상 들었던 생각. 내가 무엇을 하던 나보다 잘하는 사람은 존재하구나. 특별한 존재가 되기에는 나는 너무나 작구나. 자신감이 점점 떨어지는 듯한 느낌이 들었다. 그래서 나는 나를 특별하게 만드는, 내가 돋보일 수 있도록 해주는 것들을 공부하자고 생각했다. + +## 공부 + +나는 마구잡이로 공부했다. 필요할 때에만 공부했고, 원하는 것만 공부했다. 그래서 그걸 공부라고 해도 될 지 모르겠다. 일단 내 기억에서는 공부가 아니다. 나는 컴퓨터 공부를 취미정도로만 생각했지 공부라고는 생각하지 않았다. 그래서 항상 뭔가 컴퓨터를 공부하면 죄책감이 들고 공부한 것 처럼 느껴지지 않았다. 물론 재미있게 한 덕분에 지식은 방대해 졌지만.. + +FPGA에 대해 공부할 때에도 마찬가지였다. 공부였지만 내 마음 속에서는 공부가 아니라 딴짓으로 박혀있었다. 그래서 원하는 것을 알 수 있고 재미있게 할 수 있었지만 자세히 알고 집중해서 했다고는 못한다. FPGA를 공부했지만, 알고는 있지만 공부했다고는 할 수 없어서 결국 안한거나 마찬가지인 것이 되어버렸다. 이미 한번 공부한 내용이지만.. + +그래서 자소서를 쓸 때 고민이 되었다. 주위 친구들은 다들 수과학 내용을 위주로 썼는데, 나는 온통 다 반도체, 컴퓨터 연구 공부했던 내용, 나한테는 딴짓했던 내용이기 때문이다. 나한테는 논 것을 써내려가는 느낌이었다. 물론 쓰고 나서 객관적으로 바라보면 꽤 볼만한 자소서가 되어있었지만, 처음부터 써내려갈때에는 많이 괴롭고 고민되었다. + +아직도 컴퓨터 공부는 뭔지 잘 모르겠다. 하지만 그게 정말 재미있고, 내 적성에 100% 맞다는 것만은 알고 있다. 앞으로는 컴퓨터에 대해서 제대로 공부하고 싶다. 그것은 고등학생 신분으로는 내 맘속에서 딴짓이라고 정의되어 버리므로, 일단은 대학을 가야 하구나 싶다. + + + + + +여기서 주인공의 친구가 이런 말을 한다. '꿈이란 야망을 이야기하는 것인가'. 나는 항상 내 꿈을 말할 때 표현의 부족함을 느꼈다. 꿈이라고 하기에는 지극히 개인적이고 꿈보다 훨씬 이루고 싶고, 인생을 움직이는 원동력과도 비슷한 거니까. 물론 꿈을 사람마다 다르게 해석할 수 있다. 그게 꿈 아니야? 라고 할 수도 있다. 하지만 나에게는 꿈보다 훨씬 이루고 싶은 것이 있다. 컴퓨터라는 기계의 역사에 내 이름을 크게 남기는 것. 내가 생각했을 때는 꿈보다는 야망에 훨씬 가까운 내용이다. 나는 컴퓨터의 패러다임을 바꾸고 싶다. 어쩌면 _Linus Torvalds_처럼, 혹은 벨 연구소와 IBM 연구소의 많은 사람들 처럼. 내 이름을 직접적을 남기지 않아도 내 작품이 두고두고 기반이 되었으면 좋겠다. + +> 내 작품을 컴퓨터 역사에 깊이 뿌리박히게 하는 것. 그게 내 야망이다. + + + +## 노력 + +내 야망을 이루기 위해서는 컴퓨터를 잘 알아야 하겠지. 컴퓨터라는 기계를 역사부터 원리까지 꿰뚫고 있어야 하겠지. 그것을 위한 여정은 매우 길고 또 험난하겠지. 하지만 운이 좋았다. 나는 그걸 정말로 좋아한다. 놀지 말고 쉬지 말라고 해도 할 수 있다. 그게 내가 그것을 딴짓이라고 생각한 원인이니까. + +그게 정말 강했던 것 같다. 컴퓨터 공부를 놀이라고 생각했던 것. 하지만 앞으로는 진심을 다해 공부해야 할 것 같다. 슬금슬금 한계가 다가오고 있기도 했고, 무엇보다 그것만 하면서 살 수는 없으니까. 지금으로써 내가 할 수 있는 것은 이 마음을 잊지 않는 것. 꾸준히 생각하는 것. 기반 지식을 열심히 쌓는 것. + +그리고 대학교 진학. + +#### 야망의 뜻을 잊지 말자. 야망이란 그것을 위해서라면 무엇이든 할 수 있다는 것이다. + + + +Thank you for Reading. + +Morgan Jeon. + diff --git a/content/posts/what-i-wanted-to-do.md b/content/posts/what-i-wanted-to-do.md new file mode 100644 index 0000000..b46057a --- /dev/null +++ b/content/posts/what-i-wanted-to-do.md @@ -0,0 +1,62 @@ ++++ +date = 2021-01-28T06:14:00Z +description = "" +draft = false +slug = "what-i-wanted-to-do" +title = "What I wanted to do." + ++++ + + +#### **나는 무엇을 하고 싶지?** + +나는 개발자가 되고 싶다. 그래서 나름대로 여러가지 언어를 배우기도 하고 여러가지 활동을 하면서 나의 꿈을 키워나갔다. 나는 고등학교를 다니며 공부를 하고, 흥미를 위주로 진로를 정하려다가, 이런것들이 빙산의 일각이라는 사실을 알며 좌절하고 말았다. + +나는 과학고를 다니기 때문에 나름대로 수.과학적인 내용을 기본으로 하는 컴퓨터 아키텍쳐나 논리에 대해서 공부를 하기도 했는데, 컴퓨터 아키텍쳐에 대해 배우면서 자연스럽게 기계어, FPGA, 어셈블리 언어에 대해 관심을 가지게 되었고, 물론 지금은 대학교 진학문제가 있어서 시간을 많이 투자하지는 못하지만 관심을 가지고 배우고 있는 중이다. + +그 외에도 양자컴퓨터나 양자논리에 대해서 관심이 생겼고, 특히 반도체에도 관심이 있었다. 지금 돌이켜 보면 그냥 컴퓨터에 관련된 것이면 폭넓게 무엇이든 관심을 가졌었던것 같다. 컴퓨터란 물체를 설명하는 여러 원리나 그것을 활용하는 여러 방법에 대해 깊은 호기심이 있었다. 태생 컴퓨터 공학도인듯 하다.. + +#### **대학 탈락으로부터, 나의 진로 결정까지** + +나의 진로를 정할 때 즈음에는 정보보안에 대해 공부하고 있었고, 또 그 주제를 진로로 잡고 자기소개서를 쓰기도 하였다. 내가 정보보안에 관심을 두게 된 가장 큰 이유는 [Live Overflow](https://www.youtube.com/channel/UClcE-kVhqyiHCcjYwcpfj9w)란 외국의 유튜버를 계기로 시작하였는데, 나름대로 그 중요성을 인지하고 있었고, 재미있었다. 내 주변에는 정보보안에 대해 박식하거나 관심있는 친구들이 없기에 나름 희귀한 직업이고, 전공이라고 자연스럽게 생각해서 그런것 도 없지 않아 있을 듯 하다. + +그러던 와중에 대학교 진학을 실패하고 좌절하고, 방황하고 있을 때 포스텍 해킹캠프를 참가했다. 나름대로 미리 공부해 두었기에 부담없이 참여할 수 있겠구나 생각하고 있었는데, 결국에는 최하위 점수를 받게 되었다. 팀이 잘 운용되지 않았던 점도 있겠지만, 나는 골론적으로 이렇게 생각하고 말았다. 아, 결국에 내가 무얼 하든지 각 분야에서는 이미 나보다 잘하는 사람이 넘쳐나구나, 라고. 나는 그렇게 정보보안에 대해 재능있는 것도 아니라는 것을 알게 되었다. 때마침 여러 언어를 배우며 한계를 느끼기도 하였고, 여러가지 진행하고 있던 토이 프로젝트의 아이디어도 없었으며, 기존에 운영하던 서비스도 너무 부실했다. 갑자기 이러한 사실들을 직면하고 나니 나는, 코딩이 싫어졌다. + +그래도 정확히 말하면 싫어졌다기 보다는 지겨워졌다는 의미가 더 맞는 것 같다. 아키텍쳐나 어셈블리 언어에 대한 내용은 컴퓨터에 대한 호기심을 잃지는 않았는지 제대로 하지는 못해도 남는 시간이면 찾아보거나 여러 글을 읽으며 공부를 하고 있기는 하다만.. 코딩이란 것, 개발이라는 것에 대한 의미는 잃고 말았다. 자신감과 함께. + +--- + +나는 앞으로 컴퓨터란 분야가 어떵게 발전될지 개발 양상이나 그러한 기술적, 경제적 이야기 하는것을 좋아한다. 이러한 분야에 관심이 있는 친구에게 나의 이런 저런 생각을 공유하고는 했다. 이러한 것은 우리 아버지의 영향이 가장 컸던것 같다. 이런 저런 얘기를 하다 보면 결국에는 대학이 중요하다는 결론이 항상 나고는 했다. 그래서 대학에 대한 이야기를 하다 보면 나의 진학에 대한 이야기가 안나올 수 없었고, 이런 이야기를 하며 나는 마음 속으로 내 진로 방향을 결정하여야 했다. + +나는 원래 컴퓨터 공학과에 진학하고 싶었다. 또 여러가지 공부를 하며 결론적으로 정보보안 대학원에 진학하는 것이 내 중간 목표였다. 최종 목표는 정보보안에 대한 패러다임을 새롭게 만들고 싶다는 거창한 것이었는데, 지금 생각해 보면 무척이나 높은 꿈이었던 것 같다. 하지만 이번 캠프를 통해, 여러 생각을 통해 정보보안에 대한 관심이 떨어지자 나는 앞으로 무엇을 해야하고 무엇을 하고 싶은지에 대한 것부터 막막해 지기 시작했다. + +캠프가 막연한 좌절감만 준 것은 아니다. 이번 기회로 나는 새롭게 순수수학의 암호학에 대해서도 관심을 가지게 되었다. 내가 어떤걸 하고싶고 어떤걸 평셩 해도 지겹지 않을까에 대한 생각을 하면서, 나의 관심 종목에 대해 고민해보았다. + +나는 암호학, 정보보안, 네트워크, 로우-레벨 코딩, 하드웨어 설계, 반도체, 양자컴퓨터, 소프트웨어 공학, 등등.. 여러 분야에 관심을 가지고 있었다. 위에 있는 단어를 나열하면서 가장 나에게 끌렸던 분야는 다름아닌 반도체와 하드웨어 프로그래밍, 로우레벨 코딩이 가장 끌렸었다. 나의 진로 그리고 미래를 위해 가장 알맞는 학과를 정해야 겠다고 다짐했다. + +이런 결정을 내리는 과정에서 여러 고뇌를 거쳐갔는데, 내가 제일 최종적으로 하고 싶었던 일은 무엇일까 생각해보았다. 아마 컴퓨터 아키텍처를 분석하고 그런 시스템을 리버싱 하거나 설계하는 것이였던 것 같다. 마냥 소프트웨어 공학이나 개발보다는 그냥 논리회로 같이 컴퓨터 기계적인 분야에 더 관심이 있었고, 양자컴퓨터에 대해서 공부를 하다 보면 또 양자세계에서는 다르게 적용되는 새롭게 정리되고 개발되는 아키텍처에 대해서도 공부하고 싶었다. 결국 컴퓨터 공학과인지 전기전자 공학과 인지 결정해야 했는데, 컴퓨터 공학과는 너무 뭐랄까 공학의 느낌이 났다. 나는 컴퓨터 공학과에서 배우는 것도 배울 수 있고 또 내가 좋아하는 반도체/하드웨어 분야에 대해서 연구를 하는 전기전자 공학과를 선택하게 된 것이다. 나도 참 많은 생각을 했었다. + +#### **대학 진학을 위한 결심의 과정** + +전기전자 공학과를 가기로 한 이상 이제 대학교나 그 이상의 구체적인 계획을 세울 때가 되었다. 나는 이제 고등학교 3학년이므로, 그러한 고민을 하지에는 충분한 시기였지 않나 싶다. 전기전자 공학과도 서울대도 있고 고려대도 있으며 카이스트도 있고 포한공대도 있다. 하지만 이미 진학 실패를 경험한 나로서는 어떤 대학에 들어간다거나 어디를 붙을 수 있는지 내 위치가 정확히 어딘지 잘 모르겠다는 문제가 있었다. 물론 제일 가고 싶은 것은 서울대학교이겠지만, 그 세상은 이미 오래전에 도달하지 못하게 되었다. 나의 부족한, 미비한 성적으로는 잘해봤자 카이스트에 가는 정도였던 것이다. (그것도 이번 내신을 엄청나게 잘 봤을때의 이야기이다.) + +나는 포스텍도, 카이스트도 고려대학교도, 연세대학교도 좋았다. 모두 양질의 교육을 받을 수 있을 것이며, 또 나의 꿈을 실현시키는데에 있어서 전혀 부족하지 않은 학교들이었다. 이제 구체적인 학과를 정했으니 그 학과를 갈 수 있도록 열심히 노력하고, 공부해야 할 것이다. 그렇다. 나는 지금 공부를 해야 한다. 한국에서 가장 공부를 많이 한다는, 많이 해야하는 고3이라는 시절에, 나는 무엇을 하고 있었는가. 나는 방황하는 듯 하며 결국에는 놀았다. 하고싶은 것만 골라서 했으며, 실제로 노력한 시간은 별로 없는 것 같다. + +물론 지금까지의 생활에서는 충분히 많이 노력하고 있지만, 고등학교 3학년이라는 시기에 비해서는 (내가 상상한 것에 비해서), 또 내가 원하는 학교를 가서 내가 원하는 일을 할 수 있는 정도의 공부를, 노력을 나는 지금 하고 있지 않는것 같다. + +내가 충분히 노력했다고 생각할 수는 없을 것 같다. 하루종일 다른 생각 안하고 공부에만 매진해도 결국에는 체력이 딸려서 몇분동안은 졸게 되어있고, 아무리 열심히 다짐해도 컴퓨터 인터넷 한번에 모든 것이 무너져 내리기도 했다. 하지만, 이것은 나의 기준이었다. 부모님들은 항상 말하신다. 너 생각하는 열심은 열심이 아니라고, 더 열심히 해야 한다고. 옛날 어렸을 때에는 이러한 말을 잔소리로만 생각했다. 엄마는 내가 얼마나 노력하는지 모르면서 엄마의 기준을 들이대지 말라고 말이다. 하지만, 이러한 것들도 이제 생각이 트이게 되니 얼마나 깊은 말이었는지를 조금이나마 실감할 수 있게 되었다. + +열심히 하는 것은, 자신에게는 열심히 하고 있다고 생각되지 않는 것이다. + +진정으로 열심히 하고 있다면, 그것은 자신에게는 '더 열심히 해야 한다'라는 강박과 '더 열심히 하고 싶다'의 욕망의 형태로 다가와야 한다. 아무리 집중하고 노력해도 불안하고 더 해야하는 것 같아서, 더 열심히 해야 한다고 생각해서, 진심으로 자신을 밀어붙이는 상태가 되어야 열심히 했다고, 열심히 하고 있다고 할 수 있다고, 나는 생각했다. + +나는 열심히 하지 않았다. 나를 끝까지 몰아붙이지 않았고, 나름 열심히 했다고 생각하면서 나 자신을 기만했다. 이제는 다짐을 해야 할 때이다. 철 없이 3년을 보냈으니, 이제는 철이 들 때가 되었다. + +#### **나의 마지막 다짐** + +갑자기 여러 가지 생각이 들면서 긴박해 졌고, 이런 생각들을 정리하기 위해서 글을 쓰다 보니까 여러 가지 주제에 대해서 깊게 생각하게 되었다. 나는 이 글은 마무리 짓는 이 순간부터 나의 꿈을 이루는 마지막 날까지, 최선을 다 해서, 열심히 노력하며 달려나갈 것이다. 그게 내가 내 인생을 시작하는 첫 발걸음이 될 것이다. + +이 다짐과 이 생각이 한 순간만의 것이 되지 않도록 빌며, 이 글을 마무리 짓는다. + +_**감사합니다.**_ + diff --git a/content/posts/what-the-hell-is-usb-c-dp-alt-mode.md b/content/posts/what-the-hell-is-usb-c-dp-alt-mode.md new file mode 100644 index 0000000..19b63a1 --- /dev/null +++ b/content/posts/what-the-hell-is-usb-c-dp-alt-mode.md @@ -0,0 +1,33 @@ ++++ + +date = 2023-05-06T12:55:32Z +description = "" +draft = false +slug = "what-the-hell-is-usb-c-dp-alt-mode" +title = "What the hell is USB-C DP Alt mode" + ++++ +## **What the hell is USB-C DP Alt mode** +To. @hachsiapg, as part of my note + +### 서론: Microsoft Surface Laptop 4 & Linux + 제가 밖에서도 쓰고 집에서도 사용하는 만능 서피스 랩탑 4를 사용한지 어느새 2년이 넘었습니다. 그 사이에 리퍼도 받고 OS도 여러번 갈아엎기도 하고, 또 제 하드한 작업들을 잘 버텨주기도 한 정말 대단한 랩탑입니다. +특히 3:2의 광활한 세로는 정말 좋아서 다른 비율의 노트북은 이제 사용할 수 없는 몸이 되어버리기도 했습니다. 길이를 측정해보면 13인치 랩탑들과 동일한데, 세로에 5cm정도를 추가한 정도라 타이틀바 하나정도 넓혀주는 셈이라 마음놓고 패널바를 띄어놓고 사용할 수 있습니다. +약간의 불만족이라면 배터리와 IO, 그리고 더 깊게 들어가면 해상도 정도가 되겠네요. Intel 11세대를 탑재한 노트북 치고는, 그리고 이 가격 치고는 썬더볼트 없는 노트북을 찾는게 더 어려울것 같아요. USB-B 하나에 USB-C 하나, 그리고 자기네 proprietary한 Surface Connector라는 요상한 녀석과 다행이라면 다행일 3.5mm 오디오 잭이 하나 있습니다. 지금까지 썬더볼트를 이용할 일은 없어서 큰 불만은 아닌데 없는것보다는.. +배터리는 3-4시간 웹서핑정도를 버텨주는데, 뭐 인텔 랩탑에서는 어쩔 수 없는 부분이죠. 약간 애매한 단점으로는 2496x1664 디스플레이가 있는데, 너무 낮은 FHD보다는 좋고, 4K보다는 안좋은 QHD 패널입니다. 4K를 탑재했다면 배터리가 정말 흘러내렸을테니 이래저재 일반적인 환경에서는 딱 맞는 해상도일겁니다. +하지만 리눅스를 쓰는 저에게는 15인치 QHD는 골치아픈 일이 되어버립니다. Fractional Scaling이라는 참으로 거지같은 상황이 생기는데, 보통 13인치 화면에는 FHD가 100%로 보기 좋고, 13-15인치 4K라면 200%를 해서 사용하면 딱 맞습니다. 인터페이스 크기가 노트북를 사용하는 거리에서 딱 좋은 크기인데, QHD는 150%라는 배율을 써야합니다. +윈도우 환경에서는 그냥 사용하는 배율이지만, 리눅스 특히 Wayland에서는 골치아픈 일이 생깁니다. 물리적으로 반-픽셀이 불가능하기에 원래라면 분수 배율은 불가능합니다. 이를 적당히 물려서 샤프하게 보이게 속이거나 인터페이스는 그대로 폰트만 크게 하는 경우도 있고, 아니면 해상도를 바꾸어 다시 계산하는 방법이 있겠는데, 리눅스가 원래 사용하는 X11에서는 큰 문제 없이 이러한 꼼수를 쓸 수 있습니다. +신기술인 Wayland에서도 마찬가지지만, Wayland를 안쓰고 레거시 X11을 사용하는 앱을 Wayland 환경에서 적용하면 반픽셀 문제 때문에 흐리게 보이게 됩니다. 그러면 그냥 X11을 사용하면 안되냐, 제가 Wayland를 사용해야만 하는 이유가 딱 하나 있습니다. X11에서는, 여러 모니터에 각각 다른 Scale을 적용하기가 힘듭니다. +랩탑을 집에서 사용할 때는 27" QHD 모니터 하나와 32" 4K 모니터를 사용합니다. 제가 다른 사람들보다 인터페이스를 크게 사용해서 125% 배율을 적용해야 합니다. 이때 문제가 생기는데, 노트북 화면은 150%, 27인치 모니터는 125%, 또 32인치 모니터는 150%로 사용해야 합니다. 더 작으면 안쓰는것만 못하더라구요.. +이렇게 3가지 다른 크기의 화면은 각각 다른 배율로 써야해서, 이를 지원하는 Wayland를 써야 했습니다. 수동으로 손으로 만질수는 있지만 자주 깨지더라구요.. +외부 모니터를 좋게 사용할 것이냐 일부 앱들을 흐리게 사용할 것이냐로 나뉘는데, 일단 저는 그냥 흐리게 쓰고 있습니다. Wayland도 나온지 한참이 지났고 (10년은 넘었으려나요), 많은 앱들은 Wayland를 지원합니다. Electron은 제대로 지원을 안하고 있는데.. 뭐 얼마전 완벽하게 적용했다니 시간이 지나면 괜찮아 지겠죠. 시간이 해결할 거라 생각하고 신기술을 택했습니다. 일단 명목상으로 얼리 어답터이기는 하니까요. + +### 1. USB-C DP Alt Mode에 대해서.. + 외부 모니터를 사용할 당시 서피스가 썬더볼트를 지원하지 않는 바람에 호환성을 찾아봐야 했습니다. + USB-C 포트에 대한 정확한 정보가 없어 고민하던 중 USB-C 3.2 Gen 2라는 정보를 얻었습니다. USB3은 세분화를 이상하게 해서 헷갈리게 한다는 말을 많이 듣죠. + USB 3.2 Gen 2가 대체 뭔지 찾아봤더니, USB3중 USB3.2는 과거 USB3.1의 리네이밍입니다. USB3.2 Gen1, USB3.2 Gen2, USB3,2 Gen2x2는 각각 5, 10, 20Gbps의 bandwidth를 가집니다. + Gen1은 5Gbps 1레인으로 달성하고, Gen2는 10Gbps를 5Gbps 2레인으로 달성합니다. Gen2x2는 10Gbps 2레인입니다. 그런데 USB3.2 1x2라는 것도 있습니다. 이는 USB3.2 2x1과 동일하게 10Gbps인데, 5Gbps 레인 두개로 달성합니다. 이게 헷갈려서 꽤 고민했습니다. + USB-C는 양면으로 되어있고, Superspeed 4페어로 총 2개의 레인과 추가로 USB2가 있습니다. 이때 USB-C에는 Alt모드가 존재하는데, USB-C의 레인을 USB 데이터 교환목적이 아니라 다른 인터페이스를 얹어서 사용하는 방법입니다. 이중 가장 널리 사용되는 건 DP라는 디스플레이 인터페이스인데, DP에는 총 4페어가 있습니다. 하지만 USB와 달리 TX/RX가 필요하지 않아 4페어가 4레인이 됩니다. + 제 서피스는 USB 3.2 Gen 2, 2x1입니다. 이 말은 1Gbps 하나의 레인을 사용합니다. USB-C에서 두개의 페어가 남고, 이 두개의 페어로 DP 시그널을 보냅니다. 따라서 최대 USB3 10Gbps + DP 2 Lane이 가능한거죠. + 만약 USB3.2 1x2를 DP와 함께 사용한다면, 5Gbps 두개의 레인중 하나만 USB로 사용할 수 있고 두페어는 DP로 써야합니다. + 다행이 제 경우 2x1이기에 DP를 다 쓰면서도 USB는 그대로 사용할 수 있었고, 자세하게는 DP Alt모드에서 DisplayPort 1.4 High Bit Rate 3 (HBR3) mode를 사용하기에 레인당 8.1Gbps, 총 16.2Gbps를 사용할 수 있습니다. 이는 4K60Hz를 두개까지 보낼 수 있는 대역폭으로, 저는 이론상 USB3.2 10Gbps와 4K60 모니터 두개가지 사용할 수 있습니다. diff --git a/content/posts/what-the-hell-is-usb-c-dp-alt-mode.md~ b/content/posts/what-the-hell-is-usb-c-dp-alt-mode.md~ new file mode 100644 index 0000000..5b0312b --- /dev/null +++ b/content/posts/what-the-hell-is-usb-c-dp-alt-mode.md~ @@ -0,0 +1,35 @@ + + ++++ + +date = 2023-05-06T12:55:32Z +description = "" +draft = false +slug = "what-the-hell-is-usb-c-dp-alt-mode" +title = "What the hell is USB-C DP Alt mode" + ++++ +## **What the hell is USB-C DP Alt mode** +To. @hachsiapg, as part of my note + +### 서론: Microsoft Surface Laptop 4 & Linux + 제가 밖에서도 쓰고 집에서도 사용하는 만능 서피스 랩탑 4를 사용한지 어느새 2년이 넘었습니다. 그 사이에 리퍼도 받고 OS도 여러번 갈아엎기도 하고, 또 제 하드한 작업들을 잘 버텨주기도 한 정말 대단한 랩탑입니다. +특히 3:2의 광활한 세로는 정말 좋아서 다른 비율의 노트북은 이제 사용할 수 없는 몸이 되어버리기도 했습니다. 길이를 측정해보면 13인치 랩탑들과 동일한데, 세로에 5cm정도를 추가한 정도라 타이틀바 하나정도 넓혀주는 셈이라 마음놓고 패널바를 띄어놓고 사용할 수 있습니다. +약간의 불만족이라면 배터리와 IO, 그리고 더 깊게 들어가면 해상도 정도가 되겠네요. Intel 11세대를 탑재한 노트북 치고는, 그리고 이 가격 치고는 썬더볼트 없는 노트북을 찾는게 더 어려울것 같아요. USB-B 하나에 USB-C 하나, 그리고 자기네 proprietary한 Surface Connector라는 요상한 녀석과 다행이라면 다행일 3.5mm 오디오 잭이 하나 있습니다. 지금까지 썬더볼트를 이용할 일은 없어서 큰 불만은 아닌데 없는것보다는.. +배터리는 3-4시간 웹서핑정도를 버텨주는데, 뭐 인텔 랩탑에서는 어쩔 수 없는 부분이죠. 약간 애매한 단점으로는 2496x1664 디스플레이가 있는데, 너무 낮은 FHD보다는 좋고, 4K보다는 안좋은 QHD 패널입니다. 4K를 탑재했다면 배터리가 정말 흘러내렸을테니 이래저재 일반적인 환경에서는 딱 맞는 해상도일겁니다. +하지만 리눅스를 쓰는 저에게는 15인치 QHD는 골치아픈 일이 되어버립니다. Fractional Scaling이라는 참으로 거지같은 상황이 생기는데, 보통 13인치 화면에는 FHD가 100%로 보기 좋고, 13-15인치 4K라면 200%를 해서 사용하면 딱 맞습니다. 인터페이스 크기가 노트북를 사용하는 거리에서 딱 좋은 크기인데, QHD는 150%라는 배율을 써야합니다. +윈도우 환경에서는 그냥 사용하는 배율이지만, 리눅스 특히 Wayland에서는 골치아픈 일이 생깁니다. 물리적으로 반-픽셀이 불가능하기에 원래라면 분수 배율은 불가능합니다. 이를 적당히 물려서 샤프하게 보이게 속이거나 인터페이스는 그대로 폰트만 크게 하는 경우도 있고, 아니면 해상도를 바꾸어 다시 계산하는 방법이 있겠는데, 리눅스가 원래 사용하는 X11에서는 큰 문제 없이 이러한 꼼수를 쓸 수 있습니다. +신기술인 Wayland에서도 마찬가지지만, Wayland를 안쓰고 레거시 X11을 사용하는 앱을 Wayland 환경에서 적용하면 반픽셀 문제 때문에 흐리게 보이게 됩니다. 그러면 그냥 X11을 사용하면 안되냐, 제가 Wayland를 사용해야만 하는 이유가 딱 하나 있습니다. X11에서는, 여러 모니터에 각각 다른 Scale을 적용하기가 힘듭니다. +랩탑을 집에서 사용할 때는 27" QHD 모니터 하나와 32" 4K 모니터를 사용합니다. 제가 다른 사람들보다 인터페이스를 크게 사용해서 125% 배율을 적용해야 합니다. 이때 문제가 생기는데, 노트북 화면은 150%, 27인치 모니터는 125%, 또 32인치 모니터는 150%로 사용해야 합니다. 더 작으면 안쓰는것만 못하더라구요.. +이렇게 3가지 다른 크기의 화면은 각각 다른 배율로 써야해서, 이를 지원하는 Wayland를 써야 했습니다. 수동으로 손으로 만질수는 있지만 자주 깨지더라구요.. +외부 모니터를 좋게 사용할 것이냐 일부 앱들을 흐리게 사용할 것이냐로 나뉘는데, 일단 저는 그냥 흐리게 쓰고 있습니다. Wayland도 나온지 한참이 지났고 (10년은 넘었으려나요), 많은 앱들은 Wayland를 지원합니다. Electron은 제대로 지원을 안하고 있는데.. 뭐 얼마전 완벽하게 적용했다니 시간이 지나면 괜찮아 지겠죠. 시간이 해결할 거라 생각하고 신기술을 택했습니다. 일단 명목상으로 얼리 어답터이기는 하니까요. + +### 1. USB-C DP Alt Mode에 대해서.. + 외부 모니터를 사용할 당시 서피스가 썬더볼트를 지원하지 않는 바람에 호환성을 찾아봐야 했습니다. + USB-C 포트에 대한 정확한 정보가 없어 고민하던 중 USB-C 3.2 Gen 2라는 정보를 얻었습니다. USB3은 세분화를 이상하게 해서 헷갈리게 한다는 말을 많이 듣죠. + USB 3.2 Gen 2가 대체 뭔지 찾아봤더니, USB3중 USB3.2는 과거 USB3.1의 리네이밍입니다. USB3.2 Gen1, USB3.2 Gen2, USB3,2 Gen2x2는 각각 5, 10, 20Gbps의 bandwidth를 가집니다. + Gen1은 5Gbps 1레인으로 달성하고, Gen2는 10Gbps를 5Gbps 2레인으로 달성합니다. Gen2x2는 10Gbps 2레인입니다. 그런데 USB3.2 1x2라는 것도 있습니다. 이는 USB3.2 2x1과 동일하게 10Gbps인데, 5Gbps 레인 두개로 달성합니다. 이게 헷갈려서 꽤 고민했습니다. + USB-C는 양면으로 되어있고, Superspeed 4페어로 총 2개의 레인과 추가로 USB2가 있습니다. 이때 USB-C에는 Alt모드가 존재하는데, USB-C의 레인을 USB 데이터 교환목적이 아니라 다른 인터페이스를 얹어서 사용하는 방법입니다. 이중 가장 널리 사용되는 건 DP라는 디스플레이 인터페이스인데, DP에는 총 4페어가 있습니다. 하지만 USB와 달리 TX/RX가 필요하지 않아 4페어가 4레인이 됩니다. + 제 서피스는 USB 3.2 Gen 2, 2x1입니다. 이 말은 1Gbps 하나의 레인을 사용합니다. USB-C에서 두개의 페어가 남고, 이 두개의 페어로 DP 시그널을 보냅니다. 따라서 최대 USB3 10Gbps + DP 2 Lane이 가능한거죠. + 만약 USB3.2 1x2를 DP와 함께 사용한다면, 5Gbps 두개의 레인중 하나만 USB로 사용할 수 있고 두페어는 DP로 써야합니다. + 다행이 제 경우 2x1이기에 DP를 다 쓰면서도 USB는 그대로 사용할 수 있었고, 자세하게는 DP Alt모드에서 DisplayPort 1.4 High Bit Rate 3 (HBR3) mode를 사용하기에 레인당 8.1Gbps, 총 16.2Gbps를 사용할 수 있습니다. 이는 4K60Hz를 두개까지 보낼 수 있는 대역폭으로, 저는 이론상 USB3.2 10Gbps와 4K60 모니터 두개가지 사용할 수 있습니다. diff --git a/content/posts/yangja-keompyuteowa-yangja-eonilring.md b/content/posts/yangja-keompyuteowa-yangja-eonilring.md new file mode 100644 index 0000000..b95d2dd --- /dev/null +++ b/content/posts/yangja-keompyuteowa-yangja-eonilring.md @@ -0,0 +1,32 @@ ++++ +date = 2021-08-06T10:36:03Z +description = "" +draft = false +slug = "yangja-keompyuteowa-yangja-eonilring" +title = "양자 컴퓨터와 양자 어닐링" + ++++ + + +## 양자 컴퓨터와 양자 어닐링 + +양자 컴퓨터 입문 / 양자 컴퓨팅 발전과 전망 / 1억배 빠른 양자 컴퓨터가 온다 / 스콧 애론슨의 양자 컴퓨터 강의 + +### **양자 컴퓨터란 무엇일까?** + +#### Ø 현대 컴퓨터의 발전 과정 + +20세기, 컴퓨터(Computer)란 말은 계산하는 사람, Computing Person이라는 뜻으로 사용되었다. 하지만 단순 반복 행동을 굳이 사람이 하지 않아도 되는, 일명 계산기계가 사용될 수 있음이 증명되면서, Computer라는 말은 ‘일정한 규칙ㅇㄹ 가지고 주어진 값을 토대로 계산하는 장치’라는 의미를 가지게 되었다. + +현대적인 컴퓨터의 정의를 시작한 사람은 ‘찰스 배비지’이다. 이 사람은 19세기 초, 차분 기관이라는 기계식 계산기를 제작한다. 그 후, 그는 더 복잡한 기관인 분석 기관(해석 기관)을 제작한다. 찰스 배비지는 차분기관을 설계하였지만, 실제 완성하지는 못하였다. 하지만 후에 실제 만들어 보면서 작동하는 것을 확인하였다. 그는 천문 테이블을 만들기 위해 이 기계를 제작하였는데, 차분 기계는 다항함수를 계산할 수 있는 기관이었다. 그는 이 기관을 설계하고 난 뒤, 해석기관을 설계하였는데, 이는 천공카드를 이용해서 범용적인 계산을 할 수 있도록 하였다. 이 기계장치도 예산이랑 시간이 부족해서 완성하지 못하였다. 하지만 한 부인이 이 컴퓨터로 실제 프로그래밍을 하며, 최초의 프로그래머로 불리우고 있다. + +범용 컴퓨터의 현대적인 개념은 그 유명한 앨런 튜링이 정립했다. 그는 튜링 머신이라는 수학적 모델을 만들었는데, 모든 컴퓨터들은 이러한 튜링 머신을 기본 기능으로 설명할 수 있다. 그 전에 발명되었던, 현대의 트랜지스터와 같은 원리로 움직이는 진공관을 통해 튜링 머신이라는 논리적 모델을 실제 구현하게 된다. 그 후 에니그마를 깨기 위해 실제 계산 가능한 장치를 만들면서 최초의 전자식 계산기라고 알려져 있다. + +그 후 ENIAC이 만들어 지고, 폰 노이만이 노이만 구조라는 현대까지 아직도 적용되고 있는 방식을 제안한다. 이 폰 노이만 구조란 것은, 프로그램과 데이터를 기억장치에 저장하고, 명령어를 하나씩 수행하며 데이터를 수정해 나가는 방식을 의미한다. + +그 후 우리가 나는 집적회로와 트랜지스터가 사용되어 더욱 작은 컴퓨터가 만들어 지게 되었고, 이들이 발전해 나가면서 최초의 개인용 컴퓨터가 IBM에서 나오게 된다. + +#### Ø 그래서, 양자 컴퓨터란 무엇인가? + +흔히 알려진 양자 컴퓨터의 특징을 나열하자면, 0과 1 이분적이지 않게 두가지 정보를 동시에 가질 수 있고, 또 일반적인 컴퓨터보다 훨씬 빠르게 작동하고, 현대의 보안이 모두 뚫릴 것이며, 완전한 인공지능이 가능할 것이라 한다. 이중에서 물론 실제로 가능할 것도 있지만, 이런 것들이 가능하기에는 너무 오래 걸린다. + diff --git a/content/posts/yangjadeulyi-teuraenjiseuteo.md b/content/posts/yangjadeulyi-teuraenjiseuteo.md new file mode 100644 index 0000000..b8bd9e8 --- /dev/null +++ b/content/posts/yangjadeulyi-teuraenjiseuteo.md @@ -0,0 +1,28 @@ ++++ +date = 2021-10-30T07:09:53Z +description = "" +draft = false +slug = "yangjadeulyi-teuraenjiseuteo" +title = "양자들의 트랜지스터와 핫 캐리어 효과" + ++++ + + +트랜지스터가 점점 소형화가 되어가면서 전자가 예상한대로 움직이지 않는 작은 단위까지 내려갔다. 나노단위까지 생산공정이 작아지면서 양자역학적인 효과가 나타나기 시작했고, 이는 트랜지스터의 스위칭 작용을 방해하는 효과를 불어일으킨다. 이를 해결하기 위해서 양자 세계에서 사용할 수 있는 양자 트랜지스터와 단일 원자 트랜지스터가 개발되었다. + +1) 단일원자 트랜지스터 + +단일원자 트랜지스터는 양자 터널링 효과를 적극적으로 이용하여 스위칭 작용을 한다. 터널링 효과를 제어하기 위해서 직접 제어가 아닌 양자 얽힘 효과를 이용한다. 큐비트를 이용하여, 전자 주개로써의 원자를 제어하기 위해 원자 개개별의 스핀 상태를 이용한다. 이를 통해 큐비트의 역할을 할 수 있는 단일한 원자를 생성해 내고, 이 단일 원자들이 스위칭 작용을 하는 주체가 된다. 단일 원자 트랜지스터는 실온에서 작동하고, 적은 숫자의 원자만을 이용하기 때문에 스위칭에 필요한 전력의 양도 매우 적다. + +단일원자 트랜지스터는 실리콘 표면의 인 원자와 반응시키는 방법이 이용된다. 원자가 정해진 위치에 고정되어 있고 각각의 원자가 전자 주개 또는 스위쳐로 작용하여 전자 하나하나의 흐름을 제어하게 된다. + +2) 양자 트랜지스터 + +양자 트랜지스터는 기존의 MOS 트랜지스터와 비슷하게 행동하지만, 중간 p,N형 반도체가 하던 채널 형성과 전자 이동 제어를 나노 양자점이 전담하게 된다. + +3) 핫 캐리어 효과 + +반도체 공정이 작아지면서 트랜지스터 채널이 소형화되었고, 이에 따라 채널의 길이가 줄어들게 되었다. 채널의 길이가 줄어들면서 전자의 튐 현상과 전자 제어가 힘들어진다는 한계점이 있다. 그 중 핫 캐리어 효과는 Drain전압은 일정한데 비해 짧아진 거리에 의해 전기장이 매우 커지는 효과가 일어나고, 평소보다 훨씬 가속된 전자들의 운동에너지에 의해 원래라면 넘어갈 수 없던 Oxide 전계를 넘어서게 되면서 규소 원자와 충돌하여 갇히게 된다. 이를 핫 캐리어 효과, 빠른 전자에 의한 주입 현상이라고 한다. 이에 의해 예측한 것과는 더 적은 전하가 이동하게 되고, 전류가 불안정하고 수율이 떨어지게 된다. + +핫 캐리어 효과를 최소한으로 하고 이를 방지하기 위해서는 Oxide 게이트와 접해있는 부분의 실리콘을 특수하게 덜 도핑하는 방법이 있다. 전류 손실의 손해를 보지만 핫 캐리어 효과에 의한 손실보다는 훨씬 적다. 원래는 전자의 운동을 최소한으로 방해하기 위해 저항이 낮도록 도핑하는데, Oxide에 접해있는 부분의 저항을 특별히 더 높게 도핑하여 핫 캐리어의 운동을 방해하는 효과를 준다. + diff --git a/content/profile.md b/content/profile.md new file mode 100644 index 0000000..d7fbc6f --- /dev/null +++ b/content/profile.md @@ -0,0 +1,6 @@ ++++ +slug = "profile" +title = "About Me !" ++++ + + diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..d5b3eb5 --- /dev/null +++ b/public/404.html @@ -0,0 +1,14 @@ +<!doctype html><html lang=en dir=auto><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=robots content="index, follow"><title>404 Page not found | Morgan's Blog

404
\ No newline at end of file diff --git a/public/archives/index.html b/public/archives/index.html new file mode 100644 index 0000000..da2a85a --- /dev/null +++ b/public/archives/index.html @@ -0,0 +1,14 @@ +Archive | Morgan's Blog

2023  2

May  1

What the hell is USB-C DP Alt mode

May 6, 6000 · 659 words · Me

April  1

Wasting Time

April 20, 20000 · 5 words · Me

2022  3

October  1

(Untitled)

October 3, 3000 · 0 words · Me

April  2

선택실패

April 14, 14000 · 489 words · Me

다른 집

April 9, 9000 · 481 words · Me

2021  24

December  2

고등학교 돌아보기

December 21, 21000 · 925 words · Me

대학 입시가 한단계만 남았다.

December 1, 1000 · 589 words · Me

October  11

Spectre Attacks: Exploiting Speculative Execution

October 30, 30000 · 864 words · Me

전자 제어의 세계인 미래, 그 보안의 위협

October 30, 30000 · 598 words · Me

Ad-Tech와 통계의 쓰임새

October 30, 30000 · 225 words · Me

양자들의 트랜지스터와 핫 캐리어 효과

October 30, 30000 · 294 words · Me

구글은 그 많은 페이지를 어떻게 찾아낼까.

October 30, 30000 · 395 words · Me

인생 두번째 실패. 두번째 대학탈락.

October 23, 23000 · 85 words · Me

How I wanted to do.

October 23, 23000 · 348 words · Me

학교에서 했던 프로젝트들..

October 23, 23000 · 28 words · Me

개인정보.. Privacy..

October 23, 23000 · 397 words · Me

데이터센터

October 23, 23000 · 335 words · Me

블로그 글쓰기는 너무 힘들어..

October 8, 8000 · 258 words · Me

September  3

What I want to do.

September 11, 11000 · 551 words · Me

시험을 일주일 앞두고

September 10, 10000 · 218 words · Me

Attitude for criticism

September 10, 10000 · 603 words · Me

August  3

양자 컴퓨터와 양자 어닐링

August 6, 6000 · 321 words · Me

Security of IoT

August 6, 6000 · 280 words · Me

Hardware Security

August 6, 6000 · 876 words · Me

July  3

[전산유체역학] CFD with Python (Navier-Stokes Equation)

July 10, 10000 · 4414 words · Me

반도체의 원리, 종류, 소자, 역사, 산업. (MOSFET부터 RAM, FLASH, 그리고 Intel 4004까지.

July 9, 9000 · 637 words · Me

Cryptography

July 9, 9000 · 1490 words · Me

May  1

파이썬으로 구현한 뉴턴의 방정식과 적분방정식

May 21, 21000 · 398 words · Me

January  1

What I wanted to do.

January 28, 28000 · 1045 words · Me
\ No newline at end of file diff --git a/public/assets/css/stylesheet.0c567cdb3cebd0d379aa8cad5d8adeae85edf7230c82064f82ab2449b47e997f.css b/public/assets/css/stylesheet.0c567cdb3cebd0d379aa8cad5d8adeae85edf7230c82064f82ab2449b47e997f.css new file mode 100644 index 0000000..6bc837b --- /dev/null +++ b/public/assets/css/stylesheet.0c567cdb3cebd0d379aa8cad5d8adeae85edf7230c82064f82ab2449b47e997f.css @@ -0,0 +1,7 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ +:root{--gap:30px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--code-bg)}.dark.list{background:var(--theme)}@import 'https://fonts.googleapis.com/css2?family=Source+Sans+3&display=swap';*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}body{font-family:"source sans 3",sans-serif;font-size:15px;line-height:1.8;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2)var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0 0 0 var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}body.dark #moon{vertical-align:middle;display:none}body:not(.dark) #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons{padding:12px 0}.social-icons a:not(:last-of-type){margin-inline-end:12px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap)0 calc(var(--gap) * 2)}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:34px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;margin-bottom:var(--gap);padding:var(--gap);border-radius:var(--radius);transition:transform .1s}.post-entry:active{transform:scale(.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:24px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-cover,.entry-isdraft{font-size:14px;color:var(--secondary)}.entry-cover{margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);pointer-events:none;width:100%;height:auto}.entry-cover a{color:var(--secondary);box-shadow:0 1px 0 var(--primary)}@import "https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/static/pretendard.css";.page-header,.post-header{margin:24px auto calc(var(--content-gap) + 20px)}.post-title{margin-top:10px;margin-bottom:16px;font-size:24px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px;display:flex;flex-wrap:wrap}.post-meta .i18n_list li{display:inline-flex;list-style:none;margin:auto 3px;box-shadow:0 1px 0 var(--secondary)}.breadcrumbs a{font-size:16px}.post-content{font-family:pretendard;color:var(--content)}.post-content h3,.post-content h4,.post-content h5,a .post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.toc a:hover{box-shadow:0 1px}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:none;background:linear-gradient(to right,var(--primary) 100%,transparent 0)0/1px 1px repeat-x}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:32px}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:12px 8px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{font-size:14px;text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--hljs-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:block;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--hljs-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin:0 2px 40px;border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}.dark .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:20px}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:0 20px;padding:10px 20px}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:56px}.post-tags li{display:inline-block;margin-inline-end:3px;margin-bottom:5px}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius)}.post-tags a{display:block;padding-inline-start:14px;padding-inline-end:14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.share-buttons{margin:14px 0;padding-inline-start:var(--radius);display:flex;justify-content:center;overflow-x:auto}.share-buttons a{margin-top:10px}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{margin:10px 0;display:flex;line-height:30px;border-radius:var(--radius)}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 0}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner h1{padding:12px 0}.profile img{display:inline-table;border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px;margin:0 auto}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(.96)}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs{display:block;overflow-x:auto;background:#1c1d21;color:#c0c5ce;padding:.5em}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-track{background:var(--code-bg)}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}.list:not(.dark)::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--hljs-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap:14px}.profile img{transform:scale(.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2)var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}}:root{--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:#000;--entry:rgb(46, 46, 51);--primary:#fff;--secondary:#ddd;--tertiary:rgba(1, 1, 5, 0.32);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)} \ No newline at end of file diff --git a/public/assets/css/stylesheet.1bcbda8c7ce05a9f797f39955298ef67e38caa385385a2e25860723f687b6ead.css b/public/assets/css/stylesheet.1bcbda8c7ce05a9f797f39955298ef67e38caa385385a2e25860723f687b6ead.css new file mode 100644 index 0000000..c63110b --- /dev/null +++ b/public/assets/css/stylesheet.1bcbda8c7ce05a9f797f39955298ef67e38caa385385a2e25860723f687b6ead.css @@ -0,0 +1,7 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ +:root{--gap:30px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--code-bg)}.dark.list{background:var(--theme)}@import 'https://fonts.googleapis.com/css2?family=Source+Sans+3&display=swap';@import "https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/static/pretendard.css";*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}body{font-family:"source sans 3",pretendard,sans-serif!important;font-size:15px;line-height:1.8;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2)var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0 0 0 var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}body.dark #moon{vertical-align:middle;display:none}body:not(.dark) #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons{padding:12px 0}.social-icons a:not(:last-of-type){margin-inline-end:12px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap)0 calc(var(--gap) * 2)}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:34px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;margin-bottom:var(--gap);padding:var(--gap);border-radius:var(--radius);transition:transform .1s}.post-entry:active{transform:scale(.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:24px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-cover,.entry-isdraft{font-size:14px;color:var(--secondary)}.entry-cover{margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);pointer-events:none;width:100%;height:auto}.entry-cover a{color:var(--secondary);box-shadow:0 1px 0 var(--primary)}.page-header,.post-header{margin:24px auto calc(var(--content-gap) + 20px)}.post-title{margin-top:10px;margin-bottom:16px;font-size:24px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px;display:flex;flex-wrap:wrap}.post-meta .i18n_list li{display:inline-flex;list-style:none;margin:auto 3px;box-shadow:0 1px 0 var(--secondary)}.breadcrumbs a{font-size:16px}.post-content{font-family:pretendard;color:var(--content)}.post-content h3,.post-content h4,.post-content h5,a .post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.toc a:hover{box-shadow:0 1px}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:none;background:linear-gradient(to right,var(--primary) 100%,transparent 0)0/1px 1px repeat-x}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:32px}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:12px 8px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{font-size:14px;text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--hljs-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:block;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--hljs-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin:0 2px 40px;border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}.dark .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:20px}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:0 20px;padding:10px 20px}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:56px}.post-tags li{display:inline-block;margin-inline-end:3px;margin-bottom:5px}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius)}.post-tags a{display:block;padding-inline-start:14px;padding-inline-end:14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.share-buttons{margin:14px 0;padding-inline-start:var(--radius);display:flex;justify-content:center;overflow-x:auto}.share-buttons a{margin-top:10px}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{margin:10px 0;display:flex;line-height:30px;border-radius:var(--radius)}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 0}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner h1{padding:12px 0}.profile img{display:inline-table;border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px;margin:0 auto}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(.96)}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs{display:block;overflow-x:auto;background:#1c1d21;color:#c0c5ce;padding:.5em}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-track{background:var(--code-bg)}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}.list:not(.dark)::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--hljs-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap:14px}.profile img{transform:scale(.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2)var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}}:root{--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:#000;--entry:rgb(46, 46, 51);--primary:#fff;--secondary:#ddd;--tertiary:rgba(1, 1, 5, 0.32);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)} \ No newline at end of file diff --git a/public/assets/css/stylesheet.27a50fc99f97709c2602a00374b20c543637007ef52c9569979a282a0d454192.css b/public/assets/css/stylesheet.27a50fc99f97709c2602a00374b20c543637007ef52c9569979a282a0d454192.css new file mode 100644 index 0000000..173426e --- /dev/null +++ b/public/assets/css/stylesheet.27a50fc99f97709c2602a00374b20c543637007ef52c9569979a282a0d454192.css @@ -0,0 +1,7 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ +:root{--gap:30px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--code-bg)}.dark.list{background:var(--theme)}*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}body{font-family:-apple-system,BlinkMacSystemFont,segoe ui,Roboto,Oxygen,Ubuntu,Cantarell,open sans,helvetica neue,sans-serif;font-size:15px;line-height:1.8;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2)var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0 0 0 var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}body.dark #moon{vertical-align:middle;display:none}body:not(.dark) #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons{padding:12px 0}.social-icons a:not(:last-of-type){margin-inline-end:12px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap)0 calc(var(--gap) * 2)}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:34px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;margin-bottom:var(--gap);padding:var(--gap);border-radius:var(--radius);transition:transform .1s}.post-entry:active{transform:scale(.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:24px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-cover,.entry-isdraft{font-size:14px;color:var(--secondary)}.entry-cover{margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);pointer-events:none;width:100%;height:auto}.entry-cover a{color:var(--secondary);box-shadow:0 1px 0 var(--primary)}@import "https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/static/pretendard.css";.page-header,.post-header{margin:24px auto calc(var(--content-gap) + 20px)}.post-title{margin-top:10px;margin-bottom:16px;font-size:24px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px;display:flex;flex-wrap:wrap}.post-meta .i18n_list li{display:inline-flex;list-style:none;margin:auto 3px;box-shadow:0 1px 0 var(--secondary)}.breadcrumbs a{font-size:16px}.post-content{font-family:pretendard;color:var(--content)}.post-content h3,.post-content h4,.post-content h5,a .post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.toc a:hover{box-shadow:0 1px}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:none;background:linear-gradient(to right,var(--primary) 100%,transparent 0)0/1px 1px repeat-x}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:32px}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:12px 8px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{font-size:14px;text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--hljs-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:block;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--hljs-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin:0 2px 40px;border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}.dark .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:20px}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:0 20px;padding:10px 20px}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:56px}.post-tags li{display:inline-block;margin-inline-end:3px;margin-bottom:5px}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius)}.post-tags a{display:block;padding-inline-start:14px;padding-inline-end:14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.share-buttons{margin:14px 0;padding-inline-start:var(--radius);display:flex;justify-content:center;overflow-x:auto}.share-buttons a{margin-top:10px}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{margin:10px 0;display:flex;line-height:30px;border-radius:var(--radius)}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 0}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner h1{padding:12px 0}.profile img{display:inline-table;border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px;margin:0 auto}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(.96)}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs{display:block;overflow-x:auto;background:#1c1d21;color:#c0c5ce;padding:.5em}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-track{background:var(--code-bg)}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}.list:not(.dark)::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--hljs-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap:14px}.profile img{transform:scale(.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2)var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}}:root{--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:#000;--entry:rgb(46, 46, 51);--primary:#fff;--secondary:#ddd;--tertiary:rgba(1, 1, 5, 0.32);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)} \ No newline at end of file diff --git a/public/assets/css/stylesheet.31527a12923607f33c1cac9636a2fa755f6ade7c55866bdb96e44c6bcaf6cfbb.css b/public/assets/css/stylesheet.31527a12923607f33c1cac9636a2fa755f6ade7c55866bdb96e44c6bcaf6cfbb.css new file mode 100644 index 0000000..ba247b1 --- /dev/null +++ b/public/assets/css/stylesheet.31527a12923607f33c1cac9636a2fa755f6ade7c55866bdb96e44c6bcaf6cfbb.css @@ -0,0 +1,7 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ +:root{--gap:30px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:#242424;--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:#242424;--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:white;--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--code-bg)}.dark.list{background:var(--theme)}@import 'https://fonts.googleapis.com/css2?family=Source+Sans+3&display=swap';@import "https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/static/pretendard.css";*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}h1{font-size:24px}h2{font-size:18px}h3{font-size:16px}body{font-family:"source sans 3",pretendard,sans-serif!important;font-size:14px;line-height:1.8;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2)var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0 0 0 var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}body.dark #moon{vertical-align:middle;display:none}body:not(.dark) #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons{padding:12px 0}.social-icons a:not(:last-of-type){margin-inline-end:12px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap)0 calc(var(--gap) * 2)}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:24px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;padding:var(--gap);border-radius:var(--radius);transition:transform .1s}.post-entry:active{transform:scale(.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:18px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-cover,.entry-isdraft{font-size:14px;color:var(--secondary)}.entry-cover{margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);pointer-events:none;width:100%;height:auto}.entry-cover a{color:var(--secondary);box-shadow:0 1px 0 var(--primary)}.page-header,.post-header{margin:24px auto calc(var(--content-gap) + 20px)}.post-title{margin-top:10px;margin-bottom:16px;font-size:24px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px;display:flex;flex-wrap:wrap}.post-meta .i18n_list li{display:inline-flex;list-style:none;margin:auto 3px;box-shadow:0 1px 0 var(--secondary)}.breadcrumbs a{font-size:16px}.post-content{font-family:inherit;color:var(--content)}.post-content h3,.post-content h4,.post-content h5,a .post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.toc a:hover{box-shadow:0 1px}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:none;background:linear-gradient(to right,var(--primary) 100%,transparent 0)0/1px 1px repeat-x}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:32px}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:12px 8px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{font-size:14px;text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--hljs-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:block;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--hljs-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin:0 2px 40px;border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}.dark .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:20px}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:0 20px;padding:10px 20px}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:56px}.post-tags li{display:inline-block;margin-inline-end:3px;margin-bottom:5px}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius)}.post-tags a{display:block;padding-inline-start:14px;padding-inline-end:14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.share-buttons{margin:14px 0;padding-inline-start:var(--radius);display:flex;justify-content:center;overflow-x:auto}.share-buttons a{margin-top:10px}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{margin:10px 0;display:flex;line-height:30px;border-radius:var(--radius)}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 0}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner h1{padding:12px 0}.profile img{display:inline-table;border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px;margin:0 auto}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(.96)}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs{display:block;overflow-x:auto;background:#1c1d21;color:#c0c5ce;padding:.5em}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-track{background:var(--code-bg)}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}.list:not(.dark)::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--hljs-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap:14px}.profile img{transform:scale(.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2)var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}} \ No newline at end of file diff --git a/public/assets/css/stylesheet.48d20c88c89e0ba76c8614d826aa2fff9e8a8ca9ef99d610b376bf820fafb0f6.css b/public/assets/css/stylesheet.48d20c88c89e0ba76c8614d826aa2fff9e8a8ca9ef99d610b376bf820fafb0f6.css new file mode 100644 index 0000000..7a89bb8 --- /dev/null +++ b/public/assets/css/stylesheet.48d20c88c89e0ba76c8614d826aa2fff9e8a8ca9ef99d610b376bf820fafb0f6.css @@ -0,0 +1,7 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ +:root{--gap:30px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--code-bg)}.dark.list{background:var(--theme)}*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}body{font-family:-apple-system,BlinkMacSystemFont,segoe ui,Roboto,Oxygen,Ubuntu,Cantarell,open sans,helvetica neue,sans-serif;font-size:15px;line-height:2;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2)var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0 0 0 var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}body.dark #moon{vertical-align:middle;display:none}body:not(.dark) #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons{padding:12px 0}.social-icons a:not(:last-of-type){margin-inline-end:12px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap)0 calc(var(--gap) * 2)}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:34px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;margin-bottom:var(--gap);padding:var(--gap);border-radius:var(--radius);transition:transform .1s}.post-entry:active{transform:scale(.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:24px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-cover,.entry-isdraft{font-size:14px;color:var(--secondary)}.entry-cover{margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);pointer-events:none;width:100%;height:auto}.entry-cover a{color:var(--secondary);box-shadow:0 1px 0 var(--primary)}@import "https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/static/pretendard.css";.page-header,.post-header{margin:24px auto calc(var(--content-gap) + 20px)}.post-title{margin-top:10px;margin-bottom:16px;font-size:32px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px;display:flex;flex-wrap:wrap}.post-meta .i18n_list li{display:inline-flex;list-style:none;margin:auto 3px;box-shadow:0 1px 0 var(--secondary)}.breadcrumbs a{font-size:16px}.post-content{font-family:pretendard;color:var(--content)}.post-content h3,.post-content h4,.post-content h5,a .post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.toc a:hover{box-shadow:0 1px}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:none;background:linear-gradient(to right,var(--primary) 100%,transparent 0)0/1px 1px repeat-x}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:32px}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:12px 8px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{font-size:14px;text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--hljs-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:block;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--hljs-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin:0 2px 40px;border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}.dark .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:20px}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:0 20px;padding:10px 20px}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:56px}.post-tags li{display:inline-block;margin-inline-end:3px;margin-bottom:5px}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius)}.post-tags a{display:block;padding-inline-start:14px;padding-inline-end:14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.share-buttons{margin:14px 0;padding-inline-start:var(--radius);display:flex;justify-content:center;overflow-x:auto}.share-buttons a{margin-top:10px}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{margin:10px 0;display:flex;line-height:30px;border-radius:var(--radius)}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 0}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner h1{padding:12px 0}.profile img{display:inline-table;border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px;margin:0 auto}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(.96)}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs{display:block;overflow-x:auto;background:#1c1d21;color:#c0c5ce;padding:.5em}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-track{background:var(--code-bg)}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}.list:not(.dark)::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--hljs-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap:14px}.profile img{transform:scale(.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2)var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}}:root{--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:#000;--entry:rgb(46, 46, 51);--primary:#fff;--secondary:#ddd;--tertiary:rgba(1, 1, 5, 0.32);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)} \ No newline at end of file diff --git a/public/assets/css/stylesheet.49aeea58062c6f9ed716ca009b803f159cf9edaa0f3227711cd1bc4ad3757dc0.css b/public/assets/css/stylesheet.49aeea58062c6f9ed716ca009b803f159cf9edaa0f3227711cd1bc4ad3757dc0.css new file mode 100644 index 0000000..65be1d5 --- /dev/null +++ b/public/assets/css/stylesheet.49aeea58062c6f9ed716ca009b803f159cf9edaa0f3227711cd1bc4ad3757dc0.css @@ -0,0 +1,7 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ +:root{--gap:30px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--code-bg)}.dark.list{background:var(--theme)}*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}body{font-family:-apple-system,BlinkMacSystemFont,segoe ui,Roboto,Oxygen,Ubuntu,Cantarell,open sans,helvetica neue,sans-serif;font-size:18px;line-height:1.6;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2)var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0 0 0 var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}body.dark #moon{vertical-align:middle;display:none}body:not(.dark) #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons{padding:12px 0}.social-icons a:not(:last-of-type){margin-inline-end:12px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap)0 calc(var(--gap) * 2)}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:34px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;margin-bottom:var(--gap);padding:var(--gap);border-radius:var(--radius);transition:transform .1s}.post-entry:active{transform:scale(.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:24px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-cover,.entry-isdraft{font-size:14px;color:var(--secondary)}.entry-cover{margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);pointer-events:none;width:100%;height:auto}.entry-cover a{color:var(--secondary);box-shadow:0 1px 0 var(--primary)}@font-face{font-family:gowun;src:url(gowun.woff2)}@font-face{font-family:LINE Seed KR;src:url(lineseed.woff2)}.page-header,.post-header{margin:24px auto calc(var(--content-gap) + 20px)}.post-title{margin-top:10px;margin-bottom:16px;font-size:32px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px;display:flex;flex-wrap:wrap}.post-meta .i18n_list li{display:inline-flex;list-style:none;margin:auto 3px;box-shadow:0 1px 0 var(--secondary)}.breadcrumbs a{font-size:16px}.post-content{font-family:LINE Seed KR;color:var(--content)}.post-content h3,.post-content h4,.post-content h5,a .post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.toc a:hover{box-shadow:0 1px}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:none;background:linear-gradient(to right,var(--primary) 100%,transparent 0)0/1px 1px repeat-x}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:32px}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:12px 8px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{font-size:14px;text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--hljs-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:block;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--hljs-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin:0 2px 40px;border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}.dark .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:20px}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:0 20px;padding:10px 20px}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:56px}.post-tags li{display:inline-block;margin-inline-end:3px;margin-bottom:5px}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius)}.post-tags a{display:block;padding-inline-start:14px;padding-inline-end:14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.share-buttons{margin:14px 0;padding-inline-start:var(--radius);display:flex;justify-content:center;overflow-x:auto}.share-buttons a{margin-top:10px}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{margin:10px 0;display:flex;line-height:30px;border-radius:var(--radius)}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 0}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner h1{padding:12px 0}.profile img{display:inline-table;border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px;margin:0 auto}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(.96)}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs{display:block;overflow-x:auto;background:#1c1d21;color:#c0c5ce;padding:.5em}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-track{background:var(--code-bg)}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}.list:not(.dark)::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--hljs-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap:14px}.profile img{transform:scale(.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2)var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}}:root{--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:#000;--entry:rgb(46, 46, 51);--primary:#fff;--secondary:#ddd;--tertiary:rgba(1, 1, 5, 0.32);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)} \ No newline at end of file diff --git a/public/assets/css/stylesheet.636d5654670dcdc7ed178fde0a41912a49898f651e686f85a3afc91f56185f87.css b/public/assets/css/stylesheet.636d5654670dcdc7ed178fde0a41912a49898f651e686f85a3afc91f56185f87.css new file mode 100644 index 0000000..c6bd159 --- /dev/null +++ b/public/assets/css/stylesheet.636d5654670dcdc7ed178fde0a41912a49898f651e686f85a3afc91f56185f87.css @@ -0,0 +1,7 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ +:root{--gap:30px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:#242424;--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:#242424;--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:white;--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--code-bg)}.dark.list{background:var(--theme)}@import 'https://fonts.googleapis.com/css2?family=Source+Sans+3&display=swap';@import "https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/static/pretendard.css";*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}body{font-family:"source sans 3",pretendard,sans-serif!important;font-size:15px;line-height:1.8;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2)var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0 0 0 var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}body.dark #moon{vertical-align:middle;display:none}body:not(.dark) #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons{padding:12px 0}.social-icons a:not(:last-of-type){margin-inline-end:12px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap)0 calc(var(--gap) * 2)}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:34px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;margin-bottom:var(--gap);padding:var(--gap);border-radius:var(--radius);transition:transform .1s}.post-entry:active{transform:scale(.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:24px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-cover,.entry-isdraft{font-size:14px;color:var(--secondary)}.entry-cover{margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);pointer-events:none;width:100%;height:auto}.entry-cover a{color:var(--secondary);box-shadow:0 1px 0 var(--primary)}.page-header,.post-header{margin:24px auto calc(var(--content-gap) + 20px)}.post-title{margin-top:10px;margin-bottom:16px;font-size:24px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px;display:flex;flex-wrap:wrap}.post-meta .i18n_list li{display:inline-flex;list-style:none;margin:auto 3px;box-shadow:0 1px 0 var(--secondary)}.breadcrumbs a{font-size:16px}.post-content{font-family:inherit;color:var(--content)}.post-content h3,.post-content h4,.post-content h5,a .post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.toc a:hover{box-shadow:0 1px}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:none;background:linear-gradient(to right,var(--primary) 100%,transparent 0)0/1px 1px repeat-x}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:32px}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:12px 8px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{font-size:14px;text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--hljs-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:block;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--hljs-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin:0 2px 40px;border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}.dark .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:20px}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:0 20px;padding:10px 20px}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:56px}.post-tags li{display:inline-block;margin-inline-end:3px;margin-bottom:5px}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius)}.post-tags a{display:block;padding-inline-start:14px;padding-inline-end:14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.share-buttons{margin:14px 0;padding-inline-start:var(--radius);display:flex;justify-content:center;overflow-x:auto}.share-buttons a{margin-top:10px}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{margin:10px 0;display:flex;line-height:30px;border-radius:var(--radius)}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 0}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner h1{padding:12px 0}.profile img{display:inline-table;border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px;margin:0 auto}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(.96)}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs{display:block;overflow-x:auto;background:#1c1d21;color:#c0c5ce;padding:.5em}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-track{background:var(--code-bg)}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}.list:not(.dark)::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--hljs-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap:14px}.profile img{transform:scale(.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2)var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}}:root{--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:#000;--entry:rgb(46, 46, 51);--primary:#fff;--secondary:#ddd;--tertiary:rgba(1, 1, 5, 0.32);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)} \ No newline at end of file diff --git a/public/assets/css/stylesheet.64013ace36f887a1be8abc1df1be4d95134f7701fc118235b9905b47d67ed567.css b/public/assets/css/stylesheet.64013ace36f887a1be8abc1df1be4d95134f7701fc118235b9905b47d67ed567.css new file mode 100644 index 0000000..fcd0e30 --- /dev/null +++ b/public/assets/css/stylesheet.64013ace36f887a1be8abc1df1be4d95134f7701fc118235b9905b47d67ed567.css @@ -0,0 +1,7 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ +:root{--gap: 30px;--content-gap: 20px;--nav-width: 1024px;--main-width: 720px;--header-height: 60px;--footer-height: 60px;--radius: 8px;--theme: rgb(255, 255, 255);--entry: rgb(255, 255, 255);--primary: rgb(30, 30, 30);--secondary: rgb(108, 108, 108);--tertiary: rgb(214, 214, 214);--content: rgb(31, 31, 31);--hljs-bg: rgb(28, 29, 33);--code-bg: rgb(245, 245, 245);--border: rgb(238, 238, 238)}.dark{--theme: rgb(29, 30, 32);--entry: rgb(46, 46, 51);--primary: rgb(218, 218, 219);--secondary: rgb(155, 156, 157);--tertiary: rgb(65, 66, 68);--content: rgb(196, 196, 197);--hljs-bg: rgb(46, 46, 51);--code-bg: rgb(55, 56, 62);--border: rgb(51, 51, 51)}.list{background:var(--code-bg)}.dark.list{background:var(--theme)}*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}body{font-family:-apple-system,BlinkMacSystemFont,segoe ui,Roboto,Oxygen,Ubuntu,Cantarell,open sans,helvetica neue,sans-serif;font-size:18px;line-height:1.6;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2) var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0px 0px 0px var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}body.dark #moon{vertical-align:middle;display:none}body:not(.dark) #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid currentColor}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons{padding:12px 0}.social-icons a:not(:last-of-type){margin-inline-end:12px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap) 0 calc(var(--gap) * 2) 0}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:34px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;margin-bottom:var(--gap);padding:var(--gap);border-radius:var(--radius);transition:transform .1s}.post-entry:active{transform:scale(0.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:24px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-cover,.entry-isdraft{font-size:14px;color:var(--secondary)}.entry-cover{margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);pointer-events:none;width:100%;height:auto}.entry-cover a{color:var(--secondary);box-shadow:0 1px 0 var(--primary)}@font-face{font-family:gowun;src:url(gowun.woff2)}@font-face{font-family:LINE Seed KR;src:url(lineseed.woff2)}.page-header,.post-header{margin:24px auto calc(var(--content-gap) + 20px) auto}.post-title{margin-top:10px;margin-bottom:16px;font-size:32px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px;display:flex;flex-wrap:wrap}.post-meta .i18n_list li{display:inline-flex;list-style:none;margin:auto 3px;box-shadow:0 1px 0 var(--secondary)}.breadcrumbs a{font-size:16px}.post-content{font-family:LINE Seed KR;color:var(--content)}.post-content h3,.post-content h4,.post-content h5,a .post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.toc a:hover{box-shadow:0 1px 0}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:none;background:linear-gradient(to right,var(--primary) 100%,transparent 0) 0 50%/1px 1px repeat-x}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:32px}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:12px 8px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{font-size:14px;text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--hljs-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:block;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--hljs-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin:0 2px 40px;border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}.dark .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:20px}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:0 20px;padding:10px 20px}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:56px}.post-tags li{display:inline-block;margin-inline-end:3px;margin-bottom:5px}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius)}.post-tags a{display:block;padding-inline-start:14px;padding-inline-end:14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.share-buttons{margin:14px 0;padding-inline-start:var(--radius);display:flex;justify-content:center;overflow-x:auto}.share-buttons a{margin-top:10px}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{margin:10px 0;display:flex;line-height:30px;border-radius:var(--radius)}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 0 0}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner h1{padding:12px 0}.profile img{display:inline-table;border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px;margin:0 auto}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(0.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(0.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(0.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(0.96)}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs{display:block;overflow-x:auto;background:#1c1d21;color:#c0c5ce;padding:.5em}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-track{background:var(--code-bg)}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}.list:not(.dark)::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--hljs-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap: 14px}.profile img{transform:scale(0.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2) var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}}:root{--theme: rgb(255, 255, 255);--entry: rgb(255, 255, 255);--primary: rgb(30, 30, 30);--secondary: rgb(108, 108, 108);--tertiary: rgb(214, 214, 214);--content: rgb(31, 31, 31);--hljs-bg: rgb(28, 29, 33);--code-bg: rgb(245, 245, 245);--border: rgb(238, 238, 238)}.dark{--theme: #000;--entry: rgb(46, 46, 51);--primary: #fff;--secondary: #ddd;--tertiary: rgba(1, 1, 5, 0.32);--content: rgb(196, 196, 197);--hljs-bg: rgb(46, 46, 51);--code-bg: rgb(55, 56, 62);--border: rgb(51, 51, 51)} \ No newline at end of file diff --git a/public/assets/css/stylesheet.688e9283c99a71ee5818e794a19acaf6347ebe8d106a4fb5545b6cc7ffe22801.css b/public/assets/css/stylesheet.688e9283c99a71ee5818e794a19acaf6347ebe8d106a4fb5545b6cc7ffe22801.css new file mode 100644 index 0000000..3c15a3f --- /dev/null +++ b/public/assets/css/stylesheet.688e9283c99a71ee5818e794a19acaf6347ebe8d106a4fb5545b6cc7ffe22801.css @@ -0,0 +1,7 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ +:root{--gap:30px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:#242424;--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:#242424;--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:white;--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--code-bg)}.dark.list{background:var(--theme)}@import 'https://fonts.googleapis.com/css2?family=Source+Sans+3&display=swap';@import "https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/static/pretendard.css";*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}body{font-family:"source sans 3",pretendard,sans-serif!important;font-size:15px;line-height:1.8;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2)var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0 0 0 var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}body.dark #moon{vertical-align:middle;display:none}body:not(.dark) #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons{padding:12px 0}.social-icons a:not(:last-of-type){margin-inline-end:12px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap)0 calc(var(--gap) * 2)}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:34px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;margin-bottom:var(--gap);padding:var(--gap);border-radius:var(--radius);transition:transform .1s}.post-entry:active{transform:scale(.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:24px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-cover,.entry-isdraft{font-size:14px;color:var(--secondary)}.entry-cover{margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);pointer-events:none;width:100%;height:auto}.entry-cover a{color:var(--secondary);box-shadow:0 1px 0 var(--primary)}.page-header,.post-header{margin:24px auto calc(var(--content-gap) + 20px)}.post-title{margin-top:10px;margin-bottom:16px;font-size:24px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px;display:flex;flex-wrap:wrap}.post-meta .i18n_list li{display:inline-flex;list-style:none;margin:auto 3px;box-shadow:0 1px 0 var(--secondary)}.breadcrumbs a{font-size:16px}.post-content{font-family:inherit;color:var(--content)}.post-content h3,.post-content h4,.post-content h5,a .post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.toc a:hover{box-shadow:0 1px}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:none;background:linear-gradient(to right,var(--primary) 100%,transparent 0)0/1px 1px repeat-x}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:32px}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:12px 8px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{font-size:14px;text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--hljs-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:block;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--hljs-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin:0 2px 40px;border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}.dark .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:20px}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:0 20px;padding:10px 20px}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:56px}.post-tags li{display:inline-block;margin-inline-end:3px;margin-bottom:5px}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius)}.post-tags a{display:block;padding-inline-start:14px;padding-inline-end:14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.share-buttons{margin:14px 0;padding-inline-start:var(--radius);display:flex;justify-content:center;overflow-x:auto}.share-buttons a{margin-top:10px}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{margin:10px 0;display:flex;line-height:30px;border-radius:var(--radius)}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 0}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner h1{padding:12px 0}.profile img{display:inline-table;border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px;margin:0 auto}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(.96)}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs{display:block;overflow-x:auto;background:#1c1d21;color:#c0c5ce;padding:.5em}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-track{background:var(--code-bg)}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}.list:not(.dark)::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--hljs-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap:14px}.profile img{transform:scale(.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2)var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}} \ No newline at end of file diff --git a/public/assets/css/stylesheet.6fb38170e6e1e68be3f8be786701a4ce7971dc7f8e6d46c2edeeb3bb1555198b.css b/public/assets/css/stylesheet.6fb38170e6e1e68be3f8be786701a4ce7971dc7f8e6d46c2edeeb3bb1555198b.css new file mode 100644 index 0000000..fcc4361 --- /dev/null +++ b/public/assets/css/stylesheet.6fb38170e6e1e68be3f8be786701a4ce7971dc7f8e6d46c2edeeb3bb1555198b.css @@ -0,0 +1,7 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ +:root{--gap:30px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:white;--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--code-bg)}.dark.list{background:var(--theme)}@import 'https://fonts.googleapis.com/css2?family=Source+Sans+3&display=swap';@import "https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/static/pretendard.css";*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}body{font-family:"source sans 3",pretendard,sans-serif!important;font-size:15px;line-height:1.8;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2)var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0 0 0 var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}body.dark #moon{vertical-align:middle;display:none}body:not(.dark) #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons{padding:12px 0}.social-icons a:not(:last-of-type){margin-inline-end:12px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap)0 calc(var(--gap) * 2)}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:34px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;margin-bottom:var(--gap);padding:var(--gap);border-radius:var(--radius);transition:transform .1s}.post-entry:active{transform:scale(.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:24px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-cover,.entry-isdraft{font-size:14px;color:var(--secondary)}.entry-cover{margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);pointer-events:none;width:100%;height:auto}.entry-cover a{color:var(--secondary);box-shadow:0 1px 0 var(--primary)}.page-header,.post-header{margin:24px auto calc(var(--content-gap) + 20px)}.post-title{margin-top:10px;margin-bottom:16px;font-size:24px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px;display:flex;flex-wrap:wrap}.post-meta .i18n_list li{display:inline-flex;list-style:none;margin:auto 3px;box-shadow:0 1px 0 var(--secondary)}.breadcrumbs a{font-size:16px}.post-content{font-family:inherit;color:var(--content)}.post-content h3,.post-content h4,.post-content h5,a .post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.toc a:hover{box-shadow:0 1px}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:none;background:linear-gradient(to right,var(--primary) 100%,transparent 0)0/1px 1px repeat-x}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:32px}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:12px 8px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{font-size:14px;text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--hljs-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:block;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--hljs-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin:0 2px 40px;border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}.dark .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:20px}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:0 20px;padding:10px 20px}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:56px}.post-tags li{display:inline-block;margin-inline-end:3px;margin-bottom:5px}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius)}.post-tags a{display:block;padding-inline-start:14px;padding-inline-end:14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.share-buttons{margin:14px 0;padding-inline-start:var(--radius);display:flex;justify-content:center;overflow-x:auto}.share-buttons a{margin-top:10px}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{margin:10px 0;display:flex;line-height:30px;border-radius:var(--radius)}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 0}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner h1{padding:12px 0}.profile img{display:inline-table;border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px;margin:0 auto}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(.96)}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs{display:block;overflow-x:auto;background:#1c1d21;color:#c0c5ce;padding:.5em}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-track{background:var(--code-bg)}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}.list:not(.dark)::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--hljs-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap:14px}.profile img{transform:scale(.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2)var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}}:root{--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:#000;--entry:rgb(46, 46, 51);--primary:#fff;--secondary:#ddd;--tertiary:rgba(1, 1, 5, 0.32);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)} \ No newline at end of file diff --git a/public/assets/css/stylesheet.79528d080532744ab99d7e1ee310866286dfff3a27bfb6e489adbe8235ebfb64.css b/public/assets/css/stylesheet.79528d080532744ab99d7e1ee310866286dfff3a27bfb6e489adbe8235ebfb64.css new file mode 100644 index 0000000..b6b5045 --- /dev/null +++ b/public/assets/css/stylesheet.79528d080532744ab99d7e1ee310866286dfff3a27bfb6e489adbe8235ebfb64.css @@ -0,0 +1,7 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ +:root{--gap:30px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--code-bg)}.dark.list{background:var(--theme)}@import 'https://fonts.googleapis.com/css2?family=Source+Sans+3&display=swap';@import "https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/static/pretendard.css";*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}body{font-family:"source sans 3",pretendard,sans-serif!important;font-size:15px;line-height:1.8;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2)var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0 0 0 var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}body.dark #moon{vertical-align:middle;display:none}body:not(.dark) #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons{padding:12px 0}.social-icons a:not(:last-of-type){margin-inline-end:12px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap)0 calc(var(--gap) * 2)}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:34px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;margin-bottom:var(--gap);padding:var(--gap);border-radius:var(--radius);transition:transform .1s}.post-entry:active{transform:scale(.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:24px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-cover,.entry-isdraft{font-size:14px;color:var(--secondary)}.entry-cover{margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);pointer-events:none;width:100%;height:auto}.entry-cover a{color:var(--secondary);box-shadow:0 1px 0 var(--primary)}.page-header,.post-header{margin:24px auto calc(var(--content-gap) + 20px)}.post-title{margin-top:10px;margin-bottom:16px;font-size:24px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px;display:flex;flex-wrap:wrap}.post-meta .i18n_list li{display:inline-flex;list-style:none;margin:auto 3px;box-shadow:0 1px 0 var(--secondary)}.breadcrumbs a{font-size:16px}.post-content{font-family:inherit;color:var(--content)}.post-content h3,.post-content h4,.post-content h5,a .post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.toc a:hover{box-shadow:0 1px}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:none;background:linear-gradient(to right,var(--primary) 100%,transparent 0)0/1px 1px repeat-x}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:32px}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:12px 8px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{font-size:14px;text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--hljs-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:block;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--hljs-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin:0 2px 40px;border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}.dark .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:20px}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:0 20px;padding:10px 20px}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:56px}.post-tags li{display:inline-block;margin-inline-end:3px;margin-bottom:5px}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius)}.post-tags a{display:block;padding-inline-start:14px;padding-inline-end:14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.share-buttons{margin:14px 0;padding-inline-start:var(--radius);display:flex;justify-content:center;overflow-x:auto}.share-buttons a{margin-top:10px}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{margin:10px 0;display:flex;line-height:30px;border-radius:var(--radius)}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 0}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner h1{padding:12px 0}.profile img{display:inline-table;border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px;margin:0 auto}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(.96)}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs{display:block;overflow-x:auto;background:#1c1d21;color:#c0c5ce;padding:.5em}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-track{background:var(--code-bg)}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}.list:not(.dark)::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--hljs-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap:14px}.profile img{transform:scale(.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2)var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}}:root{--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:#000;--entry:rgb(46, 46, 51);--primary:#fff;--secondary:#ddd;--tertiary:rgba(1, 1, 5, 0.32);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)} \ No newline at end of file diff --git a/public/assets/css/stylesheet.a2c159d6026cb355c26fac9b3d5ce5dce6f31e41266c2227af80fea59903abc7.css b/public/assets/css/stylesheet.a2c159d6026cb355c26fac9b3d5ce5dce6f31e41266c2227af80fea59903abc7.css new file mode 100644 index 0000000..3feb8f8 --- /dev/null +++ b/public/assets/css/stylesheet.a2c159d6026cb355c26fac9b3d5ce5dce6f31e41266c2227af80fea59903abc7.css @@ -0,0 +1,7 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ +:root{--gap:30px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:#242424;--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:white;--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--code-bg)}.dark.list{background:var(--theme)}@import 'https://fonts.googleapis.com/css2?family=Source+Sans+3&display=swap';@import "https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/static/pretendard.css";*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}body{font-family:"source sans 3",pretendard,sans-serif!important;font-size:15px;line-height:1.8;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2)var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0 0 0 var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}body.dark #moon{vertical-align:middle;display:none}body:not(.dark) #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons{padding:12px 0}.social-icons a:not(:last-of-type){margin-inline-end:12px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap)0 calc(var(--gap) * 2)}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:34px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;margin-bottom:var(--gap);padding:var(--gap);border-radius:var(--radius);transition:transform .1s}.post-entry:active{transform:scale(.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:24px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-cover,.entry-isdraft{font-size:14px;color:var(--secondary)}.entry-cover{margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);pointer-events:none;width:100%;height:auto}.entry-cover a{color:var(--secondary);box-shadow:0 1px 0 var(--primary)}.page-header,.post-header{margin:24px auto calc(var(--content-gap) + 20px)}.post-title{margin-top:10px;margin-bottom:16px;font-size:24px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px;display:flex;flex-wrap:wrap}.post-meta .i18n_list li{display:inline-flex;list-style:none;margin:auto 3px;box-shadow:0 1px 0 var(--secondary)}.breadcrumbs a{font-size:16px}.post-content{font-family:inherit;color:var(--content)}.post-content h3,.post-content h4,.post-content h5,a .post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.toc a:hover{box-shadow:0 1px}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:none;background:linear-gradient(to right,var(--primary) 100%,transparent 0)0/1px 1px repeat-x}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:32px}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:12px 8px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{font-size:14px;text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--hljs-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:block;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--hljs-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin:0 2px 40px;border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}.dark .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:20px}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:0 20px;padding:10px 20px}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:56px}.post-tags li{display:inline-block;margin-inline-end:3px;margin-bottom:5px}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius)}.post-tags a{display:block;padding-inline-start:14px;padding-inline-end:14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.share-buttons{margin:14px 0;padding-inline-start:var(--radius);display:flex;justify-content:center;overflow-x:auto}.share-buttons a{margin-top:10px}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{margin:10px 0;display:flex;line-height:30px;border-radius:var(--radius)}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 0}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner h1{padding:12px 0}.profile img{display:inline-table;border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px;margin:0 auto}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(.96)}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs{display:block;overflow-x:auto;background:#1c1d21;color:#c0c5ce;padding:.5em}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-track{background:var(--code-bg)}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}.list:not(.dark)::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--hljs-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap:14px}.profile img{transform:scale(.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2)var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}}:root{--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:#000;--entry:rgb(46, 46, 51);--primary:#fff;--secondary:#ddd;--tertiary:rgba(1, 1, 5, 0.32);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)} \ No newline at end of file diff --git a/public/assets/css/stylesheet.c9a7485e6b21b03f4aada853aa4f359b64dc3689527b6a6b100ed040291ea5e2.css b/public/assets/css/stylesheet.c9a7485e6b21b03f4aada853aa4f359b64dc3689527b6a6b100ed040291ea5e2.css new file mode 100644 index 0000000..e4dd734 --- /dev/null +++ b/public/assets/css/stylesheet.c9a7485e6b21b03f4aada853aa4f359b64dc3689527b6a6b100ed040291ea5e2.css @@ -0,0 +1,7 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ +:root{--gap:30px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:#242424;--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:#242424;--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:white;--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--code-bg)}.dark.list{background:var(--theme)}@import 'https://fonts.googleapis.com/css2?family=Source+Sans+3&display=swap';@import "https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/static/pretendard.css";*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}h1{font-size:24px}h2{font-size:18px}h3{font-size:16px}body{font-family:"source sans 3",pretendard,sans-serif!important;font-size:14px;line-height:1.8;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2)var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0 0 0 var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}body.dark #moon{vertical-align:middle;display:none}body:not(.dark) #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons{padding:12px 0}.social-icons a:not(:last-of-type){margin-inline-end:12px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap)0 calc(var(--gap) * 2)}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:34px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;margin-bottom:var(--gap);padding:var(--gap);border-radius:var(--radius);transition:transform .1s}.post-entry:active{transform:scale(.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:24px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-cover,.entry-isdraft{font-size:14px;color:var(--secondary)}.entry-cover{margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);pointer-events:none;width:100%;height:auto}.entry-cover a{color:var(--secondary);box-shadow:0 1px 0 var(--primary)}.page-header,.post-header{margin:24px auto calc(var(--content-gap) + 20px)}.post-title{margin-top:10px;margin-bottom:16px;font-size:24px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px;display:flex;flex-wrap:wrap}.post-meta .i18n_list li{display:inline-flex;list-style:none;margin:auto 3px;box-shadow:0 1px 0 var(--secondary)}.breadcrumbs a{font-size:16px}.post-content{font-family:inherit;color:var(--content)}.post-content h3,.post-content h4,.post-content h5,a .post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.toc a:hover{box-shadow:0 1px}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:none;background:linear-gradient(to right,var(--primary) 100%,transparent 0)0/1px 1px repeat-x}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:32px}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:12px 8px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{font-size:14px;text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--hljs-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:block;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--hljs-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin:0 2px 40px;border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}.dark .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:20px}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:0 20px;padding:10px 20px}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:56px}.post-tags li{display:inline-block;margin-inline-end:3px;margin-bottom:5px}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius)}.post-tags a{display:block;padding-inline-start:14px;padding-inline-end:14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.share-buttons{margin:14px 0;padding-inline-start:var(--radius);display:flex;justify-content:center;overflow-x:auto}.share-buttons a{margin-top:10px}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{margin:10px 0;display:flex;line-height:30px;border-radius:var(--radius)}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 0}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner h1{padding:12px 0}.profile img{display:inline-table;border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px;margin:0 auto}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(.96)}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs{display:block;overflow-x:auto;background:#1c1d21;color:#c0c5ce;padding:.5em}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-track{background:var(--code-bg)}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}.list:not(.dark)::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--hljs-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap:14px}.profile img{transform:scale(.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2)var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}} \ No newline at end of file diff --git a/public/assets/css/stylesheet.cee0caf510d739f89358556ea7338ec5bfc11001d7c225dc92cc4b0e6d29c8e6.css b/public/assets/css/stylesheet.cee0caf510d739f89358556ea7338ec5bfc11001d7c225dc92cc4b0e6d29c8e6.css new file mode 100644 index 0000000..5cf6bfe --- /dev/null +++ b/public/assets/css/stylesheet.cee0caf510d739f89358556ea7338ec5bfc11001d7c225dc92cc4b0e6d29c8e6.css @@ -0,0 +1,7 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ +:root{--gap:30px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:#242424;--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--hljs-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238)}.dark{--theme:#242424;--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:white;--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--code-bg)}.dark.list{background:var(--theme)}@import 'https://fonts.googleapis.com/css2?family=Source+Sans+3&display=swap';@import "https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/static/pretendard.css";*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}body{font-family:"source sans 3",pretendard,sans-serif!important;font-size:14px;line-height:1.8;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2)var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0 0 0 var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}body.dark #moon{vertical-align:middle;display:none}body:not(.dark) #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons{padding:12px 0}.social-icons a:not(:last-of-type){margin-inline-end:12px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap)0 calc(var(--gap) * 2)}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:34px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;margin-bottom:var(--gap);padding:var(--gap);border-radius:var(--radius);transition:transform .1s}.post-entry:active{transform:scale(.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:24px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-cover,.entry-isdraft{font-size:14px;color:var(--secondary)}.entry-cover{margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);pointer-events:none;width:100%;height:auto}.entry-cover a{color:var(--secondary);box-shadow:0 1px 0 var(--primary)}.page-header,.post-header{margin:24px auto calc(var(--content-gap) + 20px)}.post-title{margin-top:10px;margin-bottom:16px;font-size:24px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px;display:flex;flex-wrap:wrap}.post-meta .i18n_list li{display:inline-flex;list-style:none;margin:auto 3px;box-shadow:0 1px 0 var(--secondary)}.breadcrumbs a{font-size:16px}.post-content{font-family:inherit;color:var(--content)}.post-content h3,.post-content h4,.post-content h5,a .post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.toc a:hover{box-shadow:0 1px}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:none;background:linear-gradient(to right,var(--primary) 100%,transparent 0)0/1px 1px repeat-x}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:32px}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:12px 8px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{font-size:14px;text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--hljs-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:block;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--hljs-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin:0 2px 40px;border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}.dark .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:20px}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:0 20px;padding:10px 20px}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:56px}.post-tags li{display:inline-block;margin-inline-end:3px;margin-bottom:5px}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius)}.post-tags a{display:block;padding-inline-start:14px;padding-inline-end:14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.share-buttons{margin:14px 0;padding-inline-start:var(--radius);display:flex;justify-content:center;overflow-x:auto}.share-buttons a{margin-top:10px}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{margin:10px 0;display:flex;line-height:30px;border-radius:var(--radius)}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 0}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner h1{padding:12px 0}.profile img{display:inline-table;border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px;margin:0 auto}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(.96)}.hljs-comment,.hljs-quote{color:#b6b18b}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#eb3c54}.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#e7ce56}.hljs-attribute{color:#ee7c2b}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:#4fb4d7}.hljs-section,.hljs-title{color:#78bb65}.hljs-keyword,.hljs-selector-tag{color:#b45ea4}.hljs{display:block;overflow-x:auto;background:#1c1d21;color:#c0c5ce;padding:.5em}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-track{background:var(--code-bg)}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}.list:not(.dark)::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--hljs-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap:14px}.profile img{transform:scale(.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2)var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}} \ No newline at end of file diff --git a/public/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js b/public/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js new file mode 100644 index 0000000..93a6f86 --- /dev/null +++ b/public/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js @@ -0,0 +1,44 @@ +/* + Highlight.js 10.2.1 (32fb9a1d) + License: BSD-3-Clause + Copyright (c) 2006-2020, Ivan Sagalaev +*/ +var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){s+=""}function g(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var d=l();if(s+=t(r.substring(i,d[0].offset)),i=d[0].offset,d===e){o.reverse().forEach(u);do{g(d.splice(0,1)[0]),d=l()}while(d===e&&d.length&&d[0].offset===i);o.reverse().forEach(c)}else"start"===d[0].event?o.push(d[0].node):o.pop(),g(d.splice(0,1)[0])}return s+t(r.substr(i))}});const s="",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=``}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function g(e){return e?"string"==typeof e?e:e.source:null}const d="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},m={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},b=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(m),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=b("//","$"),x=b("/\\*","\\*/"),E=b("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:d,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>g(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:m,COMMENT:b,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:d,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),w="of and for in not or if then".split(" ");function N(e,n){return n?+n:function(e){return w.includes(e.toLowerCase())}(e)?0:1}const y={props:["language","code","autodetect"],data:function(){return{detectedLanguage:"",unknownLanguage:!1}},computed:{className(){return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){if(!this.autoDetect&&!hljs.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`),this.unknownLanguage=!0,t(this.code);let e;return this.autoDetect?(e=hljs.highlightAuto(this.code),this.detectedLanguage=e.language):(e=hljs.highlight(this.language,this.code,this.ignoreIllegals),this.detectectLanguage=this.language),e.value},autoDetect(){return!(this.language&&(e=this.autodetect,!e&&""!==e));var e},ignoreIllegals:()=>!0},render(e){return e("pre",{},[e("code",{class:this.className,domProps:{innerHTML:this.highlighted}})])}},R={install(e){e.component("highlightjs",y)}},k=t,M=r,{nodeStream:O,mergeStreams:L}=i,A=Symbol("nomatch");return function(t){var a=[],i=Object.create(null),s=Object.create(null),o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,d="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function m(e,n,t,r){var a={code:n,language:e};j("before:highlight",a);var i=a.result?a.result:b(a.language,a.code,t,r);return i.code=a.code,j("after:highlight",i),i}function b(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=R.subLanguage?function(){if(""!==L){var e=null;if("string"==typeof R.subLanguage){if(!i[R.subLanguage])return void O.addText(L);e=b(R.subLanguage,L,!0,M[R.subLanguage]),M[R.subLanguage]=e.top}else e=v(L,R.subLanguage.length?R.subLanguage:null);R.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!R.keywords)return void O.addText(L);let e=0;R.keywordPatternRe.lastIndex=0;let n=R.keywordPatternRe.exec(L),t="";for(;n;){t+=L.substring(e,n.index);const r=c(R,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=R.keywordPatternRe.lastIndex,n=R.keywordPatternRe.exec(L)}t+=L.substr(e),O.addText(t)}(),L=""}function h(e){return e.className&&O.openNode(e.className),R=Object.create(e,{parent:{value:R}})}function p(e){return 0===R.matcher.regexIndex?(L+=e[0],1):(S=!0,0)}var m={};function x(t,r){var i=r&&r[0];if(L+=t,null==i)return u(),0;if("begin"===m.type&&"end"===r.type&&m.index===r.index&&""===i){if(L+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=m.rule,n}return 1}if(m=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?L+=t:(r.excludeBegin&&(L+=t),u(),r.returnBegin||r.excludeBegin||(L=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(R.className||"")+'"');throw e.mode=R,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(R,e,r);if(!a)return A;var i=R;i.skip?L+=t:(i.returnEnd||i.excludeEnd||(L+=t),u(),i.excludeEnd&&(L=t));do{R.className&&O.closeNode(),R.skip||R.subLanguage||(I+=R.relevance),R=R.parent}while(R!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==A)return s}if("illegal"===r.type&&""===i)return 1;if(j>1e5&&j>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return L+=i,i.length}var E=y(e);if(!E)throw console.error(d.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(g(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;let t=n.exec(e);if(this.resumingScanAtSamePosition())if(t&&t.index===this.lastIndex);else{const n=this.getMatcher(0);n.lastIndex=this.lastIndex+1,t=n.exec(e)}return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&this.considerAll()),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,N(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=g(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),w="",R=s||_,M={},O=new f.__emitter(f);!function(){for(var e=[],n=R;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var L="",I=0,T=0,j=0,S=!1;try{for(R.matcher.considerAll();;){j++,S?S=!1:R.matcher.considerAll(),R.matcher.lastIndex=T;const e=R.matcher.exec(o);if(!e)break;const n=x(o.substring(T,e.index),e);T=e.index+n}return x(o.substr(T)),O.closeAllNodes(),O.finalize(),w=O.toHTML(),{relevance:I,value:w,language:e,illegal:!1,emitter:O,top:R}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(T-100,T+100),mode:n.mode},sofar:w,relevance:0,value:k(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:k(o),emitter:O,language:e,top:R,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:k(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(y).filter(T).forEach((function(n){var a=b(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"
":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=y(t[1]);return r||(console.warn(d.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||y(e))}(e);if(p(t))return;j("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n"):n=e;const r=n.textContent,a=t?m(t,r,!0):v(r),i=O(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=L(i,O(e),r)}a.value=x(a.value),j("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const w=()=>{if(!w.called){w.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function y(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function I(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function T(e){var n=y(e);return n&&!n.disableAutodetect}function j(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:m,highlightAuto:v,fixMarkup:function(e){return console.warn("fixMarkup is deprecated and will be removed entirely in v11.0"),console.warn("Please see https://github.com/highlightjs/highlight.js/issues/2534"),x(e)},highlightBlock:E,configure:function(e){f=M(f,e)},initHighlighting:w,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",w,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&I(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:y,registerAliases:I,requireLanguage:function(e){var n=y(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:T,inherit:M,addPlugin:function(e){o.push(e)},vuePlugin:R}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.2.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); +hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}()); +hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}()); +hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin://,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}()); +hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.requireLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}()); +hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}()); +hljs.registerLanguage("cpp",function(){"use strict";return function(e){var i=e.requireLanguage("c-like").rawDefinition();return i.disableAutodetect=!1,i.name="C++",i.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],i}}()); +hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in init int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"record",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}()); +hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}()); +hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}()); +hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface enum",end:/[{;=]/,excludeEnd:!0,keywords:"class interface enum",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}()); +hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*$)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:""},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}()); +hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}()); +hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}()); +hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}()); +hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); +hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:")",end:">",keywords:{name:"style"},contains:[c],starts:{end:"",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:")",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}()); +hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}()); +hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}()); +hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}()); +hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}()); +hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]},n=e.inherit(e.APOS_STRING_MODE,{illegal:null}),i=e.inherit(e.QUOTE_STRING_MODE,{illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(a)}),o=e.END_SAME_AS_BEGIN({begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/,contains:e.QUOTE_STRING_MODE.contains.concat(a)}),l={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[e.inherit(n,{begin:"b'",end:"'"}),e.inherit(i,{begin:'b"',end:'"'}),i,n,o]},s={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},c={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:c,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:c,contains:["self",r,e.C_BLOCK_COMMENT_MODE,l,s]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},l,s]}}}()); +hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}()); +hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}()); +hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}()); +hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}()); +hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}()); +hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}()); +hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}}()); +hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}()); +hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}()); +hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}()); +hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin://},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}()); +hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}()); \ No newline at end of file diff --git a/public/categories/index.html b/public/categories/index.html new file mode 100644 index 0000000..d1325d7 --- /dev/null +++ b/public/categories/index.html @@ -0,0 +1,14 @@ +Categories | Morgan's Blog
    \ No newline at end of file diff --git a/public/categories/index.xml b/public/categories/index.xml new file mode 100644 index 0000000..68bb935 --- /dev/null +++ b/public/categories/index.xml @@ -0,0 +1,13 @@ + + + + Categories on Morgan's Blog + http://blog.morgan.kr/categories/ + Recent content in Categories on Morgan's Blog + + http://blog.morgan.kr + http://blog.morgan.kr + + Hugo -- gohugo.io + + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bd8069567ed069fec4e52ca2d3e8cbb1c110409e GIT binary patch literal 102089 zcmeHQ349FKAAf5}A`(FzsUWFT-4VCa5;r|iqNpoXioYw)xHInisQ&9}D?$H`x{HPe z**JnaqO@o#vM8Y>Qi>pH{@=IRVKSNBo!On0P4a#pUvJ)_e@0-o+?93ZNG{lKe z(-0rhvoIl_W1HhL^Hp3lBpPJ_0mgg_LhcmT5P$#7{H98T6c0p8A7j24A^Rt2NHL_e zzd;2F`E8 zbISedjqf#II_vvD{VbQQGkjb>nzz8K?A#V^r7j0GFVMBUPqlHo-k5%S>GUN8;)j-sD=XMypOU3Pn};^XE0~BCj@lcq@JC zh=eDj_tcM?GU8T~(5v?j^x)>ov#r5hi?n;~;k39>7vh)vHf&W)tEDZ5MHJg|rp?K@ zGe->Nv}d=t-$$y-Y;FTe#=eyw`gm!zj=e9wya zR*fo9Yf#9qMSE&I=l(DvCUs%|%dRB2jnmz9vP$O__wAmepODp!dOxgudPvAGrH5$9 zt^VPMuGd)@vA4;f1qVsFn0aNl#IBDS|GyJ`2se6cspU>*2Zfw1yFk;ZTGXb^4+huU z+hpLPW8~K{Zc7`@IDPc8n{MRm+t&V7xZK6$mG3st`g8lsem^xlzUG3VPNY$#Gdm02 zbeXz2zUqRlPC>;6YP)S6HuQ@ITQuaV$Ap&c+5~rwY}w#!^-cHi4mF&8&eaZZYDDgx9!D0R8qZZ5ac$|iw)cK0&-ouG z$r-)7dj#CvSa3jzT0=q(*SV`16nLoWJ3HbF{jt@VH1b{apvb8zBgoi+%}C3Y+jjnQ zVBEuPyS+KrG9&BE>=L&q!fzHSxBSks_t&(Zb)jvA&MpBbwfpO(tQmJC>HQnkmtFd^ z-Mq~=>K5O?HLaXj>f-V3V?*{&{Nk_s&YsZ`#T!pLb7p+R(89G^4_dV*a`+Duzo^$i zqx<^&gPs8!o=tw}yzD)a7IkjbrQxH>b}md(w#RmvUT1ON!3`U^-zgY=XKc&4eaWLL z-xA{e&$IuAyWO}Hx9G#x?`ay%jF^~q>g}uKudeTDZvU-2TQ$7t7;VbAhxhv~KUv}5 z|CDZ7p?*lIS=|fF?%m7;a zysUoRlM)Y0WklU}jr(~>z^ZY?Z_)^^%lVsbwO$*4X3OeO@_gYaa;3rc@qXuTHy-xu z2-n+XhPRH$c(!K=8SpszN#l1bRjGNP$HRe7%0D9ey57H=a`r--^bOqh{a?o&ytJ_b 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 literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..55be2f2 --- /dev/null +++ b/public/index.html @@ -0,0 +1,16 @@ +Morgan's Blog

    Hi, I’m Morgan!


    \ No newline at end of file diff --git a/public/index.xml b/public/index.xml new file mode 100644 index 0000000..7247693 --- /dev/null +++ b/public/index.xml @@ -0,0 +1,316 @@ + + + + Morgan's Blog + http://blog.morgan.kr/ + Recent content on Morgan's Blog + + http://blog.morgan.kr + http://blog.morgan.kr + + Hugo -- gohugo.io + Sat, 06 May 2023 12:55:32 +0000 + + What the hell is USB-C DP Alt mode + http://blog.morgan.kr/posts/what-the-hell-is-usb-c-dp-alt-mode/ + Sat, 06 May 2023 12:55:32 +0000 + + http://blog.morgan.kr/posts/what-the-hell-is-usb-c-dp-alt-mode/ + What the hell is USB-C DP Alt mode To. @hachsiapg, as part of my note +서론: Microsoft Surface Laptop 4 &amp; Linux 제가 밖에서도 쓰고 집에서도 사용하는 만능 서피스 랩탑 4를 사용한지 어느새 2년이 넘었습니다. 그 사이에 리퍼도 받고 OS도 여러번 갈아엎기도 하고, 또 제 하드한 작업들을 잘 버텨주기도 한 정말 대단한 랩탑입니다. 특히 3:2의 광활한 세로는 정말 좋아서 다른 비율의 노트북은 이제 사용할 수 없는 몸이 되어버리기도 했습니다. 길이를 측정해보면 13인치 랩탑들과 동일한데, 세로에 5cm정도를 추가한 정도라 타이틀바 하나정도 넓혀주는 셈이라 마음놓고 패널바를 띄어놓고 사용할 수 있습니다. + + + + Wasting Time + http://blog.morgan.kr/posts/wasting-time/ + Thu, 20 Apr 2023 08:07:41 +0900 + + http://blog.morgan.kr/posts/wasting-time/ + Wasting Time of My Life + + + + (Untitled) + http://blog.morgan.kr/posts/cam-nae-jinjja-sangsangdo-moshaessdeon-ilinde/ + Mon, 03 Oct 2022 15:25:08 +0000 + + http://blog.morgan.kr/posts/cam-nae-jinjja-sangsangdo-moshaessdeon-ilinde/ + + + + + 선택실패 + http://blog.morgan.kr/posts/2022041406/ + Thu, 14 Apr 2022 06:55:25 +0000 + + http://blog.morgan.kr/posts/2022041406/ + 고등학교 3학년 때까지만 해도 나는 무조건 컴퓨터 공학과나 전기전자 공학과. 학과만 보고 대학교에 진학하리라 마음먹었었다. 진짜 학교 이름은 절대 보지 않을 것이라 생각했다. 하지만 막상 입시에 처하고 선택의 갈림길에 있으니 그 다짐은 물거품이 되었다. +역시나, 아니나 다를까 원서 접수 기간이 되니 진로 담당 선생님은 실적을 위해 상위 대학교의 낮은 학과에 원서를 넣어볼 것을 추천하셨다. 말이 추천이지 반 강제로 넣게 되었다. 아무런 관심도 없었고, 3년동안 생각도 없었는데다 자기소개서도 짜맞춰야 쓸 수 있는 학과에 지원했다. + + + + 다른 집 + http://blog.morgan.kr/posts/dareun-jibe-eonjhyeo-sandaneun-geoseun/ + Sat, 09 Apr 2022 04:02:17 +0000 + + http://blog.morgan.kr/posts/dareun-jibe-eonjhyeo-sandaneun-geoseun/ + 우리 집은 창원이다.어렸을 때 서울에 살다가 초증학교때 창원으로 내려왔고, 고등학교 3학년까지 거기서 살아왔다. 고등학교는 기숙사 학교를 가기는 했지만, 내가 가장 마음의 안식을 느끼고 진정으로 쉴 수 있는 곳은 오직 우리 집이다. +대학을 서울로 와서 대학 기숙사에 들어가게 되었다. 고등학교때 기숙사는 들어오자마자 화장실과 샤워실을 리모델링 하기도 했고, 전국에서 아마 가장 넓은 방을 가지고 있었지 않을까 싶다. 각 방마다 냉장고도 있고. 하지만 대학교 기숙사는 참담했다. 2/3로 줄어든 엄청 좁은 방에, 낮은 천장, 허술한 난방, 게다가 못 쓸정도로 더러운 화장실과 때와 곰팡이로 가득한 샤워실까지. + + + + 고등학교 돌아보기 + http://blog.morgan.kr/posts/godeunghaggyo-dolabogi/ + Tue, 21 Dec 2021 16:23:55 +0000 + + http://blog.morgan.kr/posts/godeunghaggyo-dolabogi/ + 2021년을 돌아보며. +2021.12.22 +벌써 12월 22일이다. 12월달에는 열심히 살아야지 하던게 어제같은데 벌써 새해가 다가온다. 나는 내년 성인이 되지만, 아직 실감이 안난다. 술담배를 할 수 있는 나이라기 보다는 내 행동에 내가 책임져야 하는 때가 되었다는 게 더 실감이 난다. 대학을 고민하며 내가 앞으로 뭘 하면서 먹고 살아야할지 꽤 오랫동안 고심했는데, 그 결과로 조금 성장한 것 같아 이제와서는 약간 기쁘기도 하고 무섭기도 하면서 슬픈 약간 오묘한 기분이다. 어찌되었든 이제 성인이 되니까 조금 변해야겠다고 다짐하고 있다. + + + + 대학 입시가 한단계만 남았다. + http://blog.morgan.kr/posts/daehag-ibsiga-handangye-namassda/ + Wed, 01 Dec 2021 08:09:52 +0000 + + http://blog.morgan.kr/posts/daehag-ibsiga-handangye-namassda/ + 대학 입시가 한단계만을 앞두고 있다. +합격자 발표와 등록. +뭐 공부하고 대비해야하는 시험은 다 끝났으니 마음껏 놀고 있지만 마음의 한편에는 아직 불안함이 많이 존재하고 있다. 또 공부와 시험대비라는 정해져 있는 계획만을 12년 동안 따르던 나에게서 갑자기 계획이나 강제성이 사라졌다. 이제부터는 내가 무엇을 할 것인지를 나 혼자서 알아서 결정해야 하고 또한 그 책임도 내가 져야할 것이다. 예를 들어 늦게자도 누군가 깨워주지 않는다는 것에서 그것을 처음으로 느꼈다. +지금 하고싶은 것도 없다. 무언가 해야하는 것도 딱히 없다. + + + + Spectre Attacks: Exploiting Speculative Execution + http://blog.morgan.kr/posts/1-spectre-attacks-exploiting-peculative-execution/ + Sat, 30 Oct 2021 07:19:36 +0000 + + http://blog.morgan.kr/posts/1-spectre-attacks-exploiting-peculative-execution/ + The Central Processing Unit (CPU) is a device that plays a major role as the brain of a computer. The CPU controls four main functions: memory, interpretation, computation, and control, which are based on the role of interpreting the commands of a given program to perform operations with data. In CPU, there are the program counter, a command register, an ALU (arithmetic logic unit), a control unit, a bus, and a register. + + + + 전자 제어의 세계인 미래, 그 보안의 위협 + http://blog.morgan.kr/posts/jeonja-jeeoyi-segyein-mirae-geu-boanyi-wihyeob/ + Sat, 30 Oct 2021 07:17:47 +0000 + + http://blog.morgan.kr/posts/jeonja-jeeoyi-segyein-mirae-geu-boanyi-wihyeob/ + 미래 사회에는 전기자동차와 자율주행 자동차가 성하게 유행할 것이다. 사람 운전자의 역할이 거의 축소되고, AI나 전자적으로 제어될 것인데, 지금도 많이 일어나고 있는 논란은 바로 보안이다. 만약 자율주행 자동차가 해킹을 당하게 된다면 어떨까? 해커는 자동차에 타고 있는 사람의 생사여탈권을 가지게 될 정도로 심각한 문제가 있는 것이다. 그러므로, 이러한 생활환경에 직접적인 영향을 주는 전자기기의 보안은 매우 중요한 것으로 판단된다. 미래에 우리의 생활을 가장 많은 부분 담당할 사물인터넷도 마찬가지이다. 우리의 생활과 강하게 연관되어 있고, 그러므로 보안이 가장 주요한 요인이 된다. + + + + Ad-Tech와 통계의 쓰임새 + http://blog.morgan.kr/posts/ad-techwa-tonggyeyi-sseuimsae/ + Sat, 30 Oct 2021 07:10:34 +0000 + + http://blog.morgan.kr/posts/ad-techwa-tonggyeyi-sseuimsae/ + CTR(클릭률) Click-through rate)는 특정 링크를 클릭한 사용자의 비율. Z지수는 표준점수로, 통계학적인 정규분포를 만들고 각각의 경우가 표준편차상의 어떤 위치를 차지하는지를 보여주는 차원없는 수치이다. Z-지수는 원수치가 평균에서 얼마나 떨어져 있는지를 나타내는 지수로, $ z = \frac{z - \mu}{\sigma} $로 나타난다. ($\sigma$ 표준편차, $\mu$는 모집단의 평균이다. +중심극한정리란 표본의 크기가 커질수록 표본 평균의 분포는 모집단의 분포 모양과는 관계없이 정규분표에 가까워진다는 정리이다. +점추정은 모집단의 특성을 단일한 값으로 추정하는 방법으로, 표본평균과 표본분산을 이용해 모집단의 평균과 분산을 계산해 내는 방법이 대표적인 예이다. + + + + 양자들의 트랜지스터와 핫 캐리어 효과 + http://blog.morgan.kr/posts/yangjadeulyi-teuraenjiseuteo/ + Sat, 30 Oct 2021 07:09:53 +0000 + + http://blog.morgan.kr/posts/yangjadeulyi-teuraenjiseuteo/ + 트랜지스터가 점점 소형화가 되어가면서 전자가 예상한대로 움직이지 않는 작은 단위까지 내려갔다. 나노단위까지 생산공정이 작아지면서 양자역학적인 효과가 나타나기 시작했고, 이는 트랜지스터의 스위칭 작용을 방해하는 효과를 불어일으킨다. 이를 해결하기 위해서 양자 세계에서 사용할 수 있는 양자 트랜지스터와 단일 원자 트랜지스터가 개발되었다. +단일원자 트랜지스터 단일원자 트랜지스터는 양자 터널링 효과를 적극적으로 이용하여 스위칭 작용을 한다. 터널링 효과를 제어하기 위해서 직접 제어가 아닌 양자 얽힘 효과를 이용한다. 큐비트를 이용하여, 전자 주개로써의 원자를 제어하기 위해 원자 개개별의 스핀 상태를 이용한다. + + + + 구글은 그 많은 페이지를 어떻게 찾아낼까. + http://blog.morgan.kr/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga/ + Sat, 30 Oct 2021 07:07:55 +0000 + + http://blog.morgan.kr/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga/ + 구글은 방대한 웹페이지를 자사 데이터베이스에 기록하고 있으며, 이를 토대로 사용자가 검색한 검색결과와 가장 매치되는 페이지를 보여줌으로써 검색엔진의 역할을 할 수 있다. 구글이 이렇게까지 클 수 있었던 이유는 정확한 검색 결과를 보여주는 알고리즘 덕분이다. 그렇다면 이 알고리즘은 무엇일까? 구글이 웹페이지들의 관계를 산출하고 그 수치를 계산해내는 알고리즘인 페이지랭크 알고리즘은 구글의 창시자중 한명인 래리 페이지라는 사람이 석사논문으로 발명한 알고리즘이다. PageRank 알고리즘은 각각의 웹 페이지의 상대적 가중치를 계산하여 각각의 중요도와 연관성을 표현하는 방식을 이용하는데, 이를 이용하여 한 페이지와 가장 연관된 다른 페이지를 Rank를 매겨 정확한 연관성을 보여줄 수 있다. + + + + 인생 두번째 실패. 두번째 대학탈락. + http://blog.morgan.kr/posts/insaeng-dubeonjjae-silpae/ + Sat, 23 Oct 2021 08:52:59 +0000 + + http://blog.morgan.kr/posts/insaeng-dubeonjjae-silpae/ + 내 첫번째 실패는 조기진학 실패이다. 대학을 떨어졌다. +내 두번째 실패도 대학 탈락이다. 이번엔 아직 9번 더 있지만, 작년에 떨어지고 느꼈던 그 참담함과 그 마음가짐을 다시 한번 느낄 수 있게 한 그 세글자 &lsquo;불합격&rsquo;. 역시 이번에도 참담함을 느꼈고, 여전히 안타까움과 공허함을 느낄 수 있었다. +내심 기대했었다. 붙기를 간절히 기도했다. 하지만 세상은 냉정했다. +바라던게 이제는 이룰 수 없다고 생각하니 공허했다. 하지만 그것도 잠깐이었다. 멘탈이 강하고 회복력도 강한게 내 장점이라 공허함으로 쳐져있는 것도 잠깐이었고, 앞으로를 다시 생각하고 마음가짐을 고치는 계기가 되었다. + + + + How I wanted to do. + http://blog.morgan.kr/posts/how-i-wanted-to-do/ + Sat, 23 Oct 2021 08:52:15 +0000 + + http://blog.morgan.kr/posts/how-i-wanted-to-do/ + 프로그래밍에 매력을 느껴 프로그래밍에 입덕하게 된 건 2학년때쯤.. 이후 그 재미를 느끼고 많은 것들을 시도해보곤 했다. HTML과 CSS를 배워 가장 기본적인 웹사이트를 만들고, 이를 더 화려하게 꾸미기 위해 JS를 공부했다. 이를 배포하기 위해 서버 구축에 대해 공부했고, PHP나 MySQL을 이용해 기능성을 부여하면서 DB와 SQL에 대해 공부했다. 이후 고전적인 서버를 넘어 SSR이나 CSR에 대해 알아보려 NodeJS를 공부했다. 학교 입학시 과제였던 C로 하는 PS를 하면서 C나 C++에 관심을 가졌고, 왜 C로 코딩하는데 C++를 써야하는지 의문을 가지고 C++을 공부했다. + + + + 학교에서 했던 프로젝트들.. + http://blog.morgan.kr/posts/haggyoeseo-haessdeon-peurojegteudeul/ + Sat, 23 Oct 2021 08:51:44 +0000 + + http://blog.morgan.kr/posts/haggyoeseo-haessdeon-peurojegteudeul/ + 귀가시간 수집 프로그램 기상곡 수집 프로그램 컴퓨터실 사용현황 학교 내부 정보공유망 문서파일 자동저장 및 복구 시스템 학교 저지 사이트 API 정리 및 제출시스템 프록시 선생님들이 부탁하셨던 수많은 프로그램들 + + + + 개인정보.. Privacy.. + http://blog.morgan.kr/posts/gaeinjeongbo-privacy/ + Sat, 23 Oct 2021 08:31:52 +0000 + + http://blog.morgan.kr/posts/gaeinjeongbo-privacy/ + 나는 구글이 싫었다. +구글에 반대하며 지메일도 거의 쓰지 않고 있고, 다른 구글 플랫폼을 벗어나 다른 플랫폼으로 옮기고 있다. 하지만, 아이폰으로 옮기고 나서 몇주간을 생각해보니 내 분노의 대상은 구글이 아니라 애플이여야 한다는 것을 알게 되었다. 카카오, 구글에 가지고 있던 분노의 이유가 애플이라는 기업 자체를 강타한다. 물론 나도 알고 있었고, 구글 못지 않게 애플을 싫어하고 있었다. 새롭게 휴대폰을바꿀 때에도 OS만 구글이고 제조사는 다양한 (삼성이..겟지만..) 안드로이드 휴대폰과 휴대폰 하드웨어, 악세사리, OS, 결제, 게다가 웹엔진까지 제한하고 독점해버린 애플과는 비교가 된지 않는다고 생각했고, 이번에 플립이 잘 나와서 그것으로 바꾸려 했다. + + + + 데이터센터 + http://blog.morgan.kr/posts/datacenter/ + Sat, 23 Oct 2021 08:15:14 +0000 + + http://blog.morgan.kr/posts/datacenter/ + 구글같은 검색엔진이 늘어나고, 다양한 기업들과 서비스들이 사용자들의 개인정보와 데이터를 마구 수집한다. 이로 인해 생겨나는 기하급수적인 양의 데이터들을 보관할 스토리지와 그것들을 사용할 수 있는 데이터로 가공하기 위해 필요한 수없이 큰 컴퓨팅 파워를, 큰 기업들이 대형으로 지어놓은 데이터 센터가 담당하고 있다. 게다가 이제는 작은 기업이나 서비스들은 AWS나 GCP, Oracle과 같은 서비스를 통해 Cloud로 Computing하기까지 하니, 아마존이나 구글의 데이터 센터는 얼마나 커다랗고, 커다래야 하는지 알 수 있다. +아마존과 구글의 데이터센터뿐 아니라 네이버, MS, 오라클, 및 작은 데이터센터들이 지어질때 중요하게 작용하는 것이 있다. + + + + 블로그 글쓰기는 너무 힘들어.. + http://blog.morgan.kr/posts/beulrogeu-geulsseugineun-neomu-himdeuleo/ + Fri, 08 Oct 2021 05:19:00 +0000 + + http://blog.morgan.kr/posts/beulrogeu-geulsseugineun-neomu-himdeuleo/ + 야심차게 티스토리 블로그를 만들어 몇몇 글을 쓰고 나서, 한참동안이나 글을 쓰지 않았다. 하지만 나중에 돌아보면 쓰일 곳이 있지 않을까 하여 내 소장을 위해 Ghost + Vultr로 넘어왔고, 돈도 내야 하니까 글을 조금씩이라도 쓰지 않을까 생각했지만&hellip;. 결국 글을 쓰지도 않은 채 달마다 돈만 나가고 있다&hellip; +블로그 글을 왜 쓰지 않았지..? 고등학교 생활을 하느라 힘들고 바빠서 (노느라) 글을 쓰지 않았을 수도 있고, 마땅하게 글을 쓸만한 소재도 없고, 마땅하게 글을 쓸 기기 또한 없다. + + + + What I want to do. + http://blog.morgan.kr/posts/what-i-want-to-do/ + Sat, 11 Sep 2021 01:20:00 +0000 + + http://blog.morgan.kr/posts/what-i-want-to-do/ + 저번에 What I wanted to do라는 글을 쓴 적이 있는데, 이번에는 What I want to do라는 제목으로 내가 대학을 다시 지원할 때 까지의 경험을 풀어보려고 한다. +대학 탈락 이후 나는 대학을 한번 떨어진 경험이 있다. 과학고등학교 재학생 중 중상위권이었던 나는 조기진학의 기회를 받았고, KAIST만을 넣은 채로 떨어졌다. 그 때는 붙을 줄 알고 있어서 2학년 2학기 시험을 말아먹었고, 지금도 그 영향을 받아 피를 흘리고 있다. +다행히 그 이후 각성을 한건지 철이 든건지 3학년 1학기는 최상위권 성적을 받아 원래대로 유지는 할 수 있었다. + + + + 시험을 일주일 앞두고 + http://blog.morgan.kr/posts/20210620-siheomeul-iljuil-apdugo/ + Fri, 10 Sep 2021 09:23:28 +0000 + + http://blog.morgan.kr/posts/20210620-siheomeul-iljuil-apdugo/ + 지금까지 내 인생에서 가장 중요한 시험. 그 시험이 일부일 앞으로 다가왔다. 하루종일 시험공부 비슷한걸 하면서 심신이 지쳐 더 이상 집중을 할 수 없을 것 같다. 이제 이 고비만 넘기면 인생에서 가장 날아다닌다는 시기, 대학생이 된다. 앞으로 뭘 하고 살아야 할지, 무엇을 하고 싶은지, 내가 아는 게 많아지고 현실을 깨달으면서 철이 드니 생각이 복잡해지고 앞길이 막막하기만 하다. +몇일 전, 작년에 대학 원서 자기소개서를 다시 읽다 보니 내가 아는 게 많아졌음을 새삼 깨달았다. + + + + Attitude for criticism + http://blog.morgan.kr/posts/attitude-for-criticism/ + Fri, 10 Sep 2021 07:30:10 +0000 + + http://blog.morgan.kr/posts/attitude-for-criticism/ + 요즘 우리 학교에 학교를 개혁하겠다는 학생회장이 나타나고 나서부터 친구들이 학교에 대한 여러 가지 불만들을 풀어내기 시작했다. 나도 마찬가지로 학교에 대한 여러 가지 불만사항들이 많았다. 나는 매 학기마다 개정된 학교 교칙이나 규정들을 정독하는 이벤트를 가지는데, 그때마다 항상 &lsquo;아, 학생들이 당연히 너무 불리하다..&rsquo; 라던가, &lsquo;이 조항은 너무 아닌데, 너무 구시대적인 생각이 아닌가?&lsquo;라는 생각이 들기도 한다. +대학을 가야하는 시기라서 여러 학교들의 생활이나 공부방법, 대학 진학 상황들에 대해서 더욱 관심을 가지게 되었다. 특히 전국급 자사고나 타 지역 과학고의 생활과 공부습관? + + + + 양자 컴퓨터와 양자 어닐링 + http://blog.morgan.kr/posts/yangja-keompyuteowa-yangja-eonilring/ + Fri, 06 Aug 2021 10:36:03 +0000 + + http://blog.morgan.kr/posts/yangja-keompyuteowa-yangja-eonilring/ + 양자 컴퓨터와 양자 어닐링 양자 컴퓨터 입문 / 양자 컴퓨팅 발전과 전망 / 1억배 빠른 양자 컴퓨터가 온다 / 스콧 애론슨의 양자 컴퓨터 강의 +양자 컴퓨터란 무엇일까? Ø 현대 컴퓨터의 발전 과정 20세기, 컴퓨터(Computer)란 말은 계산하는 사람, Computing Person이라는 뜻으로 사용되었다. 하지만 단순 반복 행동을 굳이 사람이 하지 않아도 되는, 일명 계산기계가 사용될 수 있음이 증명되면서, Computer라는 말은 ‘일정한 규칙ㅇㄹ 가지고 주어진 값을 토대로 계산하는 장치’라는 의미를 가지게 되었다. +현대적인 컴퓨터의 정의를 시작한 사람은 ‘찰스 배비지’이다. + + + + Security of IoT + http://blog.morgan.kr/posts/security-of-iot/ + Fri, 06 Aug 2021 10:32:57 +0000 + + http://blog.morgan.kr/posts/security-of-iot/ + Security of IoT IoT란? IoT (Internet of Things)란, 사물인터넷으로, 예전에는 독립적으로 존재했던 각종 전자기기 및 사물들이 인터넷으로 엮여 한번에 관리할 수 있게 되거나, 상호 정보교환과 데이터 수집을 통해 사용자에게 최상의 서비스를 제공하는 기술을 의미이다. 여기에서 사물이라 함은 모든 사물을 포함한다. 데이터를 분석하는 과정에서 인공지능을 주로 사용하므로 IoT는 인공지능 기술이기도 하다. +IoT는 2013년부터 쭉 개발되어 왔으며, 우리 집에서 흔히 볼 수 있는 에어컨, 냉장고등 큰 가구들부터 연결되어 왔다. 그 이후 시간이 지나면서 점점 작은 기구들까지 연결되면서, TV, 전자레인지, 오븐부터 커피포트, 선풍기, 전등 뿐 아니라 변기, 샤워기, 거울, 헤어 드라이기까지 연결되어 있지 않은 것이 없을 정도로 발전되어 왔다. + + + + Hardware Security + http://blog.morgan.kr/posts/hardware-security/ + Fri, 06 Aug 2021 10:31:09 +0000 + + http://blog.morgan.kr/posts/hardware-security/ + Hardware Security 신뢰성과 관련된 기술 1. RoT (Root of Trust) Root of Trust, 신뢰점이란, 전자기기 안에서 별도로 존재하는 프로세싱 유닛으로, 메인 프로세서의 보조로서 다양한 암호화 기법이나 솔루션을 제공하거나 이를 제어하기 위한 보안 기능들을 의미한다. RoT가 궁극적으로 달성하고자 하는 것은 TC(Trusted Computing)으로, 신뢰할 수 있는 컴퓨팅, 즉 믿을 만 하고 무결성이 보장되는 계산 및 기능을 이야기한다. 이를 달성하기 위한, RoT에 포함되는 여러가지 기술들이나 알고리즘이 있고, 각 단계들을 순차적으로 달성되어 신뢰할 수 있는 보안적인 프로세스가 진행된다. + + + + [전산유체역학] CFD with Python (Navier-Stokes Equation) + http://blog.morgan.kr/posts/jeonsanyuceyeoghag-cfd-with-python-navier-stokes-equation/ + Sat, 10 Jul 2021 08:23:47 +0000 + + http://blog.morgan.kr/posts/jeonsanyuceyeoghag-cfd-with-python-navier-stokes-equation/ + 1-D Linear Convection 1차원 선형 열전도 방정식은 가장 심플하면서도 가장 기초적인 방정식입니다. +$$ \frac{\partial u}{\partial t} + c \frac{\partial u}{\partial x} = 0 $$ +이 식을 오일러 방정식으로 변환하여 수치해석적으로 해를 구할 수 있도록 변환을 해줍니다. +$$ u_i^{n+1} = u_i^n - c \frac{\Delta t}{\Delta x}(u_i^n-u_{i-1}^n) $$ +이제 이 오일러 방정식을 파이썬으로 구현해봅니다. +import numpy from matplotlib import pyplot import time, sys %matplotlib inline nx = 41 # try changing this number from 41 to 81 and Run All . + + + + 반도체의 원리, 종류, 소자, 역사, 산업. (MOSFET부터 RAM, FLASH, 그리고 Intel 4004까지. + http://blog.morgan.kr/posts/bandoceyi-weonri-jongryu-soja-yeogsa-saneob-mosfetbuteo-ram-flash-geurigo-intel-4004ggaji/ + Fri, 09 Jul 2021 17:21:52 +0000 + + http://blog.morgan.kr/posts/bandoceyi-weonri-jongryu-soja-yeogsa-saneob-mosfetbuteo-ram-flash-geurigo-intel-4004ggaji/ + .1번 반도체란?.2번 반도체 소자의 종류.3번 기본소자 – 다이오드.4번 기본소자 – 트랜지스터…1번째 MOFSETMOFSET(Metal-Oxide Semiconductor Field-Effect Transistor) 금속-산화 반도체 전계효과 트랜지스터1번째 금속산화 반도체란? 도핑된 반도체 기판 위에 SiO2로 된 절연층과 금속을 적층시켜 제작한 구조. 2번째 MOSFET TransistorNPN의 구조입니다. 두 N을 각각 Drain과 Source라고 합니다. Source에는 Ground가, Drain에는 전압이 인가됩니다. 위에서 서술했듯이 Drain과 Source사이에 채널이 형성됩니다. 이때 Gate와 Back Gate(아랫쪽 P반도체)사이에 전압을 인가해 주면 게이트와 P사이에 전기장 형성, 이에 의해 전자가 게이트쪽으로 올라갑니다. 이 때문에 Drain과 Source 사이 전류가 흐를 수 있다. + + + + Cryptography + http://blog.morgan.kr/posts/cryptography/ + Fri, 09 Jul 2021 10:24:00 +0000 + + http://blog.morgan.kr/posts/cryptography/ + Cryptography 공개키 암호화 알고리즘. 1. Diffie-Hellman 디피-헬먼 키 교환 방식은 암호화 통신을 위한 키를 교환하는 방식 중 하나이다. 두 통신 주체가 공통의 비밀 키를 사용할 수 있도록 하는 안전한 알고리즘이다. 디피-헬먼 방식은 기초적인 암호 통신 방법으로, 이 알고리즘에 RSA나 ECC같은 암호화 알고리즘을 합쳐서 암호화 통신이 성립된다. 공개키는 암호화할 수 있는 키이고, 개인키는 복호화할 수 있는 키이다. +디피-헬먼 키 교환은 공개키 암호화 방식에 기반한다. 공개키 암호화 방식이란, 자신의 공개키를 상대방에게 전송하고, 그 상대방은 그 공개키로 데이터를 암호화해서 전송하면, 자신은 자신의 개인키로 복호화 할 수 있어, 통신이 성립되는 방식이다. + + + + 파이썬으로 구현한 뉴턴의 방정식과 적분방정식 + http://blog.morgan.kr/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo/ + Fri, 21 May 2021 13:18:27 +0000 + + http://blog.morgan.kr/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo/ + 우리의 세계에서 물체의 역학적 운동을 지배하는, 지배방정식이 있죠.뉴턴의 법칙, 방정식입니다.뉴턴의 법칙은 총 세개의 방정식이 있죠. 이 세가지 법칙만을 이용해서 물체의 운동을 계산할 수 있습니다.이것을 바탕으로 만들어진 역설이 라플라스의 역설이죠. 만약 모든 분자의 가속도, 속도, 위치 세가지 정보를 알고 있다면, 뉴턴의 법칙에 근거하여 그 다음 상황을 예측할 수 있고, 따라서 이 세상, 아니면 그것을 넘어서서 모든 분자의 정보를 알 수 있습니다.우리가 여기서 분석할 것은 가장 쉬운 법칙, 뉴턴의 제 2법칙, 가속도의 법칙입니다. + + + + What I wanted to do. + http://blog.morgan.kr/posts/what-i-wanted-to-do/ + Thu, 28 Jan 2021 06:14:00 +0000 + + http://blog.morgan.kr/posts/what-i-wanted-to-do/ + 나는 무엇을 하고 싶지? 나는 개발자가 되고 싶다. 그래서 나름대로 여러가지 언어를 배우기도 하고 여러가지 활동을 하면서 나의 꿈을 키워나갔다. 나는 고등학교를 다니며 공부를 하고, 흥미를 위주로 진로를 정하려다가, 이런것들이 빙산의 일각이라는 사실을 알며 좌절하고 말았다. +나는 과학고를 다니기 때문에 나름대로 수.과학적인 내용을 기본으로 하는 컴퓨터 아키텍쳐나 논리에 대해서 공부를 하기도 했는데, 컴퓨터 아키텍쳐에 대해 배우면서 자연스럽게 기계어, FPGA, 어셈블리 언어에 대해 관심을 가지게 되었고, 물론 지금은 대학교 진학문제가 있어서 시간을 많이 투자하지는 못하지만 관심을 가지고 배우고 있는 중이다. + + + + About Me ! + http://blog.morgan.kr/profile/ + Mon, 01 Jan 0001 00:00:00 +0000 + + http://blog.morgan.kr/profile/ + + + + + + diff --git a/public/posts/1-spectre-attacks-exploiting-peculative-execution/index.html b/public/posts/1-spectre-attacks-exploiting-peculative-execution/index.html new file mode 100644 index 0000000..e2e7b4b --- /dev/null +++ b/public/posts/1-spectre-attacks-exploiting-peculative-execution/index.html @@ -0,0 +1,16 @@ +Spectre Attacks: Exploiting Speculative Execution | Morgan's Blog +

    Spectre Attacks: Exploiting Speculative Execution

    The Central Processing Unit (CPU) is a device that plays a major role as the brain of a computer. The CPU controls four main functions: memory, interpretation, computation, and control, which are based on the role of interpreting the commands of a given program to perform operations with data. In CPU, there are the program counter, a command register, an ALU (arithmetic logic unit), a control unit, a bus, and a register. Modern CPUs include cache memory or error correction devices for faster performance and more accurate computation.

    The current CPU follows the Von-Neumann structure, which includes four functions: Fetch, Deocde, Execute, and Writeback. Ancient CPUs interpret instructions in order to convert data, which only can be slow. Modern CPUs speed up through out-of-order. Out-of-Order means that the CPU executes commands dynamically as the input data and execution units, rather than in a original order. This requires the cache memory as mentioned above, and uses Branch Prediction and Specific Memory Disambiguation, which results in Meltdown and Spectre vulnerabilities.

    One day, I heard a news about Spectre and Meltdown Attack with my father. It said that it can affect within all of modern CPU manufactured in Intel, and also other companies. To defent that massive attack, we have to take a decrement of CPU’s performance about half of entire CPU or more. Me and father thought that it is a big event that will effect the history of architecture of modern CPUs. And also will effect on the semiconductor development. After that day, I wanted to learn about the modern architecture of CPUs and basic operations of modern semiconductors. So I searched internet about it, read a university books to understand it, and also a paper written by many eminent researchers, like professor of KAIST and Samsung Semiconductor research center. After the days of learing CPUs, I finally read the paper of Spectre attack and Meltdown attack. It was hard for me to read, but I rarely can understand the way they found it. I also could understand how it works, and how to prevent it to happen. My knowledge about computer and semiconductors increased very fast after I read the entire paper. I can understand how CPU ultimately works, how to make a semiconductor, and also what I have to do to do what I want. Futhermore, I wanted to know the real of semiconductor design, manufacturing, and CPU designing. To learn that thing, I want to learn semiconductor professionally in universities.

    Physical techniques and physically performed computations for improving and stabilizing the performance of modern CPUs often exhibit errors. Side-Channel attck aims to exploit vulnerabilities in these physical computational defects to obtain information that could not be obtained. Among these Side-Channel attacks, Spectre attack uses a buffer for Branch Prediction and Prediction History. This physical operation allows access to unacceptable memory. Branch prediction is a feature that improves execution performance by predicting true/false conditions when a processor executes code containing conditional statements such as if. When the processor encounters a conditional statement, it first predicts the outcome of the conditions it encounters, and first continues to execute the code based on the prediction. The processor calculates the results of the conditions while the code is running as predicted. When the results of the conditions are calculated, the processor verifies the results of the previously made predictions. If a prediction is previously correct, the execution continues and thus gains performance benefits. On the other hand, if the prediction is determined to be incorrect during execution as predicted, the result of the condition is returned to the predicted point and executed again. Spectre attack uses an attack method that allows an attacker with control flow to follow fragments of the machine language code of the targeted process and perform the desired task. An attacker discovers and executes parts of the target process that have the command he or she wants before returning. Since the attacker is free to change the control flow, changing the address of the return command to the address of the next instruction that the attacker wants to execute, even though the execution flow proceeds only within the target process.

    There are two typical cases of Spectre discovered by researchers. Exploiting Conditional Branches and Bounds Check Bypass or Exploiting Indirect Branches and Branch Target Injection are known as Spectre attack. The way Bound Check Bypass work lies in the Speculative Execution by Branch Prediction. If there is an “if” or “while” statement in front of a code that causes Fault when accessed, the CPU is tricked into accessing data in the restricted area and stored in cache to allow this check to be checked. The value of the cache can then be determined using a time difference measurement to read the memory in the inaccessible zone. Branch Target Injection also uses Speculative Execution by Branch Prediction. If the attacker’s precess repeats the branch to the location where the attack code, the code to be rejected, the location is stored in the Branch Target Buffer. The characteristic that all processes share the same Branch Target Buffer allows them to reject attack codes into the victim process.

    Wikipedia / Spectre & Meltdown Original Paper

    \ No newline at end of file diff --git a/public/posts/20210620-siheomeul-iljuil-apdugo/index.html b/public/posts/20210620-siheomeul-iljuil-apdugo/index.html new file mode 100644 index 0000000..6bf1cfd --- /dev/null +++ b/public/posts/20210620-siheomeul-iljuil-apdugo/index.html @@ -0,0 +1,19 @@ +시험을 일주일 앞두고 | Morgan's Blog +

    시험을 일주일 앞두고

    지금까지 내 인생에서 가장 중요한 시험. 그 시험이 일부일 앞으로 다가왔다. 하루종일 시험공부 비슷한걸 하면서 심신이 지쳐 더 이상 집중을 할 수 없을 것 같다. 이제 이 고비만 넘기면 인생에서 가장 날아다닌다는 시기, 대학생이 된다. 앞으로 뭘 하고 살아야 할지, 무엇을 하고 싶은지, 내가 아는 게 많아지고 현실을 깨달으면서 철이 드니 생각이 복잡해지고 앞길이 막막하기만 하다.

    몇일 전, 작년에 대학 원서 자기소개서를 다시 읽다 보니 내가 아는 게 많아졌음을 새삼 깨달았다. SW나 해킹이나 반도체에 대해 몇달동안 파고 들어 공부하고, 조사하고 생각하다 보니 전에보다 더 자세하게, 깊게 알게 되었고, 예전과는 살짝 다른 생각을 하게 되었다. 예전에는 마냥 컴퓨터공학이나 해킹이 하고 싶었던 반면 지금은 더 자세하게 무엇이 하고 싶은지에 대한 목록을 작성할 수 있게 되었다. 각종 주제에 대해서도 흥미를 갖게 되었고 특히 예전에는 그냥 넘어갔던 책들을 다시 읽어보고 싶어졌다. 앎에 대한 욕구가 끝없이 증가해 버렸다. 지금 교보문고에 있는 읽고싶은 책들만 합해도 100만원이 넘어가니 말이다.

    아마 올해 자기소개서를 쓸 때에는 정말 깔끔하고 자세한 자기소개서를 쓸 수 있지 않을까 싶다. 개발자 이력서 쓰는 법이나 회사 취직에 관한 글을 꽤 읽었으니 기술적으로도 단정한 글이 되지 않을까 싶다. 항상 느끼는 것이, 이건 대학 자소서 준비인지 아니면 그냥 개발자의 자기소개서인지 의문이 든다. 그럴 정도로 기술적인 내용을 많이 집어넣는데, 이게 과학고생의 글인지 아니면 디미고 같은 개발중점 학교 학생의 글인지 햇갈린다.

    짧은 회고록이 되었지만 2주 후, 자소서를 쓰고 있을 나를 상상하니 빨리 지나갔으면 좋겠다는 생각밖에 들지 않는다.

    \ No newline at end of file diff --git a/public/posts/2022041406/index.html b/public/posts/2022041406/index.html new file mode 100644 index 0000000..a8b1438 --- /dev/null +++ b/public/posts/2022041406/index.html @@ -0,0 +1,19 @@ +선택실패 | Morgan's Blog +

    선택실패

    고등학교 3학년 때까지만 해도 나는 무조건 컴퓨터 공학과나 전기전자 공학과. 학과만 보고 대학교에 진학하리라 마음먹었었다. 진짜 학교 이름은 절대 보지 않을 것이라 생각했다. 하지만 막상 입시에 처하고 선택의 갈림길에 있으니 그 다짐은 물거품이 되었다.

    역시나, 아니나 다를까 원서 접수 기간이 되니 진로 담당 선생님은 실적을 위해 상위 대학교의 낮은 학과에 원서를 넣어볼 것을 추천하셨다. 말이 추천이지 반 강제로 넣게 되었다. 아무런 관심도 없었고, 3년동안 생각도 없었는데다 자기소개서도 짜맞춰야 쓸 수 있는 학과에 지원했다. 붙어도 안간다는 생각으로. 하지만 내가 희망했던 대학을 떨어지고, 상위 학교 하위 학과와 하위 학교 자유 학과중에 선택해야 했다. 내가 3년동안 해왔던 것과 내가 무엇을 하고 싶은지를 생각해 본다면 당연히 학과를 보고 진학을 해야 했었는데, 막상 상위 학교의 합격증을 받으니 당연히 마음 한켠에서는 이걸 버린다고?!?라는 마음이 있었고, 그 마음에 휘둘려 등록예치금을 보낸다. 아직 등록 기간이 남았으니 등록 취소를 해도 되겠지만, 사실상 마음을 다잡은 것이나 마찬가지였다. 등록금 환불 신청서까지 적어놓고 책상에 올려두었다. 도장과 보호자 서명까지 받아놓고 고민했다. 후회하지 않을까? 어느 쪽으로 가나 조금 다니고 후회하게 될텐데, 학교를 후회하는게 학과를 후회하는 것보다 더 심하지 않을까 생각해 결국 그대로 원서는 놔둔 채 날이 넘어간다. 날짜가 넘어가는 걸 보고 얼마나 힘이 풀렸는지 모르겠다. 이제는 돌이킬 수 없구나.

    그런 선택을 한 후 몇일간은 대학교 이름에 심취해 우리 학과도 선녀처럼 보였다. 전망 좋은 공과 학과로만 보였다. 하지만 시간이 지나면서 심취해 있던 생각이 풀리기 시작했고, 학과의 현실을 마주하기 시작하면서 후회가 밀려왔다. 서양에서는 주로 취급하지도 않는 사양산업의 책임으로만 끌고 온 이름만 대학인 학과. 이게 우리 조선해양 공학과의 현실이었고, 미래였다. 미래도 없는 학과. 이런 학과인줄 알고는 있었다. 하지만 실제 전공 수업을 들으면서 더욱이 실감났다. 왜 이런 학교에 와서 이딴 옛날 정보를 배워야 하는가. 왜 교수님은 열등감에 산업을 과장하고 잘 될거라고 세뇌하고 애원하듯이 수업을 하실까. 그 정도로 사양산업의 학과라는 것을 깨닫게 되었고, 탈출을 결심했다.

    결국 탈출을 결심하게 될 줄은 알았다. 반수를 하던, 유학을 결심하던, 군대를 가던 어떻게든 이런 현실을 벗어나고자 하게 될 것이란 것을 알고 있었다. 학교도 내가 생각했던 것처럼 엄청 막 좋은 곳은 마냥 아니었다. 역사가 오래되어 뿌리깊은 명문이지만 보수적 교육과 보수적 관념 그 자체인 학교인 듯 했다. 대학교 수업은 고등학교의 주입식 교육 그 연장선 뿐이었다. 많은 것에 너무 큰 상실감을 느꼈다. 학과에서도, 학교에서도. 그래서 결국 대한민국 교육의 한계인가 싶었다. 대학교도 같은 처지의 교육이구나 했다.

    지금 학과에 대한 열등감으로 그렇게 느끼는 것일 수도 있다. 하지만 만약 ‘학과’때문에 학교도 그렇게 느껴진다면 그만큼 그 학과에 문제가 크다는 것이 아닐까?

    난 유학을 결심했다.

    대한민국의 교육을 벗어나고 싶다. 아직 기초를 공부하는 입장으로서 얼만큼의 주입식인 필요하다는 것은 인정한다. 하지만 이것이 대학원까지 이어지고 심지어 그 이상에도 이어지는 교육 체계와 대학 교수들 아래에서 배우고 싶지 않다. 난 이루고 싶은 꿈과 하고 싶은 일, 애타게 배우고 싶은 것이 있다. 지금까지 내가 노력할 수 있었던 사명감이라 할 수도 있다. 이것이 깨져버린 이상, 그리고 여기서 계속 공부를 이어나가는 이상 내 꿈은 영원히 짓밟힐 것이다. 지금 여기에는 어떤 수를 써도 그것을 이룰 수 있는 길은 없다고 생각한다. 누구는 회피라 할테지만, 난 여기에서는 내가 할 수 있는 능력의 최선을 다했다고 생각한다. 과거를 후회하면서 이뿐인 자리에 있느니, 차라리 이 현실을 회피해 새 길을 열어나가련다.

    제일 중요한 것은 이것이 지금 하기 싫은 일에 대한 회피가 목적이 되어 버리면 안된다는 것이다.

    \ No newline at end of file diff --git a/public/posts/ad-techwa-tonggyeyi-sseuimsae/index.html b/public/posts/ad-techwa-tonggyeyi-sseuimsae/index.html new file mode 100644 index 0000000..70b635d --- /dev/null +++ b/public/posts/ad-techwa-tonggyeyi-sseuimsae/index.html @@ -0,0 +1,22 @@ +Ad-Tech와 통계의 쓰임새 | Morgan's Blog +

    Ad-Tech와 통계의 쓰임새

    CTR(클릭률) Click-through rate)는 특정 링크를 클릭한 사용자의 비율. Z지수는 표준점수로, 통계학적인 정규분포를 만들고 각각의 경우가 표준편차상의 어떤 위치를 차지하는지를 보여주는 차원없는 수치이다. Z-지수는 원수치가 평균에서 얼마나 떨어져 있는지를 나타내는 지수로, $ z = \frac{z - \mu}{\sigma} $로 나타난다. ($\sigma$ 표준편차, $\mu$는 모집단의 평균이다.

    중심극한정리란 표본의 크기가 커질수록 표본 평균의 분포는 모집단의 분포 모양과는 관계없이 정규분표에 가까워진다는 정리이다.

    점추정은 모집단의 특성을 단일한 값으로 추정하는 방법으로, 표본평균과 표본분산을 이용해 모집단의 평균과 분산을 계산해 내는 방법이 대표적인 예이다. 평소에 신뢰구간 95%와 같이 구간추정하는 것과는 달리 적률방법을 이용하여 하나의 수치로 나타낸다. 표본분산의 기댓값이 모분산이 되고, 표본평균이 모평균이 된다. 더욱 정확한 수치를 계산하기 위해서 적률법을 이용한다. 모집단의 평균이 표본평균과 일치하는 모수를 찾는 방법으로 진행한다. 적률 생성함수는 $M_x(t) = E(e^tX)$로 표현되어 확률분포의 적률은 $ E(X^n) = M_x^(n) (0)$으로 표현할 수 있다. 적률생성함수를 몇번 미분하냐에 따라 n차 적률이라고 한다.

    이제 Ad-Tech에서 사용하는 각종 광고 비용계산과 그 지수 산출을 알아본다.

    CTR은 노출수 대 클릭수 비율로 구할 수 있다. 일반적으로 계산한 CTR수치는 CTR의 표본 평균이라고 할 수 있다. CTR수치는 매일마다 다르고, 또 언제 어떻게 바뀔지 모르는 랜덤 모집단이기 때문이다. 따라서, 오랜 기간동안 CTR수치를 측정하여 예측을 하는 방법으로 신뢰구간을 얻을 수 있다. 하지만, 오랜기간동안 광고수치를 계산하여 그 비용을 지불하기에는 오랜 기간이 걸리며 유행이 빠른 광고의 특성상 정확하지 않을 가능성이 있다. 따라서, 광고에서 CTR을 계산하여 캠페인의 대표 수치를 구하기 위해 표본에서 모집단의 수치를 계산할 수 있도록 중심극한 정리를 가정 하에 점추정을 통해 캠페인의 대표 CTR수치를 나타낸다.

    \ No newline at end of file diff --git a/public/posts/attitude-for-criticism/index.html b/public/posts/attitude-for-criticism/index.html new file mode 100644 index 0000000..b3f6a88 --- /dev/null +++ b/public/posts/attitude-for-criticism/index.html @@ -0,0 +1,19 @@ +Attitude for criticism | Morgan's Blog +

    Attitude for criticism

    요즘 우리 학교에 학교를 개혁하겠다는 학생회장이 나타나고 나서부터 친구들이 학교에 대한 여러 가지 불만들을 풀어내기 시작했다. 나도 마찬가지로 학교에 대한 여러 가지 불만사항들이 많았다. 나는 매 학기마다 개정된 학교 교칙이나 규정들을 정독하는 이벤트를 가지는데, 그때마다 항상 ‘아, 학생들이 당연히 너무 불리하다..’ 라던가, ‘이 조항은 너무 아닌데, 너무 구시대적인 생각이 아닌가?‘라는 생각이 들기도 한다.

    대학을 가야하는 시기라서 여러 학교들의 생활이나 공부방법, 대학 진학 상황들에 대해서 더욱 관심을 가지게 되었다. 특히 전국급 자사고나 타 지역 과학고의 생활과 공부습관? 등에 대해서 많이 조사(나무위키 정독)해보았는데, 한 가지 우리 학교랑 공통으로 비교되는 것이 있었다. 점점 상승세를 보이거나, 기존부터 진학 상황이 좋았던 학교들은 당연히 공부에 대해 많이 엄격하다. 하지만, 엄격한 만큼 그것에 대한 보상이나 회유에 대한 것도 많았다. 기숙사에서의 자유는 보장해준다던지, 상담실을 운영한다던지, 혹은 실제로 보상을 해 주는 경우도 있고, 진짜 자유시간을 주는 경우도 있다.

    우리 학교를 살아가면서 몸이 망가지도 마음이 지쳐가는 것을 확실히 느낄 수 있었다. 100명, 혹은 60명 정도의 소수의 인원이 3년 동안 계속 붙어서 살아간다고 한다면, 아무리 성격이 좋아도 인간관계에 대한 스트레스가 한두 번 쌓이는 것이 아닐 것이다. 또한, 이 열악한 환경 속에서 내신이라는 것에 의해 끝까지 몰아붙여져서, 틈도 없이 공부를 해야 한다는 현실이 피부에 와 닿았다. 우리가 이렇게 말한다면 반대쪽에서는 이렇게 반발할 것이다. 친구관계는 선생님과 상담해보고, 또 스트레스는 격주로 집에 갈 때 해소해도 되고.. 근데 실제로 하는 거 보면 쉴 틈이 많이 있는데, 왜 그렇게 호들갑을 떠느냐고.

    학생의 생활에 관해서나 우리나라 입시제도에 의한 학생들의 스트레스에 대하여, 학생들의 편의를 위해서 학생들이 단체로 학교에 청원을 하거나 개선을 요구하면, 학교는 그 요구를 결국에는 들어줄 수 밖에 없다. 학교는 결국 학생이 주체이고, 학교를 믿고 학생을 맡긴 학부모가 있기 때문이다. 교직원들도 결국에는 한 가정의 일원이다. 학생들이 요구한 것에 대해 미성년자라서 잘 진행되지 않는다? 그러면 학부모회도 있고, 교육청도 있다. 아니면, 가장 확실한 방법으로 학생 대표가 교장선생님께 직접 찾아는 방법도 있다. 교장은 모든 교직원이 속해있는 학교의 ‘장’이니까.

    하지만 우리가 하는 이야기는 성립되지 않는다. 특히 내가 하는 이야기도 성립하지 않는다. 우리, 또는 내가 학교에 대해 비판을 하고, 그 개선을 요구하기 위해서 대개는 그 조건이 충족되지 못했기 때문이다. 인도의 소금 행진, 홍콩 시위 등 사회적으로 받아들여지지 않는 소수민족이나 식민지가 최종적으로 변화를 만들어 낸 경우는 수도 없이 존재한다. 이와 같이 ‘교권’이나 ‘교칙’이라는 틀 속에 갇혀있는, ‘학생들’도 이와 같이 변화를 만들어 낼 수 있다. 하지만, 우선 이런 변화를 만들어 내기 위해서 위 운동들의 공통점, 비폭력 운동의 규칙에 대해 생각해 보아야 할 것이다. 도덕책에는 이렇게 적혀있었다. ‘비폭력 시위를 행하고 나서는 그 행위에 대한 처벌을 마다하지 않아야 합니다.‘라고. 이 문구가 도대체 우리랑 무슨 관련이 있는가. 학생들이 시위를 하고 나서 그 책임을 지고 퇴학이라도 하라는 이야기인가? 물론 아니다. 나는 이 문구를 이 문구 그대로 생각하지 않았다. 약간 억지일 수도 있겠으나, 나는 반대의 방면으로 바라보았다. 행위에 대한 책임이 아니라, 행위를 위한 의무에 대해서 생각해 보았다.

    학생들이, 또는 군중들이 학교, 또는 정부에 무언가를 요구하려면 어떻게 해야 할까? 먼저 기존 체제의 문제점에 대해서 설명하고, 논리적으로 반박해 나갈 것이다. 학교나 정부는 그에 대한 반박을 할 것이고, 그 이유를 설명할 것이다. 학생이나 군중이 이에 대해 다시 반박하고, 전체와 구성원이 서로 타협해 나가면서 결국 변화를 만들게 될 것이다. 나의 생각은 그 행위 제일 처음부터 시작한다. 이들이 제일 처음으로 기존 체제의 문제점에 대해 설명할 때, 만약 이들이 범죄 조직이거나 불량 학생이라면 어떻겠는가. 당연히 정부는 그 말을 무시할 것이다. 학교나 교직원들도 불량 학생의 일탈이라 생각할 것이다. 심지어는 그 외 군중들이나 그 외 학생들도 그 요구에 대해서 쉽사리 찬성하기에도 무리가 있을 것이다.

    결론적으로 하고 싶었던 말은 이것이다. 변화를 요구하기 전에, 한번 제대로 따라보고, 그 문제점을 지적하라고. 물론 이 말은 당연한 말이며 누구든지 할 수 있는 말이다. 하지만, 우리학교 친구들이 무언가를 비판하고 요구할 때 이러한 것들이 잘 지켜지지 않는 것 같다. 우리 학교뿐만 아니라 사회적으로도 이러한 ‘당연한’ 전제조건이 잘 지켜지지 않는 것 같았다. 나도 마찬가지였다.

    그래서 나는 친구들에게 말하고 싶다. 마냥 불만만 품거나 일탈만 하지 말고, 한번 계속 지켰다가 그 문제점을 정리해서 사람을 모아, 제대로 한번 개혁을 만들어 보라고.

    \ No newline at end of file diff --git a/public/posts/bandoceyi-weonri-jongryu-soja-yeogsa-saneob-mosfetbuteo-ram-flash-geurigo-intel-4004ggaji/index.html b/public/posts/bandoceyi-weonri-jongryu-soja-yeogsa-saneob-mosfetbuteo-ram-flash-geurigo-intel-4004ggaji/index.html new file mode 100644 index 0000000..0f9fe30 --- /dev/null +++ b/public/posts/bandoceyi-weonri-jongryu-soja-yeogsa-saneob-mosfetbuteo-ram-flash-geurigo-intel-4004ggaji/index.html @@ -0,0 +1,16 @@ +반도체의 원리, 종류, 소자, 역사, 산업. (MOSFET부터 RAM, FLASH, 그리고 Intel 4004까지. | Morgan's Blog +

    반도체의 원리, 종류, 소자, 역사, 산업. (MOSFET부터 RAM, FLASH, 그리고 Intel 4004까지.

    .1번 반도체란?.2번 반도체 소자의 종류.3번 기본소자 – 다이오드.4번 기본소자 – 트랜지스터…1번째 MOFSETMOFSET(Metal-Oxide Semiconductor Field-Effect Transistor) 금속-산화 반도체 전계효과 트랜지스터1번째 금속산화 반도체란? 도핑된 반도체 기판 위에 SiO2로 된 절연층과 금속을 적층시켜 제작한 구조. 2번째 MOSFET TransistorNPN의 구조입니다. 두 N을 각각 Drain과 Source라고 합니다. Source에는 Ground가, Drain에는 전압이 인가됩니다. 위에서 서술했듯이 Drain과 Source사이에 채널이 형성됩니다. 이때 Gate와 Back Gate(아랫쪽 P반도체)사이에 전압을 인가해 주면 게이트와 P사이에 전기장 형성, 이에 의해 전자가 게이트쪽으로 올라갑니다. 이 때문에 Drain과 Source 사이 전류가 흐를 수 있다. 이 Gate와 Back Gate 사이에 전기장을 조절함으로써 Drain과 Source 사이의 전류를 조정할 수 있다. …2번째 BJT Transistor생략. 너무 귀찮아(사실 이해 못함..).4.5번 MOS…MOS의 응용MOS Metal Oxide SemiconductorPMOS NMOS CMOS가 있다.Pmos는 Body가 P반도체, NMOS는 Body가 N반도체인 차이가 있습니다. Body와 Source/Drain 사이에는 바이어스가 형성되어 있다. 이때 정 바이어스가 형성되어선 안되겠죠.. 전류가 이상한 곳으로 흐르는 거니까따라서! 항상 Source.Drain과 Body사이에는 역바이어스가 형성되어야 합니다.  보통 Source와 Body를 묶어 같은 전압을 걸어줍니다. 이 전압은 NMOS에서 Ground, PMOS에서는 양전압(Vdd)를 인가합니다.NMOS의 작동. Gate에 양전압을 걸어줍니다. 이때 위에서 말했듯이 전기장에 의해 채널이 형성됩니다. 따라서, Source(0V)에서 Drain으로 전류가 흐르게 됩니..다.PMOS의 작동 Gate에 0V를 걸어주면 Gate와 BackGate사이 전기장, 전기장에 의해 채널이 형성 마찬가지로 Source(Vdd)에서 Drain(-V)로 전류가 흐릅니다.여기서 주의! 전류는 전지의 (+)에서 (-)로 흐른다는 것은 약간 애매합니당 왜냐하면 여기서는 Ground가 있으니까요. (-)는 Ground이고 (+)(-)는 그 기준으로니까요.그다음으로 CMOS는 NMOS와 PMOS를 합했어요 ||가 NFET, 동그라미 달린게 PFET입니다. CMOS의 역할은 인버터입니다. CMOS Inverter라고 하죠.. A는 입력 전압, Vdd는 임의의 양전압, Vss는 Ground입니당 Q가 출력이겠죠 입력 전압으로 0V가 인가되었다고 가정해봅시다. NMOS는 OFF, PMOS는 ON 동작을 하므로 PMOS의 소스에 인가되어 있는 Vdd 전압이 출력됩니다. 반대로 Vdd가 인가되면, NMOS가 ON, PMOS가 OFF되므로 NMOS의 소스에 인가되어 있는 0V가 출력됩니다.…MOS를 이용한 NAND< NOR게이트  AND, OR, NOR, XOR 다 만들 수 있음요!!..그렇습니다. MOS를 이용해서 논리 게이트를 만들 수 있고, 이러면 우리는 모든 회로를 다 반도체로 작게 작게 만들 수 있어요!.5번 응용소자 - DRAM…RAM이란?RAM(Random Access Memory) 임의 접근 메모리정보를 캐패시터에 저장하는 장치입니다. 전원이 인가되는 한 그 정보는 유지될 수 있습니다. (휘발성)임의로 어디에 접근하든지 동일한 시간이 걸리는 저장장치라서 RAM…DRAM이란?Dynamic RAM 다이나믹한 램  개개의 비트를 각기 분리된 축전기(Capacitor)에 저장하는 기억 장치전자의 수(전자의 상대적인 양)을 기준으로 0과 1이 나눠집니다. 축전기가 전자를 점점 잃어서 Refresh작업을 해줘야 합니다.  Dynamic하다!!회로의 원리. ||는 NFET  Source에 0V, 스위칭 통해 Drain에 Vdd 형성.Select에 Vdd가 인가될 경우에 NFET는 On상태이다. WRITE:: 이때 Data가 TRUE이면, Capacitor에 TRUE를 저장.READ:: Capacitor가 TRUE라면 DATA(Bitline)이 TRUE가 된다  전체 에너지가 약간 감소  언젠가 소실됨. 한 사이클마다 Recycle…5.5번 응용소자 - SRAM…SRAM이란Static RAM. DRAM과는 달리 전원이 없어지지 않는 한 정보를 그대로 유지  리프레쉬 불필요서로 대칭 구조 두 쌍의 인버터에 정보가 저장된다. 인버터가 전압의 상태를 안정적으로 유지시켜 줍니다. 이것.. 비슷한것으로 Dtype FlipFlop이 있습니다. 생략빠른 입출력이 장점입니다..6번 응용소자 – NAND Flash…Flash많이들 들어보셨을 듯 우리가 컴 맞출때나 외장하드 살 때 요즘에는 SSD라는 말이 많이 들리죠? 이 SSD에 들어있는 것이 우리의 USB에 들어있는 칩과 같은 칩입니다. Flash 칩이라고 합니다.비휘발성 메모리입니다. NonVolatile Memory입니당. NVM이욥. 이것도 NVMe하면서 들어보셨을까요….전압을 주지 않아도 정보가 저장될 수 있는 것입니다. 정말 혁신적이네.. 그래서!! 정보를 저장하는 방식은 비슷하지만 구조에 따라 읽고 쓸수 있는 범위와 방식이 다릅니다. 바이트(8비트)와 워드(32비트 아니면 처리하는 비트)로 다릅니다. 이것을 구분하여 NOR Flash, NAND Flash라고 합니다. …NAND Flash 구조MOFSET과 비슷합니다만, 약간 다릅니다. 터널링 효과를 이용하여 전자를 가둬둔다는 것을 알아두세요. 전자 주사라고도 한답니다..7,8번 시스템 소자 – 인텔 4004…인텔 CPU의 역사에 대한 설명…인텔 4004 CPU의 구성 성분  이 성분이 엄청 많이 집적되어 있는 것이 현대의 CPU 다를게 없음.0/ ALU!!!! 산술계산장치 가장 중요하고도 가장 중요한 CPU의 대뇌역할을 하는 장치입니다!1/ FLIPFLOP 이거 뭐라했죠? 이게 메모리와 같은 역할입니다. 정보 저장이요10/ Register 메모리 동일 조금 더 많고 크다.11/ MUX MUX란, 데이터 선택 장치입니다. 입력 선이 4개있으면 2개짜리 선택선에서 00이면0, 01이면 1, 10이면 2, 11이면 3입니다.이렣게 분류하는 것입니다. 마치 2진 <-> 선택의 느낌으로반대는 DEMUX 100/ ACC누산기 레지스터입니다….101/ Clock 클럭 빠르게 왔다갔다함. CpU 동작의 기초 타이밍을 재줍니다. 이게 클수록 연산이 더 빠르겠죠? CPU클럭과 동일합니다.110/ ENCODER, DECODER디코더는 n*m디코더는 들어오는 입력에 따라 대응되는 자리만 1로 만들어줌. 들어오는 숫자를 10진법으로 해석한 출력만 1이에요. 반대는 인코더겠죠?111 / 계수기, Counter 는 클럭에 왔다갔다함에 따라 1씩 증가하는 장치입니다..9번 반도체 개발의 역사.10번 반도체 산업 시장

    \ No newline at end of file diff --git a/public/posts/beulrogeu-geulsseugineun-neomu-himdeuleo/index.html b/public/posts/beulrogeu-geulsseugineun-neomu-himdeuleo/index.html new file mode 100644 index 0000000..40885fb --- /dev/null +++ b/public/posts/beulrogeu-geulsseugineun-neomu-himdeuleo/index.html @@ -0,0 +1,19 @@ +블로그 글쓰기는 너무 힘들어.. | Morgan's Blog +

    블로그 글쓰기는 너무 힘들어..

    야심차게 티스토리 블로그를 만들어 몇몇 글을 쓰고 나서, 한참동안이나 글을 쓰지 않았다. 하지만 나중에 돌아보면 쓰일 곳이 있지 않을까 하여 내 소장을 위해 Ghost + Vultr로 넘어왔고, 돈도 내야 하니까 글을 조금씩이라도 쓰지 않을까 생각했지만…. 결국 글을 쓰지도 않은 채 달마다 돈만 나가고 있다…

    블로그 글을 왜 쓰지 않았지..? 고등학교 생활을 하느라 힘들고 바빠서 (노느라) 글을 쓰지 않았을 수도 있고, 마땅하게 글을 쓸만한 소재도 없고, 마땅하게 글을 쓸 기기 또한 없다. 나에게 있는거라고는 집에 있는 아버지 노트북과 내 아이폰 밖에 없으니까..

    그래도 일기같은 형식으로 글을 써 내려갔다면 좋을 것 같은데 그 역할을 트위터가 하고 있는 바람에 더욱 쓰지 않게 되었다. 물론 길게길게 회고록을 쓰거나 감상을 쓰거나 후회를 하기 위해서라면 블로그만큼 좋은것도 없기는 한데, 나는 타자가 느리고, 글을 너무 못쓴다. 이과생특

    하지만 애초에 내가 코딩을 하지 않은것도 몇달째 되어가고 있고, 내가 아이패드나 노트북을 구매하지 않는 이상 글을 절대 꾸준히 쓸 수 없을 것 같다. 물론 아침에 일어나면 남는 자투리 시간을 이용하여 글을 틈틈히 쓸수도 있지만, 역시 그 역할을 트위터가 하고 있다.

    글쓰기가 너무 힘들다. 다른 블로그들을 보면 글도 길고 길지만 쉽게 읽히며 뭘 말하고 싶은지 탁탁 이해가 쉽다. 하지만 내가 글을 쓰자니 길제 쓰기도 힘들고 시간도 걸리고 머리도 아프고 할 이야기도 없다.

    글을 쓰고 싶다. 멋지게 글을 쓰고 싶다. 다른 사람에게 도움이 되는 글을 쓰고 싶다. 내 글을 가지고 사람들이 기꺼이 대가를 지불할 만큼의 가치를 가지는 글을 쓰고 싶다. (그 대가란, 그 사람들의 시간..)

    열심히 해봐야 겠다. 앞으로 대학 입시까지 2달 적게 남기도 했고, 내 몸이 망가져가는 걸 많이 실감했기에 건강하고 규칙적인 생활습관을 가지려 하고 있고, 그 첫걸음이 일찍 자서 일찍 일어나고, 남는 시간에 글쓰기이다.

    화이팅! 할 수 있다..!

    \ No newline at end of file diff --git a/public/posts/cam-nae-jinjja-sangsangdo-moshaessdeon-ilinde/index.html b/public/posts/cam-nae-jinjja-sangsangdo-moshaessdeon-ilinde/index.html new file mode 100644 index 0000000..9bf0a76 --- /dev/null +++ b/public/posts/cam-nae-jinjja-sangsangdo-moshaessdeon-ilinde/index.html @@ -0,0 +1,16 @@ +(Untitled) | Morgan's Blog +
    \ No newline at end of file diff --git a/public/posts/cryptography/index.html b/public/posts/cryptography/index.html new file mode 100644 index 0000000..a1cf0a6 --- /dev/null +++ b/public/posts/cryptography/index.html @@ -0,0 +1,27 @@ +Cryptography | Morgan's Blog +

    Cryptography

    Cryptography

    공개키 암호화 알고리즘.

    1. Diffie-Hellman

    디피-헬먼 키 교환 방식은 암호화 통신을 위한 키를 교환하는 방식 중 하나이다. 두 통신 주체가 공통의 비밀 키를 사용할 수 있도록 하는 안전한 알고리즘이다. 디피-헬먼 방식은 기초적인 암호 통신 방법으로, 이 알고리즘에 RSA나 ECC같은 암호화 알고리즘을 합쳐서 암호화 통신이 성립된다. 공개키는 암호화할 수 있는 키이고, 개인키는 복호화할 수 있는 키이다.

    디피-헬먼 키 교환은 공개키 암호화 방식에 기반한다. 공개키 암호화 방식이란, 자신의 공개키를 상대방에게 전송하고, 그 상대방은 그 공개키로 데이터를 암호화해서 전송하면, 자신은 자신의 개인키로 복호화 할 수 있어, 통신이 성립되는 방식이다. 이때 상호통신을 위해서는 서로의 개인키를 공개키를 이용하여 공유하고, 각각 공유한 개인키와 공유키를 이용하여 공통된 비밀키를 계산하여 그것으로 통신하거나, 서로 각자의 개인키로 복호화하여 통신할 수 있다. 공통된 비밀키를 사용한다면 대칭 키 알고리즘, 서로 다른 키를 사용한다면 비대칭 키 알고리즘이라 한다.

    디피-헬먼 키 교환 방식은 이산수학의 난해성에 기초한다. 먼저, 상호에 매우 큰 소수 P와 임의의 정수 N을 교환한다. 이는 공개적으로 전송해도 문제가 없다. 이때, 서로 P보다 작은 정수 a, b를 임의로 설정하고, N의 a, N의 b승의 mod P를 서로 전송한다. 이후에, 서로 전송받은 N의 b, a승 mod P를 자신이 가지고 있는 정수 a, b를 이용해 N의 b승의 a승과 N의 a승의 b승 mod P를 계산한다. N의 ab승과 N의 ba승은 지수법칙에 의해 동일하므로 이 값을 서로 공통의 비밀키로 사용할 수 있다.

    위 상황에서 중간의 사람은 N과 P, N의 a, N의 b승의 mod P를 알 수 있다. 키 값을 알기 위해서는 N^ab mod P를 구해야 하는데, 이를 위해서는 a나 b 둘 중 하나는 알아야 한다. 여기서, 이산수학의 난해성에 의해 중간자는 a, b값을 알 수 없고, 이에 기밀성이 유지된다.

    하지만, DH알고리즘은 가장 중요한 취약점이 있다. MITM공격에는 아주 무력하고, 기밀성만 보장할 뿐 무결성, 인증 등 기타 보안의 필수 조건을 만족시키지 못한다. 인증이란, 서로간의 정체를 확실이 하는가에 대한 문제이다. MITM 공격이란, 중간에 다른 사람이 송신자의 정보를 가로채고, 수신자에게 위조된 정보, 즉 자신의 계산값을 전송하는 상황에서 일어난다. 이때 수신자는 그 정보가 중간자가 아닌 송신자에게서 온 정보라 믿고 비밀키를 만들 것이고, 이에 중간자는 그 비밀키를 알게 된다. 받은 정보가 제대로 된 송신자에게서 온 정보인지 확신할 수 있어야 한다는 것이 인증의 개념인데, 디피-헬먼 키 교횐은 이러한 방법이 없다. 이러한 취약점을 해결하기 위해 DH와 RSA, ECDH등 다른 암호화 알고리즘과 합쳐서 PKI 등을 사용하는 것이다.

    2. RSA

    RSA는 일반적으로 알려져 있듯이 매우 큰 소수는 소인수 분해할 수 없다. (매우 힘들다)는 것을 기초로 하고 있다. RSA는 이 방식의 개발자인 세 사람 이름의 앞글자를 따서 만들어 졌다. RSA도 DH와 마찬가지로 공개키 암호화 알고리즘이다. 현재 인터넷에 사용되는 거의 모든 보안 체계는 RSA이며, 이는 RSA가 오랫동안 인정된, 안정적인 암호화 알고리즘이라는 뜻이다.

    원리를 바로 설명하자면, 서로 각자 매우 큰 소수 p, q를 준비한다. (p-1), (q-1)과 서로소인 e에 대해, ed mod (p-1)(q-1)이 1인 d의 값을 찾고, N=pq와 e를 공개한다. 이들이 공개키가 되고, d는 개인키가 된다.

    공개키 N, e로 평서문 m을 암호화하기 위해서는 m^e mod N을 계산하면 된다. 개인키 d를 가지고 있는 사람이 이를 복호화 하기 위해서는 $ (m^e)^d mod N $을 계산하면, m을 알아낼 수 있다. 이 고정에서 페르마의 소정리가 이용되는데, 페르마의 소정리란, 어떤 수 N이 있을 때, 이 수와 서로소인 수 a에 대하여, $ a^(\phi(N)) = 1 mod N $가 성립한다는 법칙이다. 이때 $ \phi(n) $은 오일러 파이 함수로, 1-N까지궁 N와 서로소인 수의 개수를 의미한다. N이 두 소인수로 이루어진 합성수라면, $ \phi(N) = (p-1)(q-1) $로 나타난다. 바로 이 값을 이용해서 복호화를 진행한다. $ E*d $는 $ (p-1)(q-1)A + 1 $ 로 나타낼 수 있고, 따라서 $ m^(ed) = m^(A(p-1)(q-1) +1) $인데, $ m^(p-1)(q-1) $은 1이므로, 이 값이 $m$이 된다.

    $M^e mod N$과 $N, $e로는 원문 $m$과 개인키 $d$를 계산할 수 없다. 이를 계산하기 위해서는

    RSA암호화 알고리즘과 DH알고리즘의 차이가 별로 없다고 생각할 수 있다. 뭐 알고리즘 상으로는 비슷하다. 다를게 없다. 하지만 제일 중요하게 다른 것은, RSA의 경우는 공개키와 비밀키를 메시지를 암호화할 때 사용한다는 것이고, DH는 개인키와 공개키를 이용하여 새로운 공통의 비밀키를 만든다는 점이다. 따라서, DH와 RSA의 차이는 키들의 용도이다. 애초에 DH는 키를 교환하는 방식이고 RSA는 암호화/복호화 알고리즘이니까 용도가 다르지만.

    RSA도 마찬가지로 MITM에 매우 약하다. 오는 정보에만 의존해서 키를 사용하기 때문이다. 따라서 RSA도 인증의 면에서는 부족한 암호화 알고리즘이며, 이를 해결하기 위해서 PKI, Public Key Infrastructure를 사용한다. 이는 사람들의 공개키를 한 인증기관이 모아서 관리하여, 상호에 신원을 보장해주는 방식이다. 송신자는 이 인증기관에 수신자의 공개키를 조회하여, 제대로 된 공개키인지 확인할 수 있다. 하지만, 이러한 방식은 인증기관에 확인하는 과정이 필요하므로, 인증기관과 연결되어 있어야 한다는 점과, 이 과정에서 시간이 오래 걸린다는 단점이 있다.

    이 점을 해결하기 위해 웹 보안에서 사용하는 HTTPS에서는 TLS/SSL이라는 더 응용한 암호가 적용된다. TLS는 상호 알고리즘 교환, 키 교환과 인증, 대칭키 생성과 통신이라는 세 단계로 나누어 통신한다.

    3. ECC

    ECC는, Elliptic Curve Cryptography로, 타원곡선 이론에 기반한 암호화 알고리즘이다. RSA에서는 소수를 사용했다면, ECC에서는 GF에서 EC연산의 비가역성을 이용한다. EC는 RSA보다 키의 길이가 짧아도 보안성이 우수하며, 연산 시간이 더 짧다는 장점이 있어, 블록체인이나 IoT 보안 등 현재의 암호에는 ECC가 주로 사용된다.

    타원곡선이란 무엇일까? 타원곡선이란, _ y2=x3+Ax+B_ 의 형식으로 나타나는 음함수이다. 타원곡선은 타원의 둘레를 계산하기 위해 타원을 적분하려다 나타난 식이라고 하는데, 그 함수의 역함수가 위의 형식이라고 한다. 더 자세하게 말하면, 체 k에서, 타원곡선은 특정 조건들을 만족시키며 원점이 주어진 k에 대한 사영 대수 곡선이다. 첫번째 특이점을 가지지 않으며, 둘째 위상수학적으로 원환면이며, 셋째 적어도 하나의 유리점을 가진다는 조건이다. 하나하나씩 알아보자.

    체는 무엇이고, 사영 대수 곡선이란 말은 어떤 말일까?

    일단 체(Field)란, 사칙연산(덧셈, 뺄셈, 곱셈, 나눗셈)에 대해 닫혀있는 집합을 의미한다. 이는 하나의 체 안에 있는 원소들끼리 사칙연산을 해도 그 값이 체 안에 속해있다는 의미이다. 가장 대표적인 체는 유리수 집합, 실수 집합, 복소수 집합이 있다.

    즉, 체 k에서 특정한 조건을 만족시키며 특정 원점을 가지는 대수 곡선이라는 의미는, 위에서 언급했던 타원 방정식을 만족시키면서 A, B로 표기되어 있는 계수가 하나로 정해져 있는 점들의 집합을 의미한다. 타원 곡선이 체라고 하는 이유는, 타원 곡선에서 새롭게 정의한 덧셈을 이용해 서로 다른 점끼리 덧셈을 하면, 타원곡선 위에 있기 때문에, 사칙연산에 대해 닫혀있기 때문이다. 타원 곡선을 어떤 체 위에서 정의하느냐에 따라 달라지겠지만, 암호학에서 사용할 때에는 정수 위에서 정의하는 것으로 하자. 정수는 체가 아닌데요?라는 의문을 가진다면, 정수의 나눗셈을 해결할 수 있는, 모듈러 연산을 이용한 갈루아체 위에서 정의한다고 알아두자, 이는 나중에 설명하겠다. 타원 곡선상의 덧셈의 특징을 설명하기 전에, 무한점 O에 대해 설명하겠다. 무한점 O는 말 그대로 타원곡선 상에서 무한대로 극한을 보냈을 때의 점을 의미한다. 무한점은 타원곡선 상의 점A에 대해 (앞으로 점 A라고 하면 타원곡선 위에 있는 점을 의미한다.) A+O=A를 만족시킨다. 따라서, 타원곡선 체에 대해서 무한점O는 항등원이다. 또한, 점P와 점Q에 대해서 P+Q=O를 만족시키는 점 Q는 점P에 대한 역원이고, Q=-P로 표현할 수 있겠다. 이때, -P는 P를 x축 대칭한 점이 된다. 또한 교환법칙도 성립한다. 뭐라해도 타원곡선은 체이니까 말이다.

    그렇다면 타원곡선 위에서 덧셈을 정의하자. 덧셈을 정의하면 곱셈이나 뺼셈이 정의되고, 그렇면 나눗셈도 정의된다. 점P를 (P_x, P_y)라 하고 마찬가지로 점Q를 (Q_x, Q_y)라고 하자. 특이하게도 타원곡선 상의 덧셈은 두 점이 같은 경우와 다른 경우를 나누어서 정의하는데, 그래도 쓰면 무한점이 나오기 떄문이다.

    If P=Q, P+Q = 2*P

    If P!=Q, P+Q = (,)

    이 연산을 타원연산의 덧셈으로 정의한다. 곱셈은 덧셈을 여러 번 하면 되고, 나눗셈은 갈루아 체에서 정의되는 대로 역모듈러 연산을 사용한다.

    타원 곡선 암호는 RSA에서 소인수분해의 난해성을 이용한 것 처럼 타원곡선에서 갈루아 소수가 커질 경우 x값을 만족시키는 y의 값을 찾기 힘든 점을 이용한다. 갈루아 소수란, 갈루아 체에서 이용하는 소수로, 모듈러 상수를 의미한다.

    ECC는 RSA와 다르게 개인키를 먼저 생성한다. 갈루아 소수 P를 상호에 정하고, 송신자는 P보다 작은 한 소수 k를 임의로 정한다. 후에, 생성자라고 불리우는 상호 동일한 타원곡서 상의 임의의 점 G에 대해 kG를 연산하면 그 값이 공개키 Q가 된다. kG는 계산하기 쉬운 반면에 갈루아 체에서는 G와 Q를 이용해 k를 구하기 어렵다는 점을 이용한다.

    ECC는 RSA에 비해 반절정도로 작은 키로 같은 보안을 얻어낼 수 있다. 하지만, ECC도 취약한 부분이 존재하는데, 임의의 소수를 정하는 데에 그것이 있다. 만약 그 난수를 구하는 알고리즘이 유출된다면 ECC는 무용지물이 되기 때문이다. 실제로, ECDSA를 이용하는 서명 체계에서 난수 생성 알고리즘이 알려져 무용지물 된 사건이 있었다. 따라서, 현재는 밀러-라빈 후보와 오일러 판정법을 이용하여 임의의 소수를 도출하거나, 하드웨어적으로 블랙박스안에 넣는 방식으로 이를 방지한다.

    ECC에서 사용하는 타원 곡선의 종류에 따라 암호화 알고리즘을 나눈다. 비트코인에서 주로 사용하는 것으로 유명한 secp256k1 곡선도 있고, 생성자와 갈루아 소수를 정해놓지 않고 이것도 임의의 t로 교환하는 방식으로 이것에서 보안을 더 높인 SECP256R1 곡선을 이용한 암호도 있다. P256은 256비트짜리 소수를 이용한다는 의미이고, k는 곡선 y^2 = x^3 + 7을 의미, r은 random을 의미한다.

    ECC는 개인키, 공개키 발급 방식 중 하나이고, DH과 ECC를 엮어서 만든 암호화 방식이 ECDH이며, ECC와 서명 알고리즘을 엮은 것이 ECDSA이다.

    블록 암호화 알고리즘.

    1. DES

    본문

    2. AES

    본문

    3. SEED

    본문

    4. PRINCE

    PRINCE 블록암호는 AES와 마찬가지로 여러 개의 라운드로 구분되는 블록암호이다. Mix Column부터 ShiftBits까지 AES와 매우 비슷하지만, 연산을 더욱 간단화하고 라운드 수를 줄여 저성능 프로세서에서도 많은 비용과 시간을 들이지 않고도 암호화, 복호화를 진행할 수 있도록 한 암호화 방식이다. 기초적인 것들은 AES와 비슷하므로 바로 암호화, 복호화 과정을 살펴보자. 여기서는 PRINCE-64/128을 기준으로 설명할 것이다. 128bit 비밀키를 이용하여 64비트 키로 분할하여 사용한다는 의미이다.

    먼저, 당연하게도 비트열 개수를 맞춰 가공하고, 키의 길이를 확장하는 과정이 필요하다. 그래서 가장 첫단계는 Key Expansion 과정이 있다. 그 후, 화이트닝 과정을 거치고 키를 더하고 라운드 상수를 더하고 S-box연산을 하고, SB연산을 하고 M`연산을 하고 그 역연산을 하고 키를 더 더하고 라운드 상수를 더 더하는 순서로 진행된다. AES의 축소판이라 해도 무방할 만큼 비슷하게 구성된다.

    1. Key Expansion
      +
    2. Whitening
      +
    3. Round I
      +
    4. Round II
      +
    5. M-Layer
      +
    6. Round III
      +
    7. Round IV
      +
    8. Whitening
      +

    위 과정을 통해서 암호화하는 알고리즘을 4-Round 알고리즘이라 하며, 표준 Prince알고리즘은 총 12-Round를 사용한다. 이처럼 연산의 용이성을 위해 라운드를 줄인 Prince를 Round-Reduced Prince라고 한다. 4-Round PRINCE-64/128 나 6-Round PRINCE-64/128는 고정키 대입 공격등 Side-Channel공격에 면역이 없기 때문에 IoT나 소형 기기에서는 적당히 타협하여 12-Round PRINCE-64/128를 사용하거나 한다고 한다.

    해시 알고리즘.

    1. MD5

    본문

    2. SHA

    본문

    3. HMAC (?)

    본문

    \ No newline at end of file diff --git a/public/posts/daehag-ibsiga-handangye-namassda/index.html b/public/posts/daehag-ibsiga-handangye-namassda/index.html new file mode 100644 index 0000000..d6f1545 --- /dev/null +++ b/public/posts/daehag-ibsiga-handangye-namassda/index.html @@ -0,0 +1,25 @@ +대학 입시가 한단계만 남았다. | Morgan's Blog +

    대학 입시가 한단계만 남았다.

    대학 입시가 한단계만을 앞두고 있다.

    합격자 발표와 등록.

    뭐 공부하고 대비해야하는 시험은 다 끝났으니 마음껏 놀고 있지만 마음의 한편에는 아직 불안함이 많이 존재하고 있다. 또 공부와 시험대비라는 정해져 있는 계획만을 12년 동안 따르던 나에게서 갑자기 계획이나 강제성이 사라졌다. 이제부터는 내가 무엇을 할 것인지를 나 혼자서 알아서 결정해야 하고 또한 그 책임도 내가 져야할 것이다. 예를 들어 늦게자도 누군가 깨워주지 않는다는 것에서 그것을 처음으로 느꼈다.

    지금 하고싶은 것도 없다. 무언가 해야하는 것도 딱히 없다. 그래서 그게 더 스트레스다. 운동을 해야할 걸 알고 운동을 하고싶지만 무엇부터 시작해야 할지 막막하다. 영어공부를 해야하는 것을 알지만 막상 하려니 하기 싫다. 운전면허는 학원을 다니므로 예외. 남겨놓은 책도 읽어야 하지만 눈에 들어오지 않는다. 모두 핑곗거리 뿐이지만 나에게는 하지 않을 충분한 계기가 된다.

    마음가짐을 고쳐잡아야 한다. 미련하고 기계이기만 했던 지난 학생 시절을 벗어나 자율적으로 움직이는 어른, 하나의 사람이 되어야 한다. 이러고만 있을 수는 없다. 그래서 다짐을 했다. 내일부터는 사람이 되어보자.

    그 다짐은 물론 다음날 아침에 깨졌다. 늦게 깨어난 것은 물론 일어나자 마자 의욕을 잃었다. 아직 나는 사람이 될 마음가짐이 안되었구나. 옛날만큼이나 아니 오히려 더다짐에 대한 마음가짐과 독기가 풀렸구나..

    어쨋든 무거운 얘기는 여기까지만 하고 이제 앞으로의 계획을 정하든가 해야겠다.

    일단 첫번째로 운전면허. 이번주 주말부터 시작해 매일 1시에 수업이 있다고 들었다. 1차 필기시험을 통과할 수 있도록 집중해서 듣자.

    두번째로 운동. 입시하던 도중에 항상 입시 끝나면 다이어트 하고 헬스를 해서 몸을 건강하게 만들어보자! 마인드였는데 지금은 헬스는 개뿔 먹고 자고 눕기만 하고 있다. 하지만 오늘 뻘짓으로 2시간이나 걸어다녔으니 운동의 초석을 다진것이라 보고 내일부터 or 담주부터 헬스를 끊어야 겠다. PT를 끊던가 하면 식단도 조절되고 그걸 따르는 건 할 수 있으니까 해보자구!

    세번째 영어. TOEFL. 토익말고 토플이 나에게는 익숙하다. 토플 주니어를 거의 매년 치다시피 했고 중딩때 IBT를 여러번 쳤으니 토플이 제일 익숙할 것이다. 일단 나는 기본 영어 감은 충분하고 넘치다고 자부하고 있..으니(???) 문법이나 문제푸는 요령같은 것들을 인강을 듣고 문제집을 풀고 해서 꾸준히 영어공부를 해야겠다. 뭐 많이는 못하더라고 꾸준히는 할 수 있잖아? 할 것도 없는데.. 일단 교재부터 알아보고 (뭐 해커스가 되겠지만) 인강도 알아보고 해서 책을 빨리 구입하던가 해야겠다.

    네번째. 자산. 돈관리. 원래 내 통장은 어머니가 관리하셨다. 금액이 *만 가까이 되니 내가 건들기 힘든 금액이기도 했고, 세금때문에 마음대로 건들면 안된다고 했다. 하지만 만 17세가 되면서 내가 내 금융을 관리할 수 있게 되었고 그때 카뱅이나 씨티같은 계좌를 몰래 만들어 놨다. (나중에 씨티는 해지하느라 애를 엄청 먹었지만) 뭐 지금은 다 알지만.. 내가 쓰는 계좌는 카뱅, 토뱅 두개이다. 어머니가 만들어 놓으신 계좌는 농협에 여러개인데 나도 잘 모른다. 근데 내가 그 고액 저축통장을 찔끔찔끔 빼서 써서 약간 일이 커지게 될 것 같이 되어버리긴 했다. 그리고 문제는 내 경제관념이다. 어디다 빼먹고 왔다. 고3 주제에 한달 사용액이 50만원 가까이 된다. 이건 진짜 고쳐야 한다고 생각한다. 통장정리 하고 어머니께 잔소리 좀 들으며 자산관리에 대해서알아가야 겠다. 국가장학금도 있고 해서..

    다섯째. 뭐 독서려나. 사놓고 안읽은 책이 90%이다.권수로 치면 대강 40권이고 금액으로 치면 대충 100만원 정도이네..? 빨리 읽어야 한다. 대학가기 전에 30권 이상 읽는게 목표이다. 하지만 어림도 없지. 기술서는 빼고 읽으면 그정도는 할 수 있을 것 같다. 독서는 마음의 양식! 나는 독서를 좋아한다.

    여섯째 자기계발! 프로그래밍 공부, 컴퓨터 공부!? 파이썬은 많이 했고 C++도 기초는공부했다. 이제 두꺼운 C++책과 TAoCP, EMC++, 하드웨어 보안, 전기전자 등등 이런 책들 가지고 공부해야 겠다! 재밌겠구만!! 이런거 좋아함.. 요즘에는 코테도 많이 보는 듯 하니 알고리즘 공부도 해놓고 내가 좋아하는 보안 공부도 하고..

    일곱째 인간관계 청산. 이게 좀 많이 필요할 것 같다. 일단 고등학교 3년을 100명이랑 보내서 안 친할래야 안 친할 수 없다. 그 중 도움이 될것 같은 친구가 있고 아닌 친구도 있지만 나는 현생에 충실하지 않았으면서도 충실했어서 대강 다들하고 이어져 있다. 이 상태 유지만 하면 좋을 것 같다. 내 주요 인간관계는 모 SNS의 분들과 몇몇 친구들이니..

    이게 이걸 바탕으로 계획을 짜보자! 애들 공부하는 VLOG도 보면서 ‘나도 그랬었지’ 와 ‘그랬었으니 지금도 가능’을 동시에 느낄 수 있다.

    화이팅! 이제 끝이고, 이제 진정으로 새로운 시작이다!!!!!

    \ No newline at end of file diff --git a/public/posts/dareun-jibe-eonjhyeo-sandaneun-geoseun/index.html b/public/posts/dareun-jibe-eonjhyeo-sandaneun-geoseun/index.html new file mode 100644 index 0000000..6dab44d --- /dev/null +++ b/public/posts/dareun-jibe-eonjhyeo-sandaneun-geoseun/index.html @@ -0,0 +1,19 @@ +다른 집 | Morgan's Blog +

    다른 집

    우리 집은 창원이다.어렸을 때 서울에 살다가 초증학교때 창원으로 내려왔고, 고등학교 3학년까지 거기서 살아왔다. 고등학교는 기숙사 학교를 가기는 했지만, 내가 가장 마음의 안식을 느끼고 진정으로 쉴 수 있는 곳은 오직 우리 집이다.

    대학을 서울로 와서 대학 기숙사에 들어가게 되었다. 고등학교때 기숙사는 들어오자마자 화장실과 샤워실을 리모델링 하기도 했고, 전국에서 아마 가장 넓은 방을 가지고 있었지 않을까 싶다. 각 방마다 냉장고도 있고. 하지만 대학교 기숙사는 참담했다. 2/3로 줄어든 엄청 좁은 방에, 낮은 천장, 허술한 난방, 게다가 못 쓸정도로 더러운 화장실과 때와 곰팡이로 가득한 샤워실까지. 고등학교때와는 차원을 달리할 정도로 극악의 기숙사였다. 그래서 그런지, 공용 공간의 위생을 병적으로 집착하는 나에게는 너무 스트레스였다. 여기저기 남이 쓰던 쓰레기나 껌같은 흔적들이 방 곳곳에 있었고, 애초에 너무 더러웠다. 그래서 결국 기숙사에일주일을 못 버티고도망쳐 나왔다. 그렇게 조부모님 댁에 얹혀 살기 시작했고, 1시간의 통학생활이 시작되었다.

    처음에 통학을 했을 때에는 학교를 가기만 하는게 너무 힘들었고, 어떻게 이렇게 힘들게 학교를다니지라는 걱정만 있었지만, 막상 한달째 통학을 하고 나니 일상 운동도 되고 기숙사와는 달리 정신을 빠릿빠릿하게 세우고 생활을 하게되는 장점도 많았다. 특히 강제적으로라도 기상시간이 앞당겨진다는 것은 일상의 더 빠른 시작을 일으켜 가장 강점이 되었다. 강권의 약속과 술약에서 수월히 빠져나올 수 있는 구실이 된다는 것은 덤.

    원래의 집에서 생활하는 여타 통학과는 달리 나는 조부모님 댁에서 생활을 하니 삶의 제한이 꽤 자유롭다. 통금 시간도 없고, 부모님의 잔소리도 없어(솔직히 이건 필요하다.) 기숙사의 자유도와 비슷하지 않을까 싶다. 하지만 그만큼의 자유에는 할머니 할아버지의 생활도 최대한 배려하고 눈치를 많이 보면서 살아야 한다는 의무가 따른다.

    내가 가장 질색하는 몇가지가 있다. 강박에 가까워 고치기 정말 힘든데다 관련된 사소한 것에도 진짜 엄청난 스트레스를 받는다. 첫번째는 먼지. 두번째는 음식, 마지막은 간섭. 바닥에 먼지가 있는 것을 극도로 싫어한다. 발은 항상 깨끗해야 한다. 침대에서 거꾸로 누울때도 걱정없이 잘 수 있을 정도로 발은 청결해야 한다. 하지만 조부모님댁(이하 본가)은 연립주택인데다, 도심에 있어 먼지가 많이 쌓인다. 게다가 청소를 잘 안하신다. 발에 계속 뭔가 달라붙고 먼지가 쌓이고 그것으로 스트레스를 엄청 받았는데, 내가 청소를 하는 것으로 해결되었다. 난 청소를 좋아한다.

    두번째는 음식. 나는 비만이다. 비만이지만 먹는 것을 좋아하지도 않고, 많이 먹지도 못한다. 하지만 강박이 있어 밥을 남기지를 못한다. 죽을 것 같아도 밀어 넣는다. 그런 강박이 있다. 그래서 평소에는 음식 냄새를 맡으면 토가 쏠린다. 그런것은 문을 닫으면 해결될 수 있다. 하지만 본가의 세탁기는 부엌을 지나 베란다에 있다. 빨래를 해주시고 말리시는 과정에서 음식에 대해서 많은 일들이 일어난다. 첫번째 항목에와 마찬가지로 음식 먼지, 즉 고춧가루 소금이나 음식에 관련된 사소한 찌꺼기들에 엄청난 스트레스를 받는다. 빨래를 가져오시는 과정에서 음식 먼지가 많이 붙는다. 이건 어떻게 해결해야 할지 감이 안온다. 런드리고라고 빨래 대행까지 생각했는데, 도리가 아닌것 같아서 포기했다. 뭔가를 요구하기에는 얹혀 사는 입장이라 너무 불편하다.

    마지막으로 간섭. 이거는 누구나 마찬가지이겠다. 내 방은 아무도 청소하지 않았으면 한다. 사생활 그런 문제는 아니고 그냥 ‘있던 그대로’라는 강박 때문이다. 물건이 나도 모르는 새에 위피가 바뀌어 있으면 사소한 것에도 스트레스를 받는다. 이건 어쩔 수 없는 성격상의 결점이라 부탁드리는 수밖에 없을 것 같다.

    조부모님은 진짜 어려운 관계인 것 같다. 부모님보다는 거리감이 있지만 그 외에서는 가장 가까운 관계이다. 조부모님과 나의 관계는 극단적으로 생각하면 남이지만 사실 가장 친밀한 가족의 소중한 가족이다. 편해진다면 얼마든지 편해질 수 있지만 불편해지면 얼마든지 불편해질 수도 있다..

    하지만 아무리 불편하고 그렇게 생각해도, 항상 고맙습니다.

    \ No newline at end of file diff --git a/public/posts/datacenter/index.html b/public/posts/datacenter/index.html new file mode 100644 index 0000000..957ea83 --- /dev/null +++ b/public/posts/datacenter/index.html @@ -0,0 +1,19 @@ +데이터센터 | Morgan's Blog +

    데이터센터

    구글같은 검색엔진이 늘어나고, 다양한 기업들과 서비스들이 사용자들의 개인정보와 데이터를 마구 수집한다. 이로 인해 생겨나는 기하급수적인 양의 데이터들을 보관할 스토리지와 그것들을 사용할 수 있는 데이터로 가공하기 위해 필요한 수없이 큰 컴퓨팅 파워를, 큰 기업들이 대형으로 지어놓은 데이터 센터가 담당하고 있다. 게다가 이제는 작은 기업이나 서비스들은 AWS나 GCP, Oracle과 같은 서비스를 통해 Cloud로 Computing하기까지 하니, 아마존이나 구글의 데이터 센터는 얼마나 커다랗고, 커다래야 하는지 알 수 있다.

    아마존과 구글의 데이터센터뿐 아니라 네이버, MS, 오라클, 및 작은 데이터센터들이 지어질때 중요하게 작용하는 것이 있다. 발열과 전력문제이다. 어디보다도 전력을 사용하여 열이 덥혀질 시설이 겨울만큼 춥다는 것으로 얼마나 냉각시스템이 신경쓰는지 알 수 있다. 심지어 우리집에 있는 노트북만 사용해도 80도 가까이 올라가고, 방이 더워지는데 수백, 수천, 수만대의 컴퓨터가 설치되어있는 데이터센터는 오죽할까. 연료를 태워 그 열기로 전기를 만들고 그 전기를 다시 열로 바꾸고, 그 열을 내보내기 위해 또 다시 전기를 쓰다니.

    나도 집에 작은 서버 하나를 운영하고 있다. 매달 받는 전기세가 가히 신비롭다. 그리고 방도 매우 덥다. 한대로 이 정도인데, 데이터센터는 엄청난 전기를 먹고 있다. 게다가 요즘에는 비트코인 열풍이 불어서 채굴이 한창 떠오르고 있다. 어떻게 보면 채굴장도 하나의 데이터 센터라고 볼 수 있지 않은가. Visa나 마스터카드와 같은 카드사들의 데이터센터가 각 나라로 각 개인으로 분산되어 분포하는 것과 비슷하게 볼 수 있으니 말이다. 이러한 와중에 전력이 부족해지고 있다는 뉴스가 자주 떠오른다.

    그 많은 데이터센터의 대부분은 아마 인텔 제온 프로세서, 하드 디스크와 엔비디아의 그래픽카드를 구축해 놓았을 것이다. MS의 Bing 데이터 센터는 FPGA를 이용해 조금 더 성능을 높였다는데, ASIC이나 FPGA를 이용한 데이터센터도 많을 것 같다. 다들 전기를 많이 먹는 장비들이다. 그렇다면 전성비를 고려하는 건 어떨까. 가령 전성비 최강인 ARM이나 RISC를 사용한다던가, Bing처럼 FPGA를 이용하던가.

    사실 전성비가 좋은만큼 서버 프로세서만큼의 수율이 나오지 않을 것이며 그 정도의 성능을 낼 정도의 대형 프로세서는 나오기 힘들 것 같다. 아직까지 모바일로 사용하는 이유기도 하고. 하지만 괴물급 기업들이 ARM 개발을 위해 한창 노력중이니. 엔비디아도 ARM코어로 데이터센터 개발중이라 하고, 그 애플이 ARM으로 노력중이니 곧 데스크탑급 되는 시스템이 나오고, 좀 있으면 서버급도 나올 수 있지 않을까 기대하고 있다. ARM 는 극강의 전성비를 고려한 설계인 만큼 물량으로 밀어붙여도 x86에 전력으로는 이길지 않을까 싶다. 서버에서는 코어수도 중요하게 작용하니까 다중코어로는 훨씬 유리하지 않을까 싶다.

    화이팅! ARM으로 개발하시는 기업들 모두!

    \ No newline at end of file diff --git a/public/posts/gaeinjeongbo-privacy/index.html b/public/posts/gaeinjeongbo-privacy/index.html new file mode 100644 index 0000000..ae5d693 --- /dev/null +++ b/public/posts/gaeinjeongbo-privacy/index.html @@ -0,0 +1,19 @@ +개인정보.. Privacy.. | Morgan's Blog +

    개인정보.. Privacy..

    나는 구글이 싫었다.

    구글에 반대하며 지메일도 거의 쓰지 않고 있고, 다른 구글 플랫폼을 벗어나 다른 플랫폼으로 옮기고 있다. 하지만, 아이폰으로 옮기고 나서 몇주간을 생각해보니 내 분노의 대상은 구글이 아니라 애플이여야 한다는 것을 알게 되었다. 카카오, 구글에 가지고 있던 분노의 이유가 애플이라는 기업 자체를 강타한다. 물론 나도 알고 있었고, 구글 못지 않게 애플을 싫어하고 있었다. 새롭게 휴대폰을바꿀 때에도 OS만 구글이고 제조사는 다양한 (삼성이..겟지만..) 안드로이드 휴대폰과 휴대폰 하드웨어, 악세사리, OS, 결제, 게다가 웹엔진까지 제한하고 독점해버린 애플과는 비교가 된지 않는다고 생각했고, 이번에 플립이 잘 나와서 그것으로 바꾸려 했다. 물론 에어팟 수리를 하러 갔다가 아이폰에 홀리듯이 들어가버렸다. 한동안 애플의 통합 생태계의 편리함에 매료되어 내가 빅테크 기업에 어떤 이미지를 가지고 있으며 어떤 불만과 어떤 사상을 가지고 있는지 잊었었다.

    하지만 이 문제는 구글이나 애플만의 문제가 아닐 것이다. 따라서 애플과 구글만을 싫어한다고 해서 해결될 문제가 아니다. 이건 모든 빅데이터 산업과 모든 데이터 기업들이 가지고 있는 문제이고, 현대 사회에서 피할 수 없는 문제인 것 같다. 개인에 맞추기 위해, 광고주와 개인을 동시에 만족시키기 위해선 개인정보의 수집이 불가피하다. 최소한의 개인정보 수집이라 해고 결국 수집해야 하는 개인정보는 한둘이 아니다. 따라서 우리는 우리의 개인정보에 대해 어떤 것을 기업에게 주고 어떤 것을 주지 않을지 선택할 권리가 있어야 하고, 선택에 신경써야 한다. 특정 앱을 잘못 설치했다가 지금 모습이 데이터센터에 축적되고 있을 수도 있으니까. 이러한 점에서 개인의 Privacy 선택권을 최대한으로 존중하는 애플은 본받을 만 하다. 애플이 선구적으로 도입한 Ask app not to track이나 앱별 개인정보 관리, 카메라 사용과 마이크 사용 표시는 안드로이드에서도 도입하려 하고 있으니까 이건 정말 잘했다고 생각한다. 애플은 광고 받는 장사가 아니니까 할 수 있는 거겠지만 말이다.

    하지만 구글은 태생이 검색엔진이고 광고 받는게 중요하고 가장 큰 수입원인 기업인 만큼 개인정보 수집에 가장 신경써야 하면서도 가장 필요한 기업이다. 앞으로 어떻게 할지 궁금하다.

    난 아이폰을 사용한다. 앱 트래킹은 다 차단했고, 필요한 것 외에는 카메라를 절대 허용하지 않는다. IP별 개인화도 좋아하지 않아 Private Relay도 잘 쓰고 있다. 하지만 매일매일 구글을 사용하고, 어쩔 수 없이 트래킹이 발생할 수 밖에 없다. 따라서 우리는 개인정보를 흘리고 다니지 않고 꽉 매고 다니는게 중요하다. 계정 보안과 로그아웃은 당연히 중요하고, 무분별하게 계정 연동을 하거나 가입하는 것도, 공개된 웹 상에 자신의 전화번호나 주소, 이메일 주소들을 과도하게 공개하지 않는것도 중요하다.

    HTTPS 연결 확인도 중요하고, WiFi가 믿을 만 한지, 이 네트워크가 믿을 만 한건지도 중요하다. 신경써야 할 게 많지만 철저히 익명으로, 해킹당하지 않을 예방법을 생각하면 쉽다. 개인정보 보호와 해킹 방지는 방법이 비슷하다. 주의해야 할 것은 믿을 만한 곳에 흘리는 개인정보이다. 구글이나, 네이버. 믿을 만 하지만 가장 필요한 회사이다. 가장 이용해먹는 회사이고. 이 점만 주의한다면 일반적으로 자신의 개인정보를 관리한다고 할 수 있지 않을까..?

    \ No newline at end of file diff --git a/public/posts/godeunghaggyo-dolabogi/index.html b/public/posts/godeunghaggyo-dolabogi/index.html new file mode 100644 index 0000000..65c22c2 --- /dev/null +++ b/public/posts/godeunghaggyo-dolabogi/index.html @@ -0,0 +1,22 @@ +고등학교 돌아보기 | Morgan's Blog +

    고등학교 돌아보기

    2021년을 돌아보며.

    2021.12.22

    벌써 12월 22일이다. 12월달에는 열심히 살아야지 하던게 어제같은데 벌써 새해가 다가온다. 나는 내년 성인이 되지만, 아직 실감이 안난다. 술담배를 할 수 있는 나이라기 보다는 내 행동에 내가 책임져야 하는 때가 되었다는 게 더 실감이 난다. 대학을 고민하며 내가 앞으로 뭘 하면서 먹고 살아야할지 꽤 오랫동안 고심했는데, 그 결과로 조금 성장한 것 같아 이제와서는 약간 기쁘기도 하고 무섭기도 하면서 슬픈 약간 오묘한 기분이다. 어찌되었든 이제 성인이 되니까 조금 변해야겠다고 다짐하고 있다.

    2021년을 돌아보면 2020년을 돌아봐야 하고, 그러면 당연히 2019년이 생각난다. 여튼 고등학교 3년 생활이었기에 항상 쌍으로 돌아다녀야지. 고등학교 생활을 돌아본다.

    2019년, 고등학교 입학.

    나는 초등학교 때부터 영재교육원을 다니면서 내 미래가 결정되다 싶이 했다. 이렇게 계속 하다보면 동네 중학교에 진학하여, 과학고를 준비하고, 과학고에 진학하여 과기원을 가는게 정해져있었던것 같다. 그때는 지금 이렇게 될지는 몰랐겠지만, 그 길을 모범적으로 걸어서 지금의 내가 되었다.

    2018년 연말, 나는 과학고 입시를 봤다. 자기소개서를 쓰면서 학원에서 선생님과 친구들과 새벽 3시까지 남아 첨삭을 했던 기억이 있다. 불 꺼진 건물에서 술래잡기를 하면서 즐거웠던 기억이 있는데, 지금 돌아보면 즐거워서는 안되었것 같지만 중학생이니 그럴 수 있다고 생각한다. 그때쯤에는 학원에 12시까지 남아서 서류준비를 하고는 했는데, 이때 항상 데리러 와주셨던 아버지께 정말 감사하다고 이제와서 생각한다. 초등학교 6학년때부터 올림피아드를 준비하면서 매 주말마다 학원에 갔고, 내가 숙제를 안해서 학원에 늦게 남아야 했던 적도 많은데, 그럴때마다 항상 아무말 없이 데려다 주셨다. 영재원도 다녔기에 먼 거리를 항상 운전해 주셨다. 2주마다 창원에서 진주까지 가고, 거기서 4시간을 기다려주시고, 집에 데려다 주셨다. 이제와서 생각하니 정말 너무 감사하다는 말 밖에 안나온다.

    서류를 통과하고, 면접을 준비해야 했다. 나는 말을 잘 못했다. 정확히는 너무 긴장을 하는 타입이었다. 평소에는 그렇게 시끄럽고 잘 놀았는데, 면접은 너무 긴장되었다. 그래서인지 준비하는데도 애를 먹었지만, 결과적으로는 잘 되었다. 뭐 통과했으니 말이다.

    면접시험은 너무 못봤다고 생각했고, 그래서 면접을 보고 와서 공부를 했을 정도이다. 아무래도 고등학교를 간다는 낮선 감정과 못봤다는 불안감이 교차해서 잠깐 철이 들었나보다. 하지만 뭐 합격을 했고, 합격 페이지를 봤을 때 그 희열은 아직까지도 기억이 난다. 합격을 했어서, 나는 의욕이 붙었었다. 과고 대비반, 과고를 들어가기 전 방학때 잠깐 하는 총정리 수업을 정말 열심히 했었다. 아마 그정도로 열정을 가지고 공부했던 적은 거의 없던것 같다. 고등학교때는 열정이 아니라 강박에 의해서 공부를 했으니… 그때 물리와 수학, 화학을 한번 쭉 배웠는데, 수학은 둘째치고 그때 배웠던 화학 지식은 고등학교 3년동안 우려먹었고, 그때 배웠던 물리 덕분에 상위권?을 유지할 수 있었다. 정말 재미있었고, 원리가 신기했다. 정말 지금 생각해도 그때 새로운걸 배운다는 느낌을 다시 느낄 수 없을 것 같다. 여튼 방학동안 정말 열심히 공부했고, 덕분에 1학년때에는 최상위권을 할 수 있었다.

    내가 진학하는, 과학고는 기숙사 학교였다. 이때 처음으로 집을 떠나 멀리서 생활하기 시작했다. 처음에는 정말 정말 무서웠다. 들뜬 감정도 있었지만, 중3 그 어린 나이에 집을 나온다는 건 아무래도 많이 불안했던 것 같다. 과학고는 브릿지라고, 입학 전에 2주간 두번 학교에서 미리 생활하면서 기숙사 생활과 고등학교 일상에 미리 익숙해지고, 미리미리 여러가지 시험을 치면서 각종 반을 결정하는 기간을 가진다. 2월 초 처음으로 브릿지를 가면 기숙사 방을 배정받고 생애 처음으로 룸메이트를 배정받았다. 생판 모르는 친구랑 같은 방에서 자고 생활해야 하는 거였는데, 나는 새 친구를 잘 사귀지 못하는 편이라 약간 두려웠다. 물론 말만 한번 트면 급속도로 친밀감을 좁히는 스타일인데, 그 처음 말을 트는게 힘들었다. 하지만 착한 친구였고, 덕분에 2주동안 여러 친구도 사귀고 잘 지냈다. 기억나는건, 우리 방에 귀신이 나오기로 알려진 괴담이 있는 방이었는데, 무서워서 몇일은 못잤던 기억이 있다. 기숙사 생활은 생각보다 괜찮았다. 첫날 빼고는 바로 익숙해졌다. 아침 6시 20분에 일어나는 것과 점호, 그리고 공동 샤워실에서 씻는것이 정말 낮설었지만 성격상 금방 적응했다. 너무 적응해서 문제지만.. 아침에 일어나서 운동장을 한바퀴 도는 구보를 하고 기숙사로 돌아와 씻는 시간을 가진다. 이후 아침 자습을 하는데, 이때 시험을 쳤다. 진단고사라고, 아마 자신의 위치를 확인해보라고 시행했던 시험이었던 것 같다. 아침에 머리를 굴리는건 낮설었고, 그때에는 그게 지대한 영향을 끼칠 것 같아 최선을 다해서 쳤다. 물론 두번째 브릿지에서는 잔다고 치지도 못했지만..ㅎㅎ

    입학을 하고 정식으로 학생이 되었다. 방학때 공부했던 기세로 1학기는 정말 열심히 했던 것 같다. 아마 고등학교 때중에서 최고로 집중했던 시기이다. 덕분에 뭐 점수는 잘 받았고, 원하던 영재학급도 들어갈 수 있었지만 원하던 동아리는 떨어졌다. 시험이 처음보는 개념들 투성이었고, 부산이나 서울에까지 가서 공부했던 친구들과 싸움은 힘들었다. 이때 한계를 첨으로 느꼈다. 1학기 기말고사가 끝나고 고등학교 생활의 전환점이 찾아온다. 한 친구를 알게 된다. 중3때 나는 덕후.. 였다. 1학기때에는 공부하느라 바빠서 다른거에 신경쓸 겨를이 없었지만 처음으로 방학을 맞이하면서 여유가 생겼고, 자유시간이 많이지면서 약간은 문화생활을 즐기게 되었다. 이때 내 내면에 있던 잠재력이 부활을 했고, 그때 같이 덕후인 한 친구를 만나게 된다. 나랑 너무 잘 맞았다. 성격도 잘 맞았고, 관심사도 잘 맞았던 그 친구와 나는 급속도로 친해졌다. 그러다 우리는 연애를 한다. 그것도 중간고사 5일전에 사귀기 시작했다. 당연히 공부는 하지 않았고, 연애에 몰두하느라 2학기는 통으로 날리게 된다. 하루종일 놀고, 문자하고, 편지쓰고 그랬다. 단 둘이 있기 좋은 시골학교라 산책도 자주 갔고, 정말 행복했다. 성적이 많이 떨어졌다. 그래도 중위권은 유지했는데, 부모님은 당연히 당황하셨을 것이다. 갑자기 그렇게 성적이 떨어졌으니.. 그래서 결국 부모님과 틈만 나면 싸웠고, 그 친구와도 정말 자주 싸웠다. 지금와서 내가 왜그랬을까 싶다. 정말 좋은 친구였고 정말 잘 맞았는데, 내가 너무 잘못했던것 같다. 시간이 많이 흘러서 알게 되는건가 싶다. 그 친구와는 몇번에 다툼 이후로 영영 멀어지게 되었다.

    한번 공부를 놓으니 그 뒤로 공부하기 어려웠고 낮아진 성적은 높이기 힘들었다. 그렇게 나는 2학년을 맞이했다.

    2020년에는..

    2020년 나는 2학년이 된다. 1학년 친구들이 새롭게 들어오며 2학년이 되었다는 것을 실감했다. 새롭게 마음을 다잡고 공부를 하기로 마음먹었다. 그나마 공부를 해서, 성적을 높이는 데에는 성공했다. 2학년 1학기를 잘 쳐서, 조기진학이 가능한 성적이 되었다. IQ도 140을 넘겨서 조기졸업도 가능했다. 2학년 여름방학때는 고민을 한다. 조기졸업을 할지 조기진학을 할지.

    그 전에, 2학년에 올라가는 시기에 코로나를 맞이한다. 전 수업이 온라인 수업이 되었고, 입학식뿐만 아니라 진급식, 그리고 그 사이 수업도 전체 다 온라인으로 진행하게 되었다. 온라인으로 진행하면서 장비를 셋팅하기 시작했다. 내가 아침에 수업을 제대로 들을리 없었기 때문에 캡쳐보드며 다른 여러 장비도 장만했다. 그러면서 오디오 문제가 생겼다. 에어팟은 녹음을 하면서 동시에 재생할 때 통화로 연결이 되어 음질이 정말 너무 구리기 때문에 이를 해결하기 위해 오디오 장치를 따로 썼고, 캡처보드에 오디오를 넣기 위해 가상 오디오 드라이버까지 찾아가며 준비했다. 그러면서 오디오 드라이버에 관심을 가졌고, 그러면서 컴퓨터에 대해서 관심을 가지게 된다.

    \ No newline at end of file diff --git a/public/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga/index.html b/public/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga/index.html new file mode 100644 index 0000000..e2ddece --- /dev/null +++ b/public/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga/index.html @@ -0,0 +1,16 @@ +구글은 그 많은 페이지를 어떻게 찾아낼까. | Morgan's Blog +

    구글은 그 많은 페이지를 어떻게 찾아낼까.

    구글은 방대한 웹페이지를 자사 데이터베이스에 기록하고 있으며, 이를 토대로 사용자가 검색한 검색결과와 가장 매치되는 페이지를 보여줌으로써 검색엔진의 역할을 할 수 있다. 구글이 이렇게까지 클 수 있었던 이유는 정확한 검색 결과를 보여주는 알고리즘 덕분이다. 그렇다면 이 알고리즘은 무엇일까? 구글이 웹페이지들의 관계를 산출하고 그 수치를 계산해내는 알고리즘인 페이지랭크 알고리즘은 구글의 창시자중 한명인 래리 페이지라는 사람이 석사논문으로 발명한 알고리즘이다. PageRank 알고리즘은 각각의 웹 페이지의 상대적 가중치를 계산하여 각각의 중요도와 연관성을 표현하는 방식을 이용하는데, 이를 이용하여 한 페이지와 가장 연관된 다른 페이지를 Rank를 매겨 정확한 연관성을 보여줄 수 있다. PageRank에서는 각각의 웹페이지를 노드로 보고, 상호 참조와 인용으로 각각의 노드를 연결하여 하나의 거대한그래프를 만든다. 각각의 페이지는 랭크값이라는 고유한 수치를 가지고 있고, 그 페이지에서 인용된 각각의 페이지는 인용한 페이지의 랭크값을 동등하게 나눠가진다. 많이 인용된 페이지는 랭크값이 높을 것이고 적게 인용된 페이지는 랭크값이 낮을 것이므로 이 랭크값으로 페이지들의 중요도를 줄세울 수 있다. 하지만 다중연결 그래프에서 각각의 노드가 각각의 노드의 값을 참조하기 때문에 순환참조 구조가 되어 무한적으로 계산하게 되는 문제가 있고, 결과적으로 노드의 값을 계산할 수 없다는 문제가 있다. 페이지랭크 알고리즘에서는 이 각각의 페이지의 랭크값이 계산을 계속하다 보면 각각 하나의 값으로 수렴한다는 것을 증명하여 문제를 해결하였다. 아니, 애초에 문제가 되지 않았던 것이다. 이 과정에서 그래프의 각 노드 랭크값을 표현한 행렬에 변환연산을 함으로써 계산의 단계를 나아가는데, 이때 이용되는 마르코프 행렬을 구글행렬이라고 한다. 페이지랭크 알고리즘은 이러한 각각의 랭크값을 계산하는 정규화공식과 계산과정의 규칙성, 그리고 수렴한다는 증명으로 완성된다. 물론 산출 과정중에 초기 산출 방법과 루프의 해결 그리고 보정을 위한 서퍼가 존재한다.

    (Step1) 초기화각 노드들의 중요도 초기값은 1N1N으로 설정.(이때 NN은 전체 웹페이지의 개수)

    (Step2) 업데이트노드 K의 t번째 시도에서 중요도를 $PR(K;t)$ 라고 할때, $ PR(K;t+1)$ 은 $ PR(K;t+1) = \frac{1−d}{N} + d \Sigma{P∈K} \frac{PR(P;t)}{|Γ_P|} $ 이다. 여기서 $d(0≤d≤1)$는 제동(damping)계수이고, $Γ_K$는 K에서 인용한 노드들의 집합이다. 그리고 $|ΓP|$는 P를 인용한 노드의 개수이다.

    구글행렬은 행렬분리를 하기 좋은 구조로 이루어져 있으며 이 덕분에 반복연산을 행하기에 매우 좋은 구조로 되어있다. 그래프를 인접행렬로 표현한 후, 각각의 페이지값을 확률행렬로 나타낸다. 인접행렬을 n승하면 n번 순회하여 도달하는 페이지를 의미한다. 하지만 인접행렬로 계산하면 수렴성을 보장할 수 없기 때문에 수렴성의 확보를 위해 확률행렬로 변환한 후, 각 열의 합이 1이 되고 나서 n승 계산을 수행한다. 따라서 행렬 S는 다음과 같이 정의한다. $S = H + \frac{1e^T}{N}$ N은 총 노드의 갯수, 벡터 1인 전체 1인 열벡터이고, e는 특정 열의 합이 0이면 원소값이 1인 열벡터이다.

    이제 이 확률행렬을 수렴하게 계산하기 위해 구글행렬 G를 계산한다.

    $G = dS + (1-d)E$이고, 이때 d는 Damping 계수이다. 이렇게 계산한 구글행렬을 페이지랭크 알고리즘에 대입하면 가장 큰 고윳값이 1인 행렬이 되어 Frobenius 정리에 의해 초기값에 관계없이 일정한 값으로 수렴한다.

    \ No newline at end of file diff --git a/public/posts/haggyoeseo-haessdeon-peurojegteudeul/index.html b/public/posts/haggyoeseo-haessdeon-peurojegteudeul/index.html new file mode 100644 index 0000000..de8bc40 --- /dev/null +++ b/public/posts/haggyoeseo-haessdeon-peurojegteudeul/index.html @@ -0,0 +1,16 @@ +학교에서 했던 프로젝트들.. | Morgan's Blog +

    학교에서 했던 프로젝트들..

    1. 귀가시간 수집 프로그램
    2. 기상곡 수집 프로그램
    3. 컴퓨터실 사용현황
    4. 학교 내부 정보공유망
    5. 문서파일 자동저장 및 복구 시스템
    6. 학교 저지 사이트 API 정리 및 제출시스템 프록시
    7. 선생님들이 부탁하셨던 수많은 프로그램들
    \ No newline at end of file diff --git a/public/posts/hardware-security/index.html b/public/posts/hardware-security/index.html new file mode 100644 index 0000000..a49a819 --- /dev/null +++ b/public/posts/hardware-security/index.html @@ -0,0 +1,16 @@ +Hardware Security | Morgan's Blog +

    Hardware Security

    Hardware Security

    신뢰성과 관련된 기술

    1. RoT (Root of Trust)

    Root of Trust, 신뢰점이란, 전자기기 안에서 별도로 존재하는 프로세싱 유닛으로, 메인 프로세서의 보조로서 다양한 암호화 기법이나 솔루션을 제공하거나 이를 제어하기 위한 보안 기능들을 의미한다. RoT가 궁극적으로 달성하고자 하는 것은 TC(Trusted Computing)으로, 신뢰할 수 있는 컴퓨팅, 즉 믿을 만 하고 무결성이 보장되는 계산 및 기능을 이야기한다. 이를 달성하기 위한, RoT에 포함되는 여러가지 기술들이나 알고리즘이 있고, 각 단계들을 순차적으로 달성되어 신뢰할 수 있는 보안적인 프로세스가 진행된다. RoT의 대표적인 기법이나 기기는 TPF, TEE등 신뢰할 수 있는 플랫폼 모듈이나 신뢰할 수 있는 실행 환경이 있다.

    2. TPF

    TPF, Trusted Platform Module이란, 신뢰할 수 있는 플랫폼 모듈을 의미한다. 어떤 어플리케이션이나 프로세스가 신뢰성 있도록 실행되기 위해 별도의 플랫폼 모듈을 설치한다. 이 플랫폼은 다양한 암호화 기법을 제공한다. TPF는 외부에서 접근이 불가하도록 설계된 암호화 키와 저장공간 및 연산장치를 별도로 제공함으로써 외부에서는 암호화 키나 암호화 과정 및 알고리즘, 그 설계를 알 수 없도록 만들어져 소프트웨어적으로 취약할 수 밖에 없는 키 유출을 해결한 장치/기술이다. TPF는 내부 키(서명)이 존재하고, 이를 바탕으로 다양한 암호화 프로세스를 제공한다. RSA암호화나 ECC암호화 및 서명 및 검증을 제공하며, Hashing이나 HMAC, 어플리케이션이 응용할 수 있는 암호화된 저장공간을 제공하기도 한다.

    TPF는 외부에서는 절대 접근할 수 없게 만들어져 있다. 하드웨어적으로 메인 프로세스와 분리되어 있어 해킹 당하거나 키가 탈취당할 확률이 적으며, 별도의 메모리를 사용한다. 하지만, TPF도 물리적인 해킹에는 취약할 수 밖에 없으며, 직접 칩을 탈취하여 역공학이나 부채널 공격을 시행하면 키가 탈취당할 위험이 있다.

    3. TEE

    TEE, Trusted Execution Environment란 신뢰할 수 있는 실행 환경을 의미한다. TPF를 따로 설치할 수 없는 환경이거나 TPF를 설치한 환경이라도 더욱 보안을 강화하기 위해 메인 프로세서를 보안 영역과 일반 사용자 영역으로 나누어 사용하는 것을 의미한다. 보안 영역에서는 TPF에서와 마찬가지로 보안 정보의 저장과 처리를 수행하고, 암호화 프로세스를 실행한다. 일반 사용자 영역에서는 보안 프로세스가 필요하면, 이를 보안 영역에서 실행함으로써 이를 신뢰 가능한 별도의 환경에서 실행하도록 하는 기술이다. 결제 및 인증 과정이나 DRM 과정이 TEE에서 주로 실행된다. 보안영역은 일반영역과 물리적으로 분리되어 있어, TPF와 마찬가지로 일반영역에서 TEE에 접근할 수 있는 방법은 TEE가 제공하는 방법밖에 없다. TEE는 TPF와는 다르게 일반 영역에 있던 잡다한 프로세스도 실행하고 처리할 수 있다. TPF에서는 비밀번호 입력 등의 온전히 메인 프로세스의 일인 것들을 처리할 수 없었지만, TEE는 메인 프로세서에 포함되어 있으므로 이러한 사소한 것들까지 모두 담당할 수 있어 보안을 더욱 향상시켜 준다. 완전히 신뢰 가능한 환경을 조성하기 위해서는 TEE와 TPF를 혼용하여 TPF는 TEE에게만 통신하고, TEE는 기타 사소한 것들까지 처리한다면 최고수준의 보안을 유지할 수 있다.

    대표적으로는 삼성전자에서 자사 휴대폰에 기본적으로 탑재하는 보안 솔루션 Knox가 있다. Knox는 휴대폰의 CPU를 보안 영역과 일반 영역으로 나누어 TEE를 제공한다.

    Side-Channel Attack 대책

    1. Side-Channel Attack

    Side-Channel Attack, 부채널 공격이란, 암호화 과정이나 보안 프로세스가 진행중일 때 프로세서에서 부가적으로 얻을 수 있는 다양한 정보들을 이용하여 구조를 파악하거나 키를 탈취하는 방법이다. 부가적으로 얻을 수 있는 정보는 칩에서 나오는 열이나 전자기파, 연산이 수행되는 시간, 전력 소비량, 에러 처리(Fault)등이 있다.

    2. 방어 기술

    Side-Channel Attack의 방어에는 Hiding과 Masking기법이 가장 많이 사용된다. 마스킹이란, 연산의 중간에 사용되는 값을 랜덤하게 결함으로써 원래의 연산에서 사용되는 값들의 입력값과 연산값과의 관계를 불명확하게 하여 특성키 공격이나 알려진 평문 공격에 대비할 수 있도록 하며, 전력 사용량의 규칙성을 모호하게 만든다. 마스킹의 어떤 과정에서 랜덤한 값을 사용하는지에 따라 다양한 마스킹 기법이 존재한다. 하지만, 랜덤 알고리즘이 밝혀지거나 역공학을 통해 알아낸다면, 혹은 또 다른 공격에서는 이 방법은 효과적이지 않을 수 있다. 랜덤 알고리즘이 밝혀졌을 때의 문제점은 거의 모든 암호화 알고리즘에서의 문제이다.

    SABL, WDDL, t-private Logic등이 있다.

    EM(Electro-Magnetic) SCA의 대비하는 방법으로는 랜덤한 전자기파를 방출하는 방법이 있다. 암호화 퍼리 과정에서 더미 연산과 불필요한 값들을 중간중간에 넣어줌으로써 더미 전가지파를 만들어 낼 수 있다. 하지만, 결국 주요한 연산의 전자기파는 모두 누출되는 것이기에 칩을 설계할 시에 이를 대비할 방법을 모색하여 전자파를 최대한 약하게 방출하도록 하거나 차폐 솔루션을 도입하는 등의 과정이 필요하다.

    Fault Injection SCA의 경우에는 예측 불가능한 다양한 상황에 대해서 많은 가능성을 두고 Fault처리를 할 수밖에 없다. 하지만, 이는 많은 연산 성능 하락을 유발하며, 알고리즘을 매우 무겁게 할 수 있다.

    Timing SCA의 경우에는 각각의 입력에 대해 연산시간이 모두 동일하게 처리되도록 설계하거나, 각각의 연산에 더미 타임을 넣는 방법이 있다.

    Reversing 대책

    1. 역공학

    역공학(Reversing)이란, 소프트웨어에서는 특정한 프로세스가 처리되는 과정에서 데이터 흐름이나 역어셈블, CPU처리 분석을 통해 원래의 알고리즘을 알아내거나 원리를 알아내어 크래킹하는 과정을 의미한다. 한편, 하드웨어의 경우에는 다양한 칩을 뜯어내어 그 구조를 확인하거나 전류 흐름을 측정하는 등의 물리적인 분석을 통해 반도체의 구조를 알아내거나 연산 중 어떤 데이터가 어떤 흐름을 통해 이동하는지에 대해 알아내는 것을 의미한다. 반도체 칩의 사진을 찍어 현미경을 통해 분석하는 과정등을 통해 데이터의 이동 버스(BUS)를 알아내는 과정이 포함된다.

    칩의 리버싱은 디캡슐레이션, 디레이어링, 게이트 레벨 넷리스트 추출등의 과정이 있다. 먼저 패키지에선 다이를 제거하고, IC를 디캡슐레이션하여 반도체 칩에 직접 접근할 수 있도록 한다. 후에, 디레이어링을 통해 각각을 싱글 레이어로 분리하여 분석하는데, 이때에는 SEM촬영을 통하여 얻은 사진 설계도를 얻어내는 과정이 있고, 후에 이 사진을 이용하여 이를 회로도로 변환하는 과정이 있다.

    데이터 BUS를 알아내게 된다면, 연산 중간중간에 사용되는 값들을 알 수 있으며, 입력과 출력값을 비교하여 어떤 부위가 어떤 연산을 처리하는지 알 수 있고, 이를 통해 전자기파 주입 공격을 하거나, 키를 알아낼 수 있다. 또한, 같은 역할을 하는 칩을 제작하여 이를 공격하는데 사용될 수 있다.

    2. 메모리 추출 방지

    메모리가 유출되는 경우를 방어하기 위한 방법으로는 PUF가 있다. PUF는 Physically Unclonable Function으로, 물리적으로 복제가 불가능한 함수를 의미한다. PUF는 칩이 각각의 고유한 값을 가지도록 하며, 이를 예측 불가능하도록 하여 칩에 직접 접근해도 이를 알 수 없도록 한다.

    3. 역공학 대책

    Reversing에 대비하는 방안에는 메모리 유출 방지에서 사용했던 방법을 사용한다. PUF를 이용함으로써 각각의 칩에 따라 연산값이 달라지게 되고, 따라서 칩의 구조를 알아내거나 Bus를 분석할 수 있어도 PUF에서의 값은 Bus를 지나가지 않으므로 키를 알 수 없다.

    UART? PSA?

    출처> Wikipedia, [ 하드웨어 칩 기반 보안시스템 밒 해킹 동향, 한양대학교 ]

    \ No newline at end of file diff --git a/public/posts/how-i-wanted-to-do/index.html b/public/posts/how-i-wanted-to-do/index.html new file mode 100644 index 0000000..51eab2a --- /dev/null +++ b/public/posts/how-i-wanted-to-do/index.html @@ -0,0 +1,16 @@ +How I wanted to do. | Morgan's Blog +

    How I wanted to do.

    프로그래밍에 매력을 느껴 프로그래밍에 입덕하게 된 건 2학년때쯤.. 이후 그 재미를 느끼고 많은 것들을 시도해보곤 했다. HTML과 CSS를 배워 가장 기본적인 웹사이트를 만들고, 이를 더 화려하게 꾸미기 위해 JS를 공부했다. 이를 배포하기 위해 서버 구축에 대해 공부했고, PHP나 MySQL을 이용해 기능성을 부여하면서 DB와 SQL에 대해 공부했다. 이후 고전적인 서버를 넘어 SSR이나 CSR에 대해 알아보려 NodeJS를 공부했다. 학교 입학시 과제였던 C로 하는 PS를 하면서 C나 C++에 관심을 가졌고, 왜 C로 코딩하는데 C++를 써야하는지 의문을 가지고 C++을 공부했다. C++이 완전히 다르다는 것에 충격을 먹었고, 이후 비슷한 객체지향에 대해 알아보며 Python에 입문했다. C에 비해 너무 쉬운 코딩과 너무 간단한 개발에 충격을 먹었고, PS하는데만 쓸 수 있던 C와는 다르게 다양한 분야에 접목하기 너무나도 쉬운 Python은 나를 개발 세계에 빠뜨렸다.

    Python의 다양한 모듈을 사용하며 Requests와 같은 웹을 다루는 모듈을 쓰며 대체 웹은 어떤 구조일까 의문이 들어 네트워킹이나 HTTP, HTTPS에 대해 공부했고, 이런 것들을 응용해 나가며 실질적인 코딩에 가깝게 가면서도 주어진 기능 외로 작동하게 만드는 것에 맛을 들려 해킹에 대해 점점 흥미를 가지기 시작했다. Python은 빠르게 무언가 기능하는 하나의 완성품을 만들기 너무 적당했고, 실행했을 때 원하는 대로 작동했을 때의 쾌감에 빠져버렸다. 이후 생각나는 아이디어란 아이디어는 다 파이썬으로 구현했고, 나 자신의 아이디어 뿐 아니라 주변의 아이디어를 신경쓰게 되었고, 그게 학교 서비스 구현 프로젝트로 이어졌다. 파이썬으로 간단하게 했던 것들을 친구들이 노가다로 하는 모습을 보고 아 저거 파이썬으로 할 수 있겠는데라고 생각했고, 그렇게 만들어본게 수십개는 될 것이다. 한편으로는 내 호기심에 딱 알맞게 점점 깊은 곳으로 내려가고 있었다. 원리의 원리를 계속 파고들며 컴퓨터 구조까지 내려갔고, 내려가면서 다른 땅굴을 파는 게 너무 재미있었다. 해킹이.

    결국 반도체까지 내려가서 더 이상 이해할 수 없을 때까지 내려갔고, 해킹은 더 이상 내가 알던 해킹이라는 학문이 아니게 다 통합되었다. 해킹을 할 수 있던 원인중 대부분 그 아랫단계에서 기초된 버그였고, 아래로 내려갈수록 하나로 합쳐졌다. 그래서 내가 읽은 책을 살펴보면 다양한 분야가 많이 있지만 다 상하관계로 얽혀있음을 알 수 있다. 네트워크에서 기초해서 TCP/IP로, 거기서 물리계층인 데이터 통신까지, 그리고 신호처리와 신호를 처리하는 소자까지 이어져 있다.

    관심사에 따라 공부해서 재미있게 공부했고, 관심사에 따라 공부하니 꼬리물기 공부가 가능했다. 서로 얽혀서 각자의 이해를 도왔고, 서로의 흥미를 돋구었다. 그냥 ‘컴퓨터’라는 분야 하나가 너무 재미있었고, 나에게는 천직이라고 생각됐다. 전체가 재미있으니 가장 기초인 ‘반도체’나 ‘컴퓨터 구조’가 자연스럽게 내 진로이자, 내 주요 관심사가 되었다.

    \ No newline at end of file diff --git a/public/posts/index.html b/public/posts/index.html new file mode 100644 index 0000000..bc894c7 --- /dev/null +++ b/public/posts/index.html @@ -0,0 +1,29 @@ +Posts | Morgan's Blog

    What the hell is USB-C DP Alt mode

    What the hell is USB-C DP Alt mode To. @hachsiapg, as part of my note +서론: Microsoft Surface Laptop 4 & Linux 제가 밖에서도 쓰고 집에서도 사용하는 만능 서피스 랩탑 4를 사용한지 어느새 2년이 넘었습니다. 그 사이에 리퍼도 받고 OS도 여러번 갈아엎기도 하고, 또 제 하드한 작업들을 잘 버텨주기도 한 정말 대단한 랩탑입니다. 특히 3:2의 광활한 세로는 정말 좋아서 다른 비율의 노트북은 이제 사용할 수 없는 몸이 되어버리기도 했습니다. 길이를 측정해보면 13인치 랩탑들과 동일한데, 세로에 5cm정도를 추가한 정도라 타이틀바 하나정도 넓혀주는 셈이라 마음놓고 패널바를 띄어놓고 사용할 수 있습니다....

    May 6, 6000 · 659 words · Me

    Wasting Time

    Wasting Time of My Life

    April 20, 20000 · 5 words · Me

    (Untitled)

    October 3, 3000 · 0 words · Me

    선택실패

    고등학교 3학년 때까지만 해도 나는 무조건 컴퓨터 공학과나 전기전자 공학과. 학과만 보고 대학교에 진학하리라 마음먹었었다. 진짜 학교 이름은 절대 보지 않을 것이라 생각했다. 하지만 막상 입시에 처하고 선택의 갈림길에 있으니 그 다짐은 물거품이 되었다. +역시나, 아니나 다를까 원서 접수 기간이 되니 진로 담당 선생님은 실적을 위해 상위 대학교의 낮은 학과에 원서를 넣어볼 것을 추천하셨다. 말이 추천이지 반 강제로 넣게 되었다. 아무런 관심도 없었고, 3년동안 생각도 없었는데다 자기소개서도 짜맞춰야 쓸 수 있는 학과에 지원했다....

    April 14, 14000 · 489 words · Me

    다른 집

    우리 집은 창원이다.어렸을 때 서울에 살다가 초증학교때 창원으로 내려왔고, 고등학교 3학년까지 거기서 살아왔다. 고등학교는 기숙사 학교를 가기는 했지만, 내가 가장 마음의 안식을 느끼고 진정으로 쉴 수 있는 곳은 오직 우리 집이다. +대학을 서울로 와서 대학 기숙사에 들어가게 되었다. 고등학교때 기숙사는 들어오자마자 화장실과 샤워실을 리모델링 하기도 했고, 전국에서 아마 가장 넓은 방을 가지고 있었지 않을까 싶다. 각 방마다 냉장고도 있고. 하지만 대학교 기숙사는 참담했다. 2/3로 줄어든 엄청 좁은 방에, 낮은 천장, 허술한 난방, 게다가 못 쓸정도로 더러운 화장실과 때와 곰팡이로 가득한 샤워실까지....

    April 9, 9000 · 481 words · Me

    고등학교 돌아보기

    2021년을 돌아보며. +2021.12.22 +벌써 12월 22일이다. 12월달에는 열심히 살아야지 하던게 어제같은데 벌써 새해가 다가온다. 나는 내년 성인이 되지만, 아직 실감이 안난다. 술담배를 할 수 있는 나이라기 보다는 내 행동에 내가 책임져야 하는 때가 되었다는 게 더 실감이 난다. 대학을 고민하며 내가 앞으로 뭘 하면서 먹고 살아야할지 꽤 오랫동안 고심했는데, 그 결과로 조금 성장한 것 같아 이제와서는 약간 기쁘기도 하고 무섭기도 하면서 슬픈 약간 오묘한 기분이다. 어찌되었든 이제 성인이 되니까 조금 변해야겠다고 다짐하고 있다....

    December 21, 21000 · 925 words · Me

    대학 입시가 한단계만 남았다.

    대학 입시가 한단계만을 앞두고 있다. +합격자 발표와 등록. +뭐 공부하고 대비해야하는 시험은 다 끝났으니 마음껏 놀고 있지만 마음의 한편에는 아직 불안함이 많이 존재하고 있다. 또 공부와 시험대비라는 정해져 있는 계획만을 12년 동안 따르던 나에게서 갑자기 계획이나 강제성이 사라졌다. 이제부터는 내가 무엇을 할 것인지를 나 혼자서 알아서 결정해야 하고 또한 그 책임도 내가 져야할 것이다. 예를 들어 늦게자도 누군가 깨워주지 않는다는 것에서 그것을 처음으로 느꼈다. +지금 하고싶은 것도 없다. 무언가 해야하는 것도 딱히 없다....

    December 1, 1000 · 589 words · Me

    Spectre Attacks: Exploiting Speculative Execution

    The Central Processing Unit (CPU) is a device that plays a major role as the brain of a computer. The CPU controls four main functions: memory, interpretation, computation, and control, which are based on the role of interpreting the commands of a given program to perform operations with data. In CPU, there are the program counter, a command register, an ALU (arithmetic logic unit), a control unit, a bus, and a register....

    October 30, 30000 · 864 words · Me

    전자 제어의 세계인 미래, 그 보안의 위협

    미래 사회에는 전기자동차와 자율주행 자동차가 성하게 유행할 것이다. 사람 운전자의 역할이 거의 축소되고, AI나 전자적으로 제어될 것인데, 지금도 많이 일어나고 있는 논란은 바로 보안이다. 만약 자율주행 자동차가 해킹을 당하게 된다면 어떨까? 해커는 자동차에 타고 있는 사람의 생사여탈권을 가지게 될 정도로 심각한 문제가 있는 것이다. 그러므로, 이러한 생활환경에 직접적인 영향을 주는 전자기기의 보안은 매우 중요한 것으로 판단된다. 미래에 우리의 생활을 가장 많은 부분 담당할 사물인터넷도 마찬가지이다. 우리의 생활과 강하게 연관되어 있고, 그러므로 보안이 가장 주요한 요인이 된다....

    October 30, 30000 · 598 words · Me

    Ad-Tech와 통계의 쓰임새

    CTR(클릭률) Click-through rate)는 특정 링크를 클릭한 사용자의 비율. Z지수는 표준점수로, 통계학적인 정규분포를 만들고 각각의 경우가 표준편차상의 어떤 위치를 차지하는지를 보여주는 차원없는 수치이다. Z-지수는 원수치가 평균에서 얼마나 떨어져 있는지를 나타내는 지수로, $ z = \frac{z - \mu}{\sigma} $로 나타난다. ($\sigma$ 표준편차, $\mu$는 모집단의 평균이다. +중심극한정리란 표본의 크기가 커질수록 표본 평균의 분포는 모집단의 분포 모양과는 관계없이 정규분표에 가까워진다는 정리이다. +점추정은 모집단의 특성을 단일한 값으로 추정하는 방법으로, 표본평균과 표본분산을 이용해 모집단의 평균과 분산을 계산해 내는 방법이 대표적인 예이다....

    October 30, 30000 · 225 words · Me

    양자들의 트랜지스터와 핫 캐리어 효과

    트랜지스터가 점점 소형화가 되어가면서 전자가 예상한대로 움직이지 않는 작은 단위까지 내려갔다. 나노단위까지 생산공정이 작아지면서 양자역학적인 효과가 나타나기 시작했고, 이는 트랜지스터의 스위칭 작용을 방해하는 효과를 불어일으킨다. 이를 해결하기 위해서 양자 세계에서 사용할 수 있는 양자 트랜지스터와 단일 원자 트랜지스터가 개발되었다. +단일원자 트랜지스터 단일원자 트랜지스터는 양자 터널링 효과를 적극적으로 이용하여 스위칭 작용을 한다. 터널링 효과를 제어하기 위해서 직접 제어가 아닌 양자 얽힘 효과를 이용한다. 큐비트를 이용하여, 전자 주개로써의 원자를 제어하기 위해 원자 개개별의 스핀 상태를 이용한다....

    October 30, 30000 · 294 words · Me

    구글은 그 많은 페이지를 어떻게 찾아낼까.

    구글은 방대한 웹페이지를 자사 데이터베이스에 기록하고 있으며, 이를 토대로 사용자가 검색한 검색결과와 가장 매치되는 페이지를 보여줌으로써 검색엔진의 역할을 할 수 있다. 구글이 이렇게까지 클 수 있었던 이유는 정확한 검색 결과를 보여주는 알고리즘 덕분이다. 그렇다면 이 알고리즘은 무엇일까? 구글이 웹페이지들의 관계를 산출하고 그 수치를 계산해내는 알고리즘인 페이지랭크 알고리즘은 구글의 창시자중 한명인 래리 페이지라는 사람이 석사논문으로 발명한 알고리즘이다. PageRank 알고리즘은 각각의 웹 페이지의 상대적 가중치를 계산하여 각각의 중요도와 연관성을 표현하는 방식을 이용하는데, 이를 이용하여 한 페이지와 가장 연관된 다른 페이지를 Rank를 매겨 정확한 연관성을 보여줄 수 있다....

    October 30, 30000 · 395 words · Me

    인생 두번째 실패. 두번째 대학탈락.

    내 첫번째 실패는 조기진학 실패이다. 대학을 떨어졌다. +내 두번째 실패도 대학 탈락이다. 이번엔 아직 9번 더 있지만, 작년에 떨어지고 느꼈던 그 참담함과 그 마음가짐을 다시 한번 느낄 수 있게 한 그 세글자 ‘불합격’. 역시 이번에도 참담함을 느꼈고, 여전히 안타까움과 공허함을 느낄 수 있었다. +내심 기대했었다. 붙기를 간절히 기도했다. 하지만 세상은 냉정했다. +바라던게 이제는 이룰 수 없다고 생각하니 공허했다. 하지만 그것도 잠깐이었다. 멘탈이 강하고 회복력도 강한게 내 장점이라 공허함으로 쳐져있는 것도 잠깐이었고, 앞으로를 다시 생각하고 마음가짐을 고치는 계기가 되었다....

    October 23, 23000 · 85 words · Me

    How I wanted to do.

    프로그래밍에 매력을 느껴 프로그래밍에 입덕하게 된 건 2학년때쯤.. 이후 그 재미를 느끼고 많은 것들을 시도해보곤 했다. HTML과 CSS를 배워 가장 기본적인 웹사이트를 만들고, 이를 더 화려하게 꾸미기 위해 JS를 공부했다. 이를 배포하기 위해 서버 구축에 대해 공부했고, PHP나 MySQL을 이용해 기능성을 부여하면서 DB와 SQL에 대해 공부했다. 이후 고전적인 서버를 넘어 SSR이나 CSR에 대해 알아보려 NodeJS를 공부했다. 학교 입학시 과제였던 C로 하는 PS를 하면서 C나 C++에 관심을 가졌고, 왜 C로 코딩하는데 C++를 써야하는지 의문을 가지고 C++을 공부했다....

    October 23, 23000 · 348 words · Me

    학교에서 했던 프로젝트들..

    귀가시간 수집 프로그램 기상곡 수집 프로그램 컴퓨터실 사용현황 학교 내부 정보공유망 문서파일 자동저장 및 복구 시스템 학교 저지 사이트 API 정리 및 제출시스템 프록시 선생님들이 부탁하셨던 수많은 프로그램들

    October 23, 23000 · 28 words · Me
    \ No newline at end of file diff --git a/public/posts/index.xml b/public/posts/index.xml new file mode 100644 index 0000000..ff0bb49 --- /dev/null +++ b/public/posts/index.xml @@ -0,0 +1,306 @@ + + + + Posts on Morgan's Blog + http://blog.morgan.kr/posts/ + Recent content in Posts on Morgan's Blog + + http://blog.morgan.kr + http://blog.morgan.kr + + Hugo -- gohugo.io + Sat, 06 May 2023 12:55:32 +0000 + + What the hell is USB-C DP Alt mode + http://blog.morgan.kr/posts/what-the-hell-is-usb-c-dp-alt-mode/ + Sat, 06 May 2023 12:55:32 +0000 + + http://blog.morgan.kr/posts/what-the-hell-is-usb-c-dp-alt-mode/ + What the hell is USB-C DP Alt mode To. @hachsiapg, as part of my note +서론: Microsoft Surface Laptop 4 &amp; Linux 제가 밖에서도 쓰고 집에서도 사용하는 만능 서피스 랩탑 4를 사용한지 어느새 2년이 넘었습니다. 그 사이에 리퍼도 받고 OS도 여러번 갈아엎기도 하고, 또 제 하드한 작업들을 잘 버텨주기도 한 정말 대단한 랩탑입니다. 특히 3:2의 광활한 세로는 정말 좋아서 다른 비율의 노트북은 이제 사용할 수 없는 몸이 되어버리기도 했습니다. 길이를 측정해보면 13인치 랩탑들과 동일한데, 세로에 5cm정도를 추가한 정도라 타이틀바 하나정도 넓혀주는 셈이라 마음놓고 패널바를 띄어놓고 사용할 수 있습니다. + + + + Wasting Time + http://blog.morgan.kr/posts/wasting-time/ + Thu, 20 Apr 2023 08:07:41 +0900 + + http://blog.morgan.kr/posts/wasting-time/ + Wasting Time of My Life + + + + (Untitled) + http://blog.morgan.kr/posts/cam-nae-jinjja-sangsangdo-moshaessdeon-ilinde/ + Mon, 03 Oct 2022 15:25:08 +0000 + + http://blog.morgan.kr/posts/cam-nae-jinjja-sangsangdo-moshaessdeon-ilinde/ + + + + + 선택실패 + http://blog.morgan.kr/posts/2022041406/ + Thu, 14 Apr 2022 06:55:25 +0000 + + http://blog.morgan.kr/posts/2022041406/ + 고등학교 3학년 때까지만 해도 나는 무조건 컴퓨터 공학과나 전기전자 공학과. 학과만 보고 대학교에 진학하리라 마음먹었었다. 진짜 학교 이름은 절대 보지 않을 것이라 생각했다. 하지만 막상 입시에 처하고 선택의 갈림길에 있으니 그 다짐은 물거품이 되었다. +역시나, 아니나 다를까 원서 접수 기간이 되니 진로 담당 선생님은 실적을 위해 상위 대학교의 낮은 학과에 원서를 넣어볼 것을 추천하셨다. 말이 추천이지 반 강제로 넣게 되었다. 아무런 관심도 없었고, 3년동안 생각도 없었는데다 자기소개서도 짜맞춰야 쓸 수 있는 학과에 지원했다. + + + + 다른 집 + http://blog.morgan.kr/posts/dareun-jibe-eonjhyeo-sandaneun-geoseun/ + Sat, 09 Apr 2022 04:02:17 +0000 + + http://blog.morgan.kr/posts/dareun-jibe-eonjhyeo-sandaneun-geoseun/ + 우리 집은 창원이다.어렸을 때 서울에 살다가 초증학교때 창원으로 내려왔고, 고등학교 3학년까지 거기서 살아왔다. 고등학교는 기숙사 학교를 가기는 했지만, 내가 가장 마음의 안식을 느끼고 진정으로 쉴 수 있는 곳은 오직 우리 집이다. +대학을 서울로 와서 대학 기숙사에 들어가게 되었다. 고등학교때 기숙사는 들어오자마자 화장실과 샤워실을 리모델링 하기도 했고, 전국에서 아마 가장 넓은 방을 가지고 있었지 않을까 싶다. 각 방마다 냉장고도 있고. 하지만 대학교 기숙사는 참담했다. 2/3로 줄어든 엄청 좁은 방에, 낮은 천장, 허술한 난방, 게다가 못 쓸정도로 더러운 화장실과 때와 곰팡이로 가득한 샤워실까지. + + + + 고등학교 돌아보기 + http://blog.morgan.kr/posts/godeunghaggyo-dolabogi/ + Tue, 21 Dec 2021 16:23:55 +0000 + + http://blog.morgan.kr/posts/godeunghaggyo-dolabogi/ + 2021년을 돌아보며. +2021.12.22 +벌써 12월 22일이다. 12월달에는 열심히 살아야지 하던게 어제같은데 벌써 새해가 다가온다. 나는 내년 성인이 되지만, 아직 실감이 안난다. 술담배를 할 수 있는 나이라기 보다는 내 행동에 내가 책임져야 하는 때가 되었다는 게 더 실감이 난다. 대학을 고민하며 내가 앞으로 뭘 하면서 먹고 살아야할지 꽤 오랫동안 고심했는데, 그 결과로 조금 성장한 것 같아 이제와서는 약간 기쁘기도 하고 무섭기도 하면서 슬픈 약간 오묘한 기분이다. 어찌되었든 이제 성인이 되니까 조금 변해야겠다고 다짐하고 있다. + + + + 대학 입시가 한단계만 남았다. + http://blog.morgan.kr/posts/daehag-ibsiga-handangye-namassda/ + Wed, 01 Dec 2021 08:09:52 +0000 + + http://blog.morgan.kr/posts/daehag-ibsiga-handangye-namassda/ + 대학 입시가 한단계만을 앞두고 있다. +합격자 발표와 등록. +뭐 공부하고 대비해야하는 시험은 다 끝났으니 마음껏 놀고 있지만 마음의 한편에는 아직 불안함이 많이 존재하고 있다. 또 공부와 시험대비라는 정해져 있는 계획만을 12년 동안 따르던 나에게서 갑자기 계획이나 강제성이 사라졌다. 이제부터는 내가 무엇을 할 것인지를 나 혼자서 알아서 결정해야 하고 또한 그 책임도 내가 져야할 것이다. 예를 들어 늦게자도 누군가 깨워주지 않는다는 것에서 그것을 처음으로 느꼈다. +지금 하고싶은 것도 없다. 무언가 해야하는 것도 딱히 없다. + + + + Spectre Attacks: Exploiting Speculative Execution + http://blog.morgan.kr/posts/1-spectre-attacks-exploiting-peculative-execution/ + Sat, 30 Oct 2021 07:19:36 +0000 + + http://blog.morgan.kr/posts/1-spectre-attacks-exploiting-peculative-execution/ + The Central Processing Unit (CPU) is a device that plays a major role as the brain of a computer. The CPU controls four main functions: memory, interpretation, computation, and control, which are based on the role of interpreting the commands of a given program to perform operations with data. In CPU, there are the program counter, a command register, an ALU (arithmetic logic unit), a control unit, a bus, and a register. + + + + 전자 제어의 세계인 미래, 그 보안의 위협 + http://blog.morgan.kr/posts/jeonja-jeeoyi-segyein-mirae-geu-boanyi-wihyeob/ + Sat, 30 Oct 2021 07:17:47 +0000 + + http://blog.morgan.kr/posts/jeonja-jeeoyi-segyein-mirae-geu-boanyi-wihyeob/ + 미래 사회에는 전기자동차와 자율주행 자동차가 성하게 유행할 것이다. 사람 운전자의 역할이 거의 축소되고, AI나 전자적으로 제어될 것인데, 지금도 많이 일어나고 있는 논란은 바로 보안이다. 만약 자율주행 자동차가 해킹을 당하게 된다면 어떨까? 해커는 자동차에 타고 있는 사람의 생사여탈권을 가지게 될 정도로 심각한 문제가 있는 것이다. 그러므로, 이러한 생활환경에 직접적인 영향을 주는 전자기기의 보안은 매우 중요한 것으로 판단된다. 미래에 우리의 생활을 가장 많은 부분 담당할 사물인터넷도 마찬가지이다. 우리의 생활과 강하게 연관되어 있고, 그러므로 보안이 가장 주요한 요인이 된다. + + + + Ad-Tech와 통계의 쓰임새 + http://blog.morgan.kr/posts/ad-techwa-tonggyeyi-sseuimsae/ + Sat, 30 Oct 2021 07:10:34 +0000 + + http://blog.morgan.kr/posts/ad-techwa-tonggyeyi-sseuimsae/ + CTR(클릭률) Click-through rate)는 특정 링크를 클릭한 사용자의 비율. Z지수는 표준점수로, 통계학적인 정규분포를 만들고 각각의 경우가 표준편차상의 어떤 위치를 차지하는지를 보여주는 차원없는 수치이다. Z-지수는 원수치가 평균에서 얼마나 떨어져 있는지를 나타내는 지수로, $ z = \frac{z - \mu}{\sigma} $로 나타난다. ($\sigma$ 표준편차, $\mu$는 모집단의 평균이다. +중심극한정리란 표본의 크기가 커질수록 표본 평균의 분포는 모집단의 분포 모양과는 관계없이 정규분표에 가까워진다는 정리이다. +점추정은 모집단의 특성을 단일한 값으로 추정하는 방법으로, 표본평균과 표본분산을 이용해 모집단의 평균과 분산을 계산해 내는 방법이 대표적인 예이다. + + + + 양자들의 트랜지스터와 핫 캐리어 효과 + http://blog.morgan.kr/posts/yangjadeulyi-teuraenjiseuteo/ + Sat, 30 Oct 2021 07:09:53 +0000 + + http://blog.morgan.kr/posts/yangjadeulyi-teuraenjiseuteo/ + 트랜지스터가 점점 소형화가 되어가면서 전자가 예상한대로 움직이지 않는 작은 단위까지 내려갔다. 나노단위까지 생산공정이 작아지면서 양자역학적인 효과가 나타나기 시작했고, 이는 트랜지스터의 스위칭 작용을 방해하는 효과를 불어일으킨다. 이를 해결하기 위해서 양자 세계에서 사용할 수 있는 양자 트랜지스터와 단일 원자 트랜지스터가 개발되었다. +단일원자 트랜지스터 단일원자 트랜지스터는 양자 터널링 효과를 적극적으로 이용하여 스위칭 작용을 한다. 터널링 효과를 제어하기 위해서 직접 제어가 아닌 양자 얽힘 효과를 이용한다. 큐비트를 이용하여, 전자 주개로써의 원자를 제어하기 위해 원자 개개별의 스핀 상태를 이용한다. + + + + 구글은 그 많은 페이지를 어떻게 찾아낼까. + http://blog.morgan.kr/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga/ + Sat, 30 Oct 2021 07:07:55 +0000 + + http://blog.morgan.kr/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga/ + 구글은 방대한 웹페이지를 자사 데이터베이스에 기록하고 있으며, 이를 토대로 사용자가 검색한 검색결과와 가장 매치되는 페이지를 보여줌으로써 검색엔진의 역할을 할 수 있다. 구글이 이렇게까지 클 수 있었던 이유는 정확한 검색 결과를 보여주는 알고리즘 덕분이다. 그렇다면 이 알고리즘은 무엇일까? 구글이 웹페이지들의 관계를 산출하고 그 수치를 계산해내는 알고리즘인 페이지랭크 알고리즘은 구글의 창시자중 한명인 래리 페이지라는 사람이 석사논문으로 발명한 알고리즘이다. PageRank 알고리즘은 각각의 웹 페이지의 상대적 가중치를 계산하여 각각의 중요도와 연관성을 표현하는 방식을 이용하는데, 이를 이용하여 한 페이지와 가장 연관된 다른 페이지를 Rank를 매겨 정확한 연관성을 보여줄 수 있다. + + + + 인생 두번째 실패. 두번째 대학탈락. + http://blog.morgan.kr/posts/insaeng-dubeonjjae-silpae/ + Sat, 23 Oct 2021 08:52:59 +0000 + + http://blog.morgan.kr/posts/insaeng-dubeonjjae-silpae/ + 내 첫번째 실패는 조기진학 실패이다. 대학을 떨어졌다. +내 두번째 실패도 대학 탈락이다. 이번엔 아직 9번 더 있지만, 작년에 떨어지고 느꼈던 그 참담함과 그 마음가짐을 다시 한번 느낄 수 있게 한 그 세글자 &lsquo;불합격&rsquo;. 역시 이번에도 참담함을 느꼈고, 여전히 안타까움과 공허함을 느낄 수 있었다. +내심 기대했었다. 붙기를 간절히 기도했다. 하지만 세상은 냉정했다. +바라던게 이제는 이룰 수 없다고 생각하니 공허했다. 하지만 그것도 잠깐이었다. 멘탈이 강하고 회복력도 강한게 내 장점이라 공허함으로 쳐져있는 것도 잠깐이었고, 앞으로를 다시 생각하고 마음가짐을 고치는 계기가 되었다. + + + + How I wanted to do. + http://blog.morgan.kr/posts/how-i-wanted-to-do/ + Sat, 23 Oct 2021 08:52:15 +0000 + + http://blog.morgan.kr/posts/how-i-wanted-to-do/ + 프로그래밍에 매력을 느껴 프로그래밍에 입덕하게 된 건 2학년때쯤.. 이후 그 재미를 느끼고 많은 것들을 시도해보곤 했다. HTML과 CSS를 배워 가장 기본적인 웹사이트를 만들고, 이를 더 화려하게 꾸미기 위해 JS를 공부했다. 이를 배포하기 위해 서버 구축에 대해 공부했고, PHP나 MySQL을 이용해 기능성을 부여하면서 DB와 SQL에 대해 공부했다. 이후 고전적인 서버를 넘어 SSR이나 CSR에 대해 알아보려 NodeJS를 공부했다. 학교 입학시 과제였던 C로 하는 PS를 하면서 C나 C++에 관심을 가졌고, 왜 C로 코딩하는데 C++를 써야하는지 의문을 가지고 C++을 공부했다. + + + + 학교에서 했던 프로젝트들.. + http://blog.morgan.kr/posts/haggyoeseo-haessdeon-peurojegteudeul/ + Sat, 23 Oct 2021 08:51:44 +0000 + + http://blog.morgan.kr/posts/haggyoeseo-haessdeon-peurojegteudeul/ + 귀가시간 수집 프로그램 기상곡 수집 프로그램 컴퓨터실 사용현황 학교 내부 정보공유망 문서파일 자동저장 및 복구 시스템 학교 저지 사이트 API 정리 및 제출시스템 프록시 선생님들이 부탁하셨던 수많은 프로그램들 + + + + 개인정보.. Privacy.. + http://blog.morgan.kr/posts/gaeinjeongbo-privacy/ + Sat, 23 Oct 2021 08:31:52 +0000 + + http://blog.morgan.kr/posts/gaeinjeongbo-privacy/ + 나는 구글이 싫었다. +구글에 반대하며 지메일도 거의 쓰지 않고 있고, 다른 구글 플랫폼을 벗어나 다른 플랫폼으로 옮기고 있다. 하지만, 아이폰으로 옮기고 나서 몇주간을 생각해보니 내 분노의 대상은 구글이 아니라 애플이여야 한다는 것을 알게 되었다. 카카오, 구글에 가지고 있던 분노의 이유가 애플이라는 기업 자체를 강타한다. 물론 나도 알고 있었고, 구글 못지 않게 애플을 싫어하고 있었다. 새롭게 휴대폰을바꿀 때에도 OS만 구글이고 제조사는 다양한 (삼성이..겟지만..) 안드로이드 휴대폰과 휴대폰 하드웨어, 악세사리, OS, 결제, 게다가 웹엔진까지 제한하고 독점해버린 애플과는 비교가 된지 않는다고 생각했고, 이번에 플립이 잘 나와서 그것으로 바꾸려 했다. + + + + 데이터센터 + http://blog.morgan.kr/posts/datacenter/ + Sat, 23 Oct 2021 08:15:14 +0000 + + http://blog.morgan.kr/posts/datacenter/ + 구글같은 검색엔진이 늘어나고, 다양한 기업들과 서비스들이 사용자들의 개인정보와 데이터를 마구 수집한다. 이로 인해 생겨나는 기하급수적인 양의 데이터들을 보관할 스토리지와 그것들을 사용할 수 있는 데이터로 가공하기 위해 필요한 수없이 큰 컴퓨팅 파워를, 큰 기업들이 대형으로 지어놓은 데이터 센터가 담당하고 있다. 게다가 이제는 작은 기업이나 서비스들은 AWS나 GCP, Oracle과 같은 서비스를 통해 Cloud로 Computing하기까지 하니, 아마존이나 구글의 데이터 센터는 얼마나 커다랗고, 커다래야 하는지 알 수 있다. +아마존과 구글의 데이터센터뿐 아니라 네이버, MS, 오라클, 및 작은 데이터센터들이 지어질때 중요하게 작용하는 것이 있다. + + + + 블로그 글쓰기는 너무 힘들어.. + http://blog.morgan.kr/posts/beulrogeu-geulsseugineun-neomu-himdeuleo/ + Fri, 08 Oct 2021 05:19:00 +0000 + + http://blog.morgan.kr/posts/beulrogeu-geulsseugineun-neomu-himdeuleo/ + 야심차게 티스토리 블로그를 만들어 몇몇 글을 쓰고 나서, 한참동안이나 글을 쓰지 않았다. 하지만 나중에 돌아보면 쓰일 곳이 있지 않을까 하여 내 소장을 위해 Ghost + Vultr로 넘어왔고, 돈도 내야 하니까 글을 조금씩이라도 쓰지 않을까 생각했지만&hellip;. 결국 글을 쓰지도 않은 채 달마다 돈만 나가고 있다&hellip; +블로그 글을 왜 쓰지 않았지..? 고등학교 생활을 하느라 힘들고 바빠서 (노느라) 글을 쓰지 않았을 수도 있고, 마땅하게 글을 쓸만한 소재도 없고, 마땅하게 글을 쓸 기기 또한 없다. + + + + What I want to do. + http://blog.morgan.kr/posts/what-i-want-to-do/ + Sat, 11 Sep 2021 01:20:00 +0000 + + http://blog.morgan.kr/posts/what-i-want-to-do/ + 저번에 What I wanted to do라는 글을 쓴 적이 있는데, 이번에는 What I want to do라는 제목으로 내가 대학을 다시 지원할 때 까지의 경험을 풀어보려고 한다. +대학 탈락 이후 나는 대학을 한번 떨어진 경험이 있다. 과학고등학교 재학생 중 중상위권이었던 나는 조기진학의 기회를 받았고, KAIST만을 넣은 채로 떨어졌다. 그 때는 붙을 줄 알고 있어서 2학년 2학기 시험을 말아먹었고, 지금도 그 영향을 받아 피를 흘리고 있다. +다행히 그 이후 각성을 한건지 철이 든건지 3학년 1학기는 최상위권 성적을 받아 원래대로 유지는 할 수 있었다. + + + + 시험을 일주일 앞두고 + http://blog.morgan.kr/posts/20210620-siheomeul-iljuil-apdugo/ + Fri, 10 Sep 2021 09:23:28 +0000 + + http://blog.morgan.kr/posts/20210620-siheomeul-iljuil-apdugo/ + 지금까지 내 인생에서 가장 중요한 시험. 그 시험이 일부일 앞으로 다가왔다. 하루종일 시험공부 비슷한걸 하면서 심신이 지쳐 더 이상 집중을 할 수 없을 것 같다. 이제 이 고비만 넘기면 인생에서 가장 날아다닌다는 시기, 대학생이 된다. 앞으로 뭘 하고 살아야 할지, 무엇을 하고 싶은지, 내가 아는 게 많아지고 현실을 깨달으면서 철이 드니 생각이 복잡해지고 앞길이 막막하기만 하다. +몇일 전, 작년에 대학 원서 자기소개서를 다시 읽다 보니 내가 아는 게 많아졌음을 새삼 깨달았다. + + + + Attitude for criticism + http://blog.morgan.kr/posts/attitude-for-criticism/ + Fri, 10 Sep 2021 07:30:10 +0000 + + http://blog.morgan.kr/posts/attitude-for-criticism/ + 요즘 우리 학교에 학교를 개혁하겠다는 학생회장이 나타나고 나서부터 친구들이 학교에 대한 여러 가지 불만들을 풀어내기 시작했다. 나도 마찬가지로 학교에 대한 여러 가지 불만사항들이 많았다. 나는 매 학기마다 개정된 학교 교칙이나 규정들을 정독하는 이벤트를 가지는데, 그때마다 항상 &lsquo;아, 학생들이 당연히 너무 불리하다..&rsquo; 라던가, &lsquo;이 조항은 너무 아닌데, 너무 구시대적인 생각이 아닌가?&lsquo;라는 생각이 들기도 한다. +대학을 가야하는 시기라서 여러 학교들의 생활이나 공부방법, 대학 진학 상황들에 대해서 더욱 관심을 가지게 되었다. 특히 전국급 자사고나 타 지역 과학고의 생활과 공부습관? + + + + 양자 컴퓨터와 양자 어닐링 + http://blog.morgan.kr/posts/yangja-keompyuteowa-yangja-eonilring/ + Fri, 06 Aug 2021 10:36:03 +0000 + + http://blog.morgan.kr/posts/yangja-keompyuteowa-yangja-eonilring/ + 양자 컴퓨터와 양자 어닐링 양자 컴퓨터 입문 / 양자 컴퓨팅 발전과 전망 / 1억배 빠른 양자 컴퓨터가 온다 / 스콧 애론슨의 양자 컴퓨터 강의 +양자 컴퓨터란 무엇일까? Ø 현대 컴퓨터의 발전 과정 20세기, 컴퓨터(Computer)란 말은 계산하는 사람, Computing Person이라는 뜻으로 사용되었다. 하지만 단순 반복 행동을 굳이 사람이 하지 않아도 되는, 일명 계산기계가 사용될 수 있음이 증명되면서, Computer라는 말은 ‘일정한 규칙ㅇㄹ 가지고 주어진 값을 토대로 계산하는 장치’라는 의미를 가지게 되었다. +현대적인 컴퓨터의 정의를 시작한 사람은 ‘찰스 배비지’이다. + + + + Security of IoT + http://blog.morgan.kr/posts/security-of-iot/ + Fri, 06 Aug 2021 10:32:57 +0000 + + http://blog.morgan.kr/posts/security-of-iot/ + Security of IoT IoT란? IoT (Internet of Things)란, 사물인터넷으로, 예전에는 독립적으로 존재했던 각종 전자기기 및 사물들이 인터넷으로 엮여 한번에 관리할 수 있게 되거나, 상호 정보교환과 데이터 수집을 통해 사용자에게 최상의 서비스를 제공하는 기술을 의미이다. 여기에서 사물이라 함은 모든 사물을 포함한다. 데이터를 분석하는 과정에서 인공지능을 주로 사용하므로 IoT는 인공지능 기술이기도 하다. +IoT는 2013년부터 쭉 개발되어 왔으며, 우리 집에서 흔히 볼 수 있는 에어컨, 냉장고등 큰 가구들부터 연결되어 왔다. 그 이후 시간이 지나면서 점점 작은 기구들까지 연결되면서, TV, 전자레인지, 오븐부터 커피포트, 선풍기, 전등 뿐 아니라 변기, 샤워기, 거울, 헤어 드라이기까지 연결되어 있지 않은 것이 없을 정도로 발전되어 왔다. + + + + Hardware Security + http://blog.morgan.kr/posts/hardware-security/ + Fri, 06 Aug 2021 10:31:09 +0000 + + http://blog.morgan.kr/posts/hardware-security/ + Hardware Security 신뢰성과 관련된 기술 1. RoT (Root of Trust) Root of Trust, 신뢰점이란, 전자기기 안에서 별도로 존재하는 프로세싱 유닛으로, 메인 프로세서의 보조로서 다양한 암호화 기법이나 솔루션을 제공하거나 이를 제어하기 위한 보안 기능들을 의미한다. RoT가 궁극적으로 달성하고자 하는 것은 TC(Trusted Computing)으로, 신뢰할 수 있는 컴퓨팅, 즉 믿을 만 하고 무결성이 보장되는 계산 및 기능을 이야기한다. 이를 달성하기 위한, RoT에 포함되는 여러가지 기술들이나 알고리즘이 있고, 각 단계들을 순차적으로 달성되어 신뢰할 수 있는 보안적인 프로세스가 진행된다. + + + + [전산유체역학] CFD with Python (Navier-Stokes Equation) + http://blog.morgan.kr/posts/jeonsanyuceyeoghag-cfd-with-python-navier-stokes-equation/ + Sat, 10 Jul 2021 08:23:47 +0000 + + http://blog.morgan.kr/posts/jeonsanyuceyeoghag-cfd-with-python-navier-stokes-equation/ + 1-D Linear Convection 1차원 선형 열전도 방정식은 가장 심플하면서도 가장 기초적인 방정식입니다. +$$ \frac{\partial u}{\partial t} + c \frac{\partial u}{\partial x} = 0 $$ +이 식을 오일러 방정식으로 변환하여 수치해석적으로 해를 구할 수 있도록 변환을 해줍니다. +$$ u_i^{n+1} = u_i^n - c \frac{\Delta t}{\Delta x}(u_i^n-u_{i-1}^n) $$ +이제 이 오일러 방정식을 파이썬으로 구현해봅니다. +import numpy from matplotlib import pyplot import time, sys %matplotlib inline nx = 41 # try changing this number from 41 to 81 and Run All . + + + + 반도체의 원리, 종류, 소자, 역사, 산업. (MOSFET부터 RAM, FLASH, 그리고 Intel 4004까지. + http://blog.morgan.kr/posts/bandoceyi-weonri-jongryu-soja-yeogsa-saneob-mosfetbuteo-ram-flash-geurigo-intel-4004ggaji/ + Fri, 09 Jul 2021 17:21:52 +0000 + + http://blog.morgan.kr/posts/bandoceyi-weonri-jongryu-soja-yeogsa-saneob-mosfetbuteo-ram-flash-geurigo-intel-4004ggaji/ + .1번 반도체란?.2번 반도체 소자의 종류.3번 기본소자 – 다이오드.4번 기본소자 – 트랜지스터…1번째 MOFSETMOFSET(Metal-Oxide Semiconductor Field-Effect Transistor) 금속-산화 반도체 전계효과 트랜지스터1번째 금속산화 반도체란? 도핑된 반도체 기판 위에 SiO2로 된 절연층과 금속을 적층시켜 제작한 구조. 2번째 MOSFET TransistorNPN의 구조입니다. 두 N을 각각 Drain과 Source라고 합니다. Source에는 Ground가, Drain에는 전압이 인가됩니다. 위에서 서술했듯이 Drain과 Source사이에 채널이 형성됩니다. 이때 Gate와 Back Gate(아랫쪽 P반도체)사이에 전압을 인가해 주면 게이트와 P사이에 전기장 형성, 이에 의해 전자가 게이트쪽으로 올라갑니다. 이 때문에 Drain과 Source 사이 전류가 흐를 수 있다. + + + + Cryptography + http://blog.morgan.kr/posts/cryptography/ + Fri, 09 Jul 2021 10:24:00 +0000 + + http://blog.morgan.kr/posts/cryptography/ + Cryptography 공개키 암호화 알고리즘. 1. Diffie-Hellman 디피-헬먼 키 교환 방식은 암호화 통신을 위한 키를 교환하는 방식 중 하나이다. 두 통신 주체가 공통의 비밀 키를 사용할 수 있도록 하는 안전한 알고리즘이다. 디피-헬먼 방식은 기초적인 암호 통신 방법으로, 이 알고리즘에 RSA나 ECC같은 암호화 알고리즘을 합쳐서 암호화 통신이 성립된다. 공개키는 암호화할 수 있는 키이고, 개인키는 복호화할 수 있는 키이다. +디피-헬먼 키 교환은 공개키 암호화 방식에 기반한다. 공개키 암호화 방식이란, 자신의 공개키를 상대방에게 전송하고, 그 상대방은 그 공개키로 데이터를 암호화해서 전송하면, 자신은 자신의 개인키로 복호화 할 수 있어, 통신이 성립되는 방식이다. + + + + 파이썬으로 구현한 뉴턴의 방정식과 적분방정식 + http://blog.morgan.kr/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo/ + Fri, 21 May 2021 13:18:27 +0000 + + http://blog.morgan.kr/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo/ + 우리의 세계에서 물체의 역학적 운동을 지배하는, 지배방정식이 있죠.뉴턴의 법칙, 방정식입니다.뉴턴의 법칙은 총 세개의 방정식이 있죠. 이 세가지 법칙만을 이용해서 물체의 운동을 계산할 수 있습니다.이것을 바탕으로 만들어진 역설이 라플라스의 역설이죠. 만약 모든 분자의 가속도, 속도, 위치 세가지 정보를 알고 있다면, 뉴턴의 법칙에 근거하여 그 다음 상황을 예측할 수 있고, 따라서 이 세상, 아니면 그것을 넘어서서 모든 분자의 정보를 알 수 있습니다.우리가 여기서 분석할 것은 가장 쉬운 법칙, 뉴턴의 제 2법칙, 가속도의 법칙입니다. + + + + What I wanted to do. + http://blog.morgan.kr/posts/what-i-wanted-to-do/ + Thu, 28 Jan 2021 06:14:00 +0000 + + http://blog.morgan.kr/posts/what-i-wanted-to-do/ + 나는 무엇을 하고 싶지? 나는 개발자가 되고 싶다. 그래서 나름대로 여러가지 언어를 배우기도 하고 여러가지 활동을 하면서 나의 꿈을 키워나갔다. 나는 고등학교를 다니며 공부를 하고, 흥미를 위주로 진로를 정하려다가, 이런것들이 빙산의 일각이라는 사실을 알며 좌절하고 말았다. +나는 과학고를 다니기 때문에 나름대로 수.과학적인 내용을 기본으로 하는 컴퓨터 아키텍쳐나 논리에 대해서 공부를 하기도 했는데, 컴퓨터 아키텍쳐에 대해 배우면서 자연스럽게 기계어, FPGA, 어셈블리 언어에 대해 관심을 가지게 되었고, 물론 지금은 대학교 진학문제가 있어서 시간을 많이 투자하지는 못하지만 관심을 가지고 배우고 있는 중이다. + + + + diff --git a/public/posts/insaeng-dubeonjjae-silpae/index.html b/public/posts/insaeng-dubeonjjae-silpae/index.html new file mode 100644 index 0000000..5113a97 --- /dev/null +++ b/public/posts/insaeng-dubeonjjae-silpae/index.html @@ -0,0 +1,25 @@ +인생 두번째 실패. 두번째 대학탈락. | Morgan's Blog +

    인생 두번째 실패. 두번째 대학탈락.

    내 첫번째 실패는 조기진학 실패이다. 대학을 떨어졌다.

    내 두번째 실패도 대학 탈락이다. 이번엔 아직 9번 더 있지만, 작년에 떨어지고 느꼈던 그 참담함과 그 마음가짐을 다시 한번 느낄 수 있게 한 그 세글자 ‘불합격’. 역시 이번에도 참담함을 느꼈고, 여전히 안타까움과 공허함을 느낄 수 있었다.

    내심 기대했었다. 붙기를 간절히 기도했다. 하지만 세상은 냉정했다.

    바라던게 이제는 이룰 수 없다고 생각하니 공허했다. 하지만 그것도 잠깐이었다. 멘탈이 강하고 회복력도 강한게 내 장점이라 공허함으로 쳐져있는 것도 잠깐이었고, 앞으로를 다시 생각하고 마음가짐을 고치는 계기가 되었다.

    할 수 있는 모든 것을 해보자. 후회없이.

    \ No newline at end of file diff --git a/public/posts/jeonja-jeeoyi-segyein-mirae-geu-boanyi-wihyeob/index.html b/public/posts/jeonja-jeeoyi-segyein-mirae-geu-boanyi-wihyeob/index.html new file mode 100644 index 0000000..dcdd7ca --- /dev/null +++ b/public/posts/jeonja-jeeoyi-segyein-mirae-geu-boanyi-wihyeob/index.html @@ -0,0 +1,16 @@ +전자 제어의 세계인 미래, 그 보안의 위협 | Morgan's Blog +

    전자 제어의 세계인 미래, 그 보안의 위협

    미래 사회에는 전기자동차와 자율주행 자동차가 성하게 유행할 것이다. 사람 운전자의 역할이 거의 축소되고, AI나 전자적으로 제어될 것인데, 지금도 많이 일어나고 있는 논란은 바로 보안이다. 만약 자율주행 자동차가 해킹을 당하게 된다면 어떨까? 해커는 자동차에 타고 있는 사람의 생사여탈권을 가지게 될 정도로 심각한 문제가 있는 것이다. 그러므로, 이러한 생활환경에 직접적인 영향을 주는 전자기기의 보안은 매우 중요한 것으로 판단된다. 미래에 우리의 생활을 가장 많은 부분 담당할 사물인터넷도 마찬가지이다. 우리의 생활과 강하게 연관되어 있고, 그러므로 보안이 가장 주요한 요인이 된다. 전자적으로 제어되는 보일러가 해킹당하면 어떻게 될까? 해커는 보일러를 과하게 제어함으로써 실 사용자에게 영향을 미칠 수 있다. 더 심각하게는 가스밸브나 의료 기기가 누군가의 악의대로 조종된다면 사용자를 죽음의 위기에 처하게까지 할 수 있다. 에어컨이나 히터, 그리고 화장실, 환풍기, 및 여러 가구들이 연결되어 있으며, 우리의 삶에 큰 영향을 미칠 수 있다. 실제로 IoT기기들에 대해 우리의 사생활의 침해도 문제가 된다. 미래 사회에서는 모든 기기가 연결되어 있을 것이며, 자동차나 버스, 그리고 비행기까지도 무선으로 연결되어 있을 것이다. 그러면 여기서 가장 문제가 되는 것이 무선통신의 보안이다. 무선통신은 유선통신과는 다르게 모든 사람들이 시호를 감청할 수 있기에 그 보안이 매우 중요하고 심각하게 느껴진다. 그렇다면 이러한 사항들에 대해 지금은 어떻게 보안이 이루어졌으며, 또한 앞으로는 어떻게 발전되어야 할까?

    첫번째로는 AI상의 보안이다. 지금 보안의 상황으로는 공격자들이 시스템에 대해 예측이 어려운 신종 변종 공격을 많이 진행하고 있다. 이것의 바탕이 되는 기술은 바로 자동화이다. 보안이라는 것 자체가 공격 시 대응 및 방지가 주요한 특징이기 때문에 자동화나 변종 공격에 대해서는 취약할 수 밖에 없다. 완벽한 시스템이란 없는 것이다. 이런 공격에 대처하는 방안으로는 인공지능을 사용하는 방법이 있다. 실제 대규모로 전송되는 공격의 경우 인공지능으로 해킹에 대한 지도 및 비지도 학습을 통해 해킹 패턴을 자동적으로 분석해 막아줄 수 있기 때문이다. 또한 악성코드 분석에 인공지능을 접목시키면, 실제 사람이 분석하는 것보다 더욱 빠르게 분석할 수 있다. 하지만, 인공지능 보안에도 문제가 있다. 특히 인공지능은 실제 보안에 의지하는 것이 아니기 때문에 과하게 보안하거나 또는 이미 일어난 데이터들의 경향성 때문에 제대로 된 예측을 못하는 것이다. 인공지능도 선입견이 있는 것이다. 이와 관련지어서 인공지능에 의한 해킹을 고려해 보아야 한다. 인공지능 자체가 해킹을 하는 것이다. 해킹이란 것 자체가 반복성이 중요하고 난수성이 중요하기 때문에 이와같은 작업에 인공지능만큼 딱 맞는 것은 없을 것이다. 이와같은 공격에는 인공지능에 의한 대처밖에 답이 없는 것이다.

    인공지능에 의한 해킹과 보안에 대해 알아보았으니 인공지능 시스템에 대한 보안을 어떨까? 이것이 이에서 언급했던 자율주행 자동차에 관한 보안이 될 수 있다. 기본적으로 업다운 인공지능이 아닌 다운업 인공지능인 현재의 인공지능으로서는 주어진 데이터가 가장 기초적인 원리로 작용한다. 데이터를 기반으로 학습하고 행동하기 때문에 데이터의 정확성이나 신뢰성이 중요하게 작용한다. 이때 문제가 될 수 있는 것이 데이터의 오염이다. 데이터를 인위적으로 조작하여 인공지능의 행동을 조작하는 방법이다. 인공지능이 해킹당하기 쉬운 (어떤 방면에서) 이유가 바로 이것이다. 데이터가 악위적인 방향으로 조작된다면 인공지능의 행동의 패턴을 유추할 수 있고, 또한 자율적으로 조작할 수도 있다. 따라서, 인공지능에 대해서는 데이터의 유입의 신빙성을 중요시하게 고려해야 할 것이며, 데이터의 무결성이나정확성에 검증을 위한 인공지능을 도입하여 방어를 한다고 한다.

    두번째로는 사물인터넷에 대한 보안이다. 사물인터넷은 실질적으로 우리의 생활과 밀접하게 관련이 있고, 가장 많은 전자기기가 이 기술에 접목될 것이기 때문에 가장 중요한 보안이라고 생각할 수도 있다. IoT, Internet of Things는 기본적으로 인터넷에 대한 기술이기 때문에 가장 보안에 취약해 질 수밖에 없다. 또한 IoT기기는 저전력과 저성능이 가장 중요하고 소형화가 중요하기 때문에 특별한 보안 솔루션을 도입하기가 어렵다. 집에 커다란 보안서버를 하나씩 구비해 놓지 않는 이상. 따라서 IoT의 경우는 해킹에 가장 취약하면서 해킹에 있어서 가장 위험한 존재이다. 그 누가 자신의 집에서의 모습을 전 세계로 생중계되기를 원하겠는가.

    따라서 IoT에 대한 보안 솔루션은 굉장히 후발적일 수 밖에 없다. 따라서 소프트 웨어적으로 강력한 솔루션을 집어넣거나 취약점을 분석하게 후에 조치하는 방법밖에 없다. 전 세계적으로 IoT기기에 대한 보안 규제를 강화하거나 보안 기준을 제시하고 있고, 이를 처리하거나 대처하는 인력이나 전략을 제대로 정비하기만 한다면 현재 가능한 보안 솔루션 중 가장 상위의 솔루션이지 않을까 싶다.

    이와 같이 우리의 삶과 인터넷, 전자기기가 밀접하게 연결될 수록 그 보안의 영향력은 비약적으로 커진다. 보안 업계나 기업들은 이 점을 유의하여 서비스를 제공해야 할 것이다.

    \ No newline at end of file diff --git a/public/posts/jeonsanyuceyeoghag-cfd-with-python-navier-stokes-equation/index.html b/public/posts/jeonsanyuceyeoghag-cfd-with-python-navier-stokes-equation/index.html new file mode 100644 index 0000000..272cbb4 --- /dev/null +++ b/public/posts/jeonsanyuceyeoghag-cfd-with-python-navier-stokes-equation/index.html @@ -0,0 +1,776 @@ +[전산유체역학] CFD with Python (Navier-Stokes Equation) | Morgan's Blog +

    [전산유체역학] CFD with Python (Navier-Stokes Equation)

    1-D Linear Convection

    1차원 선형 열전도 방정식은 가장 심플하면서도 가장 기초적인 방정식입니다.

    $$ \frac{\partial u}{\partial t} + c \frac{\partial u}{\partial x} = 0 $$

    이 식을 오일러 방정식으로 변환하여 수치해석적으로 해를 구할 수 있도록 변환을 해줍니다.

    $$ u_i^{n+1} = u_i^n - c \frac{\Delta t}{\Delta x}(u_i^n-u_{i-1}^n) $$

    이제 이 오일러 방정식을 파이썬으로 구현해봅니다.

    import numpy
    +from matplotlib import pyplot
    +import time, sys
    +%matplotlib inline 
    +
    +nx = 41  # try changing this number from 41 to 81 and Run All ... what happens?
    +dx = 2 / (nx-1)
    +nt = 25    #nt is the number of timesteps we want to calculate
    +dt = .025  #dt is the amount of time each timestep covers (delta t)
    +c = 1      #assume wavespeed of c = 1
    +
    +u = numpy.ones(nx)      #numpy function ones()
    +u[int(.5 / dx):int(1 / dx + 1)] = 2  #setting u = 2 between 0.5 and 1 as per our I.C.s
    +
    +un = numpy.ones(nx) #initialize a temporary array
    +
    +for n in range(nt):  #loop for values of n from 0 to nt, so it will run nt times
    +    un = u.copy() ##copy the existing values of u into un
    +    for i in range(1, nx): ## you can try commenting this line and...
    +    #for i in range(nx): ## ... uncommenting this line and see what happens!
    +        u[i] = un[i] - c * dt / dx * (un[i] - un[i-1])
    +
    +pyplot.plot(numpy.linspace(0, 2, nx), u);
    +

    1-D Convection Equation (Non-Linear)

    $$ \frac{\partial u}{\partial t} + u \frac{\partial u}{\partial x} = 0 $$

    $$ u_i^{n+1} = u_i^n - u_i^n \frac{\Delta t}{\Delta x} (u_i^n - u_{i-1}^n) $$

    import numpy                 # we're importing numpy 
    +from matplotlib import pyplot    # and our 2D plotting library
    +%matplotlib inline
    +
    +
    +nx = 41
    +dx = 2 / (nx - 1)
    +nt = 20    #nt is the number of timesteps we want to calculate
    +dt = .025  #dt is the amount of time each timestep covers (delta t)
    +
    +u = numpy.ones(nx)      #as before, we initialize u with every value equal to 1.
    +u[int(.5 / dx) : int(1 / dx + 1)] = 2  #then set u = 2 between 0.5 and 1 as per our I.C.s
    +
    +un = numpy.ones(nx) #initialize our placeholder array un, to hold the time-stepped solution
    +
    +for n in range(nt):  #iterate through time
    +    un = u.copy() ##copy the existing values of u into un
    +    for i in range(1, nx):  ##now we'll iterate through the u array
    +    
    +     ###This is the line from Step 1, copied exactly.  Edit it for our new equation.
    +     ###then uncomment it and run the cell to evaluate Step 2   
    +      
    +           ###u[i] = un[i] - c * dt / dx * (un[i] - un[i-1]) 
    +
    +        
    +pyplot.plot(numpy.linspace(0, 2, nx), u) ##Plot the results
    +

    1-D Diffusion Equation

    $$ \frac{\partial u}{\partial t}= \nu \frac{\partial^2 u}{\partial x^2} $$

    $$ u_{i}^{n+1}=u_{i}^{n}+\frac{\nu\Delta t}{\Delta x^2}(u_{i+1}^{n}-2u_{i}^{n}+u_{i-1}^{n}) $$

    import numpy                 #loading our favorite library
    +from matplotlib import pyplot    #and the useful plotting library
    +%matplotlib inline
    +
    +nx = 41
    +dx = 2 / (nx - 1)
    +nt = 20    #the number of timesteps we want to calculate
    +nu = 0.3   #the value of viscosity
    +sigma = .2 #sigma is a parameter, we'll learn more about it later
    +dt = sigma * dx**2 / nu #dt is defined using sigma ... more later!
    +
    +
    +u = numpy.ones(nx)      #a numpy array with nx elements all equal to 1.
    +u[int(.5 / dx):int(1 / dx + 1)] = 2  #setting u = 2 between 0.5 and 1 as per our I.C.s
    +
    +un = numpy.ones(nx) #our placeholder array, un, to advance the solution in time
    +
    +for n in range(nt):  #iterate through time
    +    un = u.copy() ##copy the existing values of u into un
    +    for i in range(1, nx - 1):
    +        u[i] = un[i] + nu * dt / dx**2 * (un[i+1] - 2 * un[i] + un[i-1])
    +        
    +pyplot.plot(numpy.linspace(0, 2, nx), u);
    +

    Burger’s Equation

    $$ \frac{\partial u}{\partial t} + u \frac{\partial u}{\partial x} = \nu \frac{\partial ^2u}{\partial x^2} $$

    $$ u_i^{n+1} = u_i^n - u_i^n \frac{\Delta t}{\Delta x} (u_i^n - u_{i-1}^n) + \nu \frac{\Delta t}{\Delta x^2}(u_{i+1}^n - 2u_i^n + u_{i-1}^n) $$

    import numpy
    +import sympy
    +from sympy import init_printing
    +from matplotlib import pyplot
    +from sympy.utilities.lambdify import lambdify
    +
    +%matplotlib inline
    +init_printing(use_latex=True)
    +
    +x, nu, t = sympy.symbols('x nu t')
    +phi = (sympy.exp(-(x - 4 * t)**2 / (4 * nu * (t + 1))) +
    +       sympy.exp(-(x - 4 * t - 2 * sympy.pi)**2 / (4 * nu * (t + 1))))
    +
    +phiprime = phi.diff(x)
    +
    +u = -2 * nu * (phiprime / phi) + 4
    +ufunc = lambdify((t, x, nu), u)
    +
    +###variable declarations
    +nx = 101
    +nt = 100
    +dx = 2 * numpy.pi / (nx - 1)
    +nu = .07
    +dt = dx * nu
    +
    +x = numpy.linspace(0, 2 * numpy.pi, nx)
    +un = numpy.empty(nx)
    +t = 0
    +
    +u = numpy.asarray([ufunc(t, x0, nu) for x0 in x])
    +
    +for n in range(nt):
    +    un = u.copy()
    +    for i in range(1, nx-1):
    +        u[i] = un[i] - un[i] * dt / dx *(un[i] - un[i-1]) + nu * dt / dx**2 *\
    +                (un[i+1] - 2 * un[i] + un[i-1])
    +    u[0] = un[0] - un[0] * dt / dx * (un[0] - un[-2]) + nu * dt / dx**2 *\
    +                (un[1] - 2 * un[0] + un[-2])
    +    u[-1] = u[0]
    +        
    +u_analytical = numpy.asarray([ufunc(nt * dt, xi, nu) for xi in x])
    +
    +pyplot.figure(figsize=(11, 7), dpi=100)
    +pyplot.plot(x,u, marker='o', lw=2, label='Computational')
    +pyplot.plot(x, u_analytical, label='Analytical')
    +pyplot.xlim([0, 2 * numpy.pi])
    +pyplot.ylim([0, 10])
    +pyplot.legend();
    +

    2-D Linear Convection

    $$ \frac{\partial u}{\partial t}+c\frac{\partial u}{\partial x} + c\frac{\partial u}{\partial y} = 0 $$

    $$ u_{i,j}^{n+1} = u_{i,j}^n-c \frac{\Delta t}{\Delta x}(u_{i,j}^n-u_{i-1,j}^n)-c \frac{\Delta t}{\Delta y}(u_{i,j}^n-u_{i,j-1}^n) $$

    from mpl_toolkits.mplot3d import Axes3D    ##New Library required for projected 3d plots
    +
    +import numpy
    +from matplotlib import pyplot, cm
    +%matplotlib inline
    +
    +###variable declarations
    +nx = 81
    +ny = 81
    +nt = 100
    +c = 1
    +dx = 2 / (nx - 1)
    +dy = 2 / (ny - 1)
    +sigma = .2
    +dt = sigma * dx
    +
    +x = numpy.linspace(0, 2, nx)
    +y = numpy.linspace(0, 2, ny)
    +
    +u = numpy.ones((ny, nx)) ##create a 1xn vector of 1's
    +un = numpy.ones((ny, nx)) ##
    +
    +###Assign initial conditions
    +
    +##set hat function I.C. : u(.5<=x<=1 && .5<=y<=1 ) is 2
    +u[int(.5 / dy):int(1 / dy + 1),int(.5 / dx):int(1 / dx + 1)] = 2 
    +
    +###Plot Initial Condition
    +##the figsize parameter can be used to produce different sized images
    +fig = pyplot.figure(figsize=(11, 7), dpi=100)
    +ax = fig.gca(projection='3d')                      
    +X, Y = numpy.meshgrid(x, y)                            
    +surf = ax.plot_surface(X, Y, u[:], cmap=cm.viridis)
    +

    2-D Convection

    $$ \frac{\partial u}{\partial t} + u \frac{\partial u}{\partial x} + v \frac{\partial u}{\partial y} = 0 $$$$ \frac{\partial v}{\partial t} + u \frac{\partial v}{\partial x} + v \frac{\partial v}{\partial y} = 0 $$$$ u_{i,j}^{n+1} = u_{i,j}^n - u_{i,j} \frac{\Delta t}{\Delta x} (u_{i,j}^n-u_{i-1,j}^n) - v_{i,j}^n \frac{\Delta t}{\Delta y} (u_{i,j}^n-u_{i,j-1}^n) $$$$ v_{i,j}^{n+1} = v_{i,j}^n - u_{i,j} \frac{\Delta t}{\Delta x} (v_{i,j}^n-v_{i-1,j}^n) - v_{i,j}^n \frac{\Delta t}{\Delta y} (v_{i,j}^n-v_{i,j-1}^n) $$

    from mpl_toolkits.mplot3d import Axes3D
    +from matplotlib import pyplot, cm
    +import numpy
    +%matplotlib inline
    +
    +###variable declarations
    +nx = 101
    +ny = 101
    +nt = 80
    +c = 1
    +dx = 2 / (nx - 1)
    +dy = 2 / (ny - 1)
    +sigma = .2
    +dt = sigma * dx
    +
    +x = numpy.linspace(0, 2, nx)
    +y = numpy.linspace(0, 2, ny)
    +
    +u = numpy.ones((ny, nx)) ##create a 1xn vector of 1's
    +v = numpy.ones((ny, nx))
    +un = numpy.ones((ny, nx))
    +vn = numpy.ones((ny, nx))
    +
    +###Assign initial conditions
    +##set hat function I.C. : u(.5<=x<=1 && .5<=y<=1 ) is 2
    +u[int(.5 / dy):int(1 / dy + 1), int(.5 / dx):int(1 / dx + 1)] = 2
    +##set hat function I.C. : v(.5<=x<=1 && .5<=y<=1 ) is 2
    +v[int(.5 / dy):int(1 / dy + 1), int(.5 / dx):int(1 / dx + 1)] = 2
    +fig = pyplot.figure(figsize=(11, 7), dpi=100)
    +ax = fig.gca(projection='3d')
    +X, Y = numpy.meshgrid(x, y)
    +
    +ax.plot_surface(X, Y, u, cmap=cm.viridis, rstride=2, cstride=2)
    +ax.set_xlabel('$x$')
    +ax.set_ylabel('$y$');
    +

    2D Diffusion

    $$ \frac{\partial u}{\partial t} = \nu \frac{\partial ^2 u}{\partial x^2} + \nu \frac{\partial ^2 u}{\partial y^2} $$$$ \begin{split}u_{i,j}^{n+1} = u_{i,j}^n &+ \frac{\nu \Delta t}{\Delta x^2}(u_{i+1,j}^n - 2 u_{i,j}^n + u_{i-1,j}^n) \&+ \frac{\nu \Delta t}{\Delta y^2}(u_{i,j+1}^n-2 u_{i,j}^n + u_{i,j-1}^n)\end{split} $$

    import numpy
    +from matplotlib import pyplot, cm
    +from mpl_toolkits.mplot3d import Axes3D ##library for 3d projection plots
    +%matplotlib inline
    +###variable declarations
    +nx = 31
    +ny = 31
    +nt = 17
    +nu = .05
    +dx = 2 / (nx - 1)
    +dy = 2 / (ny - 1)
    +sigma = .25
    +dt = sigma * dx * dy / nu
    +
    +x = numpy.linspace(0, 2, nx)
    +y = numpy.linspace(0, 2, ny)
    +
    +u = numpy.ones((ny, nx))  # create a 1xn vector of 1's
    +un = numpy.ones((ny, nx))
    +
    +###Assign initial conditions
    +# set hat function I.C. : u(.5<=x<=1 && .5<=y<=1 ) is 2
    +u[int(.5 / dy):int(1 / dy + 1),int(.5 / dx):int(1 / dx + 1)] = 2  
    +
    +###Run through nt timesteps
    +def diffuse(nt):
    +    u[int(.5 / dy):int(1 / dy + 1),int(.5 / dx):int(1 / dx + 1)] = 2  
    +    
    +    for n in range(nt + 1): 
    +        un = u.copy()
    +        u[1:-1, 1:-1] = (un[1:-1,1:-1] + 
    +                        nu * dt / dx**2 * 
    +                        (un[1:-1, 2:] - 2 * un[1:-1, 1:-1] + un[1:-1, 0:-2]) +
    +                        nu * dt / dy**2 * 
    +                        (un[2:,1: -1] - 2 * un[1:-1, 1:-1] + un[0:-2, 1:-1]))
    +        u[0, :] = 1
    +        u[-1, :] = 1
    +        u[:, 0] = 1
    +        u[:, -1] = 1
    +
    +    
    +    fig = pyplot.figure()
    +    ax = fig.gca(projection='3d')
    +    surf = ax.plot_surface(X, Y, u[:], rstride=1, cstride=1, cmap=cm.viridis,
    +        linewidth=0, antialiased=True)
    +    ax.set_zlim(1, 2.5)
    +    ax.set_xlabel('$x$')
    +    ax.set_ylabel('$y$');
    +
    +diffuse(14)
    +

    Burgers’ Equation in 2D

    $$ \frac{\partial u}{\partial t} + u \frac{\partial u}{\partial x} + v \frac{\partial u}{\partial y} = \nu ; \left(\frac{\partial ^2 u}{\partial x^2} + \frac{\partial ^2 u}{\partial y^2}\right) $$$$ \frac{\partial v}{\partial t} + u \frac{\partial v}{\partial x} + v \frac{\partial v}{\partial y} = \nu ; \left(\frac{\partial ^2 v}{\partial x^2} + \frac{\partial ^2 v}{\partial y^2}\right) $$$$ \begin{split}v_{i,j}^{n+1} = & v_{i,j}^n - \frac{\Delta t}{\Delta x} u_{i,j}^n (v_{i,j}^n - v_{i-1,j}^n) - \frac{\Delta t}{\Delta y} v_{i,j}^n (v_{i,j}^n - v_{i,j-1}^n) \&+ \frac{\nu \Delta t}{\Delta x^2}(v_{i+1,j}^n-2v_{i,j}^n+v_{i-1,j}^n) + \frac{\nu \Delta t}{\Delta y^2} (v_{i,j+1}^n - 2v_{i,j}^n + v_{i,j-1}^n)\end{split} $$

    import numpy
    +from matplotlib import pyplot, cm
    +from mpl_toolkits.mplot3d import Axes3D
    +%matplotlib inline
    +###variable declarations
    +nx = 41
    +ny = 41
    +nt = 120
    +c = 1
    +dx = 2 / (nx - 1)
    +dy = 2 / (ny - 1)
    +sigma = .0009
    +nu = 0.01
    +dt = sigma * dx * dy / nu
    +
    +
    +x = numpy.linspace(0, 2, nx)
    +y = numpy.linspace(0, 2, ny)
    +
    +u = numpy.ones((ny, nx))  # create a 1xn vector of 1's
    +v = numpy.ones((ny, nx))
    +un = numpy.ones((ny, nx)) 
    +vn = numpy.ones((ny, nx))
    +comb = numpy.ones((ny, nx))
    +
    +###Assign initial conditions
    +
    +##set hat function I.C. : u(.5<=x<=1 && .5<=y<=1 ) is 2
    +u[int(.5 / dy):int(1 / dy + 1),int(.5 / dx):int(1 / dx + 1)] = 2 
    +##set hat function I.C. : u(.5<=x<=1 && .5<=y<=1 ) is 2
    +v[int(.5 / dy):int(1 / dy + 1),int(.5 / dx):int(1 / dx + 1)] = 2
    +###(plot ICs)
    +for n in range(nt + 1): ##loop across number of time steps
    +    un = u.copy()
    +    vn = v.copy()
    +
    +    u[1:-1, 1:-1] = (un[1:-1, 1:-1] -
    +                     dt / dx * un[1:-1, 1:-1] * 
    +                     (un[1:-1, 1:-1] - un[1:-1, 0:-2]) - 
    +                     dt / dy * vn[1:-1, 1:-1] * 
    +                     (un[1:-1, 1:-1] - un[0:-2, 1:-1]) + 
    +                     nu * dt / dx**2 * 
    +                     (un[1:-1,2:] - 2 * un[1:-1, 1:-1] + un[1:-1, 0:-2]) + 
    +                     nu * dt / dy**2 * 
    +                     (un[2:, 1:-1] - 2 * un[1:-1, 1:-1] + un[0:-2, 1:-1]))
    +    
    +    v[1:-1, 1:-1] = (vn[1:-1, 1:-1] - 
    +                     dt / dx * un[1:-1, 1:-1] *
    +                     (vn[1:-1, 1:-1] - vn[1:-1, 0:-2]) -
    +                     dt / dy * vn[1:-1, 1:-1] * 
    +                    (vn[1:-1, 1:-1] - vn[0:-2, 1:-1]) + 
    +                     nu * dt / dx**2 * 
    +                     (vn[1:-1, 2:] - 2 * vn[1:-1, 1:-1] + vn[1:-1, 0:-2]) +
    +                     nu * dt / dy**2 *
    +                     (vn[2:, 1:-1] - 2 * vn[1:-1, 1:-1] + vn[0:-2, 1:-1]))
    +     
    +    u[0, :] = 1
    +    u[-1, :] = 1
    +    u[:, 0] = 1
    +    u[:, -1] = 1
    +    
    +    v[0, :] = 1
    +    v[-1, :] = 1
    +    v[:, 0] = 1
    +    v[:, -1] = 1
    +fig = pyplot.figure(figsize=(11, 7), dpi=100)
    +ax = fig.gca(projection='3d')
    +X, Y = numpy.meshgrid(x, y)
    +ax.plot_surface(X, Y, u, cmap=cm.viridis, rstride=1, cstride=1)
    +ax.plot_surface(X, Y, v, cmap=cm.viridis, rstride=1, cstride=1)
    +ax.set_xlabel('$x$')
    +ax.set_ylabel('$y$');
    +

    2D Laplace Equation

    $$ \frac{\partial ^2 p}{\partial x^2} + \frac{\partial ^2 p}{\partial y^2} = 0 $$$$ p_{i,j}^n = \frac{\Delta y^2(p_{i+1,j}^n+p_{i-1,j}^n)+\Delta x^2(p_{i,j+1}^n + p_{i,j-1}^n)}{2(\Delta x^2 + \Delta y^2)} $$

    import numpy
    +from matplotlib import pyplot, cm
    +from mpl_toolkits.mplot3d import Axes3D
    +%matplotlib inline
    +
    +def plot2D(x, y, p):
    +    fig = pyplot.figure(figsize=(11, 7), dpi=100)
    +    ax = fig.gca(projection='3d')
    +    X, Y = numpy.meshgrid(x, y)
    +    surf = ax.plot_surface(X, Y, p[:], rstride=1, cstride=1, cmap=cm.viridis,
    +            linewidth=0, antialiased=False)
    +    ax.set_xlim(0, 2)
    +    ax.set_ylim(0, 1)
    +    ax.view_init(30, 225)
    +    ax.set_xlabel('$x$')
    +    ax.set_ylabel('$y$')
    +
    +def laplace2d(p, y, dx, dy, l1norm_target):
    +  l1norm = 1
    +  pn = numpy.empty_like(p)
    +
    +  while l1norm > l1norm_target:
    +      pn = p.copy()
    +      p[1:-1, 1:-1] = ((dy**2 * (pn[1:-1, 2:] + pn[1:-1, 0:-2]) +
    +                        dx**2 * (pn[2:, 1:-1] + pn[0:-2, 1:-1])) /
    +                      (2 * (dx**2 + dy**2)))
    +          
    +      p[:, 0] = 0  # p = 0 @ x = 0
    +      p[:, -1] = y  # p = y @ x = 2
    +      p[0, :] = p[1, :]  # dp/dy = 0 @ y = 0
    +      p[-1, :] = p[-2, :]  # dp/dy = 0 @ y = 1
    +      l1norm = (numpy.sum(numpy.abs(p[:]) - numpy.abs(pn[:])) /
    +              numpy.sum(numpy.abs(pn[:])))
    +    
    +  return p
    +  
    +nx = 31
    +ny = 31
    +c = 1
    +dx = 2 / (nx - 1)
    +dy = 2 / (ny - 1)
    +
    +
    +##initial conditions
    +p = numpy.zeros((ny, nx))  # create a XxY vector of 0's
    +
    +
    +##plotting aids
    +x = numpy.linspace(0, 2, nx)
    +y = numpy.linspace(0, 1, ny)
    +
    +##boundary conditions
    +p[:, 0] = 0  # p = 0 @ x = 0
    +p[:, -1] = y  # p = y @ x = 2
    +p[0, :] = p[1, :]  # dp/dy = 0 @ y = 0
    +p[-1, :] = p[-2, :]  # dp/dy = 0 @ y = 1
    +
    +p = laplace2d(p, y, dx, dy, 1e-4)
    +
    +plot2D(x, y, p)
    +

    2D Poisson Equation

    $$ \frac{\partial ^2 p}{\partial x^2} + \frac{\partial ^2 p}{\partial y^2} = b $$$$ p_{i,j}^{n}=\frac{(p_{i+1,j}^{n}+p_{i-1,j}^{n})\Delta y^2+(p_{i,j+1}^{n}+p_{i,j-1}^{n})\Delta x^2-b_{i,j}^{n}\Delta x^2\Delta y^2}{2(\Delta x^2+\Delta y^2)} $$

    import numpy
    +from matplotlib import pyplot, cm
    +from mpl_toolkits.mplot3d import Axes3D
    +%matplotlib inline
    +# Parameters
    +nx = 50
    +ny = 50
    +nt  = 100
    +xmin = 0
    +xmax = 2
    +ymin = 0
    +ymax = 1
    +
    +dx = (xmax - xmin) / (nx - 1)
    +dy = (ymax - ymin) / (ny - 1)
    +
    +# Initialization
    +p  = numpy.zeros((ny, nx))
    +pd = numpy.zeros((ny, nx))
    +b  = numpy.zeros((ny, nx))
    +x  = numpy.linspace(xmin, xmax, nx)
    +y  = numpy.linspace(xmin, xmax, ny)
    +
    +# Source
    +b[int(ny / 4), int(nx / 4)]  = 100
    +b[int(3 * ny / 4), int(3 * nx / 4)] = -100
    +
    +for it in range(nt):
    +
    +    pd = p.copy()
    +
    +    p[1:-1,1:-1] = (((pd[1:-1, 2:] + pd[1:-1, :-2]) * dy**2 +
    +                    (pd[2:, 1:-1] + pd[:-2, 1:-1]) * dx**2 -
    +                    b[1:-1, 1:-1] * dx**2 * dy**2) / 
    +                    (2 * (dx**2 + dy**2)))
    +
    +    p[0, :] = 0
    +    p[ny-1, :] = 0
    +    p[:, 0] = 0
    +    p[:, nx-1] = 0
    +
    +def plot2D(x, y, p):
    +    fig = pyplot.figure(figsize=(11, 7), dpi=100)
    +    ax = fig.gca(projection='3d')
    +    X, Y = numpy.meshgrid(x, y)
    +    surf = ax.plot_surface(X, Y, p[:], rstride=1, cstride=1, cmap=cm.viridis,
    +            linewidth=0, antialiased=False)
    +    ax.view_init(30, 225)
    +    ax.set_xlabel('$x$')
    +    ax.set_ylabel('$y$')
    +    
    +plot2D(x, y, p)
    +

    Cavity Flow with Navier–Stokes

    $$ \frac{\partial \vec{v}}{\partial t}+(\vec{v}\cdot\nabla)\vec{v}=-\frac{1}{\rho}\nabla p + \nu \nabla^2\vec{v} $$$$ \frac{\partial u}{\partial t}+u\frac{\partial u}{\partial x}+v\frac{\partial u}{\partial y} = -\frac{1}{\rho}\frac{\partial p}{\partial x}+\nu \left(\frac{\partial^2 u}{\partial x^2}+\frac{\partial^2 u}{\partial y^2} \right) $$$$ \frac{\partial^2 p}{\partial x^2}+\frac{\partial^2 p}{\partial y^2} = -\rho\left(\frac{\partial u}{\partial x}\frac{\partial u}{\partial x}+2\frac{\partial u}{\partial y}\frac{\partial v}{\partial x}+\frac{\partial v}{\partial y}\frac{\partial v}{\partial y} \right) $$$$ \begin{split}p_{i,j}^{n} = & \frac{\left(p_{i+1,j}^{n}+p_{i-1,j}^{n}\right) \Delta y^2 + \left(p_{i,j+1}^{n}+p_{i,j-1}^{n}\right) \Delta x^2}{2\left(\Delta x^2+\Delta y^2\right)} \& -\frac{\rho\Delta x^2\Delta y^2}{2\left(\Delta x^2+\Delta y^2\right)} \& \times \left[\frac{1}{\Delta t}\left(\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x}+\frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\right)-\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x}\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x} -2\frac{u_{i,j+1}-u_{i,j-1}}{2\Delta y}\frac{v_{i+1,j}-v_{i-1,j}}{2\Delta x}-\frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\right]\end{split} $$

    import numpy
    +from matplotlib import pyplot, cm
    +from mpl_toolkits.mplot3d import Axes3D
    +%matplotlib inline
    +nx = 41
    +ny = 41
    +nt = 500
    +nit = 50
    +c = 1
    +dx = 2 / (nx - 1)
    +dy = 2 / (ny - 1)
    +x = numpy.linspace(0, 2, nx)
    +y = numpy.linspace(0, 2, ny)
    +X, Y = numpy.meshgrid(x, y)
    +
    +rho = 1
    +nu = .1
    +dt = .001
    +
    +u = numpy.zeros((ny, nx))
    +v = numpy.zeros((ny, nx))
    +p = numpy.zeros((ny, nx)) 
    +b = numpy.zeros((ny, nx))
    +
    +def build_up_b(b, rho, dt, u, v, dx, dy):
    +    
    +    b[1:-1, 1:-1] = (rho * (1 / dt * 
    +                    ((u[1:-1, 2:] - u[1:-1, 0:-2]) / 
    +                     (2 * dx) + (v[2:, 1:-1] - v[0:-2, 1:-1]) / (2 * dy)) -
    +                    ((u[1:-1, 2:] - u[1:-1, 0:-2]) / (2 * dx))**2 -
    +                      2 * ((u[2:, 1:-1] - u[0:-2, 1:-1]) / (2 * dy) *
    +                           (v[1:-1, 2:] - v[1:-1, 0:-2]) / (2 * dx))-
    +                          ((v[2:, 1:-1] - v[0:-2, 1:-1]) / (2 * dy))**2))
    +
    +    return b
    +
    +def pressure_poisson(p, dx, dy, b):
    +    pn = numpy.empty_like(p)
    +    pn = p.copy()
    +    
    +    for q in range(nit):
    +        pn = p.copy()
    +        p[1:-1, 1:-1] = (((pn[1:-1, 2:] + pn[1:-1, 0:-2]) * dy**2 + 
    +                          (pn[2:, 1:-1] + pn[0:-2, 1:-1]) * dx**2) /
    +                          (2 * (dx**2 + dy**2)) -
    +                          dx**2 * dy**2 / (2 * (dx**2 + dy**2)) * 
    +                          b[1:-1,1:-1])
    +
    +        p[:, -1] = p[:, -2] # dp/dx = 0 at x = 2
    +        p[0, :] = p[1, :]   # dp/dy = 0 at y = 0
    +        p[:, 0] = p[:, 1]   # dp/dx = 0 at x = 0
    +        p[-1, :] = 0        # p = 0 at y = 2
    +        
    +    return p
    +
    +def cavity_flow(nt, u, v, dt, dx, dy, p, rho, nu):
    +    un = numpy.empty_like(u)
    +    vn = numpy.empty_like(v)
    +    b = numpy.zeros((ny, nx))
    +    
    +    for n in range(nt):
    +        un = u.copy()
    +        vn = v.copy()
    +        
    +        b = build_up_b(b, rho, dt, u, v, dx, dy)
    +        p = pressure_poisson(p, dx, dy, b)
    +        
    +        u[1:-1, 1:-1] = (un[1:-1, 1:-1]-
    +                         un[1:-1, 1:-1] * dt / dx *
    +                        (un[1:-1, 1:-1] - un[1:-1, 0:-2]) -
    +                         vn[1:-1, 1:-1] * dt / dy *
    +                        (un[1:-1, 1:-1] - un[0:-2, 1:-1]) -
    +                         dt / (2 * rho * dx) * (p[1:-1, 2:] - p[1:-1, 0:-2]) +
    +                         nu * (dt / dx**2 *
    +                        (un[1:-1, 2:] - 2 * un[1:-1, 1:-1] + un[1:-1, 0:-2]) +
    +                         dt / dy**2 *
    +                        (un[2:, 1:-1] - 2 * un[1:-1, 1:-1] + un[0:-2, 1:-1])))
    +
    +        v[1:-1,1:-1] = (vn[1:-1, 1:-1] -
    +                        un[1:-1, 1:-1] * dt / dx *
    +                       (vn[1:-1, 1:-1] - vn[1:-1, 0:-2]) -
    +                        vn[1:-1, 1:-1] * dt / dy *
    +                       (vn[1:-1, 1:-1] - vn[0:-2, 1:-1]) -
    +                        dt / (2 * rho * dy) * (p[2:, 1:-1] - p[0:-2, 1:-1]) +
    +                        nu * (dt / dx**2 *
    +                       (vn[1:-1, 2:] - 2 * vn[1:-1, 1:-1] + vn[1:-1, 0:-2]) +
    +                        dt / dy**2 *
    +                       (vn[2:, 1:-1] - 2 * vn[1:-1, 1:-1] + vn[0:-2, 1:-1])))
    +
    +        u[0, :]  = 0
    +        u[:, 0]  = 0
    +        u[:, -1] = 0
    +        u[-1, :] = 1    # set velocity on cavity lid equal to 1
    +        v[0, :]  = 0
    +        v[-1, :] = 0
    +        v[:, 0]  = 0
    +        v[:, -1] = 0
    +        
    +        
    +    return u, v, p
    +
    +u = numpy.zeros((ny, nx))
    +v = numpy.zeros((ny, nx))
    +p = numpy.zeros((ny, nx))
    +b = numpy.zeros((ny, nx))
    +nt = 100
    +u, v, p = cavity_flow(nt, u, v, dt, dx, dy, p, rho, nu)
    +fig = pyplot.figure(figsize=(11,7), dpi=100)
    +# plotting the pressure field as a contour
    +pyplot.contourf(X, Y, p, alpha=0.5, cmap=cm.viridis)  
    +pyplot.colorbar()
    +# plotting the pressure field outlines
    +pyplot.contour(X, Y, p, cmap=cm.viridis)  
    +# plotting velocity field
    +pyplot.quiver(X[::2, ::2], Y[::2, ::2], u[::2, ::2], v[::2, ::2]) 
    +pyplot.xlabel('X')
    +pyplot.ylabel('Y');
    +
    u = numpy.zeros((ny, nx))
    +v = numpy.zeros((ny, nx))
    +p = numpy.zeros((ny, nx))
    +b = numpy.zeros((ny, nx))
    +nt = 700
    +u, v, p = cavity_flow(nt, u, v, dt, dx, dy, p, rho, nu)
    +fig = pyplot.figure(figsize=(11, 7), dpi=100)
    +pyplot.contourf(X, Y, p, alpha=0.5, cmap=cm.viridis)
    +pyplot.colorbar()
    +pyplot.contour(X, Y, p, cmap=cm.viridis)
    +pyplot.quiver(X[::2, ::2], Y[::2, ::2], u[::2, ::2], v[::2, ::2])
    +pyplot.xlabel('X')
    +pyplot.ylabel('Y');
    +
    fig = pyplot.figure(figsize=(11, 7), dpi=100)
    +pyplot.contourf(X, Y, p, alpha=0.5, cmap=cm.viridis)
    +pyplot.colorbar()
    +pyplot.contour(X, Y, p, cmap=cm.viridis)
    +pyplot.streamplot(X, Y, u, v)
    +pyplot.xlabel('X')
    +pyplot.ylabel('Y');
    +

    Channel Flow with Navier–Stokes

    $$ \frac{\partial u}{\partial t}+u\frac{\partial u}{\partial x}+v\frac{\partial u}{\partial y}=-\frac{1}{\rho}\frac{\partial p}{\partial x}+\nu\left(\frac{\partial^2 u}{\partial x^2}+\frac{\partial^2 u}{\partial y^2}\right)+F $$$$ \frac{\partial^2 p}{\partial x^2}+\frac{\partial^2 p}{\partial y^2}=-\rho\left(\frac{\partial u}{\partial x}\frac{\partial u}{\partial x}+2\frac{\partial u}{\partial y}\frac{\partial v}{\partial x}+\frac{\partial v}{\partial y}\frac{\partial v}{\partial y}\right) $$$$ \begin{split}p_{i,j}^{n} = & \frac{\left(p_{i+1,j}^{n}+p_{i-1,j}^{n}\right) \Delta y^2 + \left(p_{i,j+1}^{n}+p_{i,j-1}^{n}\right) \Delta x^2}{2(\Delta x^2+\Delta y^2)} \& -\frac{\rho\Delta x^2\Delta y^2}{2\left(\Delta x^2+\Delta y^2\right)} \& \times \left[\frac{1}{\Delta t} \left(\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x} + \frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\right) - \frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x}\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x} - 2\frac{u_{i,j+1}-u_{i,j-1}}{2\Delta y}\frac{v_{i+1,j}-v_{i-1,j}}{2\Delta x} - \frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\right]\end{split} $$

    import numpy
    +from matplotlib import pyplot, cm
    +from mpl_toolkits.mplot3d import Axes3D
    +%matplotlib inline
    +
    +def build_up_b(rho, dt, dx, dy, u, v):
    +    b = numpy.zeros_like(u)
    +    b[1:-1, 1:-1] = (rho * (1 / dt * ((u[1:-1, 2:] - u[1:-1, 0:-2]) / (2 * dx) +
    +                                      (v[2:, 1:-1] - v[0:-2, 1:-1]) / (2 * dy)) -
    +                            ((u[1:-1, 2:] - u[1:-1, 0:-2]) / (2 * dx))**2 -
    +                            2 * ((u[2:, 1:-1] - u[0:-2, 1:-1]) / (2 * dy) *
    +                                 (v[1:-1, 2:] - v[1:-1, 0:-2]) / (2 * dx))-
    +                            ((v[2:, 1:-1] - v[0:-2, 1:-1]) / (2 * dy))**2))
    +    
    +    # Periodic BC Pressure @ x = 2
    +    b[1:-1, -1] = (rho * (1 / dt * ((u[1:-1, 0] - u[1:-1,-2]) / (2 * dx) +
    +                                    (v[2:, -1] - v[0:-2, -1]) / (2 * dy)) -
    +                          ((u[1:-1, 0] - u[1:-1, -2]) / (2 * dx))**2 -
    +                          2 * ((u[2:, -1] - u[0:-2, -1]) / (2 * dy) *
    +                               (v[1:-1, 0] - v[1:-1, -2]) / (2 * dx)) -
    +                          ((v[2:, -1] - v[0:-2, -1]) / (2 * dy))**2))
    +
    +    # Periodic BC Pressure @ x = 0
    +    b[1:-1, 0] = (rho * (1 / dt * ((u[1:-1, 1] - u[1:-1, -1]) / (2 * dx) +
    +                                   (v[2:, 0] - v[0:-2, 0]) / (2 * dy)) -
    +                         ((u[1:-1, 1] - u[1:-1, -1]) / (2 * dx))**2 -
    +                         2 * ((u[2:, 0] - u[0:-2, 0]) / (2 * dy) *
    +                              (v[1:-1, 1] - v[1:-1, -1]) / (2 * dx))-
    +                         ((v[2:, 0] - v[0:-2, 0]) / (2 * dy))**2))
    +    
    +    return b
    +
    +def pressure_poisson_periodic(p, dx, dy):
    +    pn = numpy.empty_like(p)
    +    
    +    for q in range(nit):
    +        pn = p.copy()
    +        p[1:-1, 1:-1] = (((pn[1:-1, 2:] + pn[1:-1, 0:-2]) * dy**2 +
    +                          (pn[2:, 1:-1] + pn[0:-2, 1:-1]) * dx**2) /
    +                         (2 * (dx**2 + dy**2)) -
    +                         dx**2 * dy**2 / (2 * (dx**2 + dy**2)) * b[1:-1, 1:-1])
    +
    +        # Periodic BC Pressure @ x = 2
    +        p[1:-1, -1] = (((pn[1:-1, 0] + pn[1:-1, -2])* dy**2 +
    +                        (pn[2:, -1] + pn[0:-2, -1]) * dx**2) /
    +                       (2 * (dx**2 + dy**2)) -
    +                       dx**2 * dy**2 / (2 * (dx**2 + dy**2)) * b[1:-1, -1])
    +
    +        # Periodic BC Pressure @ x = 0
    +        p[1:-1, 0] = (((pn[1:-1, 1] + pn[1:-1, -1])* dy**2 +
    +                       (pn[2:, 0] + pn[0:-2, 0]) * dx**2) /
    +                      (2 * (dx**2 + dy**2)) -
    +                      dx**2 * dy**2 / (2 * (dx**2 + dy**2)) * b[1:-1, 0])
    +        
    +        # Wall boundary conditions, pressure
    +        p[-1, :] =p[-2, :]  # dp/dy = 0 at y = 2
    +        p[0, :] = p[1, :]  # dp/dy = 0 at y = 0
    +    
    +    return p
    +
    +##variable declarations
    +nx = 41
    +ny = 41
    +nt = 10
    +nit = 50 
    +c = 1
    +dx = 2 / (nx - 1)
    +dy = 2 / (ny - 1)
    +x = numpy.linspace(0, 2, nx)
    +y = numpy.linspace(0, 2, ny)
    +X, Y = numpy.meshgrid(x, y)
    +
    +
    +##physical variables
    +rho = 1
    +nu = .1
    +F = 1
    +dt = .01
    +
    +#initial conditions
    +u = numpy.zeros((ny, nx))
    +un = numpy.zeros((ny, nx))
    +
    +v = numpy.zeros((ny, nx))
    +vn = numpy.zeros((ny, nx))
    +
    +p = numpy.ones((ny, nx))
    +pn = numpy.ones((ny, nx))
    +
    +b = numpy.zeros((ny, nx))
    +
    +udiff = 1
    +stepcount = 0
    +
    +while udiff > .001:
    +    un = u.copy()
    +    vn = v.copy()
    +
    +    b = build_up_b(rho, dt, dx, dy, u, v)
    +    p = pressure_poisson_periodic(p, dx, dy)
    +
    +    u[1:-1, 1:-1] = (un[1:-1, 1:-1] -
    +                     un[1:-1, 1:-1] * dt / dx * 
    +                    (un[1:-1, 1:-1] - un[1:-1, 0:-2]) -
    +                     vn[1:-1, 1:-1] * dt / dy * 
    +                    (un[1:-1, 1:-1] - un[0:-2, 1:-1]) -
    +                     dt / (2 * rho * dx) * 
    +                    (p[1:-1, 2:] - p[1:-1, 0:-2]) +
    +                     nu * (dt / dx**2 * 
    +                    (un[1:-1, 2:] - 2 * un[1:-1, 1:-1] + un[1:-1, 0:-2]) +
    +                     dt / dy**2 * 
    +                    (un[2:, 1:-1] - 2 * un[1:-1, 1:-1] + un[0:-2, 1:-1])) + 
    +                     F * dt)
    +
    +    v[1:-1, 1:-1] = (vn[1:-1, 1:-1] -
    +                     un[1:-1, 1:-1] * dt / dx * 
    +                    (vn[1:-1, 1:-1] - vn[1:-1, 0:-2]) -
    +                     vn[1:-1, 1:-1] * dt / dy * 
    +                    (vn[1:-1, 1:-1] - vn[0:-2, 1:-1]) -
    +                     dt / (2 * rho * dy) * 
    +                    (p[2:, 1:-1] - p[0:-2, 1:-1]) +
    +                     nu * (dt / dx**2 *
    +                    (vn[1:-1, 2:] - 2 * vn[1:-1, 1:-1] + vn[1:-1, 0:-2]) +
    +                     dt / dy**2 * 
    +                    (vn[2:, 1:-1] - 2 * vn[1:-1, 1:-1] + vn[0:-2, 1:-1])))
    +
    +    # Periodic BC u @ x = 2     
    +    u[1:-1, -1] = (un[1:-1, -1] - un[1:-1, -1] * dt / dx * 
    +                  (un[1:-1, -1] - un[1:-1, -2]) -
    +                   vn[1:-1, -1] * dt / dy * 
    +                  (un[1:-1, -1] - un[0:-2, -1]) -
    +                   dt / (2 * rho * dx) *
    +                  (p[1:-1, 0] - p[1:-1, -2]) + 
    +                   nu * (dt / dx**2 * 
    +                  (un[1:-1, 0] - 2 * un[1:-1,-1] + un[1:-1, -2]) +
    +                   dt / dy**2 * 
    +                  (un[2:, -1] - 2 * un[1:-1, -1] + un[0:-2, -1])) + F * dt)
    +
    +    # Periodic BC u @ x = 0
    +    u[1:-1, 0] = (un[1:-1, 0] - un[1:-1, 0] * dt / dx *
    +                 (un[1:-1, 0] - un[1:-1, -1]) -
    +                  vn[1:-1, 0] * dt / dy * 
    +                 (un[1:-1, 0] - un[0:-2, 0]) - 
    +                  dt / (2 * rho * dx) * 
    +                 (p[1:-1, 1] - p[1:-1, -1]) + 
    +                  nu * (dt / dx**2 * 
    +                 (un[1:-1, 1] - 2 * un[1:-1, 0] + un[1:-1, -1]) +
    +                  dt / dy**2 *
    +                 (un[2:, 0] - 2 * un[1:-1, 0] + un[0:-2, 0])) + F * dt)
    +
    +    # Periodic BC v @ x = 2
    +    v[1:-1, -1] = (vn[1:-1, -1] - un[1:-1, -1] * dt / dx *
    +                  (vn[1:-1, -1] - vn[1:-1, -2]) - 
    +                   vn[1:-1, -1] * dt / dy *
    +                  (vn[1:-1, -1] - vn[0:-2, -1]) -
    +                   dt / (2 * rho * dy) * 
    +                  (p[2:, -1] - p[0:-2, -1]) +
    +                   nu * (dt / dx**2 *
    +                  (vn[1:-1, 0] - 2 * vn[1:-1, -1] + vn[1:-1, -2]) +
    +                   dt / dy**2 *
    +                  (vn[2:, -1] - 2 * vn[1:-1, -1] + vn[0:-2, -1])))
    +
    +    # Periodic BC v @ x = 0
    +    v[1:-1, 0] = (vn[1:-1, 0] - un[1:-1, 0] * dt / dx *
    +                 (vn[1:-1, 0] - vn[1:-1, -1]) -
    +                  vn[1:-1, 0] * dt / dy *
    +                 (vn[1:-1, 0] - vn[0:-2, 0]) -
    +                  dt / (2 * rho * dy) * 
    +                 (p[2:, 0] - p[0:-2, 0]) +
    +                  nu * (dt / dx**2 * 
    +                 (vn[1:-1, 1] - 2 * vn[1:-1, 0] + vn[1:-1, -1]) +
    +                  dt / dy**2 * 
    +                 (vn[2:, 0] - 2 * vn[1:-1, 0] + vn[0:-2, 0])))
    +
    +
    +    # Wall BC: u,v = 0 @ y = 0,2
    +    u[0, :] = 0
    +    u[-1, :] = 0
    +    v[0, :] = 0
    +    v[-1, :]=0
    +    
    +    udiff = (numpy.sum(u) - numpy.sum(un)) / numpy.sum(u)
    +    stepcount += 1
    +
    +fig = pyplot.figure(figsize = (11,7), dpi=100)
    +pyplot.quiver(X[::3, ::3], Y[::3, ::3], u[::3, ::3], v[::3, ::3]);
    +

    출처> CFD Python: 12 steps to Navier-Stokes :: Lorena A. Barba Group (lorenabarba.com)

    \ No newline at end of file diff --git a/public/posts/page/1/index.html b/public/posts/page/1/index.html new file mode 100644 index 0000000..fe2b10f --- /dev/null +++ b/public/posts/page/1/index.html @@ -0,0 +1 @@ +http://blog.morgan.kr/posts/ \ No newline at end of file diff --git a/public/posts/page/2/index.html b/public/posts/page/2/index.html new file mode 100644 index 0000000..2b348a0 --- /dev/null +++ b/public/posts/page/2/index.html @@ -0,0 +1,32 @@ +Posts | Morgan's Blog

    개인정보.. Privacy..

    나는 구글이 싫었다. +구글에 반대하며 지메일도 거의 쓰지 않고 있고, 다른 구글 플랫폼을 벗어나 다른 플랫폼으로 옮기고 있다. 하지만, 아이폰으로 옮기고 나서 몇주간을 생각해보니 내 분노의 대상은 구글이 아니라 애플이여야 한다는 것을 알게 되었다. 카카오, 구글에 가지고 있던 분노의 이유가 애플이라는 기업 자체를 강타한다. 물론 나도 알고 있었고, 구글 못지 않게 애플을 싫어하고 있었다. 새롭게 휴대폰을바꿀 때에도 OS만 구글이고 제조사는 다양한 (삼성이..겟지만..) 안드로이드 휴대폰과 휴대폰 하드웨어, 악세사리, OS, 결제, 게다가 웹엔진까지 제한하고 독점해버린 애플과는 비교가 된지 않는다고 생각했고, 이번에 플립이 잘 나와서 그것으로 바꾸려 했다....

    October 23, 23000 · 397 words · Me

    데이터센터

    구글같은 검색엔진이 늘어나고, 다양한 기업들과 서비스들이 사용자들의 개인정보와 데이터를 마구 수집한다. 이로 인해 생겨나는 기하급수적인 양의 데이터들을 보관할 스토리지와 그것들을 사용할 수 있는 데이터로 가공하기 위해 필요한 수없이 큰 컴퓨팅 파워를, 큰 기업들이 대형으로 지어놓은 데이터 센터가 담당하고 있다. 게다가 이제는 작은 기업이나 서비스들은 AWS나 GCP, Oracle과 같은 서비스를 통해 Cloud로 Computing하기까지 하니, 아마존이나 구글의 데이터 센터는 얼마나 커다랗고, 커다래야 하는지 알 수 있다. +아마존과 구글의 데이터센터뿐 아니라 네이버, MS, 오라클, 및 작은 데이터센터들이 지어질때 중요하게 작용하는 것이 있다....

    October 23, 23000 · 335 words · Me

    블로그 글쓰기는 너무 힘들어..

    야심차게 티스토리 블로그를 만들어 몇몇 글을 쓰고 나서, 한참동안이나 글을 쓰지 않았다. 하지만 나중에 돌아보면 쓰일 곳이 있지 않을까 하여 내 소장을 위해 Ghost + Vultr로 넘어왔고, 돈도 내야 하니까 글을 조금씩이라도 쓰지 않을까 생각했지만…. 결국 글을 쓰지도 않은 채 달마다 돈만 나가고 있다… +블로그 글을 왜 쓰지 않았지..? 고등학교 생활을 하느라 힘들고 바빠서 (노느라) 글을 쓰지 않았을 수도 있고, 마땅하게 글을 쓸만한 소재도 없고, 마땅하게 글을 쓸 기기 또한 없다....

    October 8, 8000 · 258 words · Me

    What I want to do.

    저번에 What I wanted to do라는 글을 쓴 적이 있는데, 이번에는 What I want to do라는 제목으로 내가 대학을 다시 지원할 때 까지의 경험을 풀어보려고 한다. +대학 탈락 이후 나는 대학을 한번 떨어진 경험이 있다. 과학고등학교 재학생 중 중상위권이었던 나는 조기진학의 기회를 받았고, KAIST만을 넣은 채로 떨어졌다. 그 때는 붙을 줄 알고 있어서 2학년 2학기 시험을 말아먹었고, 지금도 그 영향을 받아 피를 흘리고 있다. +다행히 그 이후 각성을 한건지 철이 든건지 3학년 1학기는 최상위권 성적을 받아 원래대로 유지는 할 수 있었다....

    September 11, 11000 · 551 words · Me

    시험을 일주일 앞두고

    지금까지 내 인생에서 가장 중요한 시험. 그 시험이 일부일 앞으로 다가왔다. 하루종일 시험공부 비슷한걸 하면서 심신이 지쳐 더 이상 집중을 할 수 없을 것 같다. 이제 이 고비만 넘기면 인생에서 가장 날아다닌다는 시기, 대학생이 된다. 앞으로 뭘 하고 살아야 할지, 무엇을 하고 싶은지, 내가 아는 게 많아지고 현실을 깨달으면서 철이 드니 생각이 복잡해지고 앞길이 막막하기만 하다. +몇일 전, 작년에 대학 원서 자기소개서를 다시 읽다 보니 내가 아는 게 많아졌음을 새삼 깨달았다....

    September 10, 10000 · 218 words · Me

    Attitude for criticism

    요즘 우리 학교에 학교를 개혁하겠다는 학생회장이 나타나고 나서부터 친구들이 학교에 대한 여러 가지 불만들을 풀어내기 시작했다. 나도 마찬가지로 학교에 대한 여러 가지 불만사항들이 많았다. 나는 매 학기마다 개정된 학교 교칙이나 규정들을 정독하는 이벤트를 가지는데, 그때마다 항상 ‘아, 학생들이 당연히 너무 불리하다..’ 라던가, ‘이 조항은 너무 아닌데, 너무 구시대적인 생각이 아닌가?‘라는 생각이 들기도 한다. +대학을 가야하는 시기라서 여러 학교들의 생활이나 공부방법, 대학 진학 상황들에 대해서 더욱 관심을 가지게 되었다. 특히 전국급 자사고나 타 지역 과학고의 생활과 공부습관?...

    September 10, 10000 · 603 words · Me

    양자 컴퓨터와 양자 어닐링

    양자 컴퓨터와 양자 어닐링 양자 컴퓨터 입문 / 양자 컴퓨팅 발전과 전망 / 1억배 빠른 양자 컴퓨터가 온다 / 스콧 애론슨의 양자 컴퓨터 강의 +양자 컴퓨터란 무엇일까? Ø 현대 컴퓨터의 발전 과정 20세기, 컴퓨터(Computer)란 말은 계산하는 사람, Computing Person이라는 뜻으로 사용되었다. 하지만 단순 반복 행동을 굳이 사람이 하지 않아도 되는, 일명 계산기계가 사용될 수 있음이 증명되면서, Computer라는 말은 ‘일정한 규칙ㅇㄹ 가지고 주어진 값을 토대로 계산하는 장치’라는 의미를 가지게 되었다. +현대적인 컴퓨터의 정의를 시작한 사람은 ‘찰스 배비지’이다....

    August 6, 6000 · 321 words · Me

    Security of IoT

    Security of IoT IoT란? IoT (Internet of Things)란, 사물인터넷으로, 예전에는 독립적으로 존재했던 각종 전자기기 및 사물들이 인터넷으로 엮여 한번에 관리할 수 있게 되거나, 상호 정보교환과 데이터 수집을 통해 사용자에게 최상의 서비스를 제공하는 기술을 의미이다. 여기에서 사물이라 함은 모든 사물을 포함한다. 데이터를 분석하는 과정에서 인공지능을 주로 사용하므로 IoT는 인공지능 기술이기도 하다. +IoT는 2013년부터 쭉 개발되어 왔으며, 우리 집에서 흔히 볼 수 있는 에어컨, 냉장고등 큰 가구들부터 연결되어 왔다. 그 이후 시간이 지나면서 점점 작은 기구들까지 연결되면서, TV, 전자레인지, 오븐부터 커피포트, 선풍기, 전등 뿐 아니라 변기, 샤워기, 거울, 헤어 드라이기까지 연결되어 있지 않은 것이 없을 정도로 발전되어 왔다....

    August 6, 6000 · 280 words · Me

    Hardware Security

    Hardware Security 신뢰성과 관련된 기술 1. RoT (Root of Trust) Root of Trust, 신뢰점이란, 전자기기 안에서 별도로 존재하는 프로세싱 유닛으로, 메인 프로세서의 보조로서 다양한 암호화 기법이나 솔루션을 제공하거나 이를 제어하기 위한 보안 기능들을 의미한다. RoT가 궁극적으로 달성하고자 하는 것은 TC(Trusted Computing)으로, 신뢰할 수 있는 컴퓨팅, 즉 믿을 만 하고 무결성이 보장되는 계산 및 기능을 이야기한다. 이를 달성하기 위한, RoT에 포함되는 여러가지 기술들이나 알고리즘이 있고, 각 단계들을 순차적으로 달성되어 신뢰할 수 있는 보안적인 프로세스가 진행된다....

    August 6, 6000 · 876 words · Me

    [전산유체역학] CFD with Python (Navier-Stokes Equation)

    1-D Linear Convection 1차원 선형 열전도 방정식은 가장 심플하면서도 가장 기초적인 방정식입니다. +$$ \frac{\partial u}{\partial t} + c \frac{\partial u}{\partial x} = 0 $$ +이 식을 오일러 방정식으로 변환하여 수치해석적으로 해를 구할 수 있도록 변환을 해줍니다. +$$ u_i^{n+1} = u_i^n - c \frac{\Delta t}{\Delta x}(u_i^n-u_{i-1}^n) $$ +이제 이 오일러 방정식을 파이썬으로 구현해봅니다. +import numpy from matplotlib import pyplot import time, sys %matplotlib inline nx = 41 # try changing this number from 41 to 81 and Run All ....

    July 10, 10000 · 4414 words · Me

    반도체의 원리, 종류, 소자, 역사, 산업. (MOSFET부터 RAM, FLASH, 그리고 Intel 4004까지.

    .1번 반도체란?.2번 반도체 소자의 종류.3번 기본소자 – 다이오드.4번 기본소자 – 트랜지스터…1번째 MOFSETMOFSET(Metal-Oxide Semiconductor Field-Effect Transistor) 금속-산화 반도체 전계효과 트랜지스터1번째 금속산화 반도체란? 도핑된 반도체 기판 위에 SiO2로 된 절연층과 금속을 적층시켜 제작한 구조. 2번째 MOSFET TransistorNPN의 구조입니다. 두 N을 각각 Drain과 Source라고 합니다. Source에는 Ground가, Drain에는 전압이 인가됩니다. 위에서 서술했듯이 Drain과 Source사이에 채널이 형성됩니다. 이때 Gate와 Back Gate(아랫쪽 P반도체)사이에 전압을 인가해 주면 게이트와 P사이에 전기장 형성, 이에 의해 전자가 게이트쪽으로 올라갑니다. 이 때문에 Drain과 Source 사이 전류가 흐를 수 있다....

    July 9, 9000 · 637 words · Me

    Cryptography

    Cryptography 공개키 암호화 알고리즘. 1. Diffie-Hellman 디피-헬먼 키 교환 방식은 암호화 통신을 위한 키를 교환하는 방식 중 하나이다. 두 통신 주체가 공통의 비밀 키를 사용할 수 있도록 하는 안전한 알고리즘이다. 디피-헬먼 방식은 기초적인 암호 통신 방법으로, 이 알고리즘에 RSA나 ECC같은 암호화 알고리즘을 합쳐서 암호화 통신이 성립된다. 공개키는 암호화할 수 있는 키이고, 개인키는 복호화할 수 있는 키이다. +디피-헬먼 키 교환은 공개키 암호화 방식에 기반한다. 공개키 암호화 방식이란, 자신의 공개키를 상대방에게 전송하고, 그 상대방은 그 공개키로 데이터를 암호화해서 전송하면, 자신은 자신의 개인키로 복호화 할 수 있어, 통신이 성립되는 방식이다....

    July 9, 9000 · 1490 words · Me

    파이썬으로 구현한 뉴턴의 방정식과 적분방정식

    우리의 세계에서 물체의 역학적 운동을 지배하는, 지배방정식이 있죠.뉴턴의 법칙, 방정식입니다.뉴턴의 법칙은 총 세개의 방정식이 있죠. 이 세가지 법칙만을 이용해서 물체의 운동을 계산할 수 있습니다.이것을 바탕으로 만들어진 역설이 라플라스의 역설이죠. 만약 모든 분자의 가속도, 속도, 위치 세가지 정보를 알고 있다면, 뉴턴의 법칙에 근거하여 그 다음 상황을 예측할 수 있고, 따라서 이 세상, 아니면 그것을 넘어서서 모든 분자의 정보를 알 수 있습니다.우리가 여기서 분석할 것은 가장 쉬운 법칙, 뉴턴의 제 2법칙, 가속도의 법칙입니다....

    May 21, 21000 · 398 words · Me

    What I wanted to do.

    나는 무엇을 하고 싶지? 나는 개발자가 되고 싶다. 그래서 나름대로 여러가지 언어를 배우기도 하고 여러가지 활동을 하면서 나의 꿈을 키워나갔다. 나는 고등학교를 다니며 공부를 하고, 흥미를 위주로 진로를 정하려다가, 이런것들이 빙산의 일각이라는 사실을 알며 좌절하고 말았다. +나는 과학고를 다니기 때문에 나름대로 수.과학적인 내용을 기본으로 하는 컴퓨터 아키텍쳐나 논리에 대해서 공부를 하기도 했는데, 컴퓨터 아키텍쳐에 대해 배우면서 자연스럽게 기계어, FPGA, 어셈블리 언어에 대해 관심을 가지게 되었고, 물론 지금은 대학교 진학문제가 있어서 시간을 많이 투자하지는 못하지만 관심을 가지고 배우고 있는 중이다....

    January 28, 28000 · 1045 words · Me
    \ No newline at end of file diff --git a/public/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo/index.html b/public/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo/index.html new file mode 100644 index 0000000..e33650c --- /dev/null +++ b/public/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo/index.html @@ -0,0 +1,35 @@ +파이썬으로 구현한 뉴턴의 방정식과 적분방정식 | Morgan's Blog +

    파이썬으로 구현한 뉴턴의 방정식과 적분방정식

    우리의 세계에서 물체의 역학적 운동을 지배하는, 지배방정식이 있죠.뉴턴의 법칙, 방정식입니다.뉴턴의 법칙은 총 세개의 방정식이 있죠. 이 세가지 법칙만을 이용해서 물체의 운동을 계산할 수 있습니다.이것을 바탕으로 만들어진 역설이 라플라스의 역설이죠. 만약 모든 분자의 가속도, 속도, 위치 세가지 정보를 알고 있다면, 뉴턴의 법칙에 근거하여 그 다음 상황을 예측할 수 있고, 따라서 이 세상, 아니면 그것을 넘어서서 모든 분자의 정보를 알 수 있습니다.우리가 여기서 분석할 것은 가장 쉬운 법칙, 뉴턴의 제 2법칙, 가속도의 법칙입니다.뉴턴의 가속도 법칙은 $ F = \frac{dp}{dt} $ 로 표현할 수 있습니다. 이 법칙에 의하면, 질량의 변화가 없는 물체에서, $ a $ 는 $ F$ 에 비례합니다. 따라서 각 순간 물체에 작용하는 힘의 크기를 안다면, 그 물체의 가속도를 알 수 있겠죠?

    이때, 가속도와 속도, 변위의 정의를 이용하면 $ a = \frac{dv}{dt} $ 이고, $ v = \frac{dx}{dt} $입니다.가속도를 안다면 적분을 통해 속도를 알 수 있고, 속도를 안다면 변위를 알 수 있죠.정상상태에서는 물체에 작용하는 힘의 방정식을 구할 수 있습니다. 이것을 질량으로 나눠 가속도를 얻을 수 있고, 속도와 변위의 방정식을 얻을 수 있습니다.

    하지만, 컴퓨터는 대수적으로 적분할 수 없습니다. (물론 할 수 있는 알고리즘도 있지만 불완전하죠)그렇다면 어떻게 각 시점에서 가속도의 값을 알고, 속도와 변위의 값을 알 수 있을까요?이렇게 미분방정식을 통해서 각 시점의 이산적인 변수값을 알 수 있도록 하는 것이 오일러 근사법입니다.오일러 근사법을 통틀어 이렇게 수치적으로 방정식을 해석하는 학문을 통틀어 수치해석학이라고 합니다.이렇게 물리를 시뮬레이션 하거나 컴퓨터로 해를 구할 때는 수치해석학을 사용합니다.

    오일러 방정식이란,

    $$ \frac{dy}{dx} = f(x) $$라고 표현되어지는 미분 방정식이 있을 때, 오일러 근사법을 이용하면 일정한 지점의 $y$ 값을 근사로 구할 수 있습니다.

    $$ y_{n+1} = y_n + \frac{dy}{dx}|_{x_n} \Delta x $$ 라는 식으로 말이죠.

    이 식을 이용하면 특정 원점으로부터 $\Delta x$만큼의 일정한 간격을 띄어가며 $y$ 를 근사할 수 있습니다.

    이 방법으로 물체에 작용하는 힘을 알 때 변위와 속도를 구할 수 있습니다. 특정 $\Delta t$를 기준으로 $\Delta$의 $n$배만큼의 시점에서 구할 수 있습니다.

    $$ v_{n+1} = v_n + \frac{dv}{dt}|_{t_n} \Delta t $$

    $$ x_{n+1} = x_n + \frac{dx}{dt}|_{t_n} \Delta t $$

    으로 말이죠..

    이제 파이썬으로 오일러 근사법을 구현해 봅시다.

    이렇게 데이터의 배열끼리의 연산을 취급할 때에는 파이썬의 수치분석 모듈인 Numpy를 사용합니다. 하지만, 간단한 시뮬레이션에서는 파이썬 기본으로도 충분합니다. 그래프를 표현하기 위해 matplotlib과 수식을 위해 math를 이용합니다.

    import matplotlib.pyplot as plt 
    +import math 
    +x0 = 0.0
    +y0 = 1.0
    +dx = 0.01
    +step = 1000
    +dydx = lambda x, y: 1/y 
    +x = [x0 + dx*i for i in range(step)] 
    +y = [y0] 
    +
    +for n in range(step-1): 
    +	y.append(y[n] + dydx(x[n],y[n]) * dx) 
    +
    +plt.plot(x, y) 
    +plt.grid() 
    +plt.xlabel("x") 
    +plt.ylabel("y") 
    +plt.legend() 
    +plt.show()
    +
    $ \frac{dy}{dx} = \frac{1}{y} $

    $ \frac{dy}{dx} = \frac{1}{y} $

    \ No newline at end of file diff --git a/public/posts/security-of-iot/index.html b/public/posts/security-of-iot/index.html new file mode 100644 index 0000000..0f0bec8 --- /dev/null +++ b/public/posts/security-of-iot/index.html @@ -0,0 +1,19 @@ +Security of IoT | Morgan's Blog +

    Security of IoT

    Security of IoT

    IoT란?

    IoT (Internet of Things)란, 사물인터넷으로, 예전에는 독립적으로 존재했던 각종 전자기기 및 사물들이 인터넷으로 엮여 한번에 관리할 수 있게 되거나, 상호 정보교환과 데이터 수집을 통해 사용자에게 최상의 서비스를 제공하는 기술을 의미이다. 여기에서 사물이라 함은 모든 사물을 포함한다. 데이터를 분석하는 과정에서 인공지능을 주로 사용하므로 IoT는 인공지능 기술이기도 하다.

    IoT는 2013년부터 쭉 개발되어 왔으며, 우리 집에서 흔히 볼 수 있는 에어컨, 냉장고등 큰 가구들부터 연결되어 왔다. 그 이후 시간이 지나면서 점점 작은 기구들까지 연결되면서, TV, 전자레인지, 오븐부터 커피포트, 선풍기, 전등 뿐 아니라 변기, 샤워기, 거울, 헤어 드라이기까지 연결되어 있지 않은 것이 없을 정도로 발전되어 왔다.

    IoT 서비스 제공자들은 사용자들의 데이터를 분석하는 더욱 발전한 알고리즘을 개발하면서 사용자들의 데이터를 수집한다. 이것들은 모여 방대한 빅 데이터가 된다. 물론 고객의 개인정보 무단수집과 남용의 논란도 계속 이어져 왔지만, 서비스를 이용하기 위해서 어쩔 수 없이 개인정보와 사생활을 팔아야 하는 것은 안타까운 일이다.

    IoT 보안

    IoT에서는 보안이 매우 중요하다. 개인의 사생활을 담당하고 있기도 하지만, 생활환경을 조정할 수 있어 자칫하면 목숨까지 위협할 수 있기 떄문이다. IoT기기는 소형화되어 있으며, 또한 저성능으로 구성되고 하드웨어에 접근이 쉽다는 근거로 해킹에 매우 취약하다. 또한, 자동화된 생산에서 만약 반도체 설계부터 문제가 있거나 트로이 목마가 존재한다면 매우 심각하고 영구적인 보안 결함이 될 것이다. 따라서, 반도체 설계, 생산 과정에서 모듈 점검을 정확하게 진행하여야 하며, 점대점(Point-to-Point) 보안을 확립하는 것이 중요하다. 또한, 저성능 프로세서에 대비하기 위해 주변에 보안칩(암호 Co-Processor)를 장치하는 것이 좋다. 소프트웨어적인 보안은 업데이트하기 용이하고, 대처하기 쉽다는 장점이 있지만, 하드웨어 보안을 확립한다면 그것이 거의 필요없을 뿐 아니라 물리적 보안, 암호 알고리즘, 보안 부팅, 키 암호화, 모듈 서명 등 다양한 보안 기능과 해킹 방지를 탑재하고 있어, 이를 확립하는 것이 무엇보다 중요하다.

    반도체 물리적 복제 방지 (PUF)나 보안 칩(TPF)등의 탑재가 가장 중요할 것이며, 이는 키가 소프트웨어적으로 탈취당할 확률을 기하급수적으로 낮춰주며, Side-Channel Attack에 대한 방어까지 탐재하는 것이 좋을 것이다.

    \ No newline at end of file diff --git a/public/posts/wasting-time/index.html b/public/posts/wasting-time/index.html new file mode 100644 index 0000000..b390ca8 --- /dev/null +++ b/public/posts/wasting-time/index.html @@ -0,0 +1,16 @@ +Wasting Time | Morgan's Blog +
    \ No newline at end of file diff --git a/public/posts/what-i-want-to-do/index.html b/public/posts/what-i-want-to-do/index.html new file mode 100644 index 0000000..418821d --- /dev/null +++ b/public/posts/what-i-want-to-do/index.html @@ -0,0 +1,22 @@ +What I want to do. | Morgan's Blog +

    What I want to do.

    저번에 What I wanted to do라는 글을 쓴 적이 있는데, 이번에는 What I want to do라는 제목으로 내가 대학을 다시 지원할 때 까지의 경험을 풀어보려고 한다.

    대학 탈락 이후

    나는 대학을 한번 떨어진 경험이 있다. 과학고등학교 재학생 중 중상위권이었던 나는 조기진학의 기회를 받았고, KAIST만을 넣은 채로 떨어졌다. 그 때는 붙을 줄 알고 있어서 2학년 2학기 시험을 말아먹었고, 지금도 그 영향을 받아 피를 흘리고 있다.

    다행히 그 이후 각성을 한건지 철이 든건지 3학년 1학기는 최상위권 성적을 받아 원래대로 유지는 할 수 있었다. 3-4등 정도 했으니까 망정이지 태도를 안고치고 그대로 했더라면 나는 그대로 멘탈이 없어져버렸을 것이다.

    오늘까지 자기소개서를 작성했다. 3번 대학별 지원동기를 쓰면서 계속 내가 하고 싶은 것이 무엇인지 내가 지금까지 무엇을 했는지에 대해 고민을 했다.

    내가 항상 하던 생각. 무엇을 공부하던지 간에 항상 들었던 생각. 내가 무엇을 하던 나보다 잘하는 사람은 존재하구나. 특별한 존재가 되기에는 나는 너무나 작구나. 자신감이 점점 떨어지는 듯한 느낌이 들었다. 그래서 나는 나를 특별하게 만드는, 내가 돋보일 수 있도록 해주는 것들을 공부하자고 생각했다.

    공부

    나는 마구잡이로 공부했다. 필요할 때에만 공부했고, 원하는 것만 공부했다. 그래서 그걸 공부라고 해도 될 지 모르겠다. 일단 내 기억에서는 공부가 아니다. 나는 컴퓨터 공부를 취미정도로만 생각했지 공부라고는 생각하지 않았다. 그래서 항상 뭔가 컴퓨터를 공부하면 죄책감이 들고 공부한 것 처럼 느껴지지 않았다. 물론 재미있게 한 덕분에 지식은 방대해 졌지만..

    FPGA에 대해 공부할 때에도 마찬가지였다. 공부였지만 내 마음 속에서는 공부가 아니라 딴짓으로 박혀있었다. 그래서 원하는 것을 알 수 있고 재미있게 할 수 있었지만 자세히 알고 집중해서 했다고는 못한다. FPGA를 공부했지만, 알고는 있지만 공부했다고는 할 수 없어서 결국 안한거나 마찬가지인 것이 되어버렸다. 이미 한번 공부한 내용이지만..

    그래서 자소서를 쓸 때 고민이 되었다. 주위 친구들은 다들 수과학 내용을 위주로 썼는데, 나는 온통 다 반도체, 컴퓨터 연구 공부했던 내용, 나한테는 딴짓했던 내용이기 때문이다. 나한테는 논 것을 써내려가는 느낌이었다. 물론 쓰고 나서 객관적으로 바라보면 꽤 볼만한 자소서가 되어있었지만, 처음부터 써내려갈때에는 많이 괴롭고 고민되었다.

    아직도 컴퓨터 공부는 뭔지 잘 모르겠다. 하지만 그게 정말 재미있고, 내 적성에 100% 맞다는 것만은 알고 있다. 앞으로는 컴퓨터에 대해서 제대로 공부하고 싶다. 그것은 고등학생 신분으로는 내 맘속에서 딴짓이라고 정의되어 버리므로, 일단은 대학을 가야 하구나 싶다.

    여기서 주인공의 친구가 이런 말을 한다. ‘꿈이란 야망을 이야기하는 것인가’. 나는 항상 내 꿈을 말할 때 표현의 부족함을 느꼈다. 꿈이라고 하기에는 지극히 개인적이고 꿈보다 훨씬 이루고 싶고, 인생을 움직이는 원동력과도 비슷한 거니까. 물론 꿈을 사람마다 다르게 해석할 수 있다. 그게 꿈 아니야? 라고 할 수도 있다. 하지만 나에게는 꿈보다 훨씬 이루고 싶은 것이 있다. 컴퓨터라는 기계의 역사에 내 이름을 크게 남기는 것. 내가 생각했을 때는 꿈보다는 야망에 훨씬 가까운 내용이다. 나는 컴퓨터의 패러다임을 바꾸고 싶다. 어쩌면 _Linus Torvalds_처럼, 혹은 벨 연구소와 IBM 연구소의 많은 사람들 처럼. 내 이름을 직접적을 남기지 않아도 내 작품이 두고두고 기반이 되었으면 좋겠다.

    내 작품을 컴퓨터 역사에 깊이 뿌리박히게 하는 것. 그게 내 야망이다.

    노력

    내 야망을 이루기 위해서는 컴퓨터를 잘 알아야 하겠지. 컴퓨터라는 기계를 역사부터 원리까지 꿰뚫고 있어야 하겠지. 그것을 위한 여정은 매우 길고 또 험난하겠지. 하지만 운이 좋았다. 나는 그걸 정말로 좋아한다. 놀지 말고 쉬지 말라고 해도 할 수 있다. 그게 내가 그것을 딴짓이라고 생각한 원인이니까.

    그게 정말 강했던 것 같다. 컴퓨터 공부를 놀이라고 생각했던 것. 하지만 앞으로는 진심을 다해 공부해야 할 것 같다. 슬금슬금 한계가 다가오고 있기도 했고, 무엇보다 그것만 하면서 살 수는 없으니까. 지금으로써 내가 할 수 있는 것은 이 마음을 잊지 않는 것. 꾸준히 생각하는 것. 기반 지식을 열심히 쌓는 것.

    그리고 대학교 진학.

    야망의 뜻을 잊지 말자. 야망이란 그것을 위해서라면 무엇이든 할 수 있다는 것이다.

    Thank you for Reading.

    Morgan Jeon.

    \ No newline at end of file diff --git a/public/posts/what-i-wanted-to-do/index.html b/public/posts/what-i-wanted-to-do/index.html new file mode 100644 index 0000000..59ff25f --- /dev/null +++ b/public/posts/what-i-wanted-to-do/index.html @@ -0,0 +1,18 @@ +What I wanted to do. | Morgan's Blog +

    What I wanted to do.

    나는 무엇을 하고 싶지?

    나는 개발자가 되고 싶다. 그래서 나름대로 여러가지 언어를 배우기도 하고 여러가지 활동을 하면서 나의 꿈을 키워나갔다. 나는 고등학교를 다니며 공부를 하고, 흥미를 위주로 진로를 정하려다가, 이런것들이 빙산의 일각이라는 사실을 알며 좌절하고 말았다.

    나는 과학고를 다니기 때문에 나름대로 수.과학적인 내용을 기본으로 하는 컴퓨터 아키텍쳐나 논리에 대해서 공부를 하기도 했는데, 컴퓨터 아키텍쳐에 대해 배우면서 자연스럽게 기계어, FPGA, 어셈블리 언어에 대해 관심을 가지게 되었고, 물론 지금은 대학교 진학문제가 있어서 시간을 많이 투자하지는 못하지만 관심을 가지고 배우고 있는 중이다.

    그 외에도 양자컴퓨터나 양자논리에 대해서 관심이 생겼고, 특히 반도체에도 관심이 있었다. 지금 돌이켜 보면 그냥 컴퓨터에 관련된 것이면 폭넓게 무엇이든 관심을 가졌었던것 같다. 컴퓨터란 물체를 설명하는 여러 원리나 그것을 활용하는 여러 방법에 대해 깊은 호기심이 있었다. 태생 컴퓨터 공학도인듯 하다..

    대학 탈락으로부터, 나의 진로 결정까지

    나의 진로를 정할 때 즈음에는 정보보안에 대해 공부하고 있었고, 또 그 주제를 진로로 잡고 자기소개서를 쓰기도 하였다. 내가 정보보안에 관심을 두게 된 가장 큰 이유는 Live Overflow란 외국의 유튜버를 계기로 시작하였는데, 나름대로 그 중요성을 인지하고 있었고, 재미있었다. 내 주변에는 정보보안에 대해 박식하거나 관심있는 친구들이 없기에 나름 희귀한 직업이고, 전공이라고 자연스럽게 생각해서 그런것 도 없지 않아 있을 듯 하다.

    그러던 와중에 대학교 진학을 실패하고 좌절하고, 방황하고 있을 때 포스텍 해킹캠프를 참가했다. 나름대로 미리 공부해 두었기에 부담없이 참여할 수 있겠구나 생각하고 있었는데, 결국에는 최하위 점수를 받게 되었다. 팀이 잘 운용되지 않았던 점도 있겠지만, 나는 골론적으로 이렇게 생각하고 말았다. 아, 결국에 내가 무얼 하든지 각 분야에서는 이미 나보다 잘하는 사람이 넘쳐나구나, 라고. 나는 그렇게 정보보안에 대해 재능있는 것도 아니라는 것을 알게 되었다. 때마침 여러 언어를 배우며 한계를 느끼기도 하였고, 여러가지 진행하고 있던 토이 프로젝트의 아이디어도 없었으며, 기존에 운영하던 서비스도 너무 부실했다. 갑자기 이러한 사실들을 직면하고 나니 나는, 코딩이 싫어졌다.

    그래도 정확히 말하면 싫어졌다기 보다는 지겨워졌다는 의미가 더 맞는 것 같다. 아키텍쳐나 어셈블리 언어에 대한 내용은 컴퓨터에 대한 호기심을 잃지는 않았는지 제대로 하지는 못해도 남는 시간이면 찾아보거나 여러 글을 읽으며 공부를 하고 있기는 하다만.. 코딩이란 것, 개발이라는 것에 대한 의미는 잃고 말았다. 자신감과 함께.


    나는 앞으로 컴퓨터란 분야가 어떵게 발전될지 개발 양상이나 그러한 기술적, 경제적 이야기 하는것을 좋아한다. 이러한 분야에 관심이 있는 친구에게 나의 이런 저런 생각을 공유하고는 했다. 이러한 것은 우리 아버지의 영향이 가장 컸던것 같다. 이런 저런 얘기를 하다 보면 결국에는 대학이 중요하다는 결론이 항상 나고는 했다. 그래서 대학에 대한 이야기를 하다 보면 나의 진학에 대한 이야기가 안나올 수 없었고, 이런 이야기를 하며 나는 마음 속으로 내 진로 방향을 결정하여야 했다.

    나는 원래 컴퓨터 공학과에 진학하고 싶었다. 또 여러가지 공부를 하며 결론적으로 정보보안 대학원에 진학하는 것이 내 중간 목표였다. 최종 목표는 정보보안에 대한 패러다임을 새롭게 만들고 싶다는 거창한 것이었는데, 지금 생각해 보면 무척이나 높은 꿈이었던 것 같다. 하지만 이번 캠프를 통해, 여러 생각을 통해 정보보안에 대한 관심이 떨어지자 나는 앞으로 무엇을 해야하고 무엇을 하고 싶은지에 대한 것부터 막막해 지기 시작했다.

    캠프가 막연한 좌절감만 준 것은 아니다. 이번 기회로 나는 새롭게 순수수학의 암호학에 대해서도 관심을 가지게 되었다. 내가 어떤걸 하고싶고 어떤걸 평셩 해도 지겹지 않을까에 대한 생각을 하면서, 나의 관심 종목에 대해 고민해보았다.

    나는 암호학, 정보보안, 네트워크, 로우-레벨 코딩, 하드웨어 설계, 반도체, 양자컴퓨터, 소프트웨어 공학, 등등.. 여러 분야에 관심을 가지고 있었다. 위에 있는 단어를 나열하면서 가장 나에게 끌렸던 분야는 다름아닌 반도체와 하드웨어 프로그래밍, 로우레벨 코딩이 가장 끌렸었다. 나의 진로 그리고 미래를 위해 가장 알맞는 학과를 정해야 겠다고 다짐했다.

    이런 결정을 내리는 과정에서 여러 고뇌를 거쳐갔는데, 내가 제일 최종적으로 하고 싶었던 일은 무엇일까 생각해보았다. 아마 컴퓨터 아키텍처를 분석하고 그런 시스템을 리버싱 하거나 설계하는 것이였던 것 같다. 마냥 소프트웨어 공학이나 개발보다는 그냥 논리회로 같이 컴퓨터 기계적인 분야에 더 관심이 있었고, 양자컴퓨터에 대해서 공부를 하다 보면 또 양자세계에서는 다르게 적용되는 새롭게 정리되고 개발되는 아키텍처에 대해서도 공부하고 싶었다. 결국 컴퓨터 공학과인지 전기전자 공학과 인지 결정해야 했는데, 컴퓨터 공학과는 너무 뭐랄까 공학의 느낌이 났다. 나는 컴퓨터 공학과에서 배우는 것도 배울 수 있고 또 내가 좋아하는 반도체/하드웨어 분야에 대해서 연구를 하는 전기전자 공학과를 선택하게 된 것이다. 나도 참 많은 생각을 했었다.

    대학 진학을 위한 결심의 과정

    전기전자 공학과를 가기로 한 이상 이제 대학교나 그 이상의 구체적인 계획을 세울 때가 되었다. 나는 이제 고등학교 3학년이므로, 그러한 고민을 하지에는 충분한 시기였지 않나 싶다. 전기전자 공학과도 서울대도 있고 고려대도 있으며 카이스트도 있고 포한공대도 있다. 하지만 이미 진학 실패를 경험한 나로서는 어떤 대학에 들어간다거나 어디를 붙을 수 있는지 내 위치가 정확히 어딘지 잘 모르겠다는 문제가 있었다. 물론 제일 가고 싶은 것은 서울대학교이겠지만, 그 세상은 이미 오래전에 도달하지 못하게 되었다. 나의 부족한, 미비한 성적으로는 잘해봤자 카이스트에 가는 정도였던 것이다. (그것도 이번 내신을 엄청나게 잘 봤을때의 이야기이다.)

    나는 포스텍도, 카이스트도 고려대학교도, 연세대학교도 좋았다. 모두 양질의 교육을 받을 수 있을 것이며, 또 나의 꿈을 실현시키는데에 있어서 전혀 부족하지 않은 학교들이었다. 이제 구체적인 학과를 정했으니 그 학과를 갈 수 있도록 열심히 노력하고, 공부해야 할 것이다. 그렇다. 나는 지금 공부를 해야 한다. 한국에서 가장 공부를 많이 한다는, 많이 해야하는 고3이라는 시절에, 나는 무엇을 하고 있었는가. 나는 방황하는 듯 하며 결국에는 놀았다. 하고싶은 것만 골라서 했으며, 실제로 노력한 시간은 별로 없는 것 같다.

    물론 지금까지의 생활에서는 충분히 많이 노력하고 있지만, 고등학교 3학년이라는 시기에 비해서는 (내가 상상한 것에 비해서), 또 내가 원하는 학교를 가서 내가 원하는 일을 할 수 있는 정도의 공부를, 노력을 나는 지금 하고 있지 않는것 같다.

    내가 충분히 노력했다고 생각할 수는 없을 것 같다. 하루종일 다른 생각 안하고 공부에만 매진해도 결국에는 체력이 딸려서 몇분동안은 졸게 되어있고, 아무리 열심히 다짐해도 컴퓨터 인터넷 한번에 모든 것이 무너져 내리기도 했다. 하지만, 이것은 나의 기준이었다. 부모님들은 항상 말하신다. 너 생각하는 열심은 열심이 아니라고, 더 열심히 해야 한다고. 옛날 어렸을 때에는 이러한 말을 잔소리로만 생각했다. 엄마는 내가 얼마나 노력하는지 모르면서 엄마의 기준을 들이대지 말라고 말이다. 하지만, 이러한 것들도 이제 생각이 트이게 되니 얼마나 깊은 말이었는지를 조금이나마 실감할 수 있게 되었다.

    열심히 하는 것은, 자신에게는 열심히 하고 있다고 생각되지 않는 것이다.

    진정으로 열심히 하고 있다면, 그것은 자신에게는 ‘더 열심히 해야 한다’라는 강박과 ‘더 열심히 하고 싶다’의 욕망의 형태로 다가와야 한다. 아무리 집중하고 노력해도 불안하고 더 해야하는 것 같아서, 더 열심히 해야 한다고 생각해서, 진심으로 자신을 밀어붙이는 상태가 되어야 열심히 했다고, 열심히 하고 있다고 할 수 있다고, 나는 생각했다.

    나는 열심히 하지 않았다. 나를 끝까지 몰아붙이지 않았고, 나름 열심히 했다고 생각하면서 나 자신을 기만했다. 이제는 다짐을 해야 할 때이다. 철 없이 3년을 보냈으니, 이제는 철이 들 때가 되었다.

    나의 마지막 다짐

    갑자기 여러 가지 생각이 들면서 긴박해 졌고, 이런 생각들을 정리하기 위해서 글을 쓰다 보니까 여러 가지 주제에 대해서 깊게 생각하게 되었다. 나는 이 글은 마무리 짓는 이 순간부터 나의 꿈을 이루는 마지막 날까지, 최선을 다 해서, 열심히 노력하며 달려나갈 것이다. 그게 내가 내 인생을 시작하는 첫 발걸음이 될 것이다.

    이 다짐과 이 생각이 한 순간만의 것이 되지 않도록 빌며, 이 글을 마무리 짓는다.

    감사합니다.

    \ No newline at end of file diff --git a/public/posts/what-the-hell-is-usb-c-dp-alt-mode/index.html b/public/posts/what-the-hell-is-usb-c-dp-alt-mode/index.html new file mode 100644 index 0000000..37b104d --- /dev/null +++ b/public/posts/what-the-hell-is-usb-c-dp-alt-mode/index.html @@ -0,0 +1,34 @@ +What the hell is USB-C DP Alt mode | Morgan's Blog +

    What the hell is USB-C DP Alt mode

    What the hell is USB-C DP Alt mode

    To. @hachsiapg, as part of my note

    서론: Microsoft Surface Laptop 4 & Linux

    제가 밖에서도 쓰고 집에서도 사용하는 만능 서피스 랩탑 4를 사용한지 어느새 2년이 넘었습니다. 그 사이에 리퍼도 받고 OS도 여러번 갈아엎기도 하고, 또 제 하드한 작업들을 잘 버텨주기도 한 정말 대단한 랩탑입니다. +특히 3:2의 광활한 세로는 정말 좋아서 다른 비율의 노트북은 이제 사용할 수 없는 몸이 되어버리기도 했습니다. 길이를 측정해보면 13인치 랩탑들과 동일한데, 세로에 5cm정도를 추가한 정도라 타이틀바 하나정도 넓혀주는 셈이라 마음놓고 패널바를 띄어놓고 사용할 수 있습니다. +약간의 불만족이라면 배터리와 IO, 그리고 더 깊게 들어가면 해상도 정도가 되겠네요. Intel 11세대를 탑재한 노트북 치고는, 그리고 이 가격 치고는 썬더볼트 없는 노트북을 찾는게 더 어려울것 같아요. USB-B 하나에 USB-C 하나, 그리고 자기네 proprietary한 Surface Connector라는 요상한 녀석과 다행이라면 다행일 3.5mm 오디오 잭이 하나 있습니다. 지금까지 썬더볼트를 이용할 일은 없어서 큰 불만은 아닌데 없는것보다는.. +배터리는 3-4시간 웹서핑정도를 버텨주는데, 뭐 인텔 랩탑에서는 어쩔 수 없는 부분이죠. 약간 애매한 단점으로는 2496x1664 디스플레이가 있는데, 너무 낮은 FHD보다는 좋고, 4K보다는 안좋은 QHD 패널입니다. 4K를 탑재했다면 배터리가 정말 흘러내렸을테니 이래저재 일반적인 환경에서는 딱 맞는 해상도일겁니다. +하지만 리눅스를 쓰는 저에게는 15인치 QHD는 골치아픈 일이 되어버립니다. Fractional Scaling이라는 참으로 거지같은 상황이 생기는데, 보통 13인치 화면에는 FHD가 100%로 보기 좋고, 13-15인치 4K라면 200%를 해서 사용하면 딱 맞습니다. 인터페이스 크기가 노트북를 사용하는 거리에서 딱 좋은 크기인데, QHD는 150%라는 배율을 써야합니다. +윈도우 환경에서는 그냥 사용하는 배율이지만, 리눅스 특히 Wayland에서는 골치아픈 일이 생깁니다. 물리적으로 반-픽셀이 불가능하기에 원래라면 분수 배율은 불가능합니다. 이를 적당히 물려서 샤프하게 보이게 속이거나 인터페이스는 그대로 폰트만 크게 하는 경우도 있고, 아니면 해상도를 바꾸어 다시 계산하는 방법이 있겠는데, 리눅스가 원래 사용하는 X11에서는 큰 문제 없이 이러한 꼼수를 쓸 수 있습니다. +신기술인 Wayland에서도 마찬가지지만, Wayland를 안쓰고 레거시 X11을 사용하는 앱을 Wayland 환경에서 적용하면 반픽셀 문제 때문에 흐리게 보이게 됩니다. 그러면 그냥 X11을 사용하면 안되냐, 제가 Wayland를 사용해야만 하는 이유가 딱 하나 있습니다. X11에서는, 여러 모니터에 각각 다른 Scale을 적용하기가 힘듭니다. +랩탑을 집에서 사용할 때는 27" QHD 모니터 하나와 32" 4K 모니터를 사용합니다. 제가 다른 사람들보다 인터페이스를 크게 사용해서 125% 배율을 적용해야 합니다. 이때 문제가 생기는데, 노트북 화면은 150%, 27인치 모니터는 125%, 또 32인치 모니터는 150%로 사용해야 합니다. 더 작으면 안쓰는것만 못하더라구요.. +이렇게 3가지 다른 크기의 화면은 각각 다른 배율로 써야해서, 이를 지원하는 Wayland를 써야 했습니다. 수동으로 손으로 만질수는 있지만 자주 깨지더라구요.. +외부 모니터를 좋게 사용할 것이냐 일부 앱들을 흐리게 사용할 것이냐로 나뉘는데, 일단 저는 그냥 흐리게 쓰고 있습니다. Wayland도 나온지 한참이 지났고 (10년은 넘었으려나요), 많은 앱들은 Wayland를 지원합니다. Electron은 제대로 지원을 안하고 있는데.. 뭐 얼마전 완벽하게 적용했다니 시간이 지나면 괜찮아 지겠죠. 시간이 해결할 거라 생각하고 신기술을 택했습니다. 일단 명목상으로 얼리 어답터이기는 하니까요.

    1. USB-C DP Alt Mode에 대해서..

    외부 모니터를 사용할 당시 서피스가 썬더볼트를 지원하지 않는 바람에 호환성을 찾아봐야 했습니다. +USB-C 포트에 대한 정확한 정보가 없어 고민하던 중 USB-C 3.2 Gen 2라는 정보를 얻었습니다. USB3은 세분화를 이상하게 해서 헷갈리게 한다는 말을 많이 듣죠. +USB 3.2 Gen 2가 대체 뭔지 찾아봤더니, USB3중 USB3.2는 과거 USB3.1의 리네이밍입니다. USB3.2 Gen1, USB3.2 Gen2, USB3,2 Gen2x2는 각각 5, 10, 20Gbps의 bandwidth를 가집니다. +Gen1은 5Gbps 1레인으로 달성하고, Gen2는 10Gbps를 5Gbps 2레인으로 달성합니다. Gen2x2는 10Gbps 2레인입니다. 그런데 USB3.2 1x2라는 것도 있습니다. 이는 USB3.2 2x1과 동일하게 10Gbps인데, 5Gbps 레인 두개로 달성합니다. 이게 헷갈려서 꽤 고민했습니다. +USB-C는 양면으로 되어있고, Superspeed 4페어로 총 2개의 레인과 추가로 USB2가 있습니다. 이때 USB-C에는 Alt모드가 존재하는데, USB-C의 레인을 USB 데이터 교환목적이 아니라 다른 인터페이스를 얹어서 사용하는 방법입니다. 이중 가장 널리 사용되는 건 DP라는 디스플레이 인터페이스인데, DP에는 총 4페어가 있습니다. 하지만 USB와 달리 TX/RX가 필요하지 않아 4페어가 4레인이 됩니다. +제 서피스는 USB 3.2 Gen 2, 2x1입니다. 이 말은 1Gbps 하나의 레인을 사용합니다. USB-C에서 두개의 페어가 남고, 이 두개의 페어로 DP 시그널을 보냅니다. 따라서 최대 USB3 10Gbps + DP 2 Lane이 가능한거죠. +만약 USB3.2 1x2를 DP와 함께 사용한다면, 5Gbps 두개의 레인중 하나만 USB로 사용할 수 있고 두페어는 DP로 써야합니다. +다행이 제 경우 2x1이기에 DP를 다 쓰면서도 USB는 그대로 사용할 수 있었고, 자세하게는 DP Alt모드에서 DisplayPort 1.4 High Bit Rate 3 (HBR3) mode를 사용하기에 레인당 8.1Gbps, 총 16.2Gbps를 사용할 수 있습니다. 이는 4K60Hz를 두개까지 보낼 수 있는 대역폭으로, 저는 이론상 USB3.2 10Gbps와 4K60 모니터 두개가지 사용할 수 있습니다.

    \ No newline at end of file diff --git a/public/posts/yangja-keompyuteowa-yangja-eonilring/index.html b/public/posts/yangja-keompyuteowa-yangja-eonilring/index.html new file mode 100644 index 0000000..9b31241 --- /dev/null +++ b/public/posts/yangja-keompyuteowa-yangja-eonilring/index.html @@ -0,0 +1,22 @@ +양자 컴퓨터와 양자 어닐링 | Morgan's Blog +

    양자 컴퓨터와 양자 어닐링

    양자 컴퓨터와 양자 어닐링

    양자 컴퓨터 입문 / 양자 컴퓨팅 발전과 전망 / 1억배 빠른 양자 컴퓨터가 온다 / 스콧 애론슨의 양자 컴퓨터 강의

    양자 컴퓨터란 무엇일까?

    Ø 현대 컴퓨터의 발전 과정

    20세기, 컴퓨터(Computer)란 말은 계산하는 사람, Computing Person이라는 뜻으로 사용되었다. 하지만 단순 반복 행동을 굳이 사람이 하지 않아도 되는, 일명 계산기계가 사용될 수 있음이 증명되면서, Computer라는 말은 ‘일정한 규칙ㅇㄹ 가지고 주어진 값을 토대로 계산하는 장치’라는 의미를 가지게 되었다.

    현대적인 컴퓨터의 정의를 시작한 사람은 ‘찰스 배비지’이다. 이 사람은 19세기 초, 차분 기관이라는 기계식 계산기를 제작한다. 그 후, 그는 더 복잡한 기관인 분석 기관(해석 기관)을 제작한다. 찰스 배비지는 차분기관을 설계하였지만, 실제 완성하지는 못하였다. 하지만 후에 실제 만들어 보면서 작동하는 것을 확인하였다. 그는 천문 테이블을 만들기 위해 이 기계를 제작하였는데, 차분 기계는 다항함수를 계산할 수 있는 기관이었다. 그는 이 기관을 설계하고 난 뒤, 해석기관을 설계하였는데, 이는 천공카드를 이용해서 범용적인 계산을 할 수 있도록 하였다. 이 기계장치도 예산이랑 시간이 부족해서 완성하지 못하였다. 하지만 한 부인이 이 컴퓨터로 실제 프로그래밍을 하며, 최초의 프로그래머로 불리우고 있다.

    범용 컴퓨터의 현대적인 개념은 그 유명한 앨런 튜링이 정립했다. 그는 튜링 머신이라는 수학적 모델을 만들었는데, 모든 컴퓨터들은 이러한 튜링 머신을 기본 기능으로 설명할 수 있다. 그 전에 발명되었던, 현대의 트랜지스터와 같은 원리로 움직이는 진공관을 통해 튜링 머신이라는 논리적 모델을 실제 구현하게 된다. 그 후 에니그마를 깨기 위해 실제 계산 가능한 장치를 만들면서 최초의 전자식 계산기라고 알려져 있다.

    그 후 ENIAC이 만들어 지고, 폰 노이만이 노이만 구조라는 현대까지 아직도 적용되고 있는 방식을 제안한다. 이 폰 노이만 구조란 것은, 프로그램과 데이터를 기억장치에 저장하고, 명령어를 하나씩 수행하며 데이터를 수정해 나가는 방식을 의미한다.

    그 후 우리가 나는 집적회로와 트랜지스터가 사용되어 더욱 작은 컴퓨터가 만들어 지게 되었고, 이들이 발전해 나가면서 최초의 개인용 컴퓨터가 IBM에서 나오게 된다.

    Ø 그래서, 양자 컴퓨터란 무엇인가?

    흔히 알려진 양자 컴퓨터의 특징을 나열하자면, 0과 1 이분적이지 않게 두가지 정보를 동시에 가질 수 있고, 또 일반적인 컴퓨터보다 훨씬 빠르게 작동하고, 현대의 보안이 모두 뚫릴 것이며, 완전한 인공지능이 가능할 것이라 한다. 이중에서 물론 실제로 가능할 것도 있지만, 이런 것들이 가능하기에는 너무 오래 걸린다.

    \ No newline at end of file diff --git a/public/posts/yangjadeulyi-teuraenjiseuteo/index.html b/public/posts/yangjadeulyi-teuraenjiseuteo/index.html new file mode 100644 index 0000000..eaea214 --- /dev/null +++ b/public/posts/yangjadeulyi-teuraenjiseuteo/index.html @@ -0,0 +1,19 @@ +양자들의 트랜지스터와 핫 캐리어 효과 | Morgan's Blog +

    양자들의 트랜지스터와 핫 캐리어 효과

    트랜지스터가 점점 소형화가 되어가면서 전자가 예상한대로 움직이지 않는 작은 단위까지 내려갔다. 나노단위까지 생산공정이 작아지면서 양자역학적인 효과가 나타나기 시작했고, 이는 트랜지스터의 스위칭 작용을 방해하는 효과를 불어일으킨다. 이를 해결하기 위해서 양자 세계에서 사용할 수 있는 양자 트랜지스터와 단일 원자 트랜지스터가 개발되었다.

    1. 단일원자 트랜지스터

    단일원자 트랜지스터는 양자 터널링 효과를 적극적으로 이용하여 스위칭 작용을 한다. 터널링 효과를 제어하기 위해서 직접 제어가 아닌 양자 얽힘 효과를 이용한다. 큐비트를 이용하여, 전자 주개로써의 원자를 제어하기 위해 원자 개개별의 스핀 상태를 이용한다. 이를 통해 큐비트의 역할을 할 수 있는 단일한 원자를 생성해 내고, 이 단일 원자들이 스위칭 작용을 하는 주체가 된다. 단일 원자 트랜지스터는 실온에서 작동하고, 적은 숫자의 원자만을 이용하기 때문에 스위칭에 필요한 전력의 양도 매우 적다.

    단일원자 트랜지스터는 실리콘 표면의 인 원자와 반응시키는 방법이 이용된다. 원자가 정해진 위치에 고정되어 있고 각각의 원자가 전자 주개 또는 스위쳐로 작용하여 전자 하나하나의 흐름을 제어하게 된다.

    1. 양자 트랜지스터

    양자 트랜지스터는 기존의 MOS 트랜지스터와 비슷하게 행동하지만, 중간 p,N형 반도체가 하던 채널 형성과 전자 이동 제어를 나노 양자점이 전담하게 된다.

    1. 핫 캐리어 효과

    반도체 공정이 작아지면서 트랜지스터 채널이 소형화되었고, 이에 따라 채널의 길이가 줄어들게 되었다. 채널의 길이가 줄어들면서 전자의 튐 현상과 전자 제어가 힘들어진다는 한계점이 있다. 그 중 핫 캐리어 효과는 Drain전압은 일정한데 비해 짧아진 거리에 의해 전기장이 매우 커지는 효과가 일어나고, 평소보다 훨씬 가속된 전자들의 운동에너지에 의해 원래라면 넘어갈 수 없던 Oxide 전계를 넘어서게 되면서 규소 원자와 충돌하여 갇히게 된다. 이를 핫 캐리어 효과, 빠른 전자에 의한 주입 현상이라고 한다. 이에 의해 예측한 것과는 더 적은 전하가 이동하게 되고, 전류가 불안정하고 수율이 떨어지게 된다.

    핫 캐리어 효과를 최소한으로 하고 이를 방지하기 위해서는 Oxide 게이트와 접해있는 부분의 실리콘을 특수하게 덜 도핑하는 방법이 있다. 전류 손실의 손해를 보지만 핫 캐리어 효과에 의한 손실보다는 훨씬 적다. 원래는 전자의 운동을 최소한으로 방해하기 위해 저항이 낮도록 도핑하는데, Oxide에 접해있는 부분의 저항을 특별히 더 높게 도핑하여 핫 캐리어의 운동을 방해하는 효과를 준다.

    \ No newline at end of file diff --git a/public/profile/index.html b/public/profile/index.html new file mode 100644 index 0000000..bc4ce7a --- /dev/null +++ b/public/profile/index.html @@ -0,0 +1,15 @@ +About Me ! | Morgan's Blog +

    About Me !


    \ No newline at end of file diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..43bc22f --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Disallow: +Sitemap: http://blog.morgan.kr/sitemap.xml diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..a095ae4 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,110 @@ + + + + http://blog.morgan.kr/ + 2023-05-06T12:55:32+00:00 + + http://blog.morgan.kr/posts/ + 2023-05-06T12:55:32+00:00 + + http://blog.morgan.kr/posts/what-the-hell-is-usb-c-dp-alt-mode/ + 2023-05-06T12:55:32+00:00 + + http://blog.morgan.kr/posts/wasting-time/ + 2023-04-20T08:07:41+09:00 + + http://blog.morgan.kr/posts/cam-nae-jinjja-sangsangdo-moshaessdeon-ilinde/ + 2022-10-03T15:25:08+00:00 + + http://blog.morgan.kr/posts/2022041406/ + 2022-04-14T06:55:25+00:00 + + http://blog.morgan.kr/posts/dareun-jibe-eonjhyeo-sandaneun-geoseun/ + 2022-04-09T04:02:17+00:00 + + http://blog.morgan.kr/posts/godeunghaggyo-dolabogi/ + 2021-12-21T16:23:55+00:00 + + http://blog.morgan.kr/posts/daehag-ibsiga-handangye-namassda/ + 2021-12-01T08:09:52+00:00 + + http://blog.morgan.kr/posts/1-spectre-attacks-exploiting-peculative-execution/ + 2021-10-30T07:19:36+00:00 + + http://blog.morgan.kr/posts/jeonja-jeeoyi-segyein-mirae-geu-boanyi-wihyeob/ + 2021-10-30T07:17:47+00:00 + + http://blog.morgan.kr/posts/ad-techwa-tonggyeyi-sseuimsae/ + 2021-10-30T07:10:34+00:00 + + http://blog.morgan.kr/posts/yangjadeulyi-teuraenjiseuteo/ + 2021-10-30T07:09:53+00:00 + + http://blog.morgan.kr/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga/ + 2021-10-30T07:07:55+00:00 + + http://blog.morgan.kr/posts/insaeng-dubeonjjae-silpae/ + 2021-10-23T08:52:59+00:00 + + http://blog.morgan.kr/posts/how-i-wanted-to-do/ + 2021-10-23T08:52:15+00:00 + + http://blog.morgan.kr/posts/haggyoeseo-haessdeon-peurojegteudeul/ + 2021-10-23T08:51:44+00:00 + + http://blog.morgan.kr/posts/gaeinjeongbo-privacy/ + 2021-10-23T08:31:52+00:00 + + http://blog.morgan.kr/posts/datacenter/ + 2021-10-23T08:15:14+00:00 + + http://blog.morgan.kr/posts/beulrogeu-geulsseugineun-neomu-himdeuleo/ + 2021-10-08T05:19:00+00:00 + + http://blog.morgan.kr/posts/what-i-want-to-do/ + 2021-09-11T01:20:00+00:00 + + http://blog.morgan.kr/posts/20210620-siheomeul-iljuil-apdugo/ + 2021-09-10T09:23:28+00:00 + + http://blog.morgan.kr/posts/attitude-for-criticism/ + 2021-09-10T07:30:10+00:00 + + http://blog.morgan.kr/posts/yangja-keompyuteowa-yangja-eonilring/ + 2021-08-06T10:36:03+00:00 + + http://blog.morgan.kr/tags/security/ + 2021-08-06T10:32:57+00:00 + + http://blog.morgan.kr/posts/security-of-iot/ + 2021-08-06T10:32:57+00:00 + + http://blog.morgan.kr/tags/ + 2021-08-06T10:32:57+00:00 + + http://blog.morgan.kr/posts/hardware-security/ + 2021-08-06T10:31:09+00:00 + + http://blog.morgan.kr/posts/jeonsanyuceyeoghag-cfd-with-python-navier-stokes-equation/ + 2021-07-10T08:23:47+00:00 + + http://blog.morgan.kr/posts/bandoceyi-weonri-jongryu-soja-yeogsa-saneob-mosfetbuteo-ram-flash-geurigo-intel-4004ggaji/ + 2021-07-09T17:21:52+00:00 + + http://blog.morgan.kr/posts/cryptography/ + 2021-07-09T10:24:00+00:00 + + http://blog.morgan.kr/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo/ + 2021-05-21T13:18:27+00:00 + + http://blog.morgan.kr/posts/what-i-wanted-to-do/ + 2021-01-28T06:14:00+00:00 + + http://blog.morgan.kr/profile/ + + http://blog.morgan.kr/archives/ + + http://blog.morgan.kr/categories/ + + diff --git a/public/tags/index.html b/public/tags/index.html new file mode 100644 index 0000000..2531d62 --- /dev/null +++ b/public/tags/index.html @@ -0,0 +1,14 @@ +Tags | Morgan's Blog
    \ No newline at end of file diff --git a/public/tags/index.xml b/public/tags/index.xml new file mode 100644 index 0000000..eb19695 --- /dev/null +++ b/public/tags/index.xml @@ -0,0 +1,23 @@ + + + + Tags on Morgan's Blog + http://blog.morgan.kr/tags/ + Recent content in Tags on Morgan's Blog + + http://blog.morgan.kr + http://blog.morgan.kr + + Hugo -- gohugo.io + Fri, 06 Aug 2021 10:32:57 +0000 + + security + http://blog.morgan.kr/tags/security/ + Fri, 06 Aug 2021 10:32:57 +0000 + + http://blog.morgan.kr/tags/security/ + + + + + diff --git a/public/tags/security/index.html b/public/tags/security/index.html new file mode 100644 index 0000000..bfc136e --- /dev/null +++ b/public/tags/security/index.html @@ -0,0 +1,16 @@ +security | Morgan's Blog

    Security of IoT

    Security of IoT IoT란? IoT (Internet of Things)란, 사물인터넷으로, 예전에는 독립적으로 존재했던 각종 전자기기 및 사물들이 인터넷으로 엮여 한번에 관리할 수 있게 되거나, 상호 정보교환과 데이터 수집을 통해 사용자에게 최상의 서비스를 제공하는 기술을 의미이다. 여기에서 사물이라 함은 모든 사물을 포함한다. 데이터를 분석하는 과정에서 인공지능을 주로 사용하므로 IoT는 인공지능 기술이기도 하다. +IoT는 2013년부터 쭉 개발되어 왔으며, 우리 집에서 흔히 볼 수 있는 에어컨, 냉장고등 큰 가구들부터 연결되어 왔다. 그 이후 시간이 지나면서 점점 작은 기구들까지 연결되면서, TV, 전자레인지, 오븐부터 커피포트, 선풍기, 전등 뿐 아니라 변기, 샤워기, 거울, 헤어 드라이기까지 연결되어 있지 않은 것이 없을 정도로 발전되어 왔다....

    August 6, 6000 · 280 words · Me
    \ No newline at end of file diff --git a/public/tags/security/index.xml b/public/tags/security/index.xml new file mode 100644 index 0000000..bdeba3f --- /dev/null +++ b/public/tags/security/index.xml @@ -0,0 +1,24 @@ + + + + security on Morgan's Blog + http://blog.morgan.kr/tags/security/ + Recent content in security on Morgan's Blog + + http://blog.morgan.kr + http://blog.morgan.kr + + Hugo -- gohugo.io + Fri, 06 Aug 2021 10:32:57 +0000 + + Security of IoT + http://blog.morgan.kr/posts/security-of-iot/ + Fri, 06 Aug 2021 10:32:57 +0000 + + http://blog.morgan.kr/posts/security-of-iot/ + Security of IoT IoT란? IoT (Internet of Things)란, 사물인터넷으로, 예전에는 독립적으로 존재했던 각종 전자기기 및 사물들이 인터넷으로 엮여 한번에 관리할 수 있게 되거나, 상호 정보교환과 데이터 수집을 통해 사용자에게 최상의 서비스를 제공하는 기술을 의미이다. 여기에서 사물이라 함은 모든 사물을 포함한다. 데이터를 분석하는 과정에서 인공지능을 주로 사용하므로 IoT는 인공지능 기술이기도 하다. +IoT는 2013년부터 쭉 개발되어 왔으며, 우리 집에서 흔히 볼 수 있는 에어컨, 냉장고등 큰 가구들부터 연결되어 왔다. 그 이후 시간이 지나면서 점점 작은 기구들까지 연결되면서, TV, 전자레인지, 오븐부터 커피포트, 선풍기, 전등 뿐 아니라 변기, 샤워기, 거울, 헤어 드라이기까지 연결되어 있지 않은 것이 없을 정도로 발전되어 왔다. + + + + diff --git a/public/tags/security/page/1/index.html b/public/tags/security/page/1/index.html new file mode 100644 index 0000000..f433bbe --- /dev/null +++ b/public/tags/security/page/1/index.html @@ -0,0 +1 @@ +http://blog.morgan.kr/tags/security/ \ No newline at end of file diff --git a/push.sh b/push.sh new file mode 100755 index 0000000..f9c4436 --- /dev/null +++ b/push.sh @@ -0,0 +1,3 @@ +git add . +git commit -m 'edited post' +git push origin diff --git a/resources/_gen/assets/scss/scss/main.scss_b17b8b3fd5dba5bd88a508c1c1f3b99b.content b/resources/_gen/assets/scss/scss/main.scss_b17b8b3fd5dba5bd88a508c1c1f3b99b.content new file mode 100644 index 0000000..22f8692 --- /dev/null +++ b/resources/_gen/assets/scss/scss/main.scss_b17b8b3fd5dba5bd88a508c1c1f3b99b.content @@ -0,0 +1,10 @@ +html{scroll-behavior:smooth}html,body{margin:0;width:100%;height:100%;font-size:18px;text-size-adjust:none;-webkit-text-size-adjust:none;-moz-text-size-adjust:none}body{-moz-tab-size:4;tab-size:4;color:var(--color-contrast-high);background-color:var(--color-bg);overflow-wrap:break-word;word-wrap:break-word;line-height:1.618;transition:all .5s}.container{min-height:100%;min-width:100%;position:relative}.main{padding:2em 1em 15em;display:block}.main{padding-top:7em}.main-inner{margin:0 auto;display:block}.icon{width:1.05em;height:1em;fill:currentColor;display:inline-block}svg{vertical-align:middle}h1,h2,h3,h4,h5,h6{margin:1.618em 0 1em;color:var(--color-contrast-higher)}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{text-decoration:none !important;color:var(--color-contrast-higher)}h1{font-size:2em}h2{font-size:1.8em}h3{font-size:1.6em}h4{font-size:1.4em}h5{font-size:1.2em}h6{font-size:1em}a{color:var(--color-contrast-high);text-decoration:none;transition:all .5s}a:hover{color:var(--color-primary)}::selection{background-color:hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.3)}::-webkit-scrollbar{width:0.5rem;height:0.5rem}::-webkit-scrollbar-track{background-color:var(--color-bg)}::-webkit-scrollbar-thumb{background-color:var(--color-contrast-low)}::-webkit-scrollbar-thumb:hover{background-color:hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.5)}::-webkit-scrollbar-thumb:active{background-color:hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.75)}::-webkit-scrollbar-corner{background-color:var(--color-bg)}.list-title,.term-title,.list-year,.list-month,.post-title,.post-subtitle,.related-title,.post-nav,thead,dt{font-family:"Comfortaa",sans-serif}.post-body h1,.post-body h2,.post-body h3,.post-body h4,.post-body h5,.post-body h6{font-family:"Comfortaa",sans-serif}.contents-title{font-family:"Comfortaa",sans-serif}code,pre,sup,.post-meta,.updated-badge,.post-gitinfo,.minimal-footer,.minimal-footer-about,.busuanzi-site-uv-and-pv,.copy-button{font-family:"Source Code Pro",monospace}body{font-family:"IBM Plex Serif",serif}[data-indent="true"] .contents-title{text-align:center}[data-indent="true"] .post-body p{text-indent:2em;margin:0}[data-indent="true"] .post-body .caption{text-indent:0;margin:0 0 1em}[data-indent="true"] .post-body blockquote{margin:1em 0;padding:0;border:none}[data-indent="true"] .post-body img,[data-indent="true"] .post-body video{margin:1em auto}[data-indent="true"] .post-body table{margin:1em 0}[data-indent="true"] .post-body pre,[data-indent="true"] .post-body .highlight{margin:1rem 0}[data-indent="true"] .post-body h1,[data-indent="true"] .post-body h2,[data-indent="true"] .post-body h3,[data-indent="true"] .post-body h4,[data-indent="true"] .post-body h5,[data-indent="true"] .post-body h6{text-align:center}[data-indent="true"] .post-body .anchor-link{position:relative;transform:none;display:block;float:none}[data-indent="true"] .post-body ol,[data-indent="true"] .post-body ul{margin:0;padding-left:4em}[data-indent="true"] .post-body ol p,[data-indent="true"] .post-body ul p{text-indent:0}[data-indent="true"] .post-body li ol,[data-indent="true"] .post-body li ul{padding-left:2em}[data-indent="true"] .post-body dl{text-indent:2em}[data-indent="true"] .post-body dl dd{text-indent:0;margin-left:4em}[data-indent="true"] .post-body dl p{text-indent:0}@media (prefers-color-scheme: light){:root:not([data-theme]){--theme-name: "light";--color-primary:hsl(220, 90%, 56%);--color-primary-h:220;--color-primary-s:90%;--color-primary-l:56%;--color-bg:hsl(0, 0%, 100%);--color-bg-h:0;--color-bg-s:0%;--color-bg-l:100%;--color-contrast-lower:hsl(0, 0%, 95%);--color-contrast-lower-h:0;--color-contrast-lower-s:0%;--color-contrast-lower-l:95%;--color-contrast-low:hsl(240, 1%, 83%);--color-contrast-low-h:240;--color-contrast-low-s:1%;--color-contrast-low-l:83%;--color-contrast-medium:hsl(240, 1%, 48%);--color-contrast-medium-h:240;--color-contrast-medium-s:1%;--color-contrast-medium-l:48%;--color-contrast-high:hsl(240, 4%, 20%);--color-contrast-high-h:240;--color-contrast-high-s:4%;--color-contrast-high-l:20%;--color-contrast-higher:hsl(240, 8%, 12%);--color-contrast-higher-h:240;--color-contrast-higher-s:8%;--color-contrast-higher-l:12%;--chroma-line-numbers-background: #ffffcc;--chroma-line-numbers-color: #7f7f7f;--chroma-keyword-color: #006699;--chroma-name-color: #9999ff;--chroma-attribute-color: #330099;--chroma-literal-color: #cc3300;--chroma-number-color: #ff6600;--chroma-comment-color: #0099ff;--chroma-deleted-color: #ffcccc;--chroma-output-color: #aaaaaa}:root:not([data-theme]) .theme-icon-light{display:inline-block}:root:not([data-theme]) .theme-icon-dark{display:none}:root:not([data-theme]) img{filter:none}}:root{--theme-name: "light";--color-primary:hsl(220, 90%, 56%);--color-primary-h:220;--color-primary-s:90%;--color-primary-l:56%;--color-bg:hsl(0, 0%, 100%);--color-bg-h:0;--color-bg-s:0%;--color-bg-l:100%;--color-contrast-lower:hsl(0, 0%, 95%);--color-contrast-lower-h:0;--color-contrast-lower-s:0%;--color-contrast-lower-l:95%;--color-contrast-low:hsl(240, 1%, 83%);--color-contrast-low-h:240;--color-contrast-low-s:1%;--color-contrast-low-l:83%;--color-contrast-medium:hsl(240, 1%, 48%);--color-contrast-medium-h:240;--color-contrast-medium-s:1%;--color-contrast-medium-l:48%;--color-contrast-high:hsl(240, 4%, 20%);--color-contrast-high-h:240;--color-contrast-high-s:4%;--color-contrast-high-l:20%;--color-contrast-higher:hsl(240, 8%, 12%);--color-contrast-higher-h:240;--color-contrast-higher-s:8%;--color-contrast-higher-l:12%;--chroma-line-numbers-background: #ffffcc;--chroma-line-numbers-color: #7f7f7f;--chroma-keyword-color: #006699;--chroma-name-color: #9999ff;--chroma-attribute-color: #330099;--chroma-literal-color: #cc3300;--chroma-number-color: #ff6600;--chroma-comment-color: #0099ff;--chroma-deleted-color: #ffcccc;--chroma-output-color: #aaaaaa}:root .theme-icon-light{display:inline-block}:root .theme-icon-dark{display:none}:root img{filter:none}@media (prefers-color-scheme: dark){:root:not([data-theme]){--theme-name: "dark";--color-primary:hsl(201, 65%, 62%);--color-primary-h:201;--color-primary-s:65%;--color-primary-l:62%;--color-bg:hsl(231, 14%, 10%);--color-bg-h:231;--color-bg-s:14%;--color-bg-l:10%;--color-contrast-lower:hsl(230, 12%, 18%);--color-contrast-lower-h:230;--color-contrast-lower-s:12%;--color-contrast-lower-l:18%;--color-contrast-low:hsl(240, 2%, 37%);--color-contrast-low-h:240;--color-contrast-low-s:2%;--color-contrast-low-l:37%;--color-contrast-medium:hsl(80, 2%, 69%);--color-contrast-medium-h:80;--color-contrast-medium-s:2%;--color-contrast-medium-l:69%;--color-contrast-high:hsl(69, 9%, 84%);--color-contrast-high-h:69;--color-contrast-high-s:9%;--color-contrast-high-l:84%;--color-contrast-higher:hsl(60, 6%, 90%);--color-contrast-higher-h:60;--color-contrast-higher-s:6%;--color-contrast-higher-l:90%;--chroma-line-numbers-background: #ffffcc;--chroma-line-numbers-color: #7f7f7f;--chroma-keyword-color: #ff79c6;--chroma-name-color: #8be9fd;--chroma-attribute-color: #50fa7b;--chroma-literal-color: #f1fa8c;--chroma-number-color: #bd93f9;--chroma-comment-color: #6272a4;--chroma-deleted-color: #8b080b;--chroma-output-color: #44475a}:root:not([data-theme]) .theme-icon-light{display:none}:root:not([data-theme]) .theme-icon-dark{display:inline-block}:root:not([data-theme]) img{filter:brightness(75%)}}:root[data-theme="dark"]{--theme-name: "dark";--color-primary:hsl(201, 65%, 62%);--color-primary-h:201;--color-primary-s:65%;--color-primary-l:62%;--color-bg:hsl(231, 14%, 10%);--color-bg-h:231;--color-bg-s:14%;--color-bg-l:10%;--color-contrast-lower:hsl(230, 12%, 18%);--color-contrast-lower-h:230;--color-contrast-lower-s:12%;--color-contrast-lower-l:18%;--color-contrast-low:hsl(240, 2%, 37%);--color-contrast-low-h:240;--color-contrast-low-s:2%;--color-contrast-low-l:37%;--color-contrast-medium:hsl(80, 2%, 69%);--color-contrast-medium-h:80;--color-contrast-medium-s:2%;--color-contrast-medium-l:69%;--color-contrast-high:hsl(69, 9%, 84%);--color-contrast-high-h:69;--color-contrast-high-s:9%;--color-contrast-high-l:84%;--color-contrast-higher:hsl(60, 6%, 90%);--color-contrast-higher-h:60;--color-contrast-higher-s:6%;--color-contrast-higher-l:90%;--chroma-line-numbers-background: #ffffcc;--chroma-line-numbers-color: #7f7f7f;--chroma-keyword-color: #ff79c6;--chroma-name-color: #8be9fd;--chroma-attribute-color: #50fa7b;--chroma-literal-color: #f1fa8c;--chroma-number-color: #bd93f9;--chroma-comment-color: #6272a4;--chroma-deleted-color: #8b080b;--chroma-output-color: #44475a}:root[data-theme="dark"] .theme-icon-light{display:none}:root[data-theme="dark"] .theme-icon-dark{display:inline-block}:root[data-theme="dark"] img{filter:brightness(75%)}#theme-switcher{color:var(--color-contrast-medium);transition:color .5s;z-index:4}#theme-switcher:hover{color:var(--color-primary)}#theme-switcher .icon{margin-right:0 !important}.header{z-index:3}.header{position:fixed;width:100vw}.header-wrapper{padding:1em 0;-webkit-backdrop-filter:saturate(180%) blur(1em);backdrop-filter:saturate(180%) blur(1em);background:linear-gradient(90deg, rgba(247,149,51,0.101961) 0, rgba(243,112,85,0.101961) 15%, rgba(239,78,123,0.101961) 30%, rgba(161,102,171,0.101961) 44%, rgba(80,115,184,0.101961) 58%, rgba(16,152,173,0.101961) 72%, rgba(7,179,155,0.101961) 86%, rgba(109,186,130,0.101961) 100%);transition:background .5s}.header-inner{display:flex;justify-content:space-between;align-items:center;margin:0 auto;max-width:36em}.header-inner.list{max-width:36em}.site-brand{margin-right:1em}.brand{font-size:1em;color:var(--color-contrast-high);text-decoration:none}.brand:hover{color:var(--color-contrast-high)}:root{--header-height: calc( + max( + /* brand */ + 29.124px, + /* menu */ + 21.6px /* {.nav font-size} * {.menu line-height} */ + ) + /* .header-wrapper top+bottom margin */ + + 36px + )}*[id]{scroll-margin-top:var(--header-height)}#nav-toggle{display:none}.nav-toggle{display:none;position:absolute;top:1em;right:1em;margin-right:1em;width:1em;height:1em;cursor:pointer}.nav-toggle-inner{padding:1em;display:inline-block}.nav-toggle span{display:block;position:absolute;height:0.1em;width:1em;background-color:var(--color-contrast-high);transition:all .5s}.nav-toggle span:nth-child(1){top:0.4em}.nav-toggle span:nth-child(2){top:0.7em}.nav-toggle span:nth-child(3){top:1em}.nav-toggle.open span:nth-child(1){top:75%;transform:rotate(225deg)}.nav-toggle.open span:nth-child(2){width:0;opacity:0;transform:rotate(-135deg)}.nav-toggle.open span:nth-child(3){top:75%;transform:rotate(-45deg)}.nav-curtain{height:100vh;width:100vw;-webkit-backdrop-filter:saturate(180%) blur(1em);backdrop-filter:saturate(180%) blur(1em);background:linear-gradient(90deg, rgba(247,149,51,0.101961) 0, rgba(243,112,85,0.101961) 15%, rgba(239,78,123,0.101961) 30%, rgba(161,102,171,0.101961) 44%, rgba(80,115,184,0.101961) 58%, rgba(16,152,173,0.101961) 72%, rgba(7,179,155,0.101961) 86%, rgba(109,186,130,0.101961) 100%) rgba(0,0,0,0.5)}.nav{z-index:3;position:relative}.menu{padding:0;margin:0;list-style:none;line-height:1.5;font-weight:500}.menu-item{display:inline-block}.menu-item a{color:var(--color-contrast-medium)}.menu-item a:hover{color:var(--color-primary)}.active a{color:var(--color-primary)}.nav{text-align:right;font-size:80%}.menu-item{margin-left:0.5em}.menu-item .icon{margin:0 0.3em 0.2em 0}.list .main-inner{width:36em}.list-title{text-align:center}.list ul{list-style:none;padding:0}.list-item-title{flex:1}.list-item-time{text-align:right;margin-left:1em}.list-item{line-height:2;position:relative;transition:border .5s;border-bottom:1px dashed var(--color-contrast-low);margin-top:1em;padding-bottom:0.5em;display:flex;align-items:baseline}.list-item:hover{border-bottom-color:var(--color-primary)}.list-item:hover ::before{background:var(--color-primary)}.list-item ::before{content:" ";position:absolute;left:0.618em;top:0.618em;width:6px;height:6px;background:var(--color-contrast-low);border-radius:50%;border:1px solid var(--color-bg);transition:background .5s;font-size:1rem}.list-item-title{margin:0 0.618em 0 2em;font-size:1.2em;line-height:1.5}.list-item-time{margin:0 0.618em 0 2em;color:var(--color-contrast-medium);line-height:1.5}.list-read-more{margin-top:1em;font-size:1.2em;line-height:1.5}.list-year{display:flex;justify-content:space-between;align-items:baseline}.term-count{color:var(--color-contrast-medium);font-size:0.7em}.single .main-inner{width:36em}.post-title{text-align:center}.post-subtitle{font-size:1.8em;text-align:center;font-weight:700;margin-top:-0.618em}.post-description{text-align:center;margin:1rem 0;font-size:90%}.post-body{margin-top:5em !important}.post-body a{text-decoration:underline;text-decoration-color:var(--color-contrast-low)}.post-body a:hover{text-decoration-color:hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.5)}.post p{margin:1em 0;line-height:1.618}.post img{display:block;margin:2em auto;max-width:100%;border:1px solid var(--color-contrast-lower);clear:both}.post video{display:block;max-width:100%;margin:2em auto;clear:both}.post sup{font-size:70%;vertical-align:super}.post sup a{text-decoration:none}.post ol,.post ul{margin:0;padding-left:2em;line-height:1.618}.post hr{border:none;margin:2.427em 0 1.5em;text-align:center}.post hr::after{content:"···";letter-spacing:2em;padding-left:2em}blockquote{margin:2em 0;padding-left:1em;color:var(--color-contrast-medium);border-left:3px solid var(--color-contrast-low)}blockquote a{color:var(--color-contrast-medium)}blockquote a:hover{color:var(--color-primary)}.drop-cap{float:left;font-size:54px;margin-right:11.124px;margin-top:11.12484549px;line-height:29.124px}.caption{display:block;text-align:center;margin:-1em 0 0;font-size:90%;color:var(--color-contrast-medium)}.contents{margin-top:5em}.contents ol,.contents ul{list-style:none}ol.toc,ul.toc{padding:0;overflow:auto hidden;white-space:nowrap}.footnotes{font-size:90%;margin-top:5rem}.footnotes hr{margin:0;height:1px;border:none;background-color:var(--color-contrast-medium)}.footnotes hr::after{content:none}.footnotes ol{margin:1.618rem 0 0 !important;padding:0 1rem 0 2rem !important}.footnote-icon{fill:hsla(var(--color-contrast-high-h), var(--color-contrast-high-s), var(--color-contrast-high-l), 0.5);transition:fill .5s;margin-bottom:0.3em}.footnote-icon:hover{fill:var(--color-primary)}.anchor-link{position:absolute;transform:translate(-150%)}.anchor-icon{width:0.75em;height:0.75em;vertical-align:baseline}:root{--anchor-opacity: 0}.anchor-link{opacity:var(--anchor-opacity);transition:all .25s}.post h1:hover,.post h2:hover,.post h3:hover,.post h4:hover,.post h5:hover,.post h6:hover,.post .anchor-link:hover{--anchor-opacity: 1}.table-container{margin:2em 0;overflow-x:auto}table{width:100%;border-collapse:collapse;border-spacing:0;border-color:var(--color-contrast-lower)}th{font-weight:700}th,td{font-size:0.9em;padding:0.4em;border:1px solid var(--color-contrast-lower)}table>tbody>tr:nth-of-type(odd){background-color:hsla(var(--color-contrast-lower-h), var(--color-contrast-lower-s), var(--color-contrast-lower-l), 0.5)}table>tbody>tr:hover{background-color:var(--color-contrast-lower)}dt{font-weight:700}dd{margin-left:2em}code{padding:2.25px 4.5px;background-color:hsla(var(--color-contrast-lower-h), var(--color-contrast-lower-s), var(--color-contrast-lower-l), 0.5);font-size:80%}pre{overflow:auto;overflow-wrap:normal;word-wrap:normal;font-size:0.8rem;margin:2rem 0;padding:1em;line-height:1.618;background-color:hsla(var(--color-contrast-lower-h), var(--color-contrast-lower-s), var(--color-contrast-lower-l), 0.5)}pre code{background-color:unset;font-size:0.8rem;padding:0}pre{max-height:20em}.copy-button{position:absolute;top:0;right:0;border:0;font-size:inherit;color:var(--color-bg);background-color:hsla(var(--color-contrast-medium-h), var(--color-contrast-medium-s), var(--color-contrast-medium-l), 0.5);transition:all .5s;cursor:pointer}.copy-button:hover{background-color:hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.5)}.copy-button{visibility:hidden;opacity:0}.katex-display,mjx-container[jax="CHTML"][display="true"]{overflow:auto hidden;text-indent:0}.footer{position:absolute;bottom:0;width:100%;font-size:90%;color:hsla(var(--color-contrast-medium-h), var(--color-contrast-medium-s), var(--color-contrast-medium-l), 0.8)}.footer a{color:hsla(var(--color-contrast-medium-h), var(--color-contrast-medium-s), var(--color-contrast-medium-l), 0.8)}.footer a:hover{color:var(--color-primary)}.footer-inner{padding:1em;text-align:center}.footer-icon{margin:0 0.25em 0.3em}.footer-icon{fill:#f06292}@keyframes heartbeat{0%,100%{transform:scale(1)}10%,30%{transform:scale(0.9)}20%,40%,50%,60%,70%,80%{transform:scale(1.1)}}.footer-icon{animation:heartbeat 1.33s ease-in-out infinite}.post-meta{color:var(--color-contrast-medium);font-size:80%;text-align:center;margin:1rem 0}.post-meta a{color:var(--color-contrast-medium)}.post-meta a:hover{color:var(--color-primary)}.home .post-meta{margin:1rem 0}.post-meta-item{margin:0.5em;display:inline-block}.post-meta-icon{fill:hsla(var(--color-contrast-medium-h), var(--color-contrast-medium-s), var(--color-contrast-medium-l), 0.5);margin-bottom:0.3em}.post-copyright{margin:0;list-style:none;margin-top:5em !important;padding:0.5em 1em;background-color:hsla(var(--color-contrast-lower-h), var(--color-contrast-lower-s), var(--color-contrast-lower-l), 0.5);border-left:3px solid hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.5);line-height:2}.copyright-item{line-height:1.5;margin:0.5em 0}.copyright-item-text{font-weight:500}.updated-badge-container{margin-top:5em;text-align:center}.updated-badge-left{fill:var(--color-contrast-low)}.updated-badge-right{fill:hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.5)}.post-share{margin-top:5rem;color:hsla(var(--color-contrast-medium-h), var(--color-contrast-medium-s), var(--color-contrast-medium-l), 0.8)}.post-share a{color:hsla(var(--color-contrast-medium-h), var(--color-contrast-medium-s), var(--color-contrast-medium-l), 0.8)}.post-share a:hover{color:inherit}.share-items{text-align:center}.share-item{margin:0 0.5em}.share-item{display:inline-block}.share-item .icon{transition:fill .5s}.twitter-icon:hover{fill:#1DA1F2}.facebook-icon:hover{fill:#1877F2}.linkedin-icon:hover{fill:#0077B5}.telegram-icon:hover{fill:#2CA5E0}.weibo-icon:hover{fill:#E6162D}.douban-icon:hover{fill:#007722}.qq-icon:hover{fill:#12B7F5}.qzone-icon:hover{fill:#FECE00}.qrcode-icon:hover{fill:var(--color-primary)}#qrcode-img{position:absolute;transform:translate(calc(-100% + 1em), calc(-100% - 1em));opacity:0;transition:opacity .5s}#qrcode-img img{display:none}.qrcode-container:hover #qrcode-img{opacity:1}.qrcode-container:hover #qrcode-img img{display:inline-block;border:1px solid var(--color-contrast-lower)}.related-posts{border:1px solid var(--color-contrast-lower);padding:0.6em 1em;line-height:2em;margin-top:5em}.related-title{font-size:1em;margin:0}.related-icon{float:right;margin-top:0.4em}.related-list{margin:0;padding:0;list-style:none}.related-link{line-height:1.5;display:inline-block}.post-tags{margin-top:5rem;text-align:center;font-size:90%}.post-tags-link{color:hsla(var(--color-contrast-medium-h), var(--color-contrast-medium-s), var(--color-contrast-medium-l), 0.9);margin:0 0.5em;line-height:2;display:inline-block}.tag-icon{margin-right:0.3em;font-size:80%}.post-nav{list-style:none;padding:0;display:flex;justify-content:space-between;border-top:1px solid var(--color-contrast-lower);font-weight:700;margin-top:5em;padding-top:0.618em}.post-nav-prev{margin-right:auto;max-width:42%}.post-nav-next{margin-left:auto;text-align:right;max-width:42%}.back-to-top{position:fixed;right:0;z-index:1}.back-to-top a{display:block;padding:1em;color:var(--color-contrast-medium)}.back-to-top a:hover{color:var(--color-primary)}.back-to-top{bottom:-3.6em;transition:bottom 0.3s ease-in-out}.back-to-top.show{bottom:0}.highlight{font-size:0.8rem;margin:2rem 0}.highlight pre{margin:0 !important;max-height:unset}.highlight .lntd pre{background-color:unset;overflow:visible}.highlight table>tbody>tr:nth-of-type(odd){background-color:inherit}.highlight table>tbody>tr:hover{background-color:inherit}span.lnt{user-select:none;display:block;margin-right:-1em !important;padding:0 !important;text-align:right}.chroma{color:var(--color-contrast-high);background-color:hsla(var(--color-contrast-lower-h), var(--color-contrast-lower-s), var(--color-contrast-lower-l), 0.5)}.lntable,.highlight>pre{max-height:20em}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block}.chroma .hl{display:block;width:100%;background-color:var(--chroma-line-numbers-background)}.chroma .lnt{margin-right:0.4em;padding:0 0.4em 0 0.4em;color:var(--chroma-line-numbers-color)}.chroma .ln{margin-right:0.4em;padding:0 0.4em 0 0.4em;color:var(--chroma-line-numbers-color)}.chroma .k{color:var(--chroma-keyword-color)}.chroma .kc{color:var(--chroma-keyword-color)}.chroma .kd{color:var(--chroma-declaration-color);font-style:italic}.chroma .kn{color:var(--chroma-name-color)}.chroma .kp{color:var(--chroma-keyword-color)}.chroma .kr{color:var(--chroma-keyword-color)}.chroma .kt{color:var(--chroma-name-color)}.chroma .na{color:var(--chroma-attribute-color)}.chroma .nb{color:var(--chroma-name-color);font-style:italic}.chroma .nc{color:var(--chroma-attribute-color)}.chroma .nf{color:var(--chroma-attribute-color)}.chroma .nl{color:var(--chroma-name-color);font-style:italic}.chroma .nt{color:var(--chroma-keyword-color)}.chroma .nv{color:var(--chroma-name-color);font-style:italic}.chroma .vc{color:var(--chroma-name-color);font-style:italic}.chroma .vg{color:var(--chroma-name-color);font-style:italic}.chroma .vi{color:var(--chroma-name-color);font-style:italic}.chroma .s{color:var(--chroma-literal-color)}.chroma .sa{color:var(--chroma-literal-color)}.chroma .sb{color:var(--chroma-literal-color)}.chroma .sc{color:var(--chroma-literal-color)}.chroma .dl{color:var(--chroma-literal-color)}.chroma .sd{color:var(--chroma-literal-color)}.chroma .s2{color:var(--chroma-literal-color)}.chroma .se{color:var(--chroma-literal-color)}.chroma .sh{color:var(--chroma-literal-color)}.chroma .si{color:var(--chroma-literal-color)}.chroma .sx{color:var(--chroma-literal-color)}.chroma .sr{color:var(--chroma-literal-color)}.chroma .s1{color:var(--chroma-literal-color)}.chroma .ss{color:var(--chroma-literal-color)}.chroma .m{color:var(--chroma-number-color)}.chroma .mb{color:var(--chroma-number-color)}.chroma .mf{color:var(--chroma-number-color)}.chroma .mh{color:var(--chroma-number-color)}.chroma .mi{color:var(--chroma-number-color)}.chroma .il{color:var(--chroma-number-color)}.chroma .mo{color:var(--chroma-number-color)}.chroma .o{color:var(--chroma-keyword-color)}.chroma .ow{color:var(--chroma-keyword-color)}.chroma .c{color:var(--chroma-comment-color)}.chroma .ch{color:var(--chroma-comment-color)}.chroma .cm{color:var(--chroma-comment-color)}.chroma .c1{color:var(--chroma-comment-color)}.chroma .cs{color:var(--chroma-comment-color)}.chroma .cp{color:var(--chroma-keyword-color)}.chroma .cpf{color:var(--chroma-keyword-color)}.chroma .gd{color:var(--chroma-deleted-color)}.chroma .ge{text-decoration:underline}.chroma .gh{font-weight:bold}.chroma .gi{font-weight:bold}.chroma .go{color:var(--chroma-output-color)}.chroma .gu{font-weight:bold}.chroma .gl{text-decoration:underline}.socials{padding:0;margin:0;list-style:none}.socials-item{display:inline-block;margin:0.5em;border-radius:50%;background-color:var(--color-contrast-medium);transition:background-color .5s}.socials-item:hover{background-color:var(--color-primary)}.social-icon{fill:var(--color-bg);padding:0.5em}article.content.post.home{margin-top:5em}.summary-title-link{color:var(--color-contrast-higher)}.summary{line-height:1.618;display:block}.read-more-container{text-align:center;margin-top:1.618em}.read-more-link{display:inline-block}.pagination{list-style:none;margin:5em 0 0;padding:0;display:flex;justify-content:space-between}.pagination-prev{margin-right:auto}.pagination-next{margin-left:auto;text-align:right}.tree{overflow:auto hidden;white-space:nowrap}.tree ul{padding-left:2.4em}.tree>ul{padding:0}.list-categories>li{position:relative}.list-categories>li::before{content:" ";position:absolute;top:2.4em;left:0.1em;width:0.2em;height:calc(100% - 2.8em);background:var(--color-contrast-lower)}.category-item{color:var(--color-primary);font-size:1.2em}.category-item:hover{color:hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.75)}.category-count{color:var(--color-contrast-medium)}.category-post:hover{color:var(--color-contrast-medium)}.tag-cloud{text-align:center}.tag-cloud-item{margin:0.5rem;display:inline-block}.fof::before{background-image:url();background-repeat:no-repeat;background-size:cover;background-position:50% 50%;content:" ";position:fixed;width:100%;height:100%;top:0;left:0;z-index:1}.fof .main-inner{background:rgba(0,0,0,0.25);min-height:100%;min-width:100%;position:absolute;z-index:3}.fof video{position:fixed;top:50%;left:50%;min-width:100%;min-height:100%;width:auto;height:auto;z-index:2;transform:translateX(-50%) translateY(-50%)}.fof h1{font-size:3rem;text-transform:uppercase;letter-spacing:0.3rem;text-align:center;top:15%;left:5%;right:5%;position:absolute;color:#fff;margin:0.67em 0}.fof .fof-footer{font-size:2rem;position:absolute;bottom:15%;left:10%;right:10%;text-align:center}.fof a{color:#eee}.fof a:hover{color:#fff}@media only screen and (max-device-width: 1024px){.fof #bgvid{display:none}}.medium-zoom-overlay,.medium-zoom-image--opened{z-index:5}@keyframes spin{100%{transform:rotateY(360deg)}}.search{display:flex;justify-content:center;border:1px solid var(--color-contrast-medium);min-width:1em;height:1em;line-height:1;border-radius:0.75em;padding:0.25em}.search .search-icon{cursor:pointer;width:1em;height:1em;margin:0;vertical-align:bottom;color:var(--color-contrast-medium);transition:color .5s}.search .search-icon:hover{color:var(--color-primary)}.search[data-running] .search-icon{animation:spin 1.5s linear infinite}.search .search-input{-moz-appearance:textfield;-webkit-appearance:textfield;appearance:textfield;border-width:0;padding:0;margin:0;width:0;outline:none;background:transparent;color:var(--color-contrast-higher);transition:width .5s}.search .search-input:focus{margin-left:0.5em;width:5em}:root{--max-width: 738px}@media (max-width: 738px){.main-inner{width:auto !important}.anchor-link{position:relative;transform:none;float:right}#back-to-top{display:none}.header-inner{width:100%}.site-brand{margin-left:1em}.header-inner{display:block;margin:0;max-width:none}.nav-toggle{display:block}.nav{display:none;text-align:center;margin:2em 0}.menu{display:grid;grid-template-columns:1fr 1fr 1fr;align-items:center}.menu-item{margin:0;padding:1em}.menu-item .icon{margin:0}.menu-item-name{display:block}.header.open .nav{display:block;animation:appear .5s;animation-iteration-count:1;animation-fill-mode:forwards}@keyframes appear{0%{opacity:0;height:0;margin:0;transform:scaleY(0);transform-origin:top}100%{opacity:1;height:10em;margin:2em 0;transform:scaleY(1);transform-origin:top}}.header.open .nav-curtain{animation:appearCurtain .5s;animation-iteration-count:1;animation-fill-mode:forwards}@keyframes appearCurtain{0%{visibility:hidden;opacity:0}100%{visibility:visible;opacity:1}}.header.fade .nav{display:block;animation:fade .5s;animation-iteration-count:1;animation-fill-mode:forwards}@keyframes fade{0%{opacity:1;height:10em;margin:2em 0;transform:scaleY(1);transform-origin:top}100%{opacity:0;height:0;margin:0;transform:scaleY(0);transform-origin:top}}.header.fade .nav-curtain{animation:fadeCurtain .5s;animation-iteration-count:1;animation-fill-mode:forwards}@keyframes fadeCurtain{0%{visibility:visible;opacity:1}100%{visibility:hidden;opacity:0}}#langs li{width:auto}.search-item{grid-column:1 / -1}.search .search-input{margin-left:0.5em;flex:1}}[data-small-caps="true"] .post-body h1,[data-small-caps="true"] .post-body h2,[data-small-caps="true"] .post-body h3,[data-small-caps="true"] .post-body h4,[data-small-caps="true"] .post-body h5,[data-small-caps="true"] .post-body h6{font-variant:small-caps}[data-small-caps="true"] .contents-title{font-variant:small-caps}[data-align="justify"] .post-body p,[data-align="justify"] .post-body li,[data-align="justify"] .post-body dd{text-align:justify;text-justify:distribute}[data-align="justify"] .footnotes a{word-break:break-all}[data-align="center"] .post-body p{text-align:center}[data-type="poetry"] .post-body{display:table;margin:0 auto}[data-type="poetry"] .post-body p{margin:0 0 1em}[data-type="poetry"] .post-body>p:first-child img,[data-type="poetry"] .post-body>p:first-child video{margin-top:0}[data-type="poetry"] .post-body>blockquote:first-child{margin-top:0}[data-type="poetry"] .post-body>blockquote:last-child{margin-bottom:0}[data-type="poetry"] .post-body>p:last-child{margin:0}[data-type="poetry"] .post-body>p:last-child img,[data-type="poetry"] .post-body>p:last-child video{margin-bottom:0}[data-type="poetry"] .post-body>p:last-child .caption{margin:1em 0 0}[data-type="poetry"] section.footnotes>ol>li:last-child>p:last-child{margin:0}[data-toc-num="true"] .contents ol{counter-reset:item}[data-toc-num="true"] .contents ol li::before{counter-increment:item;margin-right:0.5em}[data-toc-num="true"] .contents>ol>li::before{content:counters(item, ".") "."}[data-toc-num="true"] .contents li>ol>li::before{content:counters(item, ".")}@supports not ((backdrop-filter: none) or (-webkit-backdrop-filter: none)){.header-wrapper{background-color:var(--color-bg)}} diff --git a/resources/_gen/assets/scss/scss/main.scss_b17b8b3fd5dba5bd88a508c1c1f3b99b.json b/resources/_gen/assets/scss/scss/main.scss_b17b8b3fd5dba5bd88a508c1c1f3b99b.json new file mode 100644 index 0000000..844ab15 --- /dev/null +++ b/resources/_gen/assets/scss/scss/main.scss_b17b8b3fd5dba5bd88a508c1c1f3b99b.json @@ -0,0 +1 @@ +{"Target":"css/meme.min.21d090babe38ec6e5e83b6b1417c76df8072fac00bb8567a38d6830adc09ca44.css","MediaType":"text/css","Data":{"Integrity":"sha256-IdCQur447G5eg7axQXx234By+sALuFZ6ONaDCtwJykQ="}} \ No newline at end of file diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bd8069567ed069fec4e52ca2d3e8cbb1c110409e GIT binary patch literal 102089 zcmeHQ349FKAAf5}A`(FzsUWFT-4VCa5;r|iqNpoXioYw)xHInisQ&9}D?$H`x{HPe z**JnaqO@o#vM8Y>Qi>pH{@=IRVKSNBo!On0P4a#pUvJ)_e@0-o+?93ZNG{lKe z(-0rhvoIl_W1HhL^Hp3lBpPJ_0mgg_LhcmT5P$#7{H98T6c0p8A7j24A^Rt2NHL_e zzd;2F`E8 zbISedjqf#II_vvD{VbQQGkjb>nzz8K?A#V^r7j0GFVMBUPqlHo-k5%S>GUN8;)j-sD=XMypOU3Pn};^XE0~BCj@lcq@JC zh=eDj_tcM?GU8T~(5v?j^x)>ov#r5hi?n;~;k39>7vh)vHf&W)tEDZ5MHJg|rp?K@ zGe->Nv}d=t-$$y-Y;FTe#=eyw`gm!zj=e9wya zR*fo9Yf#9qMSE&I=l(DvCUs%|%dRB2jnmz9vP$O__wAmepODp!dOxgudPvAGrH5$9 zt^VPMuGd)@vA4;f1qVsFn0aNl#IBDS|GyJ`2se6cspU>*2Zfw1yFk;ZTGXb^4+huU z+hpLPW8~K{Zc7`@IDPc8n{MRm+t&V7xZK6$mG3st`g8lsem^xlzUG3VPNY$#Gdm02 zbeXz2zUqRlPC>;6YP)S6HuQ@ITQuaV$Ap&c+5~rwY}w#!^-cHi4mF&8&eaZZYDDgx9!D0R8qZZ5ac$|iw)cK0&-ouG z$r-)7dj#CvSa3jzT0=q(*SV`16nLoWJ3HbF{jt@VH1b{apvb8zBgoi+%}C3Y+jjnQ zVBEuPyS+KrG9&BE>=L&q!fzHSxBSks_t&(Zb)jvA&MpBbwfpO(tQmJC>HQnkmtFd^ z-Mq~=>K5O?HLaXj>f-V3V?*{&{Nk_s&YsZ`#T!pLb7p+R(89G^4_dV*a`+Duzo^$i zqx<^&gPs8!o=tw}yzD)a7IkjbrQxH>b}md(w#RmvUT1ON!3`U^-zgY=XKc&4eaWLL z-xA{e&$IuAyWO}Hx9G#x?`ay%jF^~q>g}uKudeTDZvU-2TQ$7t7;VbAhxhv~KUv}5 z|CDZ7p?*lIS=|fF?%m7;a zysUoRlM)Y0WklU}jr(~>z^ZY?Z_)^^%lVsbwO$*4X3OeO@_gYaa;3rc@qXuTHy-xu z2-n+XhPRH$c(!K=8SpszN#l1bRjGNP$HRe7%0D9ey57H=a`r--^bOqh{a?o&ytJ_b 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 literal 0 HcmV?d00001 diff --git a/themes/mytheme/LICENSE b/themes/mytheme/LICENSE new file mode 100644 index 0000000..1580f7f --- /dev/null +++ b/themes/mytheme/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2020 nanxiaobei and adityatelange +Copyright (c) 2021-2022 adityatelange + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/themes/mytheme/README.md b/themes/mytheme/README.md new file mode 100644 index 0000000..286617a --- /dev/null +++ b/themes/mytheme/README.md @@ -0,0 +1,96 @@ +

    Hugo PaperMod | Demo

    + +

    ☄️ Fast | ☁️ Fluent | 🌙 Smooth | 📱 Responsive

    +
    + +> Hugo PaperMod is a theme based on [hugo-paper](https://github.com/nanxiaobei/hugo-paper). +> The goal of this project is to add more features and customization to the og theme. + +The [demo](https://adityatelange.github.io/hugo-PaperMod/) includes a lot of documentation about Installation, Features with a few more stuff. Make sure you visit it, to get an awesome hands-on experience and get to know about the features ... + +**ExampleSite** can be found here: [exampleSite](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite). Demo is built up with [exampleSite](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite) as source. + +[![Minimum Hugo Version](https://img.shields.io/static/v1?label=min-HUGO-version&message=0.83.0&color=blue&logo=hugo)](https://github.com/gohugoio/hugo/releases/tag/v0.83.0) +[![Build GH-Pages](https://github.com/adityatelange/hugo-PaperMod/workflows/Build%20GH-Pages/badge.svg)](https://github.com/adityatelange/hugo-PaperMod/deployments/activity_log?environment=github-pages) +[![GitHub](https://img.shields.io/github/license/adityatelange/hugo-PaperMod)](https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE) +[![hugo-papermod](https://img.shields.io/badge/Hugo--Themes-@PaperMod-blue)](https://themes.gohugo.io/themes/hugo-papermod/) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=adityatelange_hugo-PaperMod&metric=alert_status)](https://sonarcloud.io/dashboard?id=adityatelange_hugo-PaperMod) +![code-size](https://img.shields.io/github/languages/code-size/adityatelange/hugo-PaperMod) +[![Discord](https://img.shields.io/discord/971046860317921340?label=Discord)](https://discord.gg/ahpmTvhVmp) + +--- + +

    + Mockup image +

    + +--- + +## Features/Mods 💥 + +- Uses Hugo's asset generator with pipelining, fingerprinting, bundling and minification by default. +- 3 Modes: + - [Regular Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#regular-mode-default-mode) + - [Home-Info Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#home-info-mode) + - [Profile Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#profile-mode) +- Table of Content Generation (newer implementation). +- Archive of posts. +- Social Icons (home-info and profile-mode) +- Social-Media Share buttons on posts. +- Menu location indicator. +- Multilingual support. (with language selector) +- Taxonomies +- Cover image for each post (with Responsive image support). +- Light/Dark theme (automatic theme switch a/c to browser theme and theme-switch button). +- SEO Friendly. +- Multiple Author support. +- Search Page with Fuse.js +- Other Posts suggestion below a post +- Breadcrumb Navigation +- Code Block Copy buttons +- No webpack, nodejs and other dependencies are required to edit the theme. + +Read Wiki For More Details => **[PaperMod - Features](https://github.com/adityatelange/hugo-PaperMod/wiki/Features)** + +--- + +## Install/Update 📥 + +Read Wiki For More Details => **[PaperMod - Installation](https://github.com/adityatelange/hugo-PaperMod/wiki/Installation)** + +--- + +## Social-Icons/Share-Icons 🖼️ + +Read Wiki For More Details => **[PaperMod-Icons](https://github.com/adityatelange/hugo-PaperMod/wiki/Icons)** + +--- + +## FAQs / How To's Guide 🙋 + +Read Wiki For More Details => **[PaperMod-FAQs](https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs)** + +--- + +## Release Changelog 📃 + +Release ChangeLog has info about stuff added: **[Releases](https://github.com/adityatelange/hugo-PaperMod/releases)** + +--- + +## [Pagespeed Insights (100% ?)](https://pagespeed.web.dev/report?url=https://adityatelange.github.io/hugo-PaperMod/) 👀 + +--- + +## Special Thanks 🌟 + +- [**Highlight.js**](https://github.com/highlightjs/highlight.js) +- [**Fuse.js**](https://github.com/krisk/fuse) +- [**Feather Icons**](https://github.com/feathericons/feather) +- [**Simple Icons**](https://github.com/simple-icons/simple-icons) +- **All Contributors and Supporters** + +## Stargazers over time 📈 + +[![Stargazers over time](https://starchart.cc/adityatelange/hugo-PaperMod.svg)](https://starchart.cc/adityatelange/hugo-PaperMod) + diff --git a/themes/mytheme/asd b/themes/mytheme/asd new file mode 100644 index 0000000..b49887d --- /dev/null +++ b/themes/mytheme/asd @@ -0,0 +1,51 @@ +# theme.toml template for a Hugo theme +# See https://github.com/gohugoio/hugoThemes#themetoml for an example + +name = "PaperMod" +license = "MIT" +licenselink = "https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE" +description = "A fast, clean, responsive Hugo theme" +homepage = "https://adityatelange.github.io/hugo-PaperMod/" +tags = [ + "responsive", + "simple", + "clean", + "light", + "dark", + "blog", + "minimalist", + "highlight.js", + "search" +] +features = [ + "responsive", + "single-column", + "blog", + "cover-image", + "table-of-contents", + "opengraph", + "highlight.js", + "favicon", + "archive", + "share-icons", + "cover", + "multilingual", + "social-icons", + "minified-assets", + "theme-toggle", + "menu-location-indicator", + "scroll-to-top", + "search" +] +min_version = "0.83.0" + +[author] + name = "Aditya Telange" + homepage = "https://github.com/adityatelange/" + +# If porting an existing theme +[original] + name = "Paper" + author = "nanxiaobei" + homepage = "https://github.com/nanxiaobei" + repo = "https://github.com/nanxiaobei/hugo-paper/" diff --git a/themes/mytheme/assets/css/common/404.css b/themes/mytheme/assets/css/common/404.css new file mode 100644 index 0000000..8a23430 --- /dev/null +++ b/themes/mytheme/assets/css/common/404.css @@ -0,0 +1,11 @@ +.not-found { + position: absolute; + left: 0; + right: 0; + display: flex; + align-items: center; + justify-content: center; + height: 80%; + font-size: 160px; + font-weight: 700; +} diff --git a/themes/mytheme/assets/css/common/archive.css b/themes/mytheme/assets/css/common/archive.css new file mode 100644 index 0000000..7e7e245 --- /dev/null +++ b/themes/mytheme/assets/css/common/archive.css @@ -0,0 +1,44 @@ +.archive-posts { + width: 100%; + font-size: 16px; +} + +.archive-year { + margin-top: 40px; +} + +.archive-year:not(:last-of-type) { + border-bottom: 2px solid var(--border); +} + +.archive-month { + display: flex; + align-items: flex-start; + padding: 10px 0; +} + +.archive-month-header { + margin: 25px 0; + width: 200px; +} + +.archive-month:not(:last-of-type) { + border-bottom: 1px solid var(--border); +} + +.archive-entry { + position: relative; + padding: 5px; + margin: 10px 0; +} + +.archive-entry-title { + margin: 5px 0; + font-weight: 400; +} + +.archive-count, +.archive-meta { + color: var(--secondary); + font-size: 14px; +} diff --git a/themes/mytheme/assets/css/common/footer.css b/themes/mytheme/assets/css/common/footer.css new file mode 100644 index 0000000..5addb1e --- /dev/null +++ b/themes/mytheme/assets/css/common/footer.css @@ -0,0 +1,60 @@ +.footer, +.top-link { + font-size: 12px; + color: var(--secondary); +} + +.footer { + max-width: calc(var(--main-width) + var(--gap) * 2); + margin: auto; + padding: calc((var(--footer-height) - var(--gap)) / 2) var(--gap); + text-align: center; + line-height: 24px; +} + +.footer span { + margin-inline-start: 1px; + margin-inline-end: 1px; +} + +.footer span:last-child { + white-space: nowrap; +} + +.footer a { + color: inherit; + border-bottom: 1px solid var(--secondary); +} + +.footer a:hover { + border-bottom: 1px solid var(--primary); +} + +.top-link { + visibility: hidden; + position: fixed; + bottom: 60px; + right: 30px; + z-index: 99; + background: var(--tertiary); + width: 42px; + height: 42px; + padding: 12px; + border-radius: 64px; + transition: visibility 0.5s, opacity 0.8s linear; +} + +.top-link, +.top-link svg { + filter: drop-shadow(0px 0px 0px var(--theme)); +} + +.footer a:hover, +.top-link:hover { + color: var(--primary); +} + +.top-link:focus, +#theme-toggle:focus { + outline: 0; +} diff --git a/themes/mytheme/assets/css/common/header.css b/themes/mytheme/assets/css/common/header.css new file mode 100644 index 0000000..64894da --- /dev/null +++ b/themes/mytheme/assets/css/common/header.css @@ -0,0 +1,93 @@ +.nav { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + max-width: calc(var(--nav-width) + var(--gap) * 2); + margin-inline-start: auto; + margin-inline-end: auto; + line-height: var(--header-height); +} + +.nav a { + display: block; +} + +.logo, +#menu { + display: flex; + margin: auto var(--gap); +} + +.logo { + flex-wrap: inherit; +} + +.logo a { + font-size: 24px; + font-weight: 700; +} + +.logo a img, .logo a svg { + display: inline; + vertical-align: middle; + pointer-events: none; + transform: translate(0, -10%); + border-radius: 6px; + margin-inline-end: 8px; +} + +button#theme-toggle { + font-size: 26px; + margin: auto 4px; +} + +body.dark #moon { + vertical-align: middle; + display: none; +} + +body:not(.dark) #sun { + display: none; +} + +#menu { + list-style: none; + word-break: keep-all; + overflow-x: auto; + white-space: nowrap; +} + +#menu li + li { + margin-inline-start: var(--gap); +} + +#menu a { + font-size: 16px; +} + +#menu .active { + font-weight: 500; + border-bottom: 2px solid currentColor; +} + +.lang-switch li, +.lang-switch ul, +.logo-switches { + display: inline-flex; + margin: auto 4px; +} + +.lang-switch { + display: flex; + flex-wrap: inherit; +} + +.lang-switch a { + margin: auto 3px; + font-size: 16px; + font-weight: 500; +} + +.logo-switches { + flex-wrap: inherit; +} diff --git a/themes/mytheme/assets/css/common/main.css b/themes/mytheme/assets/css/common/main.css new file mode 100644 index 0000000..50022ac --- /dev/null +++ b/themes/mytheme/assets/css/common/main.css @@ -0,0 +1,68 @@ +.main { + position: relative; + min-height: calc(100vh - var(--header-height) - var(--footer-height)); + max-width: calc(var(--main-width) + var(--gap) * 2); + margin: auto; + padding: var(--gap); +} + +.page-header h1 { + font-size: 40px; +} + +.pagination { + display: flex; +} + +.pagination a { + color: var(--theme); + font-size: 13px; + line-height: 36px; + background: var(--primary); + border-radius: calc(36px / 2); + padding: 0 16px; +} + +.pagination .next { + margin-inline-start: auto; +} + +.social-icons { + padding: 12px 0; +} + +.social-icons a:not(:last-of-type) { + margin-inline-end: 12px; +} + +.social-icons a svg { + height: 26px; + width: 26px; +} + +code { + direction: ltr; +} + +div.highlight, +pre { + position: relative; +} + +.copy-code { + display: none; + position: absolute; + top: 4px; + right: 4px; + color: rgba(255, 255, 255, 0.8); + background: rgba(78, 78, 78, 0.8); + border-radius: var(--radius); + padding: 0 5px; + font-size: 14px; + user-select: none; +} + +div.highlight:hover .copy-code, +pre:hover .copy-code { + display: block; +} diff --git a/themes/mytheme/assets/css/common/post-entry.css b/themes/mytheme/assets/css/common/post-entry.css new file mode 100644 index 0000000..55fddcb --- /dev/null +++ b/themes/mytheme/assets/css/common/post-entry.css @@ -0,0 +1,104 @@ +.first-entry { + position: relative; + display: flex; + flex-direction: column; + justify-content: center; + min-height: 320px; + margin: var(--gap) 0 calc(var(--gap) * 2) 0; +} + +.first-entry .entry-header { + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; +} + +.first-entry .entry-header h1 { + font-size: 24px; + line-height: 1.3; +} + +.first-entry .entry-content { + margin: 14px 0; + font-size: 16px; + -webkit-line-clamp: 3; +} + +.first-entry .entry-footer { + font-size: 14px; +} + +.home-info .entry-content { + -webkit-line-clamp: unset; +} + +.post-entry { + position: relative; +/** margin-bottom: var(--gap); **/ + padding: var(--gap); +/** background: var(--entry); + border: 1px solid var(--border); **/ + border-radius: var(--radius); + transition: transform 0.1s; +} + +.post-entry:active { + transform: scale(0.96); +} + +.tag-entry .entry-cover { + display: none; +} + +.entry-header h2 { + font-size: 18px; + line-height: 1.3; +} + +.entry-content { + margin: 8px 0; + color: var(--secondary); + font-size: 14px; + line-height: 1.6; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +.entry-footer { + color: var(--secondary); + font-size: 13px; +} + +.entry-link { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; +} + +.entry-cover, +.entry-isdraft { + font-size: 14px; + color: var(--secondary); +} + +.entry-cover { + margin-bottom: var(--gap); + text-align: center; +} + +.entry-cover img { + border-radius: var(--radius); + pointer-events: none; + width: 100%; + height: auto; +} + +.entry-cover a { + color: var(--secondary); + box-shadow: 0 1px 0 var(--primary); +} diff --git a/themes/mytheme/assets/css/common/post-single.css b/themes/mytheme/assets/css/common/post-single.css new file mode 100644 index 0000000..ace4d59 --- /dev/null +++ b/themes/mytheme/assets/css/common/post-single.css @@ -0,0 +1,403 @@ +.page-header, +.post-header { + margin: 24px auto calc(var(--content-gap) + 20px) auto; +} + +.post-title { + margin-top: 10px; + margin-bottom: 16px; + font-size: 24px; +} + +.post-description { + margin-top: 10px; + margin-bottom: 5px; +} + +.post-meta, +.breadcrumbs { + color: var(--secondary); + font-size: 14px; + display: flex; + flex-wrap: wrap; +} + +.post-meta .i18n_list li { + display: inline-flex; + list-style: none; + margin: auto 3px; + box-shadow: 0 1px 0 var(--secondary); +} + +.breadcrumbs a { + font-size: 16px; +} + +.post-content { + font-family: inherit; + color: var(--content); +} + +.post-content h3, +.post-content h4, +.post-content h5,a +.post-content h6 { + margin: 24px 0 16px; +} + +.post-content h1 { + margin: 40px auto 32px; + font-size: 40px; +} + +.post-content h2 { + margin: 32px auto 24px; + font-size: 32px; +} + +.post-content h3 { + font-size: 24px; +} + +.post-content h4 { + font-size: 16px; +} + +.post-content h5 { + font-size: 14px; +} + +.post-content h6 { + font-size: 12px; +} + +.post-content a, +.toc a:hover { + box-shadow: 0 1px 0; +} + +.post-content a code { + margin: auto 0; + border-radius: 0; + box-shadow: 0 -1px 0 var(--primary) inset; +} + +.post-content del { + text-decoration: none; + background: linear-gradient(to right, var(--primary) 100%, transparent 0) 0 50%/1px 1px repeat-x; +} + +.post-content dl, +.post-content ol, +.post-content p, +.post-content figure, +.post-content ul { + margin-bottom: var(--content-gap); +} + +.post-content ol, +.post-content ul { + padding-inline-start: 20px; +} + +.post-content li { + margin-top: 5px; +} + +.post-content li p { + margin-bottom: 0; +} + +.post-content dl { + display: flex; + flex-wrap: wrap; + margin: 0; +} + +.post-content dt { + width: 25%; + font-weight: 700; +} + +.post-content dd { + width: 75%; + margin-inline-start: 0; + padding-inline-start: 10px; +} + +.post-content dd ~ dd, +.post-content dt ~ dt { + margin-top: 10px; +} + +.post-content table { + margin-bottom: 32px; +} + +.post-content table th, +.post-content table:not(.highlighttable, .highlight table, .gist .highlight) td { + min-width: 80px; + padding: 12px 8px; + line-height: 1.5; + border-bottom: 1px solid var(--border); +} + +.post-content table th { + font-size: 14px; + text-align: start; +} + +.post-content table:not(.highlighttable) td code:only-child { + margin: auto 0; +} + +.post-content .highlight table { + border-radius: var(--radius); +} + +.post-content .highlight:not(table) { + margin: 10px auto; + background: var(--hljs-bg) !important; + border-radius: var(--radius); + direction: ltr; +} + +.post-content li > .highlight { + margin-inline-end: 0; +} + +.post-content ul pre { + margin-inline-start: calc(var(--gap) * -2); +} + +.post-content .highlight pre { + margin: 0; +} + +.post-content .highlighttable { + table-layout: fixed; +} + +.post-content .highlighttable td:first-child { + width: 40px; +} + +.post-content .highlighttable td .linenodiv { + padding-inline-end: 0 !important; +} + +.post-content .highlighttable td .highlight, +.post-content .highlighttable td .linenodiv pre { + margin-bottom: 0; +} + +.post-content code { + margin: auto 4px; + padding: 4px 6px; + font-size: 0.78em; + line-height: 1.5; + background: var(--code-bg); + border-radius: 2px; +} + +.post-content pre code { + display: block; + margin: auto 0; + padding: 10px; + color: rgb(213, 213, 214); + background: var(--hljs-bg) !important; + border-radius: var(--radius); + overflow-x: auto; + word-break: break-all; +} + +.post-content blockquote { + margin: 20px 0; + padding: 0 14px; + border-inline-start: 3px solid var(--primary); +} + +.post-content hr { + margin: 30px 0; + height: 2px; + background: var(--tertiary); + border: 0; +} + +.post-content iframe { + max-width: 100%; +} + +.post-content img { + border-radius: 4px; + margin: 1rem 0; +} + +.post-content img[src*="#center"] { + margin: 1rem auto; +} + +.post-content figure.align-center { + text-align: center; +} + +.post-content figure > figcaption { + color: var(--primary); + font-size: 16px; + font-weight: bold; + margin: 8px 0 16px; +} + +.post-content figure > figcaption > p { + color: var(--secondary); + font-size: 14px; + font-weight: normal; +} + +.toc { + margin: 0 2px 40px 2px; + border: 1px solid var(--border); + background: var(--code-bg); + border-radius: var(--radius); + padding: 0.4em; +} + +.dark .toc { + background: var(--entry); +} + +.toc details summary { + cursor: zoom-in; + margin-inline-start: 20px; +} + +.toc details[open] summary { + cursor: zoom-out; +} + +.toc .details { + display: inline; + font-weight: 500; +} + +.toc .inner { + margin: 0 20px; + padding: 10px 20px; +} + +.toc li ul { + margin-inline-start: var(--gap); +} + +.toc summary:focus { + outline: 0; +} + +.post-footer { + margin-top: 56px; +} + +.post-tags li { + display: inline-block; + margin-inline-end: 3px; + margin-bottom: 5px; +} + +.post-tags a, +.share-buttons, +.paginav { + border-radius: var(--radius); +/* background: var(--code-bg); + border: 1px solid var(--code-bg); */ +} + +.post-tags a { + display: block; + padding-inline-start: 14px; + padding-inline-end: 14px; + color: var(--secondary); + font-size: 14px; + line-height: 34px; + background: var(--code-bg); +} +/** +.post-tags a:hover, +.paginav a:hover { + background: var(--border); +} +**/ +.share-buttons { + margin: 14px 0; + padding-inline-start: var(--radius); + display: flex; + justify-content: center; + overflow-x: auto; +} + +.share-buttons a { + margin-top: 10px; +} + +.share-buttons a:not(:last-of-type) { + margin-inline-end: 12px; +} + +h1:hover .anchor, +h2:hover .anchor, +h3:hover .anchor, +h4:hover .anchor, +h5:hover .anchor, +h6:hover .anchor { + display: inline-flex; + color: var(--secondary); + margin-inline-start: 8px; + font-weight: 500; + user-select: none; +} + +.paginav { + margin: 10px 0; + display: flex; + line-height: 30px; + border-radius: var(--radius); +} + +.paginav a { + padding-inline-start: 14px; + padding-inline-end: 14px; + border-radius: var(--radius); +} + +.paginav .title { + letter-spacing: 1px; + text-transform: uppercase; + font-size: small; + color: var(--secondary); +} + +.paginav .prev, +.paginav .next { + width: 50%; +} + +.paginav span:hover:not(.title) { + box-shadow: 0 0px 0; +} + +.paginav .next { + margin-inline-start: auto; + text-align: right; +} + +[dir="rtl"] .paginav .next { + text-align: left; +} + +h1>a>svg { + display: inline; +} + +img.in-text { + display: inline; + margin: auto; +} diff --git a/themes/mytheme/assets/css/common/profile-mode.css b/themes/mytheme/assets/css/common/profile-mode.css new file mode 100644 index 0000000..58f2819 --- /dev/null +++ b/themes/mytheme/assets/css/common/profile-mode.css @@ -0,0 +1,42 @@ +.buttons, +.main .profile { + display: flex; + justify-content: center; +} + +.main .profile { + align-items: center; + min-height: calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2)); + text-align: center; +} + +.profile .profile_inner h1 { + padding: 12px 0; +} + +.profile img { + display: inline-table; + border-radius: 50%; +} + +.buttons { + flex-wrap: wrap; + max-width: 400px; + margin: 0 auto; +} + +.button { + background: var(--tertiary); + border-radius: var(--radius); + margin: 8px; + padding: 6px; + transition: transform 0.1s; +} + +.button-inner { + padding: 0 8px; +} + +.button:active { + transform: scale(0.96); +} diff --git a/themes/mytheme/assets/css/common/search.css b/themes/mytheme/assets/css/common/search.css new file mode 100644 index 0000000..38d5b6b --- /dev/null +++ b/themes/mytheme/assets/css/common/search.css @@ -0,0 +1,45 @@ +#searchbox input { + padding: 4px 10px; + width: 100%; + color: var(--primary); + font-weight: bold; + border: 2px solid var(--tertiary); + border-radius: var(--radius); +} + +#searchbox input:focus { + border-color: var(--secondary); +} + +#searchResults li { + list-style: none; + border-radius: var(--radius); + padding: 10px; + margin: 10px 0; + position: relative; + font-weight: 500; +} + +#searchResults { + margin: 10px 0; + width: 100%; +} + +#searchResults li:active { + transition: transform 0.1s; + transform: scale(0.98); +} + +#searchResults a { + position: absolute; + width: 100%; + height: 100%; + top: 0px; + left: 0px; + outline: none; +} + +#searchResults .focus { + transform: scale(0.98); + border: 2px solid var(--tertiary); +} diff --git a/themes/mytheme/assets/css/common/terms.css b/themes/mytheme/assets/css/common/terms.css new file mode 100644 index 0000000..244614b --- /dev/null +++ b/themes/mytheme/assets/css/common/terms.css @@ -0,0 +1,18 @@ +.terms-tags li { + display: inline-block; + margin: 10px; + font-weight: 500; +} + +.terms-tags a { + display: block; + padding: 3px 10px; + background: var(--tertiary); + border-radius: 6px; + transition: transform 0.1s; +} + +.terms-tags a:active { + background: var(--tertiary); + transform: scale(0.96); +} diff --git a/themes/mytheme/assets/css/core/license.css b/themes/mytheme/assets/css/core/license.css new file mode 100644 index 0000000..8e81d22 --- /dev/null +++ b/themes/mytheme/assets/css/core/license.css @@ -0,0 +1,6 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ diff --git a/themes/mytheme/assets/css/core/reset.css b/themes/mytheme/assets/css/core/reset.css new file mode 100644 index 0000000..1ed0c7e --- /dev/null +++ b/themes/mytheme/assets/css/core/reset.css @@ -0,0 +1,121 @@ +@import url('https://fonts.googleapis.com/css2?family=Source+Sans+3&display=swap'); +@import url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/static/pretendard.css"); + +*, +::after, +::before { + box-sizing: border-box; +} + +html { + -webkit-tap-highlight-color: transparent; + overflow-y: scroll; +} + +a, +button, +body, +h1, +h2, +h3, +h4, +h5, +h6 { + color: var(--primary); +} +h1 { font-size: 24px; } +h2 { font-size: 18px; } +h3 { font-size: 16px; } +body { + font-family: "Source Sans 3", "Pretendard", sans-serif !important; + font-size: 14px; + line-height: 1.8; + word-break: break-word; + background: var(--theme); +} + +article, +aside, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +table { + display: block; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.2; +} + +h1, +h2, +h3, +h4, +h5, +h6, +p { + margin-top: 0; + margin-bottom: 0; +} + +ul { + padding: 0; +} + +a { + text-decoration: none; +} + +body, +figure, +ul { + margin: 0; +} + +table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + overflow-x: auto; + word-break: keep-all; +} + +button, +input, +textarea { + padding: 0; + font: inherit; + background: 0 0; + border: 0; +} + +input, +textarea { + outline: 0; +} + +button, +input[type=button], +input[type=submit] { + cursor: pointer; +} + +input:-webkit-autofill, +textarea:-webkit-autofill { + box-shadow: 0 0 0 50px var(--theme) inset; +} + +img { + display: block; + max-width: 100%; +} diff --git a/themes/mytheme/assets/css/core/theme-vars.css b/themes/mytheme/assets/css/core/theme-vars.css new file mode 100644 index 0000000..6a0382e --- /dev/null +++ b/themes/mytheme/assets/css/core/theme-vars.css @@ -0,0 +1,38 @@ +:root { + --gap: 30px; + --content-gap: 20px; + --nav-width: 1024px; + --main-width: 720px; + --header-height: 60px; + --footer-height: 60px; + --radius: 8px; + --theme: #242424; + --entry: rgb(255, 255, 255); + --primary: rgb(30, 30, 30); + --secondary: rgb(108, 108, 108); + --tertiary: rgb(214, 214, 214); + --content: rgb(31, 31, 31); + --hljs-bg: rgb(28, 29, 33); + --code-bg: rgb(245, 245, 245); + --border: rgb(238, 238, 238); +} + +.dark { + --theme: #242424; + --entry: rgb(46, 46, 51); + --primary: rgb(218, 218, 219); + --secondary: rgb(155, 156, 157); + --tertiary: rgb(65, 66, 68); + --content: white; + --hljs-bg: rgb(46, 46, 51); + --code-bg: rgb(55, 56, 62); + --border: rgb(51, 51, 51); +} + +.list { + background: var(--code-bg); +} + +.dark.list { + background: var(--theme); +} diff --git a/themes/mytheme/assets/css/core/zmedia.css b/themes/mytheme/assets/css/core/zmedia.css new file mode 100644 index 0000000..210d486 --- /dev/null +++ b/themes/mytheme/assets/css/core/zmedia.css @@ -0,0 +1,49 @@ +@media screen and (max-width: 768px) { + /* theme-vars */ + :root { + --gap: 14px; + } + + /* profile-mode */ + .profile img { + transform: scale(0.85); + } + + /* post-entry */ + .first-entry { + min-height: 260px; + } + + /* archive */ + .archive-month { + flex-direction: column; + } + + .archive-year { + margin-top: 20px; + } + + /* footer */ + .footer { + padding: calc((var(--footer-height) - var(--gap) - 10px) / 2) var(--gap); + } +} + +/* footer */ +@media screen and (max-width: 900px) { + .list .top-link { + transform: translateY(-5rem); + } +} + +@media (prefers-reduced-motion) { + /* terms; profile-mode; post-single; post-entry; post-entry; search; search */ + .terms-tags a:active, + .button:active, + .post-entry:active, + .top-link, + #searchResults .focus, + #searchResults li:active { + transform: none; + } +} diff --git a/themes/mytheme/assets/css/extended/blank.css b/themes/mytheme/assets/css/extended/blank.css new file mode 100644 index 0000000..a577295 --- /dev/null +++ b/themes/mytheme/assets/css/extended/blank.css @@ -0,0 +1,5 @@ +/* +This is just a placeholder blank stylesheet so as to support adding custom styles budled with theme's default styles + +Read https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#bundling-custom-css-with-themes-assets for more info +*/ diff --git a/themes/mytheme/assets/css/hljs/an-old-hope.min.css b/themes/mytheme/assets/css/hljs/an-old-hope.min.css new file mode 100644 index 0000000..b5dabdf --- /dev/null +++ b/themes/mytheme/assets/css/hljs/an-old-hope.min.css @@ -0,0 +1,63 @@ +.hljs-comment, +.hljs-quote { + color: #b6b18b; +} + +.hljs-deletion, +.hljs-name, +.hljs-regexp, +.hljs-selector-class, +.hljs-selector-id, +.hljs-tag, +.hljs-template-variable, +.hljs-variable { + color: #eb3c54; +} + +.hljs-built_in, +.hljs-builtin-name, +.hljs-link, +.hljs-literal, +.hljs-meta, +.hljs-number, +.hljs-params, +.hljs-type { + color: #e7ce56; +} + +.hljs-attribute { + color: #ee7c2b; +} + +.hljs-addition, +.hljs-bullet, +.hljs-string, +.hljs-symbol { + color: #4fb4d7; +} + +.hljs-section, +.hljs-title { + color: #78bb65; +} + +.hljs-keyword, +.hljs-selector-tag { + color: #b45ea4; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1c1d21; + color: #c0c5ce; + padding: .5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: 700; +} diff --git a/themes/mytheme/assets/css/includes/scroll-bar.css b/themes/mytheme/assets/css/includes/scroll-bar.css new file mode 100644 index 0000000..47405de --- /dev/null +++ b/themes/mytheme/assets/css/includes/scroll-bar.css @@ -0,0 +1,63 @@ +/* from reset */ +::-webkit-scrollbar-track { + background: 0 0; +} + +.list:not(.dark)::-webkit-scrollbar-track { + background: var(--code-bg); +} + +::-webkit-scrollbar-thumb { + background: var(--tertiary); + border: 5px solid var(--theme); + border-radius: var(--radius); +} + +.list:not(.dark)::-webkit-scrollbar-thumb { + border: 5px solid var(--code-bg); +} + +::-webkit-scrollbar-thumb:hover { + background: var(--secondary); +} + +::-webkit-scrollbar:not(.highlighttable, .highlight table, .gist .highlight) { + background: var(--theme); +} + +/* from post-single */ +.post-content .highlighttable td .highlight pre code::-webkit-scrollbar { + display: none; +} + +.post-content :not(table) ::-webkit-scrollbar-thumb { + border: 2px solid var(--hljs-bg); + background: rgb(113, 113, 117); +} + +.post-content :not(table) ::-webkit-scrollbar-thumb:hover { + background: rgb(163, 163, 165); +} + +.gist table::-webkit-scrollbar-thumb { + border: 2px solid rgb(255, 255, 255); + background: rgb(173, 173, 173); +} + +.gist table::-webkit-scrollbar-thumb:hover { + background: rgb(112, 112, 112); +} + +.post-content table::-webkit-scrollbar-thumb { + border-width: 2px; +} + +/* from zmedia */ +@media screen and (min-width: 768px) { + + /* reset */ + ::-webkit-scrollbar { + width: 19px; + height: 11px; + } +} \ No newline at end of file diff --git a/themes/mytheme/assets/js/fastsearch.js b/themes/mytheme/assets/js/fastsearch.js new file mode 100644 index 0000000..06ebcfb --- /dev/null +++ b/themes/mytheme/assets/js/fastsearch.js @@ -0,0 +1,147 @@ +import * as params from '@params'; + +let fuse; // holds our search engine +let resList = document.getElementById('searchResults'); +let sInput = document.getElementById('searchInput'); +let first, last, current_elem = null +let resultsAvailable = false; + +// load our search index +window.onload = function () { + let xhr = new XMLHttpRequest(); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + if (xhr.status === 200) { + let data = JSON.parse(xhr.responseText); + if (data) { + // fuse.js options; check fuse.js website for details + let options = { + distance: 100, + threshold: 0.4, + ignoreLocation: true, + keys: [ + 'title', + 'permalink', + 'summary', + 'content' + ] + }; + if (params.fuseOpts) { + options = { + isCaseSensitive: params.fuseOpts.iscasesensitive ?? false, + includeScore: params.fuseOpts.includescore ?? false, + includeMatches: params.fuseOpts.includematches ?? false, + minMatchCharLength: params.fuseOpts.minmatchcharlength ?? 1, + shouldSort: params.fuseOpts.shouldsort ?? true, + findAllMatches: params.fuseOpts.findallmatches ?? false, + keys: params.fuseOpts.keys ?? ['title', 'permalink', 'summary', 'content'], + location: params.fuseOpts.location ?? 0, + threshold: params.fuseOpts.threshold ?? 0.4, + distance: params.fuseOpts.distance ?? 100, + ignoreLocation: params.fuseOpts.ignorelocation ?? true + } + } + fuse = new Fuse(data, options); // build the index from the json file + } + } else { + console.log(xhr.responseText); + } + } + }; + xhr.open('GET', "../index.json"); + xhr.send(); +} + +function activeToggle(ae) { + document.querySelectorAll('.focus').forEach(function (element) { + // rm focus class + element.classList.remove("focus") + }); + if (ae) { + ae.focus() + document.activeElement = current_elem = ae; + ae.parentElement.classList.add("focus") + } else { + document.activeElement.parentElement.classList.add("focus") + } +} + +function reset() { + resultsAvailable = false; + resList.innerHTML = sInput.value = ''; // clear inputbox and searchResults + sInput.focus(); // shift focus to input box +} + +// execute search as each character is typed +sInput.onkeyup = function (e) { + // run a search query (for "term") every time a letter is typed + // in the search box + if (fuse) { + const results = fuse.search(this.value.trim()); // the actual query being run using fuse.js + if (results.length !== 0) { + // build our html if result exists + let resultSet = ''; // our results bucket + + for (let item in results) { + resultSet += `
  • ${results[item].item.title} »
    ` + + `
  • ` + } + + resList.innerHTML = resultSet; + resultsAvailable = true; + first = resList.firstChild; + last = resList.lastChild; + } else { + resultsAvailable = false; + resList.innerHTML = ''; + } + } +} + +sInput.addEventListener('search', function (e) { + // clicked on x + if (!this.value) reset() +}) + +// kb bindings +document.onkeydown = function (e) { + let key = e.key; + let ae = document.activeElement; + + let inbox = document.getElementById("searchbox").contains(ae) + + if (ae === sInput) { + let elements = document.getElementsByClassName('focus'); + while (elements.length > 0) { + elements[0].classList.remove('focus'); + } + } else if (current_elem) ae = current_elem; + + if (key === "Escape") { + reset() + } else if (!resultsAvailable || !inbox) { + return + } else if (key === "ArrowDown") { + e.preventDefault(); + if (ae == sInput) { + // if the currently focused element is the search input, focus the of first
  • + activeToggle(resList.firstChild.lastChild); + } else if (ae.parentElement != last) { + // if the currently focused element's parent is last, do nothing + // otherwise select the next search result + activeToggle(ae.parentElement.nextSibling.lastChild); + } + } else if (key === "ArrowUp") { + e.preventDefault(); + if (ae.parentElement == first) { + // if the currently focused element is first item, go to input box + activeToggle(sInput); + } else if (ae != sInput) { + // if the currently focused element is input box, do nothing + // otherwise select the previous search result + activeToggle(ae.parentElement.previousSibling.lastChild); + } + } else if (key === "ArrowRight") { + ae.click(); // click on active link + } +} diff --git a/themes/mytheme/assets/js/fuse.basic.min.js b/themes/mytheme/assets/js/fuse.basic.min.js new file mode 100644 index 0000000..89477c6 --- /dev/null +++ b/themes/mytheme/assets/js/fuse.basic.min.js @@ -0,0 +1,9 @@ +/** + * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2022 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=new Map,r=Math.pow(10,t);return{get:function(t){var i=t.match(_).length;if(n.has(i))return n.get(i);var o=1/Math.pow(i,.5*e),a=parseFloat(Math.round(o*r)/r);return n.set(i,a),a},clear:function(){n.clear()}}}var O=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.getFn,i=void 0===n?L.getFn:n,o=t.fieldNormWeight,a=void 0===o?L.fieldNormWeight:o;r(this,e),this.norm=S(a,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return o(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,u(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();u(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?L.getFn:r,o=n.fieldNormWeight,a=void 0===o?L.fieldNormWeight:o,c=new O({getFn:i,fieldNormWeight:a});return c.setKeys(e.map(k)),c.setSources(t),c.create(),c}function j(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,a=t.expectedLocation,c=void 0===a?0:a,s=t.distance,h=void 0===s?L.distance:s,u=t.ignoreLocation,l=void 0===u?L.ignoreLocation:u,d=r/e.length;if(l)return d;var f=Math.abs(c-o);return h?d+f/h:f?1:d}function E(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:L.minMatchCharLength,n=[],r=-1,i=-1,o=0,a=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}var I=32;function F(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,a=void 0===o?L.location:o,c=i.threshold,s=void 0===c?L.threshold:c,h=i.distance,u=void 0===h?L.distance:h,l=i.includeMatches,d=void 0===l?L.includeMatches:l,f=i.findAllMatches,v=void 0===f?L.findAllMatches:f,g=i.minMatchCharLength,y=void 0===g?L.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?L.isCaseSensitive:p,b=i.ignoreLocation,k=void 0===b?L.ignoreLocation:b;if(r(this,e),this.options={location:a,threshold:s,distance:u,includeMatches:d,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:k},this.pattern=m?t:t.toLowerCase(),this.chunks=[],this.pattern.length){var M=function(e,t){n.chunks.push({pattern:e,alphabet:F(e),startIndex:t})},w=this.pattern.length;if(w>I){for(var x=0,_=w%I,S=w-_;x3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?L.location:i,a=r.distance,c=void 0===a?L.distance:a,s=r.threshold,h=void 0===s?L.threshold:s,u=r.findAllMatches,l=void 0===u?L.findAllMatches:u,d=r.minMatchCharLength,f=void 0===d?L.minMatchCharLength:d,v=r.includeMatches,g=void 0===v?L.includeMatches:v,y=r.ignoreLocation,m=void 0===y?L.ignoreLocation:y;if(t.length>I)throw new Error(p(I));for(var b,k=t.length,M=e.length,w=Math.max(0,Math.min(o,M)),x=h,_=w,S=f>1||g,O=S?Array(M):[];(b=e.indexOf(t,_))>-1;){var A=j(t,{currentLocation:b,expectedLocation:w,distance:c,ignoreLocation:m});if(x=Math.min(A,x),_=b+k,S)for(var F=0;F=T;R-=1){var U=R-1,B=n[e.charAt(U)];if(S&&(O[U]=+!!B),J[R]=(J[R+1]<<1|1)&B,$&&(J[R]|=(C[R+1]|C[R])<<1|1|C[R+1]),J[R]&W&&(N=j(t,{errors:$,currentLocation:U,expectedLocation:w,distance:c,ignoreLocation:m}))<=x){if(x=N,(_=U)<=w)break;T=Math.max(1,2*w-_)}}if(j(t,{errors:$+1,currentLocation:w,expectedLocation:w,distance:c,ignoreLocation:m})>x)break;C=J}var V={isMatch:_>=0,score:Math.max(.001,N)};if(S){var q=E(O,f);q.length?g&&(V.indices=q):V.isMatch=!1}return V}(e,n,i,{location:a+o,distance:s,threshold:h,findAllMatches:u,minMatchCharLength:l,includeMatches:r,ignoreLocation:d}),m=y.isMatch,b=y.score,k=y.indices;m&&(g=!0),v+=b,m&&k&&(f=[].concat(c(f),c(k)))}));var y={isMatch:g,score:g?v/this.chunks.length:1};return g&&r&&(y.indices=f),y}}]),e}(),N=[];function P(e,t){for(var n=0,r=N.length;n-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function D(e,t){t.score=e.score}function K(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?L.includeMatches:r,o=n.includeScore,a=void 0===o?L.includeScore:o,c=[];return i&&c.push($),a&&c.push(D),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return c.length&&c.forEach((function(t){t(e,r)})),r}))}var T=function(){function e(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:void 0;if(r(this,e),this.options=t(t({},L),i),this.options.useExtendedSearch)throw new Error(y);this._keyStore=new b(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof O))throw new Error("Incorrect 'index' type");this._myIndex=t||A(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){f(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{},n=t.limit,r=void 0===n?-1:n,i=this.options,o=i.includeMatches,a=i.includeScore,c=i.shouldSort,s=i.sortFn,h=i.ignoreFieldNorm,d=u(e)?u(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return W(d,{ignoreFieldNorm:h}),c&&d.sort(s),l(r)&&r>-1&&(d=d.slice(0,r)),K(d,this._docs,{includeMatches:o,includeScore:a})}},{key:"_searchStringList",value:function(e){var t=P(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(f(n)){var a=t.searchIn(n),c=a.isMatch,s=a.score,h=a.indices;c&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:h}]})}})),r}},{key:"_searchLogical",value:function(e){throw new Error("Logical search is not available")}},{key:"_searchObjectList",value:function(e){var t=this,n=P(e,this.options),r=this._myIndex,i=r.keys,o=r.records,a=[];return o.forEach((function(e){var r=e.$,o=e.i;if(f(r)){var s=[];i.forEach((function(e,i){s.push.apply(s,c(t._findMatches({key:e,value:r[i],searcher:n})))})),s.length&&a.push({idx:o,item:r,matches:s})}})),a}},{key:"_findMatches",value:function(e){var t=e.key,n=e.value,r=e.searcher;if(!f(n))return[];var i=[];if(h(n))n.forEach((function(e){var n=e.v,o=e.i,a=e.n;if(f(n)){var c=r.searchIn(n),s=c.isMatch,h=c.score,u=c.indices;s&&i.push({score:h,key:t,value:n,idx:o,norm:a,indices:u})}}));else{var o=n.v,a=n.n,c=r.searchIn(o),s=c.isMatch,u=c.score,l=c.indices;s&&i.push({score:u,key:t,value:o,norm:a,indices:l})}return i}}]),e}();return T.version="6.6.2",T.createIndex=A,T.parseIndex=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?L.getFn:n,i=t.fieldNormWeight,o=void 0===i?L.fieldNormWeight:i,a=e.keys,c=e.records,s=new O({getFn:r,fieldNormWeight:o});return s.setKeys(a),s.setIndexRecords(c),s},T.config=L,T},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t(); \ No newline at end of file diff --git a/themes/mytheme/assets/js/highlight.min.js b/themes/mytheme/assets/js/highlight.min.js new file mode 100644 index 0000000..93a6f86 --- /dev/null +++ b/themes/mytheme/assets/js/highlight.min.js @@ -0,0 +1,44 @@ +/* + Highlight.js 10.2.1 (32fb9a1d) + License: BSD-3-Clause + Copyright (c) 2006-2020, Ivan Sagalaev +*/ +var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){s+=""}function g(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var d=l();if(s+=t(r.substring(i,d[0].offset)),i=d[0].offset,d===e){o.reverse().forEach(u);do{g(d.splice(0,1)[0]),d=l()}while(d===e&&d.length&&d[0].offset===i);o.reverse().forEach(c)}else"start"===d[0].event?o.push(d[0].node):o.pop(),g(d.splice(0,1)[0])}return s+t(r.substr(i))}});const s="",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=``}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function g(e){return e?"string"==typeof e?e:e.source:null}const d="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},m={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},b=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(m),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=b("//","$"),x=b("/\\*","\\*/"),E=b("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:d,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>g(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:m,COMMENT:b,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:d,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),w="of and for in not or if then".split(" ");function N(e,n){return n?+n:function(e){return w.includes(e.toLowerCase())}(e)?0:1}const y={props:["language","code","autodetect"],data:function(){return{detectedLanguage:"",unknownLanguage:!1}},computed:{className(){return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){if(!this.autoDetect&&!hljs.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`),this.unknownLanguage=!0,t(this.code);let e;return this.autoDetect?(e=hljs.highlightAuto(this.code),this.detectedLanguage=e.language):(e=hljs.highlight(this.language,this.code,this.ignoreIllegals),this.detectectLanguage=this.language),e.value},autoDetect(){return!(this.language&&(e=this.autodetect,!e&&""!==e));var e},ignoreIllegals:()=>!0},render(e){return e("pre",{},[e("code",{class:this.className,domProps:{innerHTML:this.highlighted}})])}},R={install(e){e.component("highlightjs",y)}},k=t,M=r,{nodeStream:O,mergeStreams:L}=i,A=Symbol("nomatch");return function(t){var a=[],i=Object.create(null),s=Object.create(null),o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,d="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function m(e,n,t,r){var a={code:n,language:e};j("before:highlight",a);var i=a.result?a.result:b(a.language,a.code,t,r);return i.code=a.code,j("after:highlight",i),i}function b(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=R.subLanguage?function(){if(""!==L){var e=null;if("string"==typeof R.subLanguage){if(!i[R.subLanguage])return void O.addText(L);e=b(R.subLanguage,L,!0,M[R.subLanguage]),M[R.subLanguage]=e.top}else e=v(L,R.subLanguage.length?R.subLanguage:null);R.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!R.keywords)return void O.addText(L);let e=0;R.keywordPatternRe.lastIndex=0;let n=R.keywordPatternRe.exec(L),t="";for(;n;){t+=L.substring(e,n.index);const r=c(R,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=R.keywordPatternRe.lastIndex,n=R.keywordPatternRe.exec(L)}t+=L.substr(e),O.addText(t)}(),L=""}function h(e){return e.className&&O.openNode(e.className),R=Object.create(e,{parent:{value:R}})}function p(e){return 0===R.matcher.regexIndex?(L+=e[0],1):(S=!0,0)}var m={};function x(t,r){var i=r&&r[0];if(L+=t,null==i)return u(),0;if("begin"===m.type&&"end"===r.type&&m.index===r.index&&""===i){if(L+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=m.rule,n}return 1}if(m=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?L+=t:(r.excludeBegin&&(L+=t),u(),r.returnBegin||r.excludeBegin||(L=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(R.className||"")+'"');throw e.mode=R,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(R,e,r);if(!a)return A;var i=R;i.skip?L+=t:(i.returnEnd||i.excludeEnd||(L+=t),u(),i.excludeEnd&&(L=t));do{R.className&&O.closeNode(),R.skip||R.subLanguage||(I+=R.relevance),R=R.parent}while(R!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==A)return s}if("illegal"===r.type&&""===i)return 1;if(j>1e5&&j>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return L+=i,i.length}var E=y(e);if(!E)throw console.error(d.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(g(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;let t=n.exec(e);if(this.resumingScanAtSamePosition())if(t&&t.index===this.lastIndex);else{const n=this.getMatcher(0);n.lastIndex=this.lastIndex+1,t=n.exec(e)}return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&this.considerAll()),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,N(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=g(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),w="",R=s||_,M={},O=new f.__emitter(f);!function(){for(var e=[],n=R;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var L="",I=0,T=0,j=0,S=!1;try{for(R.matcher.considerAll();;){j++,S?S=!1:R.matcher.considerAll(),R.matcher.lastIndex=T;const e=R.matcher.exec(o);if(!e)break;const n=x(o.substring(T,e.index),e);T=e.index+n}return x(o.substr(T)),O.closeAllNodes(),O.finalize(),w=O.toHTML(),{relevance:I,value:w,language:e,illegal:!1,emitter:O,top:R}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(T-100,T+100),mode:n.mode},sofar:w,relevance:0,value:k(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:k(o),emitter:O,language:e,top:R,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:k(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(y).filter(T).forEach((function(n){var a=b(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"
    ":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=y(t[1]);return r||(console.warn(d.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||y(e))}(e);if(p(t))return;j("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n"):n=e;const r=n.textContent,a=t?m(t,r,!0):v(r),i=O(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=L(i,O(e),r)}a.value=x(a.value),j("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const w=()=>{if(!w.called){w.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function y(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function I(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function T(e){var n=y(e);return n&&!n.disableAutodetect}function j(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:m,highlightAuto:v,fixMarkup:function(e){return console.warn("fixMarkup is deprecated and will be removed entirely in v11.0"),console.warn("Please see https://github.com/highlightjs/highlight.js/issues/2534"),x(e)},highlightBlock:E,configure:function(e){f=M(f,e)},initHighlighting:w,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",w,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&I(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:y,registerAliases:I,requireLanguage:function(e){var n=y(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:T,inherit:M,addPlugin:function(e){o.push(e)},vuePlugin:R}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.2.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); +hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}()); +hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}()); +hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin://,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}()); +hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.requireLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}()); +hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}()); +hljs.registerLanguage("cpp",function(){"use strict";return function(e){var i=e.requireLanguage("c-like").rawDefinition();return i.disableAutodetect=!1,i.name="C++",i.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],i}}()); +hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in init int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"record",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}()); +hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}()); +hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}()); +hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface enum",end:/[{;=]/,excludeEnd:!0,keywords:"class interface enum",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}()); +hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*$)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:""},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}()); +hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}()); +hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}()); +hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}()); +hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); +hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:")",end:">",keywords:{name:"style"},contains:[c],starts:{end:"",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:")",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}()); +hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}()); +hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}()); +hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}()); +hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}()); +hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]},n=e.inherit(e.APOS_STRING_MODE,{illegal:null}),i=e.inherit(e.QUOTE_STRING_MODE,{illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(a)}),o=e.END_SAME_AS_BEGIN({begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/,contains:e.QUOTE_STRING_MODE.contains.concat(a)}),l={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[e.inherit(n,{begin:"b'",end:"'"}),e.inherit(i,{begin:'b"',end:'"'}),i,n,o]},s={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},c={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:c,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:c,contains:["self",r,e.C_BLOCK_COMMENT_MODE,l,s]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},l,s]}}}()); +hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}()); +hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}()); +hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}()); +hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}()); +hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}()); +hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}()); +hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}}()); +hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}()); +hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}()); +hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}()); +hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin://},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}()); +hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}()); \ No newline at end of file diff --git a/themes/mytheme/assets/js/license.js b/themes/mytheme/assets/js/license.js new file mode 100644 index 0000000..8e81d22 --- /dev/null +++ b/themes/mytheme/assets/js/license.js @@ -0,0 +1,6 @@ +/* + PaperMod v6 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2022 adityatelange +*/ diff --git a/themes/mytheme/go.mod b/themes/mytheme/go.mod new file mode 100644 index 0000000..af95855 --- /dev/null +++ b/themes/mytheme/go.mod @@ -0,0 +1,3 @@ +module github.com/adityatelange/hugo-PaperMod + +go 1.12 diff --git a/themes/mytheme/i18n/ar.yaml b/themes/mytheme/i18n/ar.yaml new file mode 100644 index 0000000..11f50a2 --- /dev/null +++ b/themes/mytheme/i18n/ar.yaml @@ -0,0 +1,22 @@ +- id: prev_page + translation: "الصفحة السابقة" + +- id: next_page + translation: "الصفحة التالية" + +- id: read_time + translation: + one: "دقيقة واحدة" + two: "دقيقتان" + few: "بضع ثوان" + zero: "الآن" + other: "دقائق {{ .Count }}" + +- id: toc + translation: "فهرس المحتوى" + +- id: translations + translation: "ترجمات أخرى" + +- id: home + translation: "الصفحة الرئيسية" diff --git a/themes/mytheme/i18n/bg.yaml b/themes/mytheme/i18n/bg.yaml new file mode 100644 index 0000000..1e314af --- /dev/null +++ b/themes/mytheme/i18n/bg.yaml @@ -0,0 +1,16 @@ +- id: prev_page + translation: "Предишна страница" + +- id: next_page + translation: "Следваща страница" + +- id: read_time + translation: + one : "1 мин" + other: "{{ .Count }} мин" + +- id: toc + translation: "Съдържание" + +- id: translations + translation: "Преводи" diff --git a/themes/mytheme/i18n/bn.yaml b/themes/mytheme/i18n/bn.yaml new file mode 100644 index 0000000..9c5a2c4 --- /dev/null +++ b/themes/mytheme/i18n/bn.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "পূর্ববর্তী" + +- id: next_page + translation: "পরবর্তী" + +- id: read_time + translation: + one : "১ মিনিট" + other: "{{ .Count }} মিনিট" + +- id: toc + translation: "সূচিপত্র" + +- id: translations + translation: "অনুবাদসমূহ" + +- id: home + translation: "হোম" + +- id: edit_post + translation: "সম্পাদনা করুন" + +- id: code_copy + translation: "কপি করুন" + +- id: code_copied + translation: "কপি হয়েছে!" diff --git a/themes/mytheme/i18n/ca.yaml b/themes/mytheme/i18n/ca.yaml new file mode 100644 index 0000000..15713e1 --- /dev/null +++ b/themes/mytheme/i18n/ca.yaml @@ -0,0 +1,19 @@ +- id: prev_page + translation: "Pàgina anterior" + +- id: next_page + translation: "Pàgina següent" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: toc + translation: "Taula de Continguts" + +- id: translations + translation: "Traduccions" + +- id: home + translation: "Inici" diff --git a/themes/mytheme/i18n/ckb.yaml b/themes/mytheme/i18n/ckb.yaml new file mode 100644 index 0000000..25789d1 --- /dev/null +++ b/themes/mytheme/i18n/ckb.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "پەڕەی پێشتر" + +- id: next_page + translation: "پەڕەی دواتر" + +- id: read_time + translation: + one : "1 خولەک" + other: "{{ .Count }} خولەک" + +- id: toc + translation: "پێڕست" + +- id: translations + translation: "وەرگێڕانەکان" + +- id: home + translation: "ماڵەوە" + +- id: code_copy + translation: "لەبەری بگرەوە" + +- id: code_copied + translation: "لەبەر گیرایەوە!" diff --git a/themes/mytheme/i18n/da.yaml b/themes/mytheme/i18n/da.yaml new file mode 100644 index 0000000..03b0abe --- /dev/null +++ b/themes/mytheme/i18n/da.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "Forrige Side" + +- id: next_page + translation: "Næste Side" + +- id: read_time + translation: + one: "1 min" + other: "{{ .Count }} min" + +- id: toc + translation: "Indholdsfortegnelse" + +- id: translations + translation: "Oversættelser" + +- id: home + translation: "Start" + +- id: edit_post + translation: "Rediger" + +- id: code_copy + translation: "kopier" + +- id: code_copied + translation: "kopieret!" diff --git a/themes/mytheme/i18n/de.yaml b/themes/mytheme/i18n/de.yaml new file mode 100644 index 0000000..f64aad9 --- /dev/null +++ b/themes/mytheme/i18n/de.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Vorherige" + +- id: next_page + translation: "Nächste" + +- id: read_time + translation: + one: "1 Minute" + other: "{{ .Count }} Minuten" + +- id: words + translation: + one : "Wort" + other: "{{ .Count }} Wörter" + +- id: toc + translation: "Inhaltsverzeichnis" + +- id: translations + translation: "Übersetzungen" + +- id: home + translation: "Home" + +- id: edit_post + translation: "Bearbeiten" + +- id: code_copy + translation: "Kopieren" + +- id: code_copied + translation: "Kopiert!" diff --git a/themes/mytheme/i18n/en.yaml b/themes/mytheme/i18n/en.yaml new file mode 100644 index 0000000..3a1e215 --- /dev/null +++ b/themes/mytheme/i18n/en.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Prev" + +- id: next_page + translation: "Next" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "word" + other: "{{ .Count }} words" + +- id: toc + translation: "Table of Contents" + +- id: translations + translation: "Translations" + +- id: home + translation: "Home" + +- id: edit_post + translation: "Edit" + +- id: code_copy + translation: "copy" + +- id: code_copied + translation: "copied!" diff --git a/themes/mytheme/i18n/eo.yaml b/themes/mytheme/i18n/eo.yaml new file mode 100644 index 0000000..de5d744 --- /dev/null +++ b/themes/mytheme/i18n/eo.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "antaŭa paĝo" + +- id: next_page + translation: "sekva paĝo" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: toc + translation: "Enhavo" + +- id: translations + translation: "tradukoj" + +- id: home + translation: "ĉefpaĝo" + +- id: code_copy + translation: "kopii" + +- id: code_copied + translation: "kopiite!" diff --git a/themes/mytheme/i18n/es.yaml b/themes/mytheme/i18n/es.yaml new file mode 100644 index 0000000..52a559c --- /dev/null +++ b/themes/mytheme/i18n/es.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Anterior" + +- id: next_page + translation: "Siguiente" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "palabra" + other: "{{ .Count }} palabras" + +- id: toc + translation: "Tabla de Contenidos" + +- id: translations + translation: "Traducciones" + +- id: home + translation: "Inicio" + +- id: edit_post + translation: "Editar" + +- id: code_copy + translation: "copiar" + +- id: code_copied + translation: "¡copiado!" diff --git a/themes/mytheme/i18n/fa.yaml b/themes/mytheme/i18n/fa.yaml new file mode 100644 index 0000000..3fd5927 --- /dev/null +++ b/themes/mytheme/i18n/fa.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "صفحه قبلی" + +- id: next_page + translation: "صفحه بعدی" + +- id: read_time + translation: + one: "۱ دقیقه" + other: "{{ .Count }} دقیقه" + +- id: toc + translation: "فهرست مطالب" + +- id: translations + translation: "ترجمه ها" + +- id: home + translation: "خانه" + +- id: edit_post + translation: "ویرایش" + +- id: code_copy + translation: "کپی" + +- id: code_copied + translation: "کپی شد!" \ No newline at end of file diff --git a/themes/mytheme/i18n/fr.yaml b/themes/mytheme/i18n/fr.yaml new file mode 100644 index 0000000..b074c10 --- /dev/null +++ b/themes/mytheme/i18n/fr.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Page précédente" + +- id: next_page + translation: "Page suivante" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "mot" + other: "{{ .Count }} mots" + +- id: toc + translation: "Table des matières" + +- id: translations + translation: "Traductions" + +- id: home + translation: "Accueil" + +- id: edit_post + translation: "Modifier" + +- id: code_copy + translation: "Copier" + +- id: code_copied + translation: "Copié !" diff --git a/themes/mytheme/i18n/he.yaml b/themes/mytheme/i18n/he.yaml new file mode 100644 index 0000000..6d203f4 --- /dev/null +++ b/themes/mytheme/i18n/he.yaml @@ -0,0 +1,19 @@ +- id: prev_page + translation: "לעמוד הקודם" + +- id: next_page + translation: "לעמוד הבא" + +- id: read_time + translation: + one : "דקה אחת" + other: "{{ .Count }} דקות" + +- id: toc + translation: "תוכן עניינים" + +- id: translations + translation: "תרגומים" + +- id: home + translation: "דף בית" diff --git a/themes/mytheme/i18n/hi.yaml b/themes/mytheme/i18n/hi.yaml new file mode 100644 index 0000000..681efdc --- /dev/null +++ b/themes/mytheme/i18n/hi.yaml @@ -0,0 +1,19 @@ +- id: prev_page + translation: "पिछला" + +- id: next_page + translation: "अगला" + +- id: read_time + translation: + one : "एक मिनट" + other: "{{ .Count }} मिनट" + +- id: edit_post + translation: "सुधारें" + +- id: toc + translation: "विषय - सूची" + +- id: translations + translation: "अनुवाद" diff --git a/themes/mytheme/i18n/hu.yaml b/themes/mytheme/i18n/hu.yaml new file mode 100644 index 0000000..a039dda --- /dev/null +++ b/themes/mytheme/i18n/hu.yaml @@ -0,0 +1,16 @@ +- id: prev_page + translation: "Előző oldal" + +- id: next_page + translation: "Következő oldal" + +- id: read_time + translation: + one: "1 perc" + other: "{{ .Count }} perc" + +- id: toc + translation: "Tartalomjegyzék" + +- id: translations + translation: "Fordítások" diff --git a/themes/mytheme/i18n/id.yaml b/themes/mytheme/i18n/id.yaml new file mode 100644 index 0000000..93d34f5 --- /dev/null +++ b/themes/mytheme/i18n/id.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Sebelumnya" + +- id: next_page + translation: "Selanjutnya" + +- id: read_time + translation: + one : "1 menit" + other: "{{ .Count }} menit" + +- id: words + translation: + one : "kata" + other: "{{ .Count }} kata" + +- id: toc + translation: "Daftar isi" + +- id: translations + translation: "Terjemahan" + +- id: home + translation: "Beranda" + +- id: edit_post + translation: "Sunting" + +- id: code_copy + translation: "salin" + +- id: code_copied + translation: "disalin!" \ No newline at end of file diff --git a/themes/mytheme/i18n/it.yaml b/themes/mytheme/i18n/it.yaml new file mode 100644 index 0000000..ef41db4 --- /dev/null +++ b/themes/mytheme/i18n/it.yaml @@ -0,0 +1,27 @@ +- id: prev_page + translation: "Pag Prec" + +- id: next_page + translation: "Pag Succ" + +- id: read_time + translation: + one: "1 minuto" + other: "{{ .Count }} minuti" + +- id: words + translation: + one : "parola" + other: "{{ .Count }} parole" + +- id: toc + translation: "Tabella dei Contenuti" + +- id: translations + translation: "Traduzioni" + +- id: code_copy + translation: "copia" + +- id: code_copied + translation: "copiato!" diff --git a/themes/mytheme/i18n/ja.yaml b/themes/mytheme/i18n/ja.yaml new file mode 100644 index 0000000..bc7bf37 --- /dev/null +++ b/themes/mytheme/i18n/ja.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "前のページ" + +- id: next_page + translation: "次のページ" + +- id: read_time + translation: + one : "1 分" + other: "{{ .Count }} 分" + +- id: words + translation: + one: "文字" + other: "{{ .Count }} 文字" + +- id: toc + translation: "目次" + +- id: translations + translation: "言語" + +- id: home + translation: "ホーム" + +- id: edit_post + translation: "編集" + +- id: code_copy + translation: "コピー" + +- id: code_copied + translation: "コピーされました!" diff --git a/themes/mytheme/i18n/ko.yaml b/themes/mytheme/i18n/ko.yaml new file mode 100644 index 0000000..777dd93 --- /dev/null +++ b/themes/mytheme/i18n/ko.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "이전 페이지" + +- id: next_page + translation: "다음 페이지" + +- id: read_time + translation: + one : "1 분" + other: "{{ .Count }} 분" + +- id: words + translation: + one : "단어" + other: "{{ .Count }} 단어" + +- id: toc + translation: "목차" + +- id: translations + translation: "번역" + +- id: home + translation: "홈" + +- id: edit_post + translation: "편집" + +- id: code_copy + translation: "복사" + +- id: code_copied + translation: "복사 완료!" diff --git a/themes/mytheme/i18n/ku.yaml b/themes/mytheme/i18n/ku.yaml new file mode 100644 index 0000000..d1d30a5 --- /dev/null +++ b/themes/mytheme/i18n/ku.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "Rûpela Paş" + +- id: next_page + translation: "Rûpela Pêş" + +- id: read_time + translation: + one : "1 xulek" + other: "{{ .Count }} xulek" + +- id: toc + translation: "Pêrist" + +- id: translations + translation: "Wergeran" + +- id: home + translation: "Xanî" + +- id: code_copy + translation: "Jê bigire" + +- id: code_copied + translation: "Hat jêgirtin!" diff --git a/themes/mytheme/i18n/mn.yaml b/themes/mytheme/i18n/mn.yaml new file mode 100644 index 0000000..dbce2ce --- /dev/null +++ b/themes/mytheme/i18n/mn.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "Ѳмнѳх" + +- id: next_page + translation: "Дараах" + +- id: read_time + translation: + one : "1 МИН" + other: "{{ .Count }} МИН" + +- id: toc + translation: "Агуулга" + +- id: translations + translation: "Орчуулга" + +- id: home + translation: "Нүүр" + +- id: code_copy + translation: "хуулах" + +- id: code_copied + translation: "хуулсан!" diff --git a/themes/mytheme/i18n/ms.yaml b/themes/mytheme/i18n/ms.yaml new file mode 100644 index 0000000..d8a9eff --- /dev/null +++ b/themes/mytheme/i18n/ms.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "Halaman Sebelumnya" + +- id: next_page + translation: "Halaman Seterusnya" + +- id: read_time + translation: + one: "1 minit" + other: "{{ .Count }} minit" + +- id: toc + translation: "Isi Kandungan" + +- id: translations + translation: "Terjemahan" + +- id: home + translation: "Home" + +- id: edit_post + translation: "Sunting" + +- id: code_copy + translation: "Salin" + +- id: code_copied + translation: "Disalin!" diff --git a/themes/mytheme/i18n/nl.yaml b/themes/mytheme/i18n/nl.yaml new file mode 100644 index 0000000..e9d06fa --- /dev/null +++ b/themes/mytheme/i18n/nl.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Vorige" + +- id: next_page + translation: "Volgende" + +- id: read_time + translation: + one: "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "woord" + other: "{{ .Count }} woorden" + +- id: toc + translation: "Inhoudsopgave" + +- id: translations + translation: "Vertalingen" + +- id: home + translation: "Startpagina" + +- id: edit_post + translation: "Bewerk" + +- id: code_copy + translation: "kopieer" + +- id: code_copied + translation: "gekopieerd!" diff --git a/themes/mytheme/i18n/pl.yaml b/themes/mytheme/i18n/pl.yaml new file mode 100644 index 0000000..fdf6b0c --- /dev/null +++ b/themes/mytheme/i18n/pl.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "Poprzednia strona" + +- id: next_page + translation: "Następna strona" + +- id: read_time + translation: + one: "1 min" + other: "{{ .Count }} min" + +- id: toc + translation: "Spis treści" + +- id: translations + translation: "Tłumaczenia" + +- id: home + translation: "Strona Główna" + +- id: edit_post + translation: "Edytuj" + +- id: code_copy + translation: "Kopiuj" + +- id: code_copied + translation: "Skopiowano!" diff --git a/themes/mytheme/i18n/pt.yaml b/themes/mytheme/i18n/pt.yaml new file mode 100644 index 0000000..f449de9 --- /dev/null +++ b/themes/mytheme/i18n/pt.yaml @@ -0,0 +1,21 @@ +- id: prev_page + translation: "Página Anterior" + +- id: next_page + translation: "Próxima Página" + +- id: read_time + translation: + one: "1 minuto" + other: "{{ .Count }} minutos" + +- id: words + translation: + one : "palavra" + other: "{{ .Count }} palavras" + +- id: toc + translation: "Conteúdo" + +- id: translations + translation: "Traduções" diff --git a/themes/mytheme/i18n/ru.yaml b/themes/mytheme/i18n/ru.yaml new file mode 100644 index 0000000..a5dbb5c --- /dev/null +++ b/themes/mytheme/i18n/ru.yaml @@ -0,0 +1,39 @@ +- id: prev_page + translation: "Предыдущая" + +- id: next_page + translation: "Следующая" + +- id: read_time + translation: + zero: "0 минут" + one: "1 минута" + few: "{{ .Count }} минуты" + many: "{{ .Count }} минут" + other: "{{ .Count }} минута" + +- id: words + translation: + zero: "0 слов" + one: "1 слово" + few: "{{ .Count }} слова" + many: "{{ .Count }} слов" + other: "{{ .Count }} слово" + +- id: toc + translation: "Оглавление" + +- id: translations + translation: "Переводы" + +- id: home + translation: "Главная" + +- id: edit_post + translation: "Редактировать" + +- id: code_copy + translation: "копировать" + +- id: code_copied + translation: "скопировано!" \ No newline at end of file diff --git a/themes/mytheme/i18n/sv.yaml b/themes/mytheme/i18n/sv.yaml new file mode 100644 index 0000000..65ce422 --- /dev/null +++ b/themes/mytheme/i18n/sv.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "Förra Sidan" + +- id: next_page + translation: "Nästa Sida" + +- id: read_time + translation: + one: "1 min" + other: "{{ .Count }} min" + +- id: toc + translation: "Innehållsförteckning" + +- id: translations + translation: "Översättningar" + +- id: home + translation: "Hem" + +- id: edit_post + translation: "Redigera" + +- id: code_copy + translation: "kopiera" + +- id: code_copied + translation: "kopierad!" diff --git a/themes/mytheme/i18n/tr.yaml b/themes/mytheme/i18n/tr.yaml new file mode 100644 index 0000000..e598b41 --- /dev/null +++ b/themes/mytheme/i18n/tr.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "Önceki Sayfa" + +- id: next_page + translation: "Sonraki Sayfa" + +- id: read_time + translation: + one : "1 dk" + other: "{{ .Count }} dk" + +- id: toc + translation: "İçindekiler" + +- id: translations + translation: "Çeviriler" + +- id: home + translation: "Anasayfa" + +- id: code_copy + translation: "Kopyala" + +- id: code_copied + translation: "Kopyalandı!" diff --git a/themes/mytheme/i18n/uk.yaml b/themes/mytheme/i18n/uk.yaml new file mode 100644 index 0000000..41be964 --- /dev/null +++ b/themes/mytheme/i18n/uk.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "Попередня" + +- id: next_page + translation: "Наступна" + +- id: read_time + translation: + one : "1 хвилина" + other: "{{ .Count }} хвилин" + +- id: toc + translation: "Зміст" + +- id: translations + translation: "Переклади" + +- id: home + translation: "Головна" + +- id: code_copy + translation: "копіювати" + +- id: code_copied + translation: "скопійовано!" \ No newline at end of file diff --git a/themes/mytheme/i18n/uz.yaml b/themes/mytheme/i18n/uz.yaml new file mode 100644 index 0000000..c9f2375 --- /dev/null +++ b/themes/mytheme/i18n/uz.yaml @@ -0,0 +1,20 @@ +- id: prev_page + translation: "Oldingi sahifa" + +- id: next_page + translation: "Keyingi sahifa" + +- id: read_time + translation: + one : "Bir daqiqa" + other: "{{ .Count }} daqiqa" + +- id: toc + translation: "Mundarija" + +- id: translations + translation: "Tarjimalar" + +- id: home + translation: "Bosh sahifa" + diff --git a/themes/mytheme/i18n/vi.yaml b/themes/mytheme/i18n/vi.yaml new file mode 100644 index 0000000..a3832ed --- /dev/null +++ b/themes/mytheme/i18n/vi.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "Trang trước" + +- id: next_page + translation: "Trang tiếp theo" + +- id: read_time + translation: + one : "1 phút" + other: "{{ .Count }} phút" + +- id: toc + translation: "Mục lục" + +- id: translations + translation: "Bản dịch" + +- id: home + translation: "Trang chủ" + +- id: code_copy + translation: "Sao chép" + +- id: code_copied + translation: "Đã sao chép!" diff --git a/themes/mytheme/i18n/zh-tw.yaml b/themes/mytheme/i18n/zh-tw.yaml new file mode 100644 index 0000000..48b84d2 --- /dev/null +++ b/themes/mytheme/i18n/zh-tw.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "上一頁" + +- id: next_page + translation: "下一頁" + +- id: read_time + translation: + one : "1 分鐘" + other: "{{ .Count }} 分鐘" + +- id: words + translation: + one: "字" + other: "{{ .Count }} 字" + +- id: toc + translation: "目錄" + +- id: translations + translation: "語言" + +- id: home + translation: "首頁" + +- id: edit_post + translation: "編輯" + +- id: code_copy + translation: "複製" + +- id: code_copied + translation: "已複製!" diff --git a/themes/mytheme/i18n/zh.yaml b/themes/mytheme/i18n/zh.yaml new file mode 100644 index 0000000..0280425 --- /dev/null +++ b/themes/mytheme/i18n/zh.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "上一页" + +- id: next_page + translation: "下一页" + +- id: read_time + translation: + one : "1 分钟" + other: "{{ .Count }} 分钟" + +- id: words + translation: + one: "字" + other: "{{ .Count }} 字" + +- id: toc + translation: "目录" + +- id: translations + translation: "语言" + +- id: home + translation: "主页" + +- id: edit_post + translation: "编辑" + +- id: code_copy + translation: "复制" + +- id: code_copied + translation: "已复制!" diff --git a/themes/mytheme/images/screenshot.png b/themes/mytheme/images/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a37c485abef2bfce648503d110b7b580da91325c GIT binary patch literal 141511 zcmeFZi96N%8a8e>?n5}7ho=4P1|8AC|OOqpkm>}p35B9h8Hm0`)SP<9DL zEJG|qCG(Wb^Y8ww&iP%}`yag5d!5d?&M9g6em}$W+|T{o_j5~wqPTu7=UNsPmi0=f zPiV5RtZZdrS>F5mDtzVN4YFPMzZI58)sC{TybNA9Z@LnH-eq=LQ;mhiYcC7Sl^ZN9 zv-r}LUKSQtQ5Kf|^DHdV4_R2YU5YL^Ba6RSbwNe(1j`cn&l6f=D891VMM>@C>hEhf zmP`F{$u*@3|CmMT#8GXJmccgnXzdBw(&&^F-R+{Kw@G;Wqg?`j8=W|M#_SI7fm;Vo zIsUxEspXLI&Z?5O*DKWaX{}Y-8RztW1BNdA7Qbfg?!QYlw|+j>EL}*qte#o8>YSyr z*_=f(v#0arwrHs??`k_?%k~~;d6PXmHZYdqQJBBx-pbZ5|L-5ZR9z|E`JX>r5!`iY z^?!c9Yu)dyzy0U;@0Tre|L^x_{a^L%rM^jc;3XT@vP*tE{4o^n{=a@bH1qL&tj(9% zDP`Gv$2K-Ix~3xR88-IzI>(P+?;jZGa>{r4c8jmFXKd&EX0r9zm9*WLRu?~EExTtO zl_jW>tesLmARM8B|5EL%veK?^-OH`qR&(8y-KnrmZrQYvQoJUxi9Bc@MUfr- z*N7|Il-7qBUFQ@% zf2CSs$tT9OQGe}73#h|5>|koxAkKGEoWVZdJLT z@Aup;@1*?hH`#2tUqoc&O6;@Y*llES2M_=8m!-XZIwvQmgz1|bZPcs(ly~BL@smuZ z2jr%X5IIsuUF^12$ zn(Bv3%gE%KS8Pf*$W>-g?df59#{9wM*>tMB%E;L8fN%J^keaOF;dhazdFoqR2Xk&7 zP}5Qg7p#qza&~Fdx12cJD9Vb}Q>&4iiVmrG-s+II`Bi!6<*u%-o%hTZpPG1(OA_n8 zbLUPxrT{njC{V@j<+%mp0W-@2!32-n^=gYA?4q-RU(ql;_%c_mIt((yP_< za+4F}-<{Z9?QdCZd+}A91KYN3mR<8)$^oYPc5Fz^$e`enL(4nQ=;(wA?BCxtH8*8j zn4X?qFw_00q0rsY$a^UF=Zud@)T1pdlN)euc+cyH2dv+opcJ~dLX_3j#l@;Q%VKuA zGdN5+e#_lc6ZqZ0XS3jjSC>1@^~33zviDE#i&U+o+UK`9B-)tiZM&6VT`8d!Pq*gX zw1)4?lo#!%hb*OLx~*b7Mm>>!`|X7gp4gfm?f8+DO>$$Q%JI=QE)i9{_|my~{EJ*F zb@Hsprdz!;J+V!<_#S_LX459hN?Vv@7`(i2GWZYKEo=EV-5PW`+U(mJ=^WO)G+a#& z8sH68!oTgg$nsSNYk5yDz%(g4TdQQYAv4FOL11ArucYDO0kf=4K3I3&O}FHPLr?Q; zxpkuW)6v45g~E@=H_AQliS=)f+$>X=lLUMQaMcUHhoHR}`{+*=vq+R;im&YC*a@5_oMN=S5)4?HQ zc4{QEGf0L~7P!$}IP3Y)w)<5PB2E1bsSTe#JqZurdb7+F!QkoB-Q*f?=A&rG%KN%; z7(7Zy&d3lJI`>Lr-8NxuEv-;hx;A!xuj<1m&w`|t{Ypy8y^M^EQqt2KZnN#z*3(OD zY}9?*d3k2RPe)t3_jxF#?!F>dvbk6?l}hD0O0|wMDDrr@Rmk9ZMJV5XEY6`l7e73V zvy$j?nE8Ece~u=iu6xFViZ&)d7uM?RLkg;}ti?w(Ws++z&2 zTb%A_X-RQ!_f+Ke`Ek|2z~Dh>=rg~CS!*m$p{ybaA(KYkE&kQfQaI942h0La1?|Y! zvWi+0BraIxbnK_9scN^(O$&X>)%ysK`RA%#{ih}nTJnk~gp7Pf-{O*oQ1z}R()+lY z<|0S9+VYxd?1^&+-6s}<)Frro4>0ZhceA>-n%doS!Vw4UK0hg07;==J`5x-}W)0uI z7)t7sCrA8B{1aaerA*uCm4EWhH=>oK9!s<1HWS=RH(8q16Ees-t!L~Rzd>RC63%$K zG0mW%p+T;Awfhq7bHlXTgtykYb7=~TqrsFo-KlSxAAT0LG$t-kSf;-r=@s+XF?0pO zoEEQUWMnixR|+M;49kyCvTrNU>2oo-fBJ;~!hlKcrLS*dsGUyv<9OcQl+=tmy^>j- zM1jJWFV7rmy>$JcLu-<@055~;eU9CeX1tzV^hkt>Uw*apfMDV`qZYqEvo3d@YV+)g z@j|HBvi7FeITu;Hru5hc@rmo)^GD+2YB}a zabQ!PJu8!1MVGK(P)QQ;o3YsG{NX@lMFoPB*9dJY$E8oR=YmXj`iFyVY4Wj>w&BAC z1Hw4PZ<6g^+B2lox0(37EFQhoj^^rJcM%)@ zrK(z#_2jcNu?bf&W?cVA%m66e%tB!{XXYGyN6@G z8R_Y2NLzFS#_yvZ(QlI4ChpfX=I=P<5FK>*+wb}3goTWY&Z^6f-gx&9$Fp@JMH&LS|$Q z4GndSjMB}5q)s8HRIk5>eLc(VKmU^I&?cZnQYU#RJriG@lP6C~_dO4duF1hM8tbWP z>i+mhM^`uD)@DBGl0A`Ql8)`Nk_Qh8@bM`g58TjjW6fqS?JvuxFMRROEsZ$6SFpO( zv_`h^p{Jad&eyRS?Q`b@%S69V&BcTZN1lHb7kAXX!#9uQj?10zltMI<9~2Z6JfI{3 z0s)KAmt-SV1!5?+4JkUaZ6khsc;DhoT{X^1gDOrW#VI> zpGr8|3*Y$^?l%pD*)v+G_Ky%V$OafsIOG{7Yb)b_7iK4%g420as(9T|t(J<9ZJx|}Ky(Yb>6hbh!gI~O3#KRC^U6Y@=Vz09RANBDmC?T)m3fV+r1Avgb{Y<4u*KTW(wRx81}pPXJC zq?BZ>M1d`9`yP7_pAluRZz@@I)en!qbT}=L+wUw_up+KP@j=J-G($(4j!J~E4sw9B zwDdR!d|OiEDDhJ_~og$NSd<$Y&QhlC62KgG@sWd-{jv~bXH$vjbWqbf2n zK>X0*UqDvd#3a-5vFE9hnU9X->6@wPxLkdWhK@SEzO>C6j;*iGJUex_4yz@c*_5iV z(5LP-l-pF#ylL%8XP#+mXk0oHTstt4^6J%R&nU0)-r8z+#&C(=NYPl3-_l$MGEC}= z7a9{26D0UM6wh3o7-HxN2?-U9zT2K_QMI+9zW#8JRqv-buldn(f?{JXy;%dCJp1MP z#___A1&Y1BJz$O&GGBsvY=+6=&j?N_r{@5JE_Ag+)jg77H z<3}B_$okfN=ZQD#MD}gHBjw&Ce$_j`lpVo|FUBRL`fw*JK8Yj?am#9L9B4zsM_gXL zf02-qlAL_sp5Zmq6*1BM$gxtC6{lP+Mp`HFu~*8s(O1|~sgI8isUsPP(8ie`1=L-g z|FBBdAtE9ou}Y-m9L;M&Q%^4fw?V?DejoOsx|#wE#P>mA_*Lf?)>RXe49C>`eEm$? zWE8plI;pzW?M0p;&u`ye8{<3KJUbSj@w-zI*pBFsT;`7?;79<^2e%5vJ@>;+8?ASm?Rj@U<*(AlkY5jFQr=#!Qn;|M^bt zmLkuwxWzD19u@x(tg0KxEFp)XGg!eG(TP*eD`#g1Vlvi1h;BYC_(g}&)i4aXUn)3pWq$ro3l)KLip8}Wms9nGaJN++3rIn{3RWki1UgBoPRvj zkv7^{o|>DhLtx@K&X3Kve{UJkymGrgL_XV}@#>h#TuW2*OxgyQuBrAH_J*&|Yc!eo z(+GUuyELAt&|sTMOZaooDH2KmX%eFzJ#wuQ%Cq|Z{=V|w(Ak=$d3F43u7SnR;fZN{HA`u$iA>;TZ*|Bra}C&{LB&wvUtn+872 zh4B}!y?Kmmw4l-~J$8}YajUM%u-V|H>5X#00;B>UWsQ(gfi{5@396A#PwbA<7Rc3N z=&+cut{5(jIFexb_3okeeN|cYb#>pyWovST`) zn2oJ%uE*#FoJJ&6oPJMQJJ(#cpi1CQw}-+-KaSx+V?4Vff6gs<^(QBqMS0d08^`f|NgV!XXXA}Yx>^YoE)psZ*OI8&PPrj zAOX&6qQBu;>{EM2e}BIdm!kx7Cho<_lQ*{to_zuctDk+b@97=ky6uidaVWr)LV~2a z*>Q#6<^Nu({lk(vTC2$2cYUM$rDJ2_)rXHGz(4!>^CzmB+3~(-0DDchPd#hNvbb}x z=5ab=g#d8;>uW24O!3x8rL$B1OYS88gisZVUtM^+w&xfrz)LMdljZ$M^f!I80`cm7 z&zSYk?-d08k1x)R*!I^aSN}|~7En+yxq0(ub!g$bt%4fP&e;w{qo)AoKlEt{SFCCE zm5)_cQPI)Rcmj-1eu&q2tztuKYg$&8nB^SRKK1$Y6P@M3O(-&RTnBVXn8dM0Tp0Ih+4X2wd9(MG0Hk-ZT*@!hC+ zG!Q+Jy|JGYUjw=Oe^!Y!0f_W$ISgQRnDM@%;*6hPabuePGsGpEPfw0kAK?1uiYMMH zB`vM~9}aN|+eSg!c%6#$Z0|GIt}s2D=^tNb5j%8HZjfpKQ6(iaQ%^cZ7jXluK*DLB zZ(D4;y1S*#YI2tMFUsUy{KzR}QhW~4=nMiU!dx_;pgfYOtD9R2AUb#fQVpF^+!>#e zBGA)k!(t*!j_Vauc6@NtySv-Hi}u==^zIiDYH%-^Gg{9n@jiL$S={Z5)zQfW5Tf9q z+*C9(d#0tsb?0sLoq(Md$40aT;?IjFkwlwW^z$}w?}e8Su?R6#(d`HAF3rX(K070a zSE_bHly=^{D@@rMAP#rEFq%z%?Cma$y@1L<2z@sBKV4>25#dP`_DS zHZI?}r!q?rx8An$0l$E-u-o2$D`fj4`(pD@rQ+R`LzZ2=LXqm)vhw=TMD<02{@Q8Y z1TkgV8>Z@I>LQUK?*L*&J1YPw+~t%^DPO;=r2@x}Wv)g-jTC-rYH9_baT@CCcH`P+ znkb;Qqb<%35aj2zf)@F>KXQZxTY$10h1-Y&-{4?z5D(kdtZ|Ag>LDK^F0c-Z*Q|v_CF+WOUQ?6*SuS)9}$IT$i*0Jl7&Tl zM&YnDK#p$#ppoRo59~3{)l#d|E%U9TNVzQOHh5N2LZTOduAywBLK-UJ1)!t)#&ko% zhM~MBuUhSeG72TZ$Y_j9c}MV0k}gn1WMBMPH#br;BDn4DDT0`>-+O`%AM02cb|+km z6)v}Q_d_!m^4xgi)lO?p9v})|-*qX#^*On0su(%r!CNxlkn2s5U~Y295~xV*rjRBiVylEB=GOp zFmQD>*C*`LZtJ-TuYFtUo}RozcmQOwLAUM3nR(?ty0P!5LtGsZZVx;;UnL}*a_*_t zSz27kMTj$UYqmh0gj*4c4Z(?W0mm_Zwn;(_2MDxJ3^F0P_Jq@rL$OJ+636ER=6L$VE`;eoIh4h`9YycZaD367O5r0CDbWM1H<08yUZ|}3< z;WO656JBh;uZZS*u5cGs1S$Z+72x!xms63-wc7leEh759hpIP{EYU|#w5@%5l1bH= zzrS~UHgfrAcV=X<(C0jG;RZ#1#(c&{9A*yyMs^;&}}Z7xMW^( z&p!tS6hSyj)-&s|@1#C%+Q&%khJgti5-|4d)7X7qW7i+|au%-b&)ykaPB&`>N*whl zDt{#=HzxkNpu7|HIc4eHKOatHlbDcIF3JjeqK~kM9G20wd!A#}Qgzeo2;+rlG<@(< z#B*RK0Ixo5UG0_MmPZ>87N)u_Nkme`5~H1N6Eq5D4?t?C_uxy)(vR2ISKH#SDJRnV zJ4#BldLQry^mDB+!MPx%az@clWrBJ)?^Qi){?#^Nn_t4p4-fdY9ssyvo9E|!dZt%z z*pY2r0iFfg(?~~ z(ZCi({qQcIV3kBVr97A1Q1ELz9KP`88X@bbcSctE$mXdm|_Qy7p7taY-Nr!hc}rQ9vMYHI0^Yj|e`> zzZBx7TdAj~w;vTbaPrqnXSsdH?*o2`pzwCeuLlR zS)agpPWHWF#X%??1}w|#@G}Hsx6R1q{$5J-=T7e$V6E}lflPpvb|%5pQ$Ulc$|Asp z&^-ks#dA3*y2z>#(l8~Zu7WRia4>bQpwMfRNBPJ>zF42E$9}WcgshJ^=X8slcNgh& zWKqI_5Mb?6w*F9Wy_UKTa7XqCNJMgYNb{m0RZj$`ij>XZLBhhqR=Y0yxYID+{PFls zYy&C+|6UwEvOM5Ob3Ml{g4wR3+5=Jb+M3Ko4d?f85pJON$Jerk&!3Y>ngS(G8Cf7D zDi#Dc$spGzZ1?@YQ&Ll7+@7z#X3E}D;F?OpQCLI-IU^_>@pp6rSx`m+C7ky3^o$a- zxJ_zD1eKj`pG}c@KYsiebtlNH@&uzp)3s!rUOvr#2rwh=lA{b`w9uyer+1+=jzUXLieg^y1M3S zNq!rfi8iaTE2r9%cOSCwD;&Fh54#GRpke+acQIBTF+#av1tK)K3MV!S>RdtTOr`iJ& z;rB9Q$8nHf^r z3sz;32t=wn1hvYe=?>^i5TpyH-Pr+sCc>$qWFaw$P!``Oya@EJeWoa*zF_QB!HYt) zDNR3H+t4tzzuyLEyU9~w>zzJSwT=5TivYAhgSn2r-A1ZmseR>=9zV{LFbEpTy_@%u zv}+29L&($0AsPAIoZ#GSfS*Zn1P@IZPc3!12B~d?TBxcTc)6hZn?d)SLxPd2sc9T3 zi{z%iTu0G?TS7UbcX&r5mG4^OVeN4xK`d{i&W$xyfz^K z!Y%sd$7-4~{TFQc?ApUrd0(^Xor}Z%NXsqbqeLg+Wl)xVjFMCV35?hSKudS@pECp) zw*l-d7|g0dPwN-W*N~{rjVzCpr}XHcy%X1US%9T+&`D=d4B-wFwv&*&sHq$J4wx7l z59b80xp|DxcEvx#GJ6qd+=aFMrwTjz0720FBmo60n1SkK;?)J9xcu`l~i^) zC8PWcmY+=;v$}{1fZSQUFv0!`bImmpPTx=C7?8A2Fa$_0Ui1b1<~`b6n~X@Bl#XdM za&L<-neP&*UIfihk6@FVmxn6nb>v~U`RUODG?ZdGn_rk-_nR)`wn1$~v5l#$RPNc4 zX;i2ir*Rq!_s}e;7D=&BR`+)t>@Rc>Y-pBv%04!trhT~aFeWAjKMJn_(il~haquU( zY&+C6ii&|?j*ytHy?%nbj4}dEzuUKOM}Lyzyo+$7LXepk4K=GK&!#h%FTWJu7G}y` z=p$Dqp@yyw_Msw6kbsQqNBJIZ3@k$tTCG(YX?FNw2M0c>rKJS~PmFGKq?yXz(CQ++ z$ftZI9U`dt1$#z4wgi`lQ4$-Po0GX0e*~h$Xhdii0B{90c$$Zt(+RJz*w_+vbs2x% z$i$s!ZL-~Y>owTXIXdp4`6f&7=CQxtUO0dr)sbCKfL)84P)2|@IWO94*O4WNHLU7# zk}7%BHWe9Z*EBM<|Ii^l)Uq*@{W~`72M?yc>3dJl$j=H^mRNu7SIbS#%S`$*9(7e! zR=OZy_pAHQh9V&29ncB;hl_1p;z{R-`WErnN*!W;KV^X=QW)vu7Fl1MEv zTV=BN6jUe(u7;+j)Z*gyX5+no2c6hWxmlXg@@)`(oBf+^9j-FpD_@yra`tQzIDLI& zOJk!KtLe6a|rYxITHPO zB@5{wDE2GK1s%#BPK+@l(X9}D^2*9e9_u_IIVWdlHf)6LuGvu zU~AXqsD%8gj^q#LtlLaFF2~9Q@oui(wq?tXx|$tF-2T8`XhaH(s;)dT<^OQ%UkNqR zE+bUT;!IC2dPN9+d@gQ@*JC6kRE(dHvZAk&pGjy z4<1`M|NACT?dpUl{ZC#a)7HilQ*+ufOqKtTf z-u6L{zqE~wGZ1~C7NFl$2M^%z>gy`Pdx@0HXCc`>Hy7ilO8{j*M{}Y-L`Asvg=v{v zfv5~(JE=JnWBm*WaRT0GbGNrF7inPX>XHoHduAn(pqwA^X>pG=nlSE&=yK1iZWqkX zo14q=-O*p_sy^4zFjKk3k(7mwMWX>I^Ldh=K0T%|Q=v}kiy;@gz<%~Awz0L2{n`f zE!O;@l*9?grAbFpkLQ|}twIF(`O^viVmxVAGm!d!_$5@qPpu>bfDyiZyAbx^LDG{a zrI8%QA-J3|x6T>~HwkmU&9OI((|GSGC?bBwc8cpxVfLYci`6=Kdr;f;?d=)S(K`SS zQV})fV;zIbAD!mOv1c5Vl$1@qZ zN+Y<5V&o!wz~&eJ;pHF22HZFH6?W*1EGD%EU7aJeA~zx}<#SP9aFJ_AN03>Ej_bee zJ31Dl1AW^RrxJgkr0!JRTRKu4TQeI;sNd3_wv4r}r-zq+FVq(s)P<`Fc;tvRk@3_+TR4V;@2Q_K&6QQVYpng z!|o-i%qZp-#m@HY@2B+?H@dTUzZLz5Yje0k_{lFDetq5L_)VEBv09G8=FX0W# zk9-TR{{O0tSbkW5_y6_XEJwEDhWzLE_g1bL{?Bh&%zwK|6a~y*`v3d(|E#zc_71 zNH;<_Kw+n?uMd#7rk$CRW4%e*{qn~Fp5r0uAC~U(Komq|abTarI!2nnJf&@>96st- z68niMB>s_q@kW_xasD!vE6d+cf3MjoETw7MoSej(XX3OvW(wT|bdI4*xcD(Dext&? z2D2|OKWB&1>KIdIT-vjhZJ6cCanRP0-IG#9LRBFa`m23e156JqgqSlX|Kcc*(9Kez z#)N-eqa2_TVxB7!kvnY4uPf3u9@0GL6KS!T*M5Xi>@(wpk}2l$JC4elnx?_#Y#lAF zXF#os&V}#zoJ$x!x?~xy)U3ubl>TMP9)Kz?T-YcjUL~TkbJXh1jWu90-yhwnh?)cy zAtZq4OF?lVY5x9?yE|pVKl%DMho_}GTSyk|)Bls>rsDfS=L}XfXaW+yQ-s43OEXVgSrXd3JYo0JueRpfD|B{9_ed?jM__=XejabUqJhYbOPNqS^_{a5waWwn~j5m z?%^G1O*NqSPK1Eu&sQTG%O14p@YxR0etJE!@RC!uOV*KY*{9dBF246vzO%1bk#W8p z7k_K=zb%D4Wg3*3(Sq?hN2{S0Nm7nXpy8N`wgW2RwKt`^rp_v-&zV?PrDlCRmme^H z=JzsM^MOEXzTf+w}^8p{emGOpFagrlZ8u#{)7E37w9AOBr%J};| z!H44t?HMQu>w^8p_kb=M7JGP*^|&F`u6Cz;Yn;Zu??sQHm?R32XNtk$7W!aaP>-M+ z<2;*ZImrMGY9*0^cWUaCWQsFut+c^q80It03OcZ#s`*mcra0gD8Y*~W>!`6hFQ*tG?V@!6D36C0~6_nOZZF^*3i zE2)2}R`I~(*58VnIhMT+H`q+vgX`RsGmH~$-{1QS1vaOw`9mLjXNw!h#N>uQIPka^ zo4-2wnOPbfuHVR7p&Km zSyUQ+i74NGUnpTp zGp^NF?JI0N)EeKFn{%FNcGCz?H5i@rnpwL(Qod&L6K&tF+`zDZW*+pa;*6_*65$Bh ze{WChh1;1W>ei7s3j&OT=F|HvD){vOtgv`5$`fzK2zCEYSpDl1%BsUe=?dKrd;}+A zT8%xm)1 z{A|>wF`YAN(a7kyJoxss1>f;3&V;HS$B3%fXWGxzZe_T|8+F}ww+qYE5TkK%B=9>P zJrb~6*(LsgmAX=h?Ca>EA&clw3tajE=DM+ayB?@W(JT^m-(SkNC}3^=x;{(mPmag3 zzchR-m-hY1Tsw&F-)(m!ig&qdqeQBpxa0D_em95FQi1{$O>-H0KIk?e5e^;*JocB6 ze%1-}_O)fX^zf=U4E3N$QNRyU0~dmzyxx8P6N1bHnmMT;O)Jbb^YilwsRFJYG?H@u zxr{b0$GvI6Z!bWqgE-motBN&yVsn@yF&=k`1^kEVzJ3beF4q_5jLP#s}5y>2Vr1B;E&&}&^IlB zG?}PW8>O)W;Eb5h^7hWQ{jd^n1*?RB&H|Um6cdu}b>~0glLh{ZTnfwGHP!}cXW3GV zxTg3T`sKSmA9#D*NSW{4?Yy_&_g6N{&m>#Vi@S{6=CA#e$kBW3V`ZDVrYbBI**bn) zsq5>V+$uKv{9A`am)M&u1BH9H%P;msFfBS)YW^m9OI5J!ZwGKyYH(Tm87TJCpJB;O)@YvB<**i)lyiRsX_BB)2N*tsx-(8>xnuw*S1Nz z=dHw2vzhFsTUHQ85xs@{^q1wNaZa=w*)&z1IrM>3q0Bzh=i-$&WDed7pUbxP=67fo z#@O$?9Y@Q&|MhBaZ94$^AhE_q2AhG?rX`gbNj8osdd9(0)n|(#t9=)YZ z{#>W*`j-an*II|-yd8pkE}k2myivC%c$58^ncK_6WHbB&h7;mW>`U?RJ}b5!$)Dk` z=j8L#;K17^1s;xo53&(-xp!URbswG0o1*{PlXxtLsU2k5A@D(X70c)SkxvfMN4(V) zVzg-PBA9Aam^&%d6bbEdymIcif6{{kXKw|)p!dJUrt9^FTE7ds9na>tu8QLOGv})H zd&58OiFAl?yqj#Yml}w2h%kTqU93~g=wdg|`>x9ss&*j_)aYAU%-9{cg&ARM5`xl`hT7ow9dVaPx<6G?m`<3mz3{F`+lbyLb6gKRa=@atJ-ZXyq8YQaF z+t))2pVuFMeCDu0)V(S{@TyHIFD z?$L{1FYQ$)?oyT=n^0k0@vW09U62K%3N`tQvJG_W#2705ds1ZhVQ(?J&!R-3Oj+qw z;v4OAcPhD#(V!iAKx{ z+3mzSh2AnzirLuNxrCblkRuGChc-z&dC#=6<)HdIYDCxm@zbY{RcI83xMgfI4L1Lm z8aNzsPKv8*%W5{;Ax(j(d(D5|&$IF_ap$wkv#+4$RNbC%sA5m}D}pT~*S=U=^hBhR z4)gXMerV;gmgO@a(|*~u=ws~l3M!p(fsw`RL!ASDvIrzlKR4b=v{V|w{M_H{nC z=7XLriYx3Zx}OlzWfCGD01tN#0ySvDtsxJRo7}!35X^soy07&4@|q`eFJamuVMbBG zgFz)V6m}u_IRDm!8x(Q}5;34{M%2t4-1pg8z|o`*t?m_vm0W z-xhuZD!A-DJ+x?ic!!%nx469pQpZ%`&YA?ZM_ZtvvNgxD1+_7>Zs-jZz;Xdi zAB|D!3ndOo`B|HG_&=WZDUR`q8aaD_d+p5!%JE);FdRbC65jSWbGYYymLSZ43!Ikd z+FDxnQ0DHO*j*U&!OgvM+AcO$s7z15`BMphe!seAxq;`;WwAGg^F#jPmFc{lcan$0 zsb`kQH*0BUN=sf|NG;!QbCXl5!O7-4LX50JwwL~!3bqHR@;0-3%J>+7ksRPa(Jqy{hIV@g!Laug<_T=FC$J7p*{YT5(!o+ox z-O1Ng3!~cP-o7~01JOqQ9mPt{Q7vA*MI|?@n?*Cf0sfl!9SLCNl{Qn(Q8f2bjpTB# zsW>CP`Du$>nOieeHR3P&y}=ybGJ6;9SLV%5`K<9zA6X=Jim7HMIWaka9jeUW5V9t0 zYD>SL@$4&ZJD^o$0!o-y0^3Kap6F*NEX!TR4@toC^!I{Ixmi>KaFct=St9=4s}?n$ zeCW6xBfMio4_?H{K4;ZLI_dr6d!WdhSS%b#Nh>*`*|0IQxb7dH`u6bXHa$Y^^@V{jhTHF3$Zz;jN72GPJ!j#V+(0!hggpjp_CU* zZgSi2D_kJ_OU}u0$y~NTi#dNVyXHUc8B#d)CB|mtwR@>R@uFuu?UJ=3Z0nW@_BqcTR50IUVQk& zLdOagmcSs!kgh1Z%OXRR6^=is8PG6=T{=q%W;pAh^BtbrM4_V{7c@@iiO8^ja2*fJEgT}W@hBxF?HgDjr+CV8;RCRbq{|OszXlE>$fsj9>ZYQ33j&7}dE^3uRaoG>ZqFb*BmB{sQyu;$5av}& z_4W7HEx}h~1G5iAALI^-MMBjZ@#gCb_`Y1=k|&aLY}MSBc_2lgx`CpxYC4u6UXjc5 z1RxWgoOvvrhhWOzIzme?Y{OD$iv1ovp`UyMZ>hV_JL_dCEv4DyElQnYWIb?Ws}fW& z7Bh;?NnxJyFJB0Q=o5zyHyFS^f-B}{#$uF?t}oL7LWPvfTd)v#0-P>P1Uv4%WQEuc zo$;jvLx=p6q^I8N5S0LF$eXX1f?Y8h0rvs28XQ;%qNWOG+o|@1MJV_lqB0IA!T$TF z$E^}Kuf17cTU%?!%7Mxpkc+%tk;yM55Y#ioP)NB+vyLJHit3q4De2)Go4<4Z^o`fE z_3q`mRCOs*W_5pcN1@(J_mSodF4ICDUM;G&SI&p|IJrD#oGCqe3|z+NbXCWZVFm9! z^itrH(Mb@{%I?Byb-MKNm0Wn?c@DA+6$jchlk#V^p zf5+-Tn5QsX0j?+*)3yOpNoBfo*96TGEf6jWF+0;oUAavzvc|empdHF6=oi45UVvdL z6Y19bA5*i`{=q@ey0w;T7g1ZoStoJ6l!b6&;7qG01J-lzWhhtu(0eaAzFIkR z^1Xw%O8b?Gnn^L4mBVdI^$ul|E&}Nf5)Crsdz6QFq%fFU7`TGK>Ij%aK+FGUL}28zG?!+#O2(&HbyEU5zn#0Pr13kye6~iNf}ZXQ$uv*E!kCNf!Fjlb_9q3#u0! zXd_6?`sU_7)nolm`M-2WnLxZ!I$a?TVq-IjbK?~>R^sV{_A@j#1cm03M_v}6CD+@X|ywbPRyf~-e~+o zZ#hmI@l_{h8?ZbT6+a_3=TPh+ zemf2+3#auAt^&TOC3R!}0?YWh$uRjDEt$NK=C5Pw27ZytON7P!e>Y`{1isum@aC&% z&AH_)Zkr&g%Grr{hpP^B;?3HomHYsRF8W9l)gCD9+O=yjEe~8AokLz8Vrwl#Dg~~F zNidaoQ{hR2&;+@MxPxUqUJz9+u0Ge0&hGoCgO#U?ii%>qk}=8v(-{tj%|#0QL`5DG z6gTIA&H{0Lk`E~^Hb!Uw%!gzM+eC;|$Wft%b6Z;=o__Jd%d^40TefT&)Kb|&mw4r4 z{vVq2X9q*-H>HTdsC8Xj(?S*FN~+;x_6^J76J)?kVU8K&PwNrG;z64>-*khHj>{t{ z_LUh1uLr9xyJh~{5iwRvd;2kHVB|2BCKVAIKT$ngUG=#7<5AOxnps-Ox&EQG<3&Zq z4^$)a2M&tK5PttTf8jUP{J?Yk`PX;b{R+p*2*)6v#aQ_{&e$w;igCt=4 zyh5nTXm{8SA-#_h9G=&yna6(-%G1%z**CEw0sQg1v!n^nwx3sqw@hf}wt4r)u=|F4 zBDpH$50CwtqVpn;EM95Py_dASxr{$@m_bQCu{F?(JiAPG06DEF&G$p4x@`iA)J2w!Eu; znJB5`^x&9B>t*K6iY5-gCIVHw} z={8P0XDK?K#8f>uT&NC9v)r=F3@WCmcxfL&v4p$U=D)OnNgQpdjlAGQv(iM)eMZ#< zwvSlfKgKF7trK4auX1Ad%koNB(Dt*d)-j*{vm6SaBO75zC3Tj-C!~M^*MafD?3$Fg zxH!enMbPX+#|fXAOq@f4qepjQVH=#DX&5Kr*3Va*I3*@FS1A~(pD}mX&Heb3xjFB( zb@aX*j0;Gyl4vnAkqL5kq~>=1YzwwmXEe7-wb2*F7%ute3grU5XI15gJly7edRH?G z%W1tXc{1e5#}7q3tcjR}Kt|n!TPU>{hmp=GUW0@m!g@a+YM=uMX+d+1&>ds3os*Lo zkKkEC@L#{>@MWw38$^-BrP1X@g0m3$b2rFX0f!*O) z8^{$HCkb5)atDzMsy7n0&_#v!)|^2F6+?V*u(4Q{V6O(6GWGCx;O9GveaRRI@bE@K z4G`^_lo%6{Iyx8d%b&W-$%|eJI3`Suu*L)m)Iy}r$EUe*j9bn&JAQs~6w^-#;rtSC z1L-^&upLD-;2OAU8qN|id=iN)T=7oVhEPV6wk$EAxVlbI8U|5zBTNG>0_p1M>qo9y z&-t7bSvBU4!It=m26+xKXtsf#)q$)P2HvDsuckGYl$l}Rk_Ph(zptv&f{}=9-ih6R zA(O%iPN)?)84ODNXn<7k6vD7bz5&i@EFAQ*wwQWAY~1)O2+%=OB|_>x0PTN=MK6vZ zD5;5WcSKU~Iw&we1){^Kg$^QFc`_mjtc*4+px}?Yt7B5NC{ibpWXW&?fEZ%dg0BM$ zf=L`7V`TIQM!2^VlY>C%TfqoRaxH2Do=vr>nZ+rPqLY3fN2Az*)uz5005q0Pp7!E#9+K1gozEHNd?tenPN7Z~K~mlisfP||5*4{$T0 zKnbJx#EkM}#DbkK;Ui=?R&y(sQaJ$c(}0)Gu&JCU(+aeixi#coE4cE+|u_! zAq4`k!!rwSBk{;X=m|YF3KV|$2Z+QRC@BZ-7UDiZ!p2I|zr4O4hBhxE1QF&F{IZ5G zdKXAY*dq0ai4hGS)Iq&5lN{jeA*)Ah8i3K6SUX@Q+q|O&eN})&>7Hn30t~ScGpGsEc@f+)q9Z1W0jJXgJ+1c5cNelJ>qVh$U>iv69 z&?jslnePFKG=g;MvuDSNCl3xENf;Z5=_M?TaKsv@e^H!z+o6iYT!bW??CYyHhU1>? z`U5sV4U7_51uq?ZbqG=@o5|c4Tn`+!TCj4&77n|Hz>W>%DGSr9-SW?Y`#_NdUnuq* zF3n&GVj|utqYI`7Wg{6kL%42yjz?Z-NE9&v?80G%KZ97waSc|kT#5Do3Fcrb;&I?1 z8z*-Nb69MfGQx5e0#2eEKvet)V^tMrFmMia5PUm{=sDnqo+FM;%w+*%=q6oFlj34f zb1`cNQUEf=0W^YJ^~7+?C^O6buuvqNB_GToAv~nE0U9L{4GqVASRg{Ll4%V=cv$kc z7gV=tcVm*A@=%jIrdQxuNrWTVu)yaCvaT^sWRfr-!O{WcRcSD9l6XA7|l78z%X zC$zSnBL@kEK29W8uw@>jLc3~i!SB~(C(Ah`Hd5k&W<;$>>^`{K5OiE7(iu#;!IUhK zJO+(E^Z7D2IOxt%g!!}k^)j@@A_xDxH!?H|A{9{o{g7KK_^P})CYk@mWDOGv;g!H7 z;v`|%1mr~f;7b41nkfrdPscQvB=ibXap;M+sHO(vJCI0GQ`3n`0S-kz(eUr%(jE61 zLx4wEJ(;_E#Pj=thLliBAeP8-)i|UAV0=!F^_&97%a4p$>^s-L-(=>tc+dwg(h2|S z>W-v~BS4I((rCHao4H9|?jL?v)G04kem~#y0LT%NHi$PLxdxOS$eLIqu7Tlq+`;AU zG8r_Slkz>Vc;Zjq8O&;QTJM+&2S5(hUM5}jzk?z$63H#)p{Sn31&tR(&r(keuPTl3LhXNcIn;0Omk7&am?iAX$@3Vzufpruv5qPUC!K!9=+(U$2 z64{YY@UbBH2^c}82^doS@j5LxvEtNfBzDYkAn}y!D`+V=_g^G);0wZJa;Hy~Kzi1x{hMxj3f(}c~Q-ELukb3K2G5Dkqz>uK9m64(to&nqgrn??R zHogdZ9jI}<2)VJu#!N=Ok=ZW9aZ6l*Xb4+l?gNSZ7|WJY;+~Vp($YEF3k6d>02)ah z#3fJE4mkEe3ZSLvdp^|UJnsX^Nko8z!o!dROm&j}_V*r%%im5Axfx;RKxU9JgZL2` zDA>V(qdL!d7pm=3>=7LFu4L+asGlrq9Im7|bM(;&giNzKGl1RTG4k1GeVI8(X-XuGzhR|!KoN!#_*KkRWBfM$6O;}7y|FinXJCPI^!Wcj+fr}%X8>S%Ccs^l3mATUJ? zS_4FST~tj30s)3Vi$V61m?4o*(DKQ3>QW{w0Fg4mxs9thd#ii)fk-L^okA04OkwqB6Ot2B8H_U(TvcrVgnJGvH!I_CmuoH7#vWE4Um15a|XhN?<2QOk&`}*a=c4Y(F^o|8J58$Ja{_ z15#P8#Gv-LbQmVZEx)hux={mE&Gftsk3TkL|JBD)h^dB-9M6~JF`;jS`ISecSwTP@I=k>b$!T~a+WXM{~ zUIU>gkCTpZduPucfQU7Ln`4Fj!-~~$DU_22Gp*(yWP(A73;;$YtcAC)EJ!Q#3u+dz z+r*gLPtYTOV)QX@4w5iSOSX`Hn8T3GvKpFaCaO9Ee?6U!Lc^YH3@0#VJQ_kK@edyw zWIsRh%3T@Q$GaYdZ_8a_Ae!+#DT@%?wu|o?(Rq~UP?D85Y9Ur1VM}i{-Mn;A( zvAv=Ih~=b?R6U%W5PvDCLh3=(Vo)%k4uP`{@6Us~wwd}X-gRjp-j!}Uk-!#gp^rtN z1Wz63$H3A1rw7hB~AnB))3;4P-&`by0m zRD3`=kgzmUeUkz^Z@dn)5e)QN@_vSEfRIRv54f#W>4OK1%S7E~9WfRLjxkit0A=76 zkNdKd#keA}hMb?HblSC6>QKzJPag(WKf?S^=!hI>6S{Y~!DKJh>NfSS&)nTefzyqx|*usemnUsA=80-L8|CFMz;DX)Vzx58;#4zQG zA-5{Xw7|ilTJgf9API~O0gma%(93$#K{>MPN4~T?dAibVn*n#eh&M-EX_Zie6%>GI z-x9CYMX;Dw~DEKOwldf;6YpqQlD?$NoP*e*HIE$Zq1#YCB$ z%ZOc??Rb@%sFQIm#LSFDtSVCUT**K&k;?PEU zI*UM2MA2s8e{Xhg00hM7RNSoV20G}l5N9Q6nh{|)(V$~` zgzt~ntBKGEiVuJik0a&x;aV(RzL88{I0HR8?l0zP5gjQRmXk0u^KkJkCJkZUrTE1U zpRiKt#H5QjYf$WyPaY0Z8SD?B5MVtbh4swOF2dZPhJ8Z3z3@%9z;_)aKWl}o_mHr! zEG#cNl86F5R8?}e#(&Wn2(8U$>?4^^B)mTp)SR)$*Og?@k2XeAtzEkofgVFm$6=GT zstDml-Oxz*zS`P2JmR-2dY3Gb5qMR?F#&l1a|l9edgv#&89m1oygu%w=|D27w9TnX z2w73;iy0CFXd}`HBxA0z;sS_u`D^Ye$CIIO{rF-N@yug>(;2@Kg@I0Jt_it-Vj6IA ze86N0DziQe@@vF_nZP7TBixGEN9U!-9^8a&0h2~aO-c&o>W{a;kl}0qw2=W+q(g*c zO$r#4z@%Fx_bcp`E@D79%iw0Z!~~Yt8e9$9J@x)eQ~m?^Ibc9ALDD6-tGgyPlZ*l< ze@W0h4mc@+p!WJiT=jaOFHs$b@Bjy)(%<=j$_r8hGb5);mT06hcl4iQFhxrkYD7j| zlA*wuaX|WO1DNF$UfwCS%dB!d#{@+enO#UAJW?TP-;##nz()V+>paYHl4N%X(MRUv z5sHKiZ_&lXAou>8OPM@lH{O7r#C{RWFQ#kJBlqRbd2&d*B#~F|nIPB&_oq6PS=X?b zFBh`FG^@d8%h(3=5K%2K;S|RBq2j}!Ki8C-n{VA1rcD`>2@56*{d%q#Cql+~psdkC zkAs{ntOFtAh;klCd3dWBuoUtVj?1;TgU(r(1T=(60QsZkVMA2 zoQPY1xm%5uuBl)Io+);9baSqwpz=@u|-eB*Ta??F|DbDEsd%ms#VcZ`LwLP?9}`He!X7z zeO=G%`Fvj29l2RBH1!|ST(8bmi#8Bkke7PwHQ@x6)CEYcGXc1%kIB~qNjTE4@&Vtp zf60n85;Ke8zIN8%hD0OQ7L}c=@_`%?wS?%)SKj?|tf;EQ;NnTK5jO>}uX`-=v=w<-;$+yzdK z`}>ZV{_ETjt-IS+LrlGWA7LgYunB66(S*9@wqkAuV?g}{IBQU4wkv?-kFq#u*3maR zTr2usaL7C4RFN`C5PYI0WVNxPnc(_qTc=7!007e4wPw#4O)g_Lg`;8 zV$>&eat*Xi(_a2hb?5gQ^D*W8PfH|~iAf~PnAMjv8@zd! zApWZlQG2kx_!UZW&;@C+GBezD8T|7D-bqL+>@>C(>%rl^-Y(Dz)hV~Ou-t)I0Wyb= zqKFg}KAZSE!}ebjb8m%%4W>T4YfPqlm#u*d6%Ez>P3D4^eJ zIP;a684n4Qfem!9p>U)NpE*qe&#q^=GWJ7E%?Z8vV2%J&s^7tN@5Gou>Y9KwMwbMf zvZd#tib3QSa1~;btLlVFleT_&ydR1M%8EIWZ+S!^Vw5qlSiA`A=2gnYxxR$&Dh8-- zss8!lLE-7us)jJ$3ygIMUt%PagI4o7T}4L!%vNOyLAd&5mjAhf6I$-zs;hk-QD_RC zpk*$Rydfs2qy`uWf7iToHFod_g0uxF6APIMCZl7=)@9(1tYH3xAR$l?KCw^{W(D&t zHi;NuC`Mz5Vc4SZVfIcj+cc|4?ngGBMr3tBk(jR}qNhn?o}v@ernzmKUI|TvihF0~ zvgL-pOfHTy7uUtmJO39Iy~l4F*2mj|WVofngJ&#ZGYWUkmvF$=O-pS~HDCr1>p z;FCIGL8b-sSlETQJu=LRK|2jS5&E=M4& z?Qu^dnT5wdz_r4nCg#2a1<;k1dz6vzPzAWNt0FgfUv$W8 zFGk}Eu29SzE2?PeuUhXW#*b8=qisqQDgxUvjFd(v*DE5OaePMY8}}(ovYVNtcOB_M z3?~NSo~pVP*+O+qIdRCTMRWZ(;R!vDmM11Xg`Yp)r>ZQ+gb$x?IP}8h%|>_nF3hyn~i`2WNtSK;DEid8k7)o<5HfwaXYVU*hGJ1#aK81epH97qB4 zG|*5?8x}`M2q@0ogBO>*qCa(f`ZdO;Lk5tXFjX+GN=!I}S>`^Ay8ZZUM%+vT(o%SR z-#KOEq%kmr9OEH|fl6w9B(KFl?9Bl##$qnKXqKas;|DPL9pz9->k?7Ei%^2Hv6W6I zp`uW1ROPEkR-jh)+R$Rg>OZmtb-cPgN?d+iZIXIRt;Vq^Z$xvgK#XG69J7ROzvKuJ zlHpt7hGb^+7P>;~Uo4Luc;@A)yYb_fXg7-@j|C$}(qd)CbY`ASMnVcbArkGst}Tw* zK?BQVYA%Yi=(+y1J!Za$MW0<8wh61pgT~)4cQMZLuN!A}Lj-CmpCJIWOd~xvE~$NR z2uV#`rvM8SP~t80I(Xn*x+$&=7IlmPq@ytgRl zSm)g;OD7)>+0YB#0cKvP+f~BR3W~~UF3H&m7*sw6o;3i>f{PUEQ zUCkF)x-sC^DR+--C7oX{OYDlpd_eKE090kxw=>m6qk)*928-sz(EpvEw%tb~_zsUE z=sny?^x=q+lGtfho*s-`%u*{R4g2v=@J#LgxJhMO+@zvO3wc^BOc6dduH^V9wv0H4 zgK=IhIW8rAYaVTW}&&b6tB*iV(x+}5G7`Q3Ma$vpGmy8 z(7pwi#of@>ud{rvREDfx>1EQW&-B^X=oDe_5o^W3R1s;{S|zj*TJKQXCwZ9P)5S6% zlXxp>8l72dcTSAmhf-5M_A9EPmqKDgz%ry-Sc3*P60Z|#XO9j7Us;pNuW z>^f7xJY`$ySpLhT3f-9Oi6^@ZARDfF7}K zj?MQz+~nfsmbMnw(3R>)_;JJ{qA(cw^0v-|d1*7%9a}EV&Qr9lF2^6mnIq)t%i_!# z!2&{Y3erN%J;k^0+oFh3%JH-@8UR1Uu@7RdxxmOm<-cbixbfo$hezu!Kw1Hse<(lM z@?;Ek&!7yAPIJciZIR9(5#!4=epk)K6*L# zX_??BrquR6V7=(?Y+D-}u}8$}^3kq7E9S{EJJQey5n9xxq7)|@)<}n1+~2mEG<<%{ zhP}M^HzhG6K^(78c`_%UCel%Dd_ab9`#9HH30|Dq;$!~rrGK!vf~w%_b)L7rip8qs zKJf{sp18K@<6Z77*pH{aIq!vsX3*xVF3*KSkkd1Mjo%*z4cNz9`A$#Oa}^nwfm*05 zF-u=mSiY5Foe%Z5+WT-_ne?L#=}p5ASWV8#e}tenbde;iOy!!f_PHE&2qI33ddAqb zFRnFx+fR*ckyNHl6q?))e<}B-+xZ2-*&eCW$DRglW!rt)27Ie>-JuR*66k@Rc(+BN z6@#x6y1|leCiT_(mVp>y_{4@gt69u{bdDe=1L}>XIaa{F#%im*La&vGSPW|8zQT|AE zc-XB=moDjXqih1Ri>n^H`^bRgeS>?KobV9@=fevtdB8wXb1*mSHV$u}qY#>sOA z;P_Vk^_3Ohc ztE+=ULS*e?`YqIL(l|0RKVR+b8Q&yRz3J0s=uUb4?wx1Jr~78~Ddd%3yr`TN>(WE`P-`gBoI z@qxz-TM^NU=3|rV(~8f0c>liF%$YL-myS@eIN$C5CvWUEvd|KXhIMB}#+Nmwmi3=F zvHJMM@Rx;q`4Dg3bkEv8iJ4b{M%VT2j*cHc{+EN+qR>p+dQNxp%(U1)=Zf5ivD(U= zEGPCI)l+`R(4ogqoRGP&U{aBznVA`0q|W)bBOEmqP!OP95lM#y=nRtBkkWY zN^8^lNBWqHGG~-dIfV`>T>O3I31Tq z`!!`&DgRsUAePV45kZ+2G8cy$cID%%8af5qG@Nm)-mO-+YtEJ5@_wsx;!+DHuAK9z z_WpBcmt@JqGY@WaC_{XHxt3KxqZZ2rD}HcM_|g$cNnT0Sb2-dz0z_P5anFH1+?MEq zH4VP1haR;0_3X!C5e5%_+h8W@G3AklzKd3@IGEFvowI-Dr9EjyPo6z%*Zj$?VMi^e zUa@4yjvKcZSuJdBOi#5l@-(g`;e%lPxU=;M>}TfCJfBE=&-6HQqyx?wSr`*@3ya4{-G?zh!geGkCz~-+fsLK~@VnjBkPvHziE{G! z1}m%1BTmV2fX@3nTb8^Y_j1#wO;%MumMt|lHYHwI-0g!Y_*-ddvwrK(vu4e*uJ}6t z&i(sl>(@_vbI$0x!Mu4L@Ys2*jj?MpU(YP^gH==gE+`-wR=QP8b~}0b={7dwcnr79 zk`=yH)w{prLizoCG4wwu-MqhHS30wQA*b{oF+y&lU&k|QYxU>Om2WF6J62n}WB5Dy z$PY&_sQ>(USDs56u=a}XjKr9tj7{40=%B z6xrKXRqu+?7pCgz>*+~9T&JFTVX7yLqg2h37Z0&&jp^0F_Tv|9I`krl=X7V)=zlUY zB52_YqoHSktAk(4f%5~`t_v)2Mmx#Sx`;As4dTP34iAm6f{7p#=}k=&cY)fTja8IL=VBiH!|X3 zqJoOfsJ*3+9zCjUu8H&EfkkDPYKCW6+~p|A1VKqEX*pP>&iPbYy1lW`qOFH;GY*yoBE^2mHbmxW_x1-tHJMWXMdd zw{PC;%b}+-IX8EG{N$6L=HD>RhgMH?Yfh8&=CJd`C*P*DtPX=t+4&|{Nub^LWp7v9 zqAztYH=0zer*$d4UF3%jC!Tljyheik>oDuBd>!4HVN*^oS>CHd+iyFkuw&T28j~jF z&(f{$a#TfEdC}4Ga_dI?bWc&M_MJP|n;+S?e}BSX*?t^ z!#zuKwvTt)nU}h(T)8q&t1$C9+j`ZFo{;mFi$3P$_;BXN5pQpPc^WJAO@Htkn4ICUI%}5YW_{+?!NPbZW)}(`VLEr7q!1 zLNmwo@g}wFsT*tEjO`MZO4?z$6QYqneob<#m~`t?N!~7wSBmHP$#^BTIyI-wiRb&y zp6vw~I-Duluwg@m^77bryaO z+*}jgDkNk0KPu1D`u6LWq}%vJH&?7VB?V813!h4!vb$f89gw4G-B7)ag<7YZo}Jw^ zCZ+`}cS)cAq=x_$?=hB>Kg-Kv?91|?_Pf?S0eKlMVQk@)3ktHGlntz{#}c+Tj5|l# zvo3tmLrL4IJ5bTX!y}4Tt7)nBn%CGH5u4MLMG`hOdxbwJe*1khQ`1($(dxsjyThk) zl6_Q?Y3MR|?Szv1{{9XXZn-N>p(1|$a(Xn`?q{!yZq1I}6%}Qb7W%55P1)4=bw~3M zaN!srLwfq+<0`9NZ>k#dWNN*0YC9Hu{hEjQrWR#QJl4NYf&d2$9V$TCWT#4e!Ls~8 zg0%jXtH;Nyb=G-^bw(hoJ$0l%QviWg^qR@8jZsm(tgC;nw9J0cL!1XKB?T`nozM^# zHcDyA&UV+YU;kEI{3P79YGf8ny5Y7FhFz5uX1(^Fd1}t!ol~-lR+W^PY>sO#jyp=2 z@1UTNhb4kMBTJ3Ku~&z=tEPl^p6Ipf*Y`a6;y&k!zL8N^S8j~ThYugX(B@mWPR9=N zT4SoOst`BK5!QyUSZF&B+u&{lkQ&Qi}wJ`@OD=Uw^>Cu8)(=R2q;6P(mK2l5VLdkdC zgyJgGojbc@x9ruoZ@192$lJGXas0DXjm$1=jicNf5_Cf{+Dom7wi(RHz#@Wy;@HOy zS{F4#Z3i1ZX3do2%8-^4OQx6iOeP&o1>T8UxpCv*bn-a)MBo%Z&Z=;GItx_^| z?em4Mdk-Btq}ex)_>?aa+N(_!MWwn;~Yg2L>=g*rr z4@*?=l`9)RTmM@z%y{}|rSP-dvu{6s$kq0>(jC)FQPHyubM`>R`>KXfyKB@C3Ox=S zXxpJvrzhZNa}ChV!mv^IKb7doluEU-Ip#NSh|**$DG{Fe41@s|5qCm9gLlvO3uo+=~5UN{=sr4KA;tAb;pk%^v@+?`oKw( z6yM!k>tS>~@ztviTFRZI0z*UPr%#_gu>XUt@6@_j%9hF+%w-p6XLkhCh+XgGBvKS> zJg=4qnK#gL%~#nEV=}kjzx42-l8lUuba+Lb^Ru+HWKlfs3+q%T`{Inci2~~bSWcCA zeB7){=>i(o;)|i&c%7NKU-$=}viHT(1QCsLl3pL=?!074H*lI4L*NfB)n{3qIB_EQ zQB%ez=XDC6GVj7olIa1pF8i!KZ~pv4J&Gu6vQi>mkJX*4){J6ly?|W0yZUFB1Usn} zajx3*ckBV5P77KTc;!kP3fF^&53jnV!xrtVs5n%ucHV*ok4x;Phh`oKOKmAb4l4g! z-{U3<+q5h+^Y!kgHb>*4a^&QXPWb+deer@45FVmERS+1jbkD7t9|~n0wuS`r0c-Z7kP+ zuX0MNd$DIuuIn*P9UYxq?YpZ+ckS90JWk-{k%OWK4jKdoAANE2M8BYn@B07TjGQ#o z<=DNtQM-l|RnQ?Q?N}7R*|%8_9lM1rxUl!hmuU+Zb`p?QX{ucZdNJb#aJ9^eD&J$g zY_9J<+#q?3i*3(F$*rjC`SV23in}E{r$k?_LUs8t;&=Ln4Fhn2QvA#E?Dy?!O)=IV<7fYN zlO{~qAJFu3bChk70sz6(%q+sC!R~TM$dfNtx%iN&tekVl)yjrRA9TNB9NMwn>6x=; z4WcG9@Bg~EYM_ozbI{fJU%I6~HAatwbLB5%8Hz-8MTrn-DyE!2;TmrXD+c_8>9Cf66X7s+xA9@NK0v0<%gd9J zg3M{xsZ%mkj;f(P(7&0d)~l_@h6TS?3wU22INVa%_)(h^{{9_+wV*nmWDg7^QESwW zpBHGxzBH@L78@Qz7iDFI3ky8yREYTPvVOhP{q5P0Nqag=>I%F~*O@$TbqNVSMGxT^`-it@0{jOZeIB2{RCU# z?{C1~K5*c`*N3Tboj9Y_dT5f7@(y$J&e7$A2-Kob@SC)wt(2fs2p$JgHu>4klT zqTVVPd(ia1{!-=lXtr0M*yh5ya|xnXOzcp|I@V5Czdf!i@s3}*e!V?W?zP2TivDiG z0tNeKe0g{8e*N}S4K4_ozH{fD+0wQIJz~jY(}?vHUX-UGKI$dg`tU}{Z`W1{wK>{f zs+<-tS>i!;ON~+<)u_xHMcI{{Zx@`V^VKM$(qPssFM0hXOO`}Aln=yCM6UJTvqzfj zHL6~j^6S})7hSJgu;LG3VKe1jAP#Di-5O`@+_{q&I_-*4(B;boLD?yPs_e=ci7lx6 zN*9t^RMg}nN00L0TQK8}9qL9#Mi5B?t`9r)qD_Ty=+Y6i(G0y79zKf_f}5GxHkhi5 zNmoxXdq_zE2C(sr6F4&>Vyu8X;mtq7e=(A15cNBcj?dkzckhI`>W}t`(?Wf;T@F0| z>oMNC102jqI@lmEy4d1w%|&hplJoTdu3!OY9Tf_Ia?DHz{l$chCp=n=u?pY{l6bBt zfQ}zOK45R^?-#Y|ePKhzYdmJM_A#&qtRh8UWmVONzy304olGGsn6afJ7Q<2T)LTWl zZH`xI{-QDvtP34w9NI&dqo8>`>BtYGN{7`Js=FN`l?~9*Q3ioj-uRH0pU;LndgxGl zgbaV}-91U3wX}7()8a8;@ZdINSC^gTTL`0^`nUIgZH=qmD*x7O%^D?zepB`_ zJAev_EBc}fQE-s5YQ+s>P-Ft=qo`s7JzCT=Ir-b2{_x$i4hz?W)2M=!!7e&EzA{me z8V*>^%j25gNd!4uTRT~&uAp1Flctr{?(vx)*fE3&>BhKa&nN-LkMAbBaJ%&AG58{9 z#Y_YpG%Bt@zrKDWAzqV*=h3BIPwLg{1lRuS<4FCxQ_u5zC4vzOUDmWIEgHj-se7oX^!4@Q&6;5bj**sfU0tmu zTGbSAdD^Dz-PFxNHGulsNs_NQ{aH9T@1?n5m~90VG~fgV>U`R9k}2zoTI+DYwMSgz z%ecgbvN*w+2m}q53tH6rO&PWHjQVq)1E4YCQiZPJi*5R~s*%az zFn~QtrU@)yhIiJ+u${Qpa2T;!PfyeT+f? zpdk9g4^Ex&7if-!KwTcZt})qe%^H96>H|f#akro z2@~2-!oayECMF^gwt~#^+HTXZ@_EVD`=2~6=IHPGY8L}xuV%c_FJ)8uO@cTJw^y%T zqT1pP&l}Rs*Vh+OuK(W3$PXoUkOAw71dxJjeu5UdBv;ir3n9kMEv}vW%ROc9->+DF z^n>Casw$qI(2{t2h}70^LNhI9n3$*lfR6e4?q#!-pM};!-DumkttfhJ(q=)o$+wz$ z$vSmL5AqP187Res;rR7q`fFCl#^=zP7VL;r!nZoO3vDGhS7R~i_owqW+hm*k>! zEh1$~a~eL^{1U~kPs|Fj1}X=)2#YDz4)%7SGp7!<9)AiXG@7D|MW#}u!BD)yH z>_w;k{l{;Srb5Pv{SB}zr`KPRjOeSn0VTyJX0~`;zAAepDnZt%Ixn;RBL`}Cc=d() zA#$uIQs#fY7Po8pfPa1ksQStA691J!753) zBbZX;sT%rR(Ly}le!szb`AeB{r$=xmJ~vWhpCP8LQG1uK_H;VR9F-j^S-zT_OZ(Zr zt%2w<+09X2`trwA+e7*;2wBn?mub;)iqGiEUfQdaePsWIjoW5%-6sA17M*==zoX=Z zt)K(=h{!I4(SFkv6rcqrD=C!wWPIOe9J;phJ#byfXUEQ*k%db`7Z-#Px(NiH)3w6t zI_E_rBsq625KifYee!+hKut}@)UAA2+Q9&E+}QHhFTSP~R|TV`kuWJf^a3*A+bOR5 z!zT3c{<`OLPEm!P?`6-Avy|UOAO?#n{>zsQe{I^tLf!oyk*gdR?VwSkEI-GVUjv{H z>wY--A0OqA^|pK86?Z(lT&I&}AcQ1(rGIkv_DK+f{53dv=VT=Z9Mw=m$4;NFjtVW6 zrw907$@QSOchj1tdc7h|J~~tJI)j}E_|yweX-D?@^~;J-(niZZC|Q5;=_KdHPn)Ru zaP$K*+Il4Xdgh}`RmvEre2zQ&ms)gksyDmQt-jG=tlz}rVNDu$S6Rx#qu1)}xpVF7 z`=DdZJ);(M_iokk%^b}u2tRRB`-ReiDG8z$@yb;FEHP}edd-eTb>z5eS{Xu&~56r;G$ME3&05KIapC8$X6O^&x{O zJJtQw)N4(mu;t<8PP*-#xvu-Zt2d8Q@2sH zVkCIaptpRr7lS74UVuU>gayRId&eHeagV{t=&}(^PWx-~X0PO@$;m=+C7V4ljTrU4 zDYjkc@wg6{fU3)KIvM%~W?JZ0G&rAjR9n$^^qcK-w`D9!i#EAz9Y8_g))X$809sM5 zi(rjDh>1CV=8Pwg(8iff;xc1w3lTDd0*6rwdvzvKU;(%(u!N#Yg@s%>*R>462(-6; z)26ndX|WAK53sMiS_H?gL-13j(?LCO!h{}B_EPTRB^EBcM2XdZu*aM$0;>uwlgvWv z-GJf4+s8KrA}00b(T*E8j=H7I-Blf__t7p%3IhNvEI?=kSjbjVszZmG!CTrIeVOgM z53w8dE@At9(BD8_2o@h)hy*(WK+x_gx0Qw3gIZRUp)g9MLkIy9vOhKVzYYqPRr}iG z>V{p(M(Ju z9W&I}{lNbHLU91o=*jdW9D@3BfOvi?nThDlbakF8h6u&5-Ivmb)tf-w!A0Y75Vb1@ zaJVOXRHc33MWI)56G(9puvdU~A;L{8{{9`PxJN&z-LTNCn=URckneE#&GGB z5%m6xQhMDI6O&G89*@>_@=LjAuHu(saX0why`GSVP{eM5N)1R#TIqm3#2J^hfqE_eI;x0o@w8twl*CIqVVo^id^3w#ZHp#Ks+h^I@jt9`;k~nta1ip?V zZIZREbo=Lg{CJq%f7q)GVu^LFhrY*vY_G{z&V{YBhY>e-Scl@ z?*GkZL@&+GlO|3)K#yTNK!SK=W@dxvZ7=6++CdX1+NIZ&p!?BGE0Q^D5S}d<)`_tk zUE!9|fsau*Vpbtg31h z9R=WhT79JMj_U)zqQXF^GkNQ>?4+*J-JBV13d*8MA zexPxvh{j=SqQ~|Bwwe^f4x!G*px1ZyoH@cR0uT{037f@TzIC(W7&gAum&a`u$DtKc zB&(x1?tL3UoTsANIpxCp73H+8f#I=mX|c-}vry>c-?E_d1_y^;48u_VLqLz^mQ_~n zM4biI=khD89wL;8enew(flB3j00o&h%DGPXW&$(5gLqkYgHzq8Xn+J@uhs;u*H|+I zsuF@9Kljz&Pd_N0%}bo3E`r3qMXQw-<7uEg*8Kq>|pm^INhZG>Wb zEFeI4hs2pixUX4X;PcWErAQY*Okw095I-T!i4OtoNbtUV_3GpAJM$=91({%1_PHZM z0}o43-1vPwC~BWQV*$3^nn8!Vh#gcBQl;S^=g*n*7?;j#HpZPh8gNm6ZQPi!eoQVy zC*em$WrnY8KS$RJ-5B?dh*$Py%FvmB2Vs+1zRs}?nwwOq?B&9gzQi9KhvGIc;H1Bn zmJ-z^9pCRCI*zwPO5D7$nfeWL;=cwi2sOyHr0N{3s>jsSm2Ma=%pyCM=$XXO$DY1@nqu9hPi1*krDUSqq zpvI`x_d4(}m)~5I0Nu!XAMo*m#a;a?MhV|{>ib@nRX#E9PyGoI7eufk$j@H5Fqy5% zEXYM`)*OKnYSTKasMxGIVJo?{q9~1lb@Gg9cp;P0x5C@;Qu;yE9(Hf*)>$uKzC7;l zf8^S=VdA-xMF+0;qv*p_7Pze%f7QV$r;>jo+#`bxR?|Xg4-O0KAV?(!s5}e0z=uBb zazCRWetx>&NzfEezQi-lI>c^YmfBp5>G${l+CTyB%I zGbS7J0Q8c{1Mhbew2OY(}aDSY96>Kz>9^`*jcC=_VF?`t3I zY){^s>|8qr?co-*(!noU zu}g{a3Y#J|zeN;QRE6N&%mEHbt!KWv*kG9!N%RC;H#a)MjHR_dO}WcX>x!plA40a( zmsTWyfnJYa-5mP>+w-uIBRytbN)Yrs+dwE|0ZfM?qM`nNEeT+3Auhqq(^ldXy6E&{ zI3Ei*$}J;#m|_Y*ceR>wVZ}Ym-U`ZE?ZV$p4G9yAYX1BrdG&{4OM`76HdTMptC=cr zlu)J^qG3wn40d(VQK5ihXouPl11yJ(IOx@<&tnF$AB80mp`N*D2IO;k)!iZZMTDbv zCc-hQV3Jkw+tEBWJzrHpqS3P4O>Yw3T4u_yPrfjUH@K0k!%9r?KXn2$ zK(jPjr!Dpcoi$jLW?S5f2&700t0j1N_RKUD0lHeD{$@FeY~9sm4p> zr>Jk7m%8cxCs+oAtwUH9MfHTq4%u(dyW$zZ6k0)x$qngH5Cbrfq({7 z9N$!cFBPe_6?Zd=3=MBDYIte;{panIXU?Qet(KRU7Y<0~Qfn~?!}Rlsh6j?UfJeQz zlB-~wKyiC$g%(f{6A{%AdK&mYpr!)x#Whu{&?efdzH$p`?hA7k_5z@I{aPC zw}(H=9oCOK_X`saw4?ZSVcKM1R?(XEOe^%iZ}MDmB#VlXRR$~18Dlm27V7y2eStRG z1snRdMq&lOGfI+*L2z~PO?O68?wRk{q3HLx&80=daODfn12O+_R@iTgYO)DhT5EBy z25u=e32abNFpM2a+>80+;!f9bJ0Ljd>u{FNAdGqE=WD7;LHStW1 zr`uJd$g?^(w?8PH>EJV7Ti7jX)?<|u&;^bhIKflt{gPqb#TJ0-CSHnQy!Zeb+k4A< zZ9I1W9`T6JO>{oEv+LNgV@243XrCe1ekI}c)u!=kYogrgNbgT=g>8{t!UxvJDv#Si zI&0zFfjfMsP938>YIC`M;nL7dVmPw&ENV0nb31hGnBr&>9a}gh?b)+w^XGTO&)hSm zW-B)X;6aJ*RrEq}bAh~ud{r8gGg@C>h^ZeCD+!!cvn zQ8ZUfJg%;#rRDtjq$)B9(RT(1R8H$%&~bdBnN;UJV@RLOpRkTd*c3^l#q5VSK|a87 z>KUM_X{15)jmA%wXbz}vr~{LCSL4&#V#cR4uo&*fo&r8l*0NLfC+DBDA3sx4?Q`_# zOv(zV17g^WU(xtUcxNdoucWr};??*?vt#!UQmXR_ubk)_=p5kl~tAL7mlu4`-)Bt$YRP92z4?`P-^|ZSj zQ_`mUs)}8TRDfMV?9#wW)1@Pp#h?B8DH~zJV^d<(pS{3;-2u&iJM<( zRJ}4bQrEtq&NV0^j&t$2)0|M(qk`%2=Qnr2aDTNS1Dqt1j6MUT0}3SSUn z`#H@Mk=}awQHj=-r6VAVyqF(>NGZI8d5+B+SN`1nPY{Ea#y~H;iZa_N_(>m|KN$N347p6A|sfotWUvAn>`n6*4ym3}$HBoN z{>4Jgfcl?-tGE=rlC;XXDk*44N{f51!=K=)sB|mcFQZwA9Ac zv@T0=>q5sK1*W@1Uj}({TTD`Y$iuEnhlK1iq!hBW44Xaa_Q~5X(kgV{>ThFB;05ZL z(nU=-r_e?(Btwr+g-p+?LFdLqi3py6Q`owubS+QpV5OFPCRW-5s)o`f0eD)#jGBrw zh#OQQhj~H~T~{hk@;a`5?D;NLlU^Ax3)vVv_LEr1&SZV8^uf5xD79%$aR<||w6G}= z+P=1aEfvVR0`-#_gmwMcg$v#sA-&1a@9l#%YEl8)=1sY4;33Q)Azs%>g1ki&hKix!NMvI%uL_Kh>i? zKC{@4=z|{AFCgf{nV(?HTQA!9J1f^Fx|Ld(>$>Kq)S`+3BS+4C^PKSwM@aQrHCeV5 zsr@Qa+63IU>{K7?(f~9%tax ztB$IwYU|PAc;_f)(O|trEq(K*0zSxOuxYD{HGvhkvo2cPo$_tQrTz7pMmo0t`*MA6 z(=;v_{pM+IZeY9aXlflgbm%{2%BsfK3f1duZmCf_5tIhHo8A93RzqVSF3kwXd;;>~ zl`Go=ZE1+Atf{#KSwg0?wW)Yf(0|D-m7KX((#5lnj;6FnRJkfh=?G< z{qg0#@Nc|HdkNeTJkDG>BUHqA>?AZgrM_5U=-Zhx3;~Yw`T`w`o1Wj#Z8(E#uRq@U zuve4%c$>;3z=j0+)epwR2@v8LB?^|ED>vf_im>nO-00t!9^aICB+`e?*yB6e8lYq6 zU8gZ*w7e{pMAKd2?~1Vl>?Z+kU=ZuT*Q07aT&Y|rxwi%On&N5Q?ve@U%Ni3W3McN| z5uqO}56rxzXJTS9O>#bb?WN#gY>D1HjT!2bw`lYMcHrPMt0~R4Z51Y*Er7v$J93Uv zbR2$|Vq-OD!O%RFFyD%MNQwE(99r?KR_O1v@d(Q=r%OY%reEzer&NNaqVsO0SFTzU zCM+u``h07H3`CA~USfL+2Of}9>fbA)7s$)W9V32GH90efmTk~E`g&8t$>jX@!*&}O zBp4@=II6)DwOaW;@=@#@uH&z~EP zoutsA!$C7D9x4{_Lz{=2hZ(EVwgCk@kh@PFa45Q9zi9R9k*zYCE3%A=T1lD~HA-|> zd?-xr>10xu>i?mlN#6|ZST+-FU8wf{Q|%SN+nAQGv|FUUbF*k1!Z$A(jtK1qMMYlo zS1HyzpH)A0<6SY?VlOK+ALo={ff!=f^H=?qS1&t_yFcnpxK3JuW=7q}@7!L7I-Up^80GT(8={07`l*7y@2a<1KG^%O-T`;_; zNm;=T_1{CFqNjyizMPw}P&bLs4hg@9ewK%vVTZ+mx~0>quh8bgbVbD>Ff-hXrKRO- z+j5hBKO_!VyeV>k*p?Glzjls?91(@C@F0=YNhOfuhk8U~%AxNHCsiMvrphHy>OmnP zL)Y&QcXI?1E?T+r5QnXAfSZAFc@iJ*zGB&VqALn7IgZ8Y<*h@=oYAL)r1}sbf|fn> z0|SeFEI#4l7vKYoK3r`*eN|f*9CO3BLj)i??@QU#&GC!(%t7Ef>$=|?k<@vl6rr$V zgVfd4zeTW2@D{Y99HMf<-PwgYnYb`}-n{O~oPY{2)R^#P7=f&b)|jwNCQD!$_N1qCS%P!}H6X&<7)P<^p*AD(Jo+FwU!-DRy+VPP10 zAm||^5&-w`)(CP3;O-;FIo^YU5I0%alv&sYx2QxNQ?22IMF!z)Xi>#ZgGZ)yOS-P4DwZp^f^ zn}{@bNT{cS22C$`S+fIg!Tl9}DW_4B;C&!qf;cB&jrq&8G!A?nO!Lov@Ubw20{x-g zL^$c&8Wn9IID*oLa&g6&^$!pF+UqWv=63Z`7JAs9Q}AJbh}=(sz`(Q$Z* zW{g|vyKo|j%tSAGTZ6;ZTH2|P8x8Bu=JA^}L7z1O-3t!0rVuAG3JMJBN6MWvPurLf zpl8gO!P*eDG}N4M=~15GT?>khRR(Y7;R z-Wb{yHTT&6d_Q)m)zysex3J&)>$)iehGv0A#o>gatRUHn;6tF4#i>i^6k3|?4{Mss zgpZ#lY}z+WO$TBoYlR)x*dFFoFb)(>EX?j(4EOe%3b`OyJ2jKoBWV0y%f6v3O1o?) z*lbSq--BBc|1Jl4KGz&+;ZZdo{g6BHkIbm0HBz@|j3V@)_tK$&7Sl!)r{C_t_00Cw z*deK0PWXqBgHkeVJ)B)LV}$4a7k@7rcFVSCf%)B48X6jb4<2AmXoWUy`#VTx8n{h# zwXAvM)I+EmQ01H)b^PSXeZULN{0X|cDzHk4+*GUI1%~OTZQRR56AN9BR@|ouBjeb! zryx@icY}aBm=$Mk+B5`WA%eC<-VdVVkbD~?Bls4%703I4H5kGy$3RSB=p`bFYH3DK zN%>zB{bY>1Sz^cELDRGqVhAf@FT^f27NP)-p@X^G7A#PpN&EQu^YkgVBgYa-wE91r z{0aCLaYEDJ!o37-&SA5Jlnps9nK) zb8>-}^1^8i>Q_=4dwb8MGqw-pU*2PnHIq1Nqm|m)2m5d{c=_irwxFwCE+B|(5yXjE zm%E&Ml(t7=T_7Ludqs!0W!#3RPoG+S|7Y-V2KT^V^`Rl!NSty%4)57EQ#@GmTm7?mBPr_%pJ5q}w+-yV7 zbaVglr8HZ7eRIY6_+%Dkf1hUOfKCJ)y`t&ps<2tKmU6eLWJE6#0wIB{oq0gg*NrT6 zmV>*sMo!Jy{q?8lVSQP+>ep1!@8>c>baAUkFiXI_L3dzbV9Aq#hF$p<<-$YV$%BQ* zsq>a@9okNxb`JRkh4{$KODonERn#R`V1Od4_LZcp+rtqDNl#rFRH$X5@HRD>M4kBp z^Z^DT7tl^n;I=Dz4J4$9ewXIeS=Uwl9By`pYxbODqS=x!TgfCVH8}H7%G}c^~ zA++#)puONDkxQ<>FR@!J+w7BOZz+kB>0EWg=(?bd7}_l_%+W%WBjsuI@z`$AH>|Y4 z>2$*j{axz!b?K}7T2Y6U!y64bPc$^GSRA)PQaPz%MYGGc;Tuo+41RZ?%ktaMHXjgb zHJJ${iH>cG7mkZg+0&pmTvAi*W@(qY&9OthbFBN6Uu7!4mByN^uDc(d6|z}(xz15Z z!!xtjaXv51miVeh41DW0qyA@|o^lZ~u3oW?T})ltgvg=}j+QS%w-v^vO&U@-Mb0iZ zA$8lm4{0l}`J||Yt|_v~br@dp)YR;=M7vmUVED=T8xj*=CQy^5+@0$ z0kqaMu(k9uzXngr#Mcj$v#QgGC--{|zUxYO^DMY zoo{Do5Y0xSCzSu5txwRiPZ#d2bXPy_?6 z6HsOy@T2G}%7E46{)YeH;W=|St;pY15@?3~PS=mCWzmm{Ix8?Y#Wua^+NwoAZK4x>e((R0PP-=rEsQvS@aao|gVAGK zDW8y7N3WsisE7?w>UGSgqZAoOH25LQsMI!!`oavBUMQ-RKKz>~$w@A-gpAj?=2Eob z0i97oif1Iq4daF=uZr2iBzG!cM@f>9Hov|SSYTR6hIZ)^xs{JdtJLl-%)$JiMOwbi zCG>IioBP}0O!9RG2;epFsdJ7^%f9DzDt%LAn^&3@r|iKCBwWEW(k3DU^noUBlj8 + +{{- $pages := where site.RegularPages "Type" "in" site.Params.mainSections }} + +{{- if site.Params.ShowAllPagesInArchive }} +{{- $pages = site.RegularPages }} +{{- end }} + +{{- range $pages.GroupByPublishDate "2006" }} +{{- if ne .Key "0001" }} + +{{- end }} +{{- end }} + +{{- end }}{{/* end main */}} diff --git a/themes/mytheme/layouts/_default/baseof.html b/themes/mytheme/layouts/_default/baseof.html new file mode 100644 index 0000000..3d13f07 --- /dev/null +++ b/themes/mytheme/layouts/_default/baseof.html @@ -0,0 +1,23 @@ + + + + + {{- partial "head.html" . }} + + + + {{- partialCached "header.html" . .Page -}} +
    + {{- block "main" . }}{{ end }} +
    + {{ partialCached "footer.html" . .Layout .Kind (.Param "hideFooter") (.Param "ShowCodeCopyButtons") -}} + + + diff --git a/themes/mytheme/layouts/_default/index.json b/themes/mytheme/layouts/_default/index.json new file mode 100644 index 0000000..feeb437 --- /dev/null +++ b/themes/mytheme/layouts/_default/index.json @@ -0,0 +1,7 @@ +{{- $.Scratch.Add "index" slice -}} +{{- range site.RegularPages -}} + {{- if and (not .Params.searchHidden) (ne .Layout `archives`) (ne .Layout `search`) }} + {{- $.Scratch.Add "index" (dict "title" .Title "content" .Plain "permalink" .Permalink "summary" .Summary) -}} + {{- end }} +{{- end -}} +{{- $.Scratch.Get "index" | jsonify -}} diff --git a/themes/mytheme/layouts/_default/list.html b/themes/mytheme/layouts/_default/list.html new file mode 100644 index 0000000..3a6f316 --- /dev/null +++ b/themes/mytheme/layouts/_default/list.html @@ -0,0 +1,112 @@ +{{- define "main" }} + +{{- if (and site.Params.profileMode.enabled .IsHome) }} +{{- partial "index_profile.html" . }} +{{- else }} {{/* if not profileMode */}} + +{{- if not .IsHome | and .Title }} + +{{- end }} + +{{- if .Content }} +
    + {{- if not (.Param "disableAnchoredHeadings") }} + {{- partial "anchored_headings.html" .Content -}} + {{- else }}{{ .Content }}{{ end }} +
    +{{- end }} + +{{- $pages := union .RegularPages .Sections }} + +{{- if .IsHome }} +{{- $pages = where site.RegularPages "Type" "in" site.Params.mainSections }} +{{- $pages = where $pages "Params.hiddenInHomeList" "!=" "true" }} +{{- end }} + +{{- $paginator := .Paginate $pages }} + +{{- if and .IsHome site.Params.homeInfoParams (eq $paginator.PageNumber 1) }} +{{- partial "home_info.html" . }} +{{- end }} + +{{- $term := .Data.Term }} +{{- range $index, $page := $paginator.Pages }} + +{{- $class := "post-entry" }} + +{{- $user_preferred := or site.Params.disableSpecial1stPost site.Params.homeInfoParams }} +{{- if (and $.IsHome (eq $paginator.PageNumber 1) (eq $index 0) (not $user_preferred)) }} +{{- $class = "first-entry" }} +{{- else if $term }} +{{- $class = "post-entry tag-entry" }} +{{- end }} + +
    + {{- $isHidden := (site.Params.cover.hidden | default site.Params.cover.hiddenInList) }} + {{- partial "cover.html" (dict "cxt" . "IsHome" true "isHidden" $isHidden) }} +
    +

    + {{- .Title }} + {{- if .Draft }}  [draft]{{- end }} +

    +
    + {{- if (ne (.Param "hideSummary") true) }} +
    +

    {{ .Summary | plainify | htmlUnescape }}{{ if .Truncated }}...{{ end }}

    +
    + {{- end }} + {{- if not (.Param "hideMeta") }} +
    + {{- partial "post_meta.html" . -}} +
    + {{- end }} + +
    +{{- end }} + +{{- if gt $paginator.TotalPages 1 }} + +{{- end }} + +{{- end }}{{/* end profileMode */}} + +{{- end }}{{- /* end main */ -}} diff --git a/themes/mytheme/layouts/_default/rss.xml b/themes/mytheme/layouts/_default/rss.xml new file mode 100644 index 0000000..134d50d --- /dev/null +++ b/themes/mytheme/layouts/_default/rss.xml @@ -0,0 +1,50 @@ +{{- $pctx := . -}} +{{- if .IsHome -}}{{ $pctx = site }}{{- end -}} +{{- $pages := slice -}} +{{- if or $.IsHome $.IsSection -}} +{{- $pages = $pctx.RegularPages -}} +{{- else -}} +{{- $pages = $pctx.Pages -}} +{{- end -}} +{{- $limit := site.Config.Services.RSS.Limit -}} +{{- if ge $limit 1 -}} +{{- $pages = $pages | first $limit -}} +{{- end -}} +{{- printf "" | safeHTML }} + + + {{ if eq .Title site.Title }}{{ site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ site.Title }}{{ end }} + {{ .Permalink }} + Recent content {{ if ne .Title site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ site.Title }} + {{- with site.Params.images }} + + {{ index . 0 | absURL }} + {{ index . 0 | absURL }} + + {{- end }} + Hugo -- gohugo.io{{ with site.LanguageCode }} + {{.}}{{end}}{{ with site.Author.email }} + {{.}}{{ with site.Author.name }} ({{.}}){{end}}{{end}}{{ with site.Author.email }} + {{.}}{{ with site.Author.name }} ({{.}}){{end}}{{end}}{{ with site.Copyright }} + {{.}}{{end}}{{ if not .Date.IsZero }} + {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ end }} + {{- with .OutputFormats.Get "RSS" -}} + {{ printf "" .Permalink .MediaType | safeHTML }} + {{- end -}} + {{ range $pages }} + {{- if and (ne .Layout `search`) (ne .Layout `archives`) }} + + {{ .Title }} + {{ .Permalink }} + {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} + {{ with site.Author.email }}{{.}}{{ with site.Author.name }} ({{.}}){{end}}{{end}} + {{ .Permalink }} + {{ with .Description | html }}{{ . }}{{ else }}{{ .Summary | html }}{{ end -}} + {{- if site.Params.ShowFullTextinRSS }} + {{ (printf "" .Content) | safeHTML }} + {{- end }} + + {{- end }} + {{ end }} + + diff --git a/themes/mytheme/layouts/_default/search.html b/themes/mytheme/layouts/_default/search.html new file mode 100644 index 0000000..2349587 --- /dev/null +++ b/themes/mytheme/layouts/_default/search.html @@ -0,0 +1,29 @@ +{{- define "main" }} + + + + + +{{- end }}{{/* end main */}} diff --git a/themes/mytheme/layouts/_default/single.html b/themes/mytheme/layouts/_default/single.html new file mode 100644 index 0000000..0d1701d --- /dev/null +++ b/themes/mytheme/layouts/_default/single.html @@ -0,0 +1,59 @@ +{{- define "main" }} + +
    +
    + {{ partial "breadcrumbs.html" . }} +

    + {{ .Title }} + {{- if .Draft }}  [draft]{{- end }} +

    + {{- if .Description }} +
    + {{ .Description }} +
    + {{- end }} + {{- if not (.Param "hideMeta") }} + + {{- end }} +
    + {{- $isHidden := .Params.cover.hidden | default site.Params.cover.hiddenInSingle | default site.Params.cover.hidden }} + {{- partial "cover.html" (dict "cxt" . "IsHome" false "isHidden" $isHidden) }} + {{- if (.Param "ShowToc") }} + {{- partial "toc.html" . }} + {{- end }} + + {{- if .Content }} +
    + {{- if not (.Param "disableAnchoredHeadings") }} + {{- partial "anchored_headings.html" .Content -}} + {{- else }}{{ .Content }}{{ end }} +
    + {{- end }} + +
    + {{- $tags := .Language.Params.Taxonomies.tag | default "tags" }} + + {{- if (.Param "ShowPostNavLinks") }} + {{- partial "post_nav_links.html" . }} + {{- end }} +
    + {{- if (and (and site.Params.ShowShareButtons (ne .Params.disableShare true)) false) }} + {{- partial "share_icons.html" . -}} + {{- end }} +
    + + {{- if (.Param "comments") }} + {{- partial "comments.html" . }} + {{- end }} +
    + +{{- end }}{{/* end main */}} diff --git a/themes/mytheme/layouts/_default/terms.html b/themes/mytheme/layouts/_default/terms.html new file mode 100644 index 0000000..6fd2654 --- /dev/null +++ b/themes/mytheme/layouts/_default/terms.html @@ -0,0 +1,27 @@ +{{- define "main" }} + +{{- if .Title }} + +{{- end }} + +
      + {{- $type := .Type }} + {{- range $key, $value := .Data.Terms.Alphabetical }} + {{- $name := .Name }} + {{- $count := .Count }} + {{- with site.GetPage (printf "/%s/%s" $type $name) }} +
    • + {{ .Name }} {{ $count }} +
    • + {{- end }} + {{- end }} +
    + +{{- end }}{{/* end main */ -}} diff --git a/themes/mytheme/layouts/partials/anchored_headings.html b/themes/mytheme/layouts/partials/anchored_headings.html new file mode 100644 index 0000000..377af89 --- /dev/null +++ b/themes/mytheme/layouts/partials/anchored_headings.html @@ -0,0 +1,2 @@ +{{- /* formats .Content headings by adding an anchor */ -}} +{{ . | replaceRE "()" "${1}${3}" | safeHTML }} diff --git a/themes/mytheme/layouts/partials/author.html b/themes/mytheme/layouts/partials/author.html new file mode 100644 index 0000000..8f2758f --- /dev/null +++ b/themes/mytheme/layouts/partials/author.html @@ -0,0 +1,9 @@ +{{- if or .Params.author site.Params.author }} +{{- $author := (.Params.author | default site.Params.author) }} +{{- $author_type := (printf "%T" $author) }} +{{- if (or (eq $author_type "[]string") (eq $author_type "[]interface {}")) }} +{{- (delimit $author ", " ) }} +{{- else }} +{{- $author }} +{{- end }} +{{- end -}} diff --git a/themes/mytheme/layouts/partials/breadcrumbs.html b/themes/mytheme/layouts/partials/breadcrumbs.html new file mode 100644 index 0000000..7e8257b --- /dev/null +++ b/themes/mytheme/layouts/partials/breadcrumbs.html @@ -0,0 +1,19 @@ +{{- if (.Param "ShowBreadCrumbs") -}} + +{{- end -}} diff --git a/themes/mytheme/layouts/partials/comments.html b/themes/mytheme/layouts/partials/comments.html new file mode 100644 index 0000000..21efa0d --- /dev/null +++ b/themes/mytheme/layouts/partials/comments.html @@ -0,0 +1,14 @@ + + diff --git a/themes/mytheme/layouts/partials/cover.html b/themes/mytheme/layouts/partials/cover.html new file mode 100644 index 0000000..5c5f2fb --- /dev/null +++ b/themes/mytheme/layouts/partials/cover.html @@ -0,0 +1,40 @@ +{{- with .cxt}} {{/* Apply proper context from dict */}} +{{- if (and .Params.cover.image (not $.isHidden)) }} +{{- $alt := (.Params.cover.alt | default .Params.cover.caption | plainify) }} +
    + {{- $responsiveImages := (.Params.cover.responsiveImages | default site.Params.cover.responsiveImages) | default true }} + {{- $addLink := (and site.Params.cover.linkFullImages (not $.IsHome)) }} + {{- $cover := (.Resources.ByType "image").GetMatch (printf "*%s*" (.Params.cover.image)) }} + {{- if $cover -}}{{/* i.e it is present in page bundle */}} + {{- if $addLink }}{{ end -}} + {{- $sizes := (slice "360" "480" "720" "1080" "1500") }} + {{- $processableFormats := (slice "jpg" "jpeg" "png" "tif" "bmp" "gif") -}} + {{- if hugo.IsExtended -}} + {{- $processableFormats = $processableFormats | append "webp" -}} + {{- end -}} + {{- $prod := (hugo.IsProduction | or (eq site.Params.env "production")) }} + {{- if (and (in $processableFormats $cover.MediaType.SubType) ($responsiveImages) (eq $prod true)) }} + {{ $alt }} + {{- else }}{{/* Unprocessable image or responsive images disabled */}} + {{ $alt }} + {{- end }} + {{- else }}{{/* For absolute urls and external links, no img processing here */}} + {{- if $addLink }}{{ end -}} + {{ $alt }} + {{- end }} + {{- if $addLink }}{{ end -}} + {{/* Display Caption */}} + {{- if not $.IsHome }} + {{ with .Params.cover.caption }}

    {{ . | markdownify }}

    {{- end }} + {{- end }} +
    +{{- end }}{{/* End image */}} +{{- end -}}{{/* End context */ -}} diff --git a/themes/mytheme/layouts/partials/edit_post.html b/themes/mytheme/layouts/partials/edit_post.html new file mode 100644 index 0000000..efa4c70 --- /dev/null +++ b/themes/mytheme/layouts/partials/edit_post.html @@ -0,0 +1,8 @@ +{{- if or .Params.editPost.URL site.Params.editPost.URL -}} +{{- $fileUrlPath := path.Join .File.Path }} + +{{- if or .Params.author site.Params.author (.Param "ShowReadingTime") (not .Date.IsZero) .IsTranslated }} | {{- end -}} + + {{- .Params.editPost.Text | default (site.Params.editPost.Text | default (i18n "edit_post" | default "Edit")) -}} + +{{- end }} diff --git a/themes/mytheme/layouts/partials/extend_footer.html b/themes/mytheme/layouts/partials/extend_footer.html new file mode 100644 index 0000000..0519748 --- /dev/null +++ b/themes/mytheme/layouts/partials/extend_footer.html @@ -0,0 +1,3 @@ +{{- /* Footer custom content area start */ -}} +{{- /* Insert any custom code web-analytics, resources, etc. here */ -}} +{{- /* Footer custom content area end */ -}} diff --git a/themes/mytheme/layouts/partials/extend_head.html b/themes/mytheme/layouts/partials/extend_head.html new file mode 100644 index 0000000..150cbef --- /dev/null +++ b/themes/mytheme/layouts/partials/extend_head.html @@ -0,0 +1,4 @@ +{{- /* Head custom content area start */ -}} +{{- /* Insert any custom code (web-analytics, resources, etc.) - it will appear in the section of every page. */ -}} +{{- /* Can be overwritten by partial with the same name in the global layouts. */ -}} +{{- /* Head custom content area end */ -}} diff --git a/themes/mytheme/layouts/partials/footer.html b/themes/mytheme/layouts/partials/footer.html new file mode 100644 index 0000000..52668eb --- /dev/null +++ b/themes/mytheme/layouts/partials/footer.html @@ -0,0 +1,135 @@ +{{- if not (.Param "hideFooter") }} +
    + {{- if site.Copyright }} + {{ site.Copyright | markdownify }} + {{- else }} + © {{ now.Year }} {{ site.Title }} + {{- end }} + + Powered by + Hugo & + PaperMod + +
    +{{- end }} + +{{- if (not site.Params.disableScrollToTop) }} + + + + + +{{- end }} + +{{- partial "extend_footer.html" . }} + + + +{{- if (not site.Params.disableScrollToTop) }} + +{{- end }} + +{{- if (not site.Params.disableThemeToggle) }} + +{{- end }} + +{{- if (and (eq .Kind "page") (ne .Layout "archives") (ne .Layout "search") (.Param "ShowCodeCopyButtons")) }} + +{{- end }} diff --git a/themes/mytheme/layouts/partials/head.html b/themes/mytheme/layouts/partials/head.html new file mode 100644 index 0000000..35257fc --- /dev/null +++ b/themes/mytheme/layouts/partials/head.html @@ -0,0 +1,170 @@ + + + +{{- if hugo.IsProduction | or (eq site.Params.env "production") | and (ne .Params.robotsNoIndex true) }} + +{{- else }} + +{{- end }} + +{{- /* Title */}} +{{ if .IsHome }}{{ else }}{{ if .Title }}{{ .Title }} | {{ end }}{{ end }}{{ site.Title }} + +{{- /* Meta */}} +{{- if .IsHome }} +{{ with site.Params.keywords -}}{{ end }} +{{- else }} + +{{- end }} + + + +{{- if site.Params.analytics.google.SiteVerificationTag }} + +{{- end }} +{{- if site.Params.analytics.yandex.SiteVerificationTag }} + +{{- end }} +{{- if site.Params.analytics.bing.SiteVerificationTag }} + +{{- end }} +{{- if site.Params.analytics.naver.SiteVerificationTag }} + +{{- end }} + +{{- /* Styles */}} + +{{- /* includes */}} +{{- $includes := slice }} +{{- $includes = $includes | append (" " | resources.FromString "assets/css/includes-blank.css")}} + +{{- if not (eq site.Params.assets.disableScrollBarStyle true) }} + {{- $ScrollStyle := (resources.Get "css/includes/scroll-bar.css") }} + {{- $includes = (append $ScrollStyle $includes) }} +{{- end }} + +{{- $includes_all := $includes | resources.Concat "assets/css/includes.css" }} + +{{- $theme_vars := (resources.Get "css/core/theme-vars.css") }} +{{- $reset := (resources.Get "css/core/reset.css") }} +{{- $media := (resources.Get "css/core/zmedia.css") }} +{{- $license_css := (resources.Get "css/core/license.css") }} +{{- $common := (resources.Match "css/common/*.css") | resources.Concat "assets/css/common.css" }} + +{{- /* include `an-old-hope` if hljs is on */}} +{{- $isHLJSdisabled := (site.Params.assets.disableHLJS | default false) }} +{{- $hljs := (cond ($isHLJSdisabled) (".chroma { background-color: unset !important;}" | resources.FromString "assets/css/hljs-blank.css") (resources.Get "css/hljs/an-old-hope.min.css")) }} + +{{- /* order is important */}} +{{- $core := (slice $theme_vars $reset $common $hljs $includes_all $media) | resources.Concat "assets/css/core.css" | resources.Minify }} +{{- $extended := (resources.Match "css/extended/*.css") | resources.Concat "assets/css/extended.css" | resources.Minify }} + +{{- /* bundle all required css */}} +{{- /* Add extended css after theme style */ -}} +{{- $stylesheet := (slice $license_css $core $extended) | resources.Concat "assets/css/stylesheet.css" }} + +{{- if not site.Params.assets.disableFingerprinting }} +{{- $stylesheet := $stylesheet | fingerprint }} + +{{- else }} + +{{- end }} + +{{- /* Search */}} +{{- if (eq .Layout `search`) -}} + +{{- $fastsearch := resources.Get "js/fastsearch.js" | js.Build (dict "params" (dict "fuseOpts" site.Params.fuseOpts)) | resources.Minify }} +{{- $fusejs := resources.Get "js/fuse.basic.min.js" }} +{{- $license_js := resources.Get "js/license.js" }} +{{- if not site.Params.assets.disableFingerprinting }} +{{- $search := (slice $fusejs $license_js $fastsearch ) | resources.Concat "assets/js/search.js" | fingerprint }} + +{{- else }} +{{- $search := (slice $fusejs $fastsearch ) | resources.Concat "assets/js/search.js" }} + +{{- end }} +{{- end -}} + +{{- /* Highlight.js */}} +{{- $isHLJSdisabled := (site.Params.assets.disableHLJS | default .Params.disableHLJS ) }} +{{- if (and (eq .Kind "page") (ne .Layout "archives") (ne .Layout "search") (not $isHLJSdisabled)) }} +{{- if not site.Params.assets.disableFingerprinting }} +{{- $highlight := slice (resources.Get "js/highlight.min.js") | resources.Concat "assets/js/highlight.js" | fingerprint }} + +{{- else }} +{{- $highlight := slice (resources.Get "js/highlight.min.js") | resources.Concat "assets/js/highlight.js" }} + +{{- end }} +{{- end }} + +{{- /* Favicons */}} + + + + + + + + +{{- /* RSS */}} +{{ range .AlternativeOutputFormats -}} + +{{ end -}} +{{- range .AllTranslations -}} + +{{ end -}} + + + +{{- partial "extend_head.html" . -}} + +{{- /* Misc */}} +{{- if hugo.IsProduction | or (eq site.Params.env "production") }} +{{- template "_internal/google_analytics.html" . }} +{{- template "partials/templates/opengraph.html" . }} +{{- template "partials/templates/twitter_cards.html" . }} +{{- template "partials/templates/schema_json.html" . }} +{{- end -}} diff --git a/themes/mytheme/layouts/partials/header.html b/themes/mytheme/layouts/partials/header.html new file mode 100644 index 0000000..9a5322a --- /dev/null +++ b/themes/mytheme/layouts/partials/header.html @@ -0,0 +1,160 @@ +{{- /* theme-toggle is enabled */}} +{{- if (not site.Params.disableThemeToggle) }} +{{- /* theme is light */}} +{{- if (eq site.Params.defaultTheme "light") }} + +{{- /* theme is dark */}} +{{- else if (eq site.Params.defaultTheme "dark") }} + +{{- else }} +{{- /* theme is auto */}} + +{{- end }} +{{- /* theme-toggle is disabled and theme is auto */}} +{{- else if (and (ne site.Params.defaultTheme "light") (ne site.Params.defaultTheme "dark"))}} + +{{- end }} + + +
    + +
    diff --git a/themes/mytheme/layouts/partials/home_info.html b/themes/mytheme/layouts/partials/home_info.html new file mode 100644 index 0000000..efae956 --- /dev/null +++ b/themes/mytheme/layouts/partials/home_info.html @@ -0,0 +1,13 @@ +{{- with site.Params.homeInfoParams }} +
    +
    +

    {{ .Title | markdownify }}

    +
    +
    + {{ .Content | markdownify }} +
    +
    + {{ partial "social_icons.html" site.Params.socialIcons }} +
    +
    +{{- end -}} diff --git a/themes/mytheme/layouts/partials/index_profile.html b/themes/mytheme/layouts/partials/index_profile.html new file mode 100644 index 0000000..1526c5c --- /dev/null +++ b/themes/mytheme/layouts/partials/index_profile.html @@ -0,0 +1,59 @@ +
    + {{- with site.Params.profileMode }} +
    + {{- if .imageUrl -}} + {{- $img := "" }} + {{- if not (urls.Parse .imageUrl).IsAbs }} + {{- $img = resources.Get .imageUrl }} + {{- end }} + {{- if $img }} + {{- $processableFormats := (slice "jpg" "jpeg" "png" "tif" "bmp" "gif") -}} + {{- if hugo.IsExtended -}} + {{- $processableFormats = $processableFormats | append "webp" -}} + {{- end -}} + {{- $prod := (hugo.IsProduction | or (eq site.Params.env "production")) }} + {{- if and (in $processableFormats $img.MediaType.SubType) (eq $prod true)}} + {{- if (not (and (not .imageHeight) (not .imageWidth))) }} + {{- $img = $img.Resize (printf "%dx%d" .imageWidth .imageHeight) }} + {{- else if .imageHeight }} + {{- $img = $img.Resize (printf "x%d" .imageHeight) }} + {{ else if .imageWidth }} + {{- $img = $img.Resize (printf "%dx" .imageWidth) }} + {{ else }} + {{- $img = $img.Resize "150x150" }} + {{- end }} + {{- end }} + {{ .imageTitle | default + {{- else }} + {{ .imageTitle | default + {{- end }} + {{- end }} +

    {{ .title | default site.Title | markdownify }}

    +
    + {{ .subtitle | markdownify }} + {{- partial "social_icons.html" site.Params.socialIcons -}} + + {{- with .buttons }} + + {{- end }} +
    + {{- end}} +
    diff --git a/themes/mytheme/layouts/partials/post_canonical.html b/themes/mytheme/layouts/partials/post_canonical.html new file mode 100644 index 0000000..abfc1e3 --- /dev/null +++ b/themes/mytheme/layouts/partials/post_canonical.html @@ -0,0 +1,9 @@ +{{ if and (.Params.canonicalURL) (.Params.ShowCanonicalLink ) -}} +{{ $url := urls.Parse .Params.canonicalURL }} + +{{- if or .Params.author site.Params.author (.Param "ShowReadingTime") (not .Date.IsZero) .IsTranslated (or .Params.editPost.URL site.Params.editPost.URL) }} | {{- end -}} + + {{- (site.Params.CanonicalLinkText | default .Params.CanonicalLinkText) | default "Originally published at" -}} +  {{ $url.Host }} + +{{- end }} diff --git a/themes/mytheme/layouts/partials/post_meta.html b/themes/mytheme/layouts/partials/post_meta.html new file mode 100644 index 0000000..15b8b1b --- /dev/null +++ b/themes/mytheme/layouts/partials/post_meta.html @@ -0,0 +1,21 @@ +{{- $scratch := newScratch }} + +{{- if not .Date.IsZero -}} +{{- $scratch.Add "meta" (slice (printf "%s" (.Date) (.Date | time.Format (default "January 2, 2006" site.Params.DateFormat)))) }} +{{- end }} + +{{- if (.Param "ShowReadingTime") -}} +{{- $scratch.Add "meta" (slice (i18n "read_time" .ReadingTime | default (printf "%d min" .ReadingTime))) }} +{{- end }} + +{{- if (.Param "ShowWordCount") -}} +{{- $scratch.Add "meta" (slice (i18n "words" .WordCount | default (printf "%d words" .WordCount))) }} +{{- end }} + +{{- with (partial "author.html" .) }} +{{- $scratch.Add "meta" (slice .) }} +{{- end }} + +{{- with ($scratch.Get "meta") }} +{{- delimit . " · " -}} +{{- end -}} diff --git a/themes/mytheme/layouts/partials/post_nav_links.html b/themes/mytheme/layouts/partials/post_nav_links.html new file mode 100644 index 0000000..b988641 --- /dev/null +++ b/themes/mytheme/layouts/partials/post_nav_links.html @@ -0,0 +1,19 @@ +{{- $pages := where site.RegularPages "Type" "in" site.Params.mainSections }} +{{- if and (gt (len $pages) 1) (in $pages . ) }} + +{{- end }} diff --git a/themes/mytheme/layouts/partials/share_icons.html b/themes/mytheme/layouts/partials/share_icons.html new file mode 100644 index 0000000..59ed050 --- /dev/null +++ b/themes/mytheme/layouts/partials/share_icons.html @@ -0,0 +1,71 @@ +{{- $pageurl := .Permalink }} +{{- $title := .Title }} + +{{- $.Scratch.Set "tags" ""}} + +{{- with .Params.Tags }} +{{- $hashtags := newScratch}} +{{- range . }}{{ $hashtags.Add "tags" (slice (replaceRE "(\\s)" "" . ))}}{{end}} +{{- $.Scratch.Set "tags" (delimit ($hashtags.Get "tags") ",") }} +{{- end -}} + +{{- $custom := false }} +{{- $ShareButtons := (.Param "ShareButtons")}} +{{- with $ShareButtons }}{{ $custom = true }}{{ end }} + + \ No newline at end of file diff --git a/themes/mytheme/layouts/partials/social_icons.html b/themes/mytheme/layouts/partials/social_icons.html new file mode 100644 index 0000000..206bff3 --- /dev/null +++ b/themes/mytheme/layouts/partials/social_icons.html @@ -0,0 +1,8 @@ + diff --git a/themes/mytheme/layouts/partials/svg.html b/themes/mytheme/layouts/partials/svg.html new file mode 100644 index 0000000..49f5389 --- /dev/null +++ b/themes/mytheme/layouts/partials/svg.html @@ -0,0 +1,649 @@ +{{- $icon_name := ( trim .name " " | lower )}} +{{- if (eq $icon_name "123rf") -}} + + + + +{{- else if (eq $icon_name "adobestock") -}} + + + + +{{- else if (eq $icon_name "anilist") -}} + + + +{{- else if (eq $icon_name "applemusic") -}} + + + +{{- else if (eq $icon_name "applepodcasts") -}} + + + +{{- else if (eq $icon_name "behance") -}} + + + +{{- else if (eq $icon_name "bilibili") -}} + + + + + + + +{{- else if (eq $icon_name "bitcoin") -}} + + + +{{- else if (eq $icon_name "buymeacoffee") -}} + + + + + + + + + + + + + + + + +{{- else if (eq $icon_name "codepen") -}} + + + + + + + +{{- else if (eq $icon_name "cryptohack") -}} + + + + + + +{{- else if (eq $icon_name "ctftime") -}} + + + + + + +{{- else if (eq $icon_name "cv") -}} + + + + + + +{{- else if (eq $icon_name "dev") -}} + + + +{{- else if (eq $icon_name "deviantart") -}} + + + +{{- else if (eq $icon_name "deezer") -}} + + + +{{- else if (eq $icon_name "discogs") -}} + + + +{{- else if (eq $icon_name "discord") -}} + + + + +{{- else if (eq $icon_name "dreamstime") -}} + + + +{{- else if (eq $icon_name "dribbble") -}} + + + + + +{{- else if (eq $icon_name "email") -}} + + + + +{{- else if (eq $icon_name "facebook") -}} + + + +{{- else if (eq $icon_name "flickr") -}} + + + +{{- else if (eq $icon_name "freepik") -}} + + + + + + +{{- else if (eq $icon_name "gitea") -}} + + + +{{- else if (eq $icon_name "github") -}} + + + + +{{- else if (eq $icon_name "gitlab") -}} + + + + +{{- else if (eq $icon_name "goodreads") -}} + + + +{{- else if (eq $icon_name "googlepodcasts") -}} + + + +{{- else if (eq $icon_name "googlescholar") -}} + + + +{{- else if (eq $icon_name "gurushots") -}} + + + + + + + + + + + + +{{- else if (eq $icon_name "hackerone") -}} + + + +{{- else if (eq $icon_name "hackerrank") -}} + + + + + + +{{- else if (eq $icon_name "hackthebox") -}} + + + + + + +{{- else if (eq $icon_name "instagram") -}} + + + + + +{{- else if (eq $icon_name "itchio") -}} + + + +{{- else if (eq $icon_name "kaggle") -}} + + + +{{- else if (eq $icon_name "kakaotalk") -}} + + + + + + + +{{- else if (eq $icon_name "keybase") -}} + + + +{{- else if (eq $icon_name "kofi") -}} + + + +{{- else if (eq $icon_name "komoot") -}} + + + +{{- else if (eq $icon_name "lastfm") -}} + + + +{{- else if (eq $icon_name "letterboxd") -}} + + + +{{- else if (eq $icon_name "liberapay") -}} + + + + + + +{{- else if (eq $icon_name "lichess" ) -}} + + + +{{- else if (eq $icon_name "linkedin") -}} + + + + + +{{- else if (eq $icon_name "mastodon") -}} + + + + +{{- else if (eq $icon_name "matrix") -}} + + + +{{- else if (eq $icon_name "medium") -}} + + + + + +{{- else if (eq $icon_name "microblog") -}} + + + + + + +{{- else if (eq $icon_name "mixcloud") -}} + + + +{{- else if (eq $icon_name "monero") -}} + + + +{{- else if (eq $icon_name "nuget") -}} + + + + + + + + +{{- else if (eq $icon_name "orcid") -}} + + + +{{- else if (eq $icon_name "osu!") -}} + + + + + + +{{- else if (eq $icon_name "overcast") -}} + + + +{{- else if (eq $icon_name "patreon") -}} + + + +{{- else if (eq $icon_name "paypal") -}} + + + +{{- else if (eq $icon_name "peertube") -}} + + + +{{- else if or (eq $icon_name "pgpkey") (eq $icon_name "key") -}} + + + + +{{- else if (eq $icon_name "phone") -}} + + + + + +{{- else if (eq $icon_name "pocketcasts") -}} + + + +{{- else if (eq $icon_name "polywork") -}} + +{{- else if (eq $icon_name "qq") -}} + + + + +{{- else if (eq $icon_name "reddit") -}} + + + +{{- else if (eq $icon_name "researchgate") -}} + + + +{{- else if (eq $icon_name "rss") -}} + + + + + +{{- else if (eq $icon_name "serverfault") -}} + + + +{{- else if (eq $icon_name "sessionmessenger") -}} + + + + +{{- else if (eq $icon_name "soundcloud") -}} + + + +{{- else if (eq $icon_name "shutterstock") -}} + + + + +{{- else if (eq $icon_name "sketchfab") -}} + + + +{{- else if (eq $icon_name "slack") -}} + + + + + + + +{{- else if (eq $icon_name "snapchat") -}} + + + +{{- else if (eq $icon_name "sourcehut") -}} + + + + +{{- else if (eq $icon_name "spotify") -}} + + + +{{- else if (eq $icon_name "stackoverflow") -}} + + + +{{- else if (eq $icon_name "steam") -}} + + + + + + + + + +{{- else if (eq $icon_name "strava") -}} + + + +{{- else if (eq $icon_name "telegram") -}} + + + +{{- else if (eq $icon_name "threema") -}} + + + +{{- else if (eq $icon_name "tiktok") -}} + + + +{{- else if (eq $icon_name "twitch") -}} + + + +{{- else if (eq $icon_name "twitter") -}} + + + + +{{- else if (eq $icon_name "unsplash") -}} + + + + +{{- else if (eq $icon_name "vimeo") -}} + + + +{{- else if (eq $icon_name "xda") -}} + + + +{{- else if (eq $icon_name "xing") -}} + + + + +{{- else if (eq $icon_name "xmpp") -}} + + + + +{{- else if (eq $icon_name "ycombinator") -}} + + + +{{- else if (eq $icon_name "youtube") -}} + + + + + +{{- else if $icon_name -}} + + + + +{{- end -}} diff --git a/themes/mytheme/layouts/partials/templates/opengraph.html b/themes/mytheme/layouts/partials/templates/opengraph.html new file mode 100644 index 0000000..9e8df14 --- /dev/null +++ b/themes/mytheme/layouts/partials/templates/opengraph.html @@ -0,0 +1,52 @@ + + + + +{{- if .Params.cover.image -}} +{{- if (ne .Params.cover.relative true) }} + +{{- else}} + +{{- end}} +{{- else }} + +{{- with $.Params.images -}} +{{- range first 6 . }}{{ end -}} +{{- else -}} +{{- $images := $.Resources.ByType "image" -}} +{{- $featured := $images.GetMatch "*feature*" -}} +{{- if not $featured }}{{ $featured = $images.GetMatch "{*cover*,*thumbnail*}" }}{{ end -}} +{{- with $featured -}} + +{{- else -}} +{{- with site.Params.images }}{{ end -}} +{{- end -}} +{{- end -}} +{{- end }} + +{{- if .IsPage }} +{{- $iso8601 := "2006-01-02T15:04:05-07:00" -}} + +{{ with .PublishDate }}{{ end }} +{{ with .Lastmod }}{{ end }} +{{- end -}} + +{{- with .Params.audio }}{{ end }} +{{- with .Params.locale }}{{ end }} +{{- with site.Params.title }}{{ end }} +{{- with .Params.videos }}{{- range . }} + +{{ end }}{{ end }} + +{{- /* If it is part of a series, link to related articles */}} +{{- $permalink := .Permalink }} +{{- $siteSeries := site.Taxonomies.series }} +{{ with .Params.series }}{{- range $name := . }} + {{- $series := index $siteSeries ($name | urlize) }} + {{- range $page := first 6 $series.Pages }} + {{- if ne $page.Permalink $permalink }}{{ end }} + {{- end }} +{{ end }}{{ end }} + +{{- /* Facebook Page Admin ID for Domain Insights */}} +{{- with site.Social.facebook_admin }}{{ end }} diff --git a/themes/mytheme/layouts/partials/templates/schema_json.html b/themes/mytheme/layouts/partials/templates/schema_json.html new file mode 100644 index 0000000..74abbb5 --- /dev/null +++ b/themes/mytheme/layouts/partials/templates/schema_json.html @@ -0,0 +1,119 @@ +{{ if .IsHome }} + +{{- else if (or .IsPage .IsSection) }} +{{/* BreadcrumbList */}} +{{- $url := replace .Parent.Permalink ( printf "%s" site.BaseURL) "" }} +{{- $lang_url := strings.TrimPrefix ( printf "%s/" .Lang) $url }} +{{- $bc_list := (split $lang_url "/")}} + +{{- $scratch := newScratch }} + +{{- if .IsPage }} + +{{- end }}{{/* .IsPage end */}} + +{{- end -}} diff --git a/themes/mytheme/layouts/partials/templates/twitter_cards.html b/themes/mytheme/layouts/partials/templates/twitter_cards.html new file mode 100644 index 0000000..bd46e37 --- /dev/null +++ b/themes/mytheme/layouts/partials/templates/twitter_cards.html @@ -0,0 +1,33 @@ +{{- if .Params.cover.image -}} + +{{- if (ne $.Params.cover.relative true) }} + +{{- else }} + +{{- end}} +{{- else }} +{{- with $.Params.images -}} + + +{{ else -}} +{{- $images := $.Resources.ByType "image" -}} +{{- $featured := $images.GetMatch "*feature*" -}} +{{- if not $featured }}{{ $featured = $images.GetMatch "{*cover*,*thumbnail*}" }}{{ end -}} +{{- with $featured -}} + + +{{- else -}} +{{- with site.Params.images -}} + + +{{ else -}} + +{{- end -}} +{{- end -}} +{{- end }} +{{- end }} + + +{{ with site.Social.twitter -}} + +{{ end -}} diff --git a/themes/mytheme/layouts/partials/toc.html b/themes/mytheme/layouts/partials/toc.html new file mode 100644 index 0000000..d9b8b23 --- /dev/null +++ b/themes/mytheme/layouts/partials/toc.html @@ -0,0 +1,97 @@ +{{- $headers := findRE "(.|\n])+?
    " .Content -}} +{{- $has_headers := ge (len $headers) 1 -}} +{{- if $has_headers -}} +
    +
    + + {{- i18n "toc" | default "Table of Contents" }} + + +
    + {{- if (.Param "UseHugoToc") }} + {{- .TableOfContents -}} + {{- else }} + {{- $largest := 6 -}} + {{- range $headers -}} + {{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}} + {{- $headerLevel := len (seq $headerLevel) -}} + {{- if lt $headerLevel $largest -}} + {{- $largest = $headerLevel -}} + {{- end -}} + {{- end -}} + + {{- $firstHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers 0) 1) 0)) -}} + + {{- $.Scratch.Set "bareul" slice -}} +
      + {{- range seq (sub $firstHeaderLevel $largest) -}} +
        + {{- $.Scratch.Add "bareul" (sub (add $largest .) 1) -}} + {{- end -}} + {{- range $i, $header := $headers -}} + {{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}} + {{- $headerLevel := len (seq $headerLevel) -}} + + {{/* get id="xyz" */}} + {{- $id := index (findRE "(id=\"(.*?)\")" $header 9) 0 }} + + {{- /* strip id="" to leave xyz, no way to get regex capturing groups in hugo */ -}} + {{- $cleanedID := replace (replace $id "id=\"" "") "\"" "" }} + {{- $header := replaceRE "((.|\n])+?)" "$1" $header -}} + + {{- if ne $i 0 -}} + {{- $prevHeaderLevel := index (findRE "[1-6]" (index $headers (sub $i 1)) 1) 0 -}} + {{- $prevHeaderLevel := len (seq $prevHeaderLevel) -}} + {{- if gt $headerLevel $prevHeaderLevel -}} + {{- range seq $prevHeaderLevel (sub $headerLevel 1) -}} +
          + {{/* the first should not be recorded */}} + {{- if ne $prevHeaderLevel . -}} + {{- $.Scratch.Add "bareul" . -}} + {{- end -}} + {{- end -}} + {{- else -}} + + {{- if lt $headerLevel $prevHeaderLevel -}} + {{- range seq (sub $prevHeaderLevel 1) -1 $headerLevel -}} + {{- if in ($.Scratch.Get "bareul") . -}} +
        + {{/* manually do pop item */}} + {{- $tmp := $.Scratch.Get "bareul" -}} + {{- $.Scratch.Delete "bareul" -}} + {{- $.Scratch.Set "bareul" slice}} + {{- range seq (sub (len $tmp) 1) -}} + {{- $.Scratch.Add "bareul" (index $tmp (sub . 1)) -}} + {{- end -}} + {{- else -}} +
      + + {{- end -}} + {{- end -}} + {{- end -}} + {{- end }} +
    • + {{- $header | safeHTML -}} + {{- else }} +
    • + {{- $header | safeHTML -}} + {{- end -}} + {{- end -}} + + {{- $firstHeaderLevel := $largest }} + {{- $lastHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers (sub (len $headers) 1)) 1) 0)) }} +
    • + {{- range seq (sub $lastHeaderLevel $firstHeaderLevel) -}} + {{- if in ($.Scratch.Get "bareul") (add . $firstHeaderLevel) }} +
    + {{- else }} + +

    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 SaWs{<2jwqAA`-!=U&yzL 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%0AE_#}$`j!6qjR9< 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 +{{- end }}{{/* end main */ -}} diff --git a/themes/mytheme/layouts/_default/_markup/render-image.html b/themes/mytheme/layouts/_default/_markup/render-image.html new file mode 100644 index 0000000..1acb87d --- /dev/null +++ b/themes/mytheme/layouts/_default/_markup/render-image.html @@ -0,0 +1 @@ +{{ .Text }} diff --git a/themes/mytheme/layouts/_default/archives.html b/themes/mytheme/layouts/_default/archives.html new file mode 100644 index 0000000..e400e2c --- /dev/null +++ b/themes/mytheme/layouts/_default/archives.html @@ -0,0 +1,49 @@ +{{- define "main" }} + +

  • + {{- end -}} + {{- end }} + + {{- end }} + + + +{{- end }} diff --git a/themes/mytheme/layouts/partials/translation_list.html b/themes/mytheme/layouts/partials/translation_list.html new file mode 100644 index 0000000..0028251 --- /dev/null +++ b/themes/mytheme/layouts/partials/translation_list.html @@ -0,0 +1,19 @@ +{{- if .IsTranslated -}} +{{- if (ne .Layout "search") }} +{{- if or .Params.author site.Params.author (.Param "ShowReadingTime") (not .Date.IsZero) }} | {{- end -}} +{{- end }} +{{- i18n "translations" | default "Translations" }}: + +{{- end -}} diff --git a/themes/mytheme/layouts/robots.txt b/themes/mytheme/layouts/robots.txt new file mode 100644 index 0000000..f26f508 --- /dev/null +++ b/themes/mytheme/layouts/robots.txt @@ -0,0 +1,7 @@ +User-agent: * +{{- if hugo.IsProduction | or (eq site.Params.env "production") }} +Disallow: +{{- else }} +Disallow: / +{{- end }} +Sitemap: {{ "sitemap.xml" | absURL }} diff --git a/themes/mytheme/layouts/shortcodes/chat.html b/themes/mytheme/layouts/shortcodes/chat.html new file mode 100644 index 0000000..526a75f --- /dev/null +++ b/themes/mytheme/layouts/shortcodes/chat.html @@ -0,0 +1,12 @@ + + +
    + diff --git a/themes/mytheme/layouts/shortcodes/collapse.html b/themes/mytheme/layouts/shortcodes/collapse.html new file mode 100644 index 0000000..17d8d3b --- /dev/null +++ b/themes/mytheme/layouts/shortcodes/collapse.html @@ -0,0 +1,8 @@ +{{ if .Get "summary" }} +{{ else }} +{{ warnf "missing value for param 'summary': %s" .Position }} +{{ end }} +

    + {{ .Get "summary" | markdownify }} + {{ .Inner | markdownify }} +

    diff --git a/themes/mytheme/layouts/shortcodes/figure.html b/themes/mytheme/layouts/shortcodes/figure.html new file mode 100644 index 0000000..8c93eff --- /dev/null +++ b/themes/mytheme/layouts/shortcodes/figure.html @@ -0,0 +1,31 @@ + + {{- if .Get "link" -}} + + {{- end }} + {{ with .Get + {{- if .Get "link" }}{{ end -}} + {{- if or (or (.Get "title") (.Get "caption")) (.Get "attr") -}} +
    + {{ with (.Get "title") -}} + {{ . }} + {{- end -}} + {{- if or (.Get "caption") (.Get "attr") -}}

    + {{- .Get "caption" | markdownify -}} + {{- with .Get "attrlink" }} + + {{- end -}} + {{- .Get "attr" | markdownify -}} + {{- if .Get "attrlink" }}{{ end }}

    + {{- end }} +
    + {{- end }} + diff --git a/themes/mytheme/layouts/shortcodes/inTextImg.html b/themes/mytheme/layouts/shortcodes/inTextImg.html new file mode 100644 index 0000000..0239fd6 --- /dev/null +++ b/themes/mytheme/layouts/shortcodes/inTextImg.html @@ -0,0 +1,5 @@ +{{- $Img := (.Get "url") }} +{{- $height := (.Get "height") }} +{{- $alt := (.Get "alt") }} + +{{$alt}} diff --git a/themes/mytheme/layouts/shortcodes/ltr.html b/themes/mytheme/layouts/shortcodes/ltr.html new file mode 100644 index 0000000..4ad7682 --- /dev/null +++ b/themes/mytheme/layouts/shortcodes/ltr.html @@ -0,0 +1,15 @@ +{{ $.Scratch.Set "md" false }} + +{{ if .IsNamedParams }} +{{ $.Scratch.Set "md" (.Get "md") }} +{{ else }} +{{ $.Scratch.Set "md" (.Get 0) }} +{{ end }} + +
    + {{ if eq ($.Scratch.Get "md") false }} + {{ .Inner }} + {{ else }} + {{ .Inner | markdownify }} + {{ end }} +
    diff --git a/themes/mytheme/layouts/shortcodes/rawhtml.html b/themes/mytheme/layouts/shortcodes/rawhtml.html new file mode 100644 index 0000000..9350c13 --- /dev/null +++ b/themes/mytheme/layouts/shortcodes/rawhtml.html @@ -0,0 +1,2 @@ + +{{- .Inner -}} \ No newline at end of file diff --git a/themes/mytheme/layouts/shortcodes/rtl.html b/themes/mytheme/layouts/shortcodes/rtl.html new file mode 100644 index 0000000..a69b8ce --- /dev/null +++ b/themes/mytheme/layouts/shortcodes/rtl.html @@ -0,0 +1,15 @@ +{{ $.Scratch.Set "md" false }} + +{{ if .IsNamedParams }} +{{ $.Scratch.Set "md" (.Get "md") }} +{{ else }} +{{ $.Scratch.Set "md" (.Get 0) }} +{{ end }} + +
    + {{ if eq ($.Scratch.Get "md") false }} + {{ .Inner }} + {{ else }} + {{ .Inner | markdownify }} + {{ end }} +
    diff --git a/themes/mytheme/theme.yaml b/themes/mytheme/theme.yaml new file mode 100644 index 0000000..6dd0e5d --- /dev/null +++ b/themes/mytheme/theme.yaml @@ -0,0 +1,41 @@ +name: mytheme +license: MIT +licenselink: 'https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE' +description: 'A fast, clean, responsive Hugo theme' +homepage: 'https://adityatelange.github.io/hugo-PaperMod/' +tags: + - responsive + - simple + - clean + - light + - dark + - blog + - minimalist + - highlight.js + - search +features: + - responsive + - single-column + - blog + - cover-image + - table-of-contents + - opengraph + - highlight.js + - favicon + - archive + - share-icons + - cover + - multilingual + - social-icons + - minified-assets + - theme-toggle + - menu-location-indicator + - scroll-to-top + - search +min_version: 0.83.0 +author: + name: Aditya Telange + homepage: 'https://github.com/adityatelange/' +params: + ShareButtons: [""] + disableShare: true diff --git a/update.sh b/update.sh new file mode 100755 index 0000000..f62d0a5 --- /dev/null +++ b/update.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +cd /srv/web/blog + +git pull + +hugo