diff --git a/db.json b/db.json index 6164275..bcc1ab1 100644 --- a/db.json +++ b/db.json @@ -1 +1 @@ -{"meta":{"version":1,"warehouse":"5.0.1"},"models":{"Asset":[{"_id":"themes/icarus/source/img/og_image.png","path":"img/og_image.png","modified":0,"renderable":1},{"_id":"themes/icarus/source/img/razor-bottom-black.svg","path":"img/razor-bottom-black.svg","modified":0,"renderable":1},{"_id":"themes/icarus/source/img/razor-top-black.svg","path":"img/razor-top-black.svg","modified":0,"renderable":1},{"_id":"themes/icarus/source/js/animation.js","path":"js/animation.js","modified":0,"renderable":1},{"_id":"themes/icarus/source/js/back_to_top.js","path":"js/back_to_top.js","modified":0,"renderable":1},{"_id":"themes/icarus/source/js/main.js","path":"js/main.js","modified":0,"renderable":1},{"_id":"themes/icarus/source/js/column.js","path":"js/column.js","modified":0,"renderable":1},{"_id":"themes/icarus/source/js/pjax.js","path":"js/pjax.js","modified":1,"renderable":1},{"_id":"themes/icarus/source/css/cyberpunk.styl","path":"css/cyberpunk.styl","modified":0,"renderable":1},{"_id":"themes/icarus/source/css/style.styl","path":"css/style.styl","modified":0,"renderable":1},{"_id":"themes/icarus/source/css/default.styl","path":"css/default.styl","modified":0,"renderable":1},{"_id":"themes/icarus/source/img/favicon.png","path":"img/favicon.png","modified":0,"renderable":1},{"_id":"themes/icarus/source/img/logo.png","path":"img/logo.png","modified":0,"renderable":1},{"_id":"themes/icarus/source/css/night.styl","path":"css/night.styl","modified":0,"renderable":1},{"_id":"themes/icarus/source/js/imaegoo/night.js","path":"js/imaegoo/night.js","modified":0,"renderable":1},{"_id":"themes/icarus/source/js/imaegoo/universe.js","path":"js/imaegoo/universe.js","modified":0,"renderable":1},{"_id":"themes/icarus/source/img/me.MP.jpg","path":"img/me.MP.jpg","modified":0,"renderable":1}],"Cache":[{"_id":"source/_posts/hello-world.md","hash":"6d32d528cf04cc2d4a78909c54d86d0ea7165275","modified":1729072457119},{"_id":"themes/icarus/layout/comment/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122673},{"_id":"themes/icarus/layout/donate/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122676},{"_id":"themes/icarus/layout/misc/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122677},{"_id":"themes/icarus/layout/search/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122678},{"_id":"themes/icarus/layout/share/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122678},{"_id":"themes/icarus/include/schema/misc/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122660},{"_id":"themes/icarus/include/schema/comment/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122656},{"_id":"themes/icarus/include/schema/donate/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122659},{"_id":"themes/icarus/include/schema/search/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122662},{"_id":"themes/icarus/include/schema/share/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122663},{"_id":"themes/icarus/.eslintrc.json","hash":"ca45d8e5d80ad6b7004cddacae7fc7d8040b2d6f","modified":1722343122649},{"_id":"themes/icarus/.eslintignore","hash":"5410a1bef9807f666cd92a0d2020f700e67e4096","modified":1722343122649},{"_id":"themes/icarus/.npmignore","hash":"42242c8da7a020a3295e7dd3d18bf022cb08b661","modified":1722343122654},{"_id":"themes/icarus/.gitignore","hash":"36084c0851a22bfd393933abb8e262562ffc6802","modified":1722343122653},{"_id":"themes/icarus/CONTRIBUTING.md","hash":"70254c6778c1e41bb2ff222bbf3a70b2239b9bc1","modified":1722343122654},{"_id":"themes/icarus/LICENSE","hash":"86037e5335a49321fa73b7815cab542057fac944","modified":1722343122654},{"_id":"themes/icarus/README.md","hash":"32f9f4fc8cd7ec60b30544bd2e558b593519ae5d","modified":1722343122654},{"_id":"themes/icarus/.github/dependabot.yml","hash":"d532d0db30e42211f35823b9885f3ed1b2d51777","modified":1722343122652},{"_id":"themes/icarus/package.json","hash":"4d195c729390c8f25d998489dbf399640f3dfb1c","modified":1735475653736},{"_id":"themes/icarus/include/config.js","hash":"4b8a3096137e0d879fb17972a69630bde38d8212","modified":1722343122654},{"_id":"themes/icarus/include/register.js","hash":"040fed1d0d7e4d8003446d1541bc15a2c4b4e500","modified":1722343122656},{"_id":"themes/icarus/.github/stale.yml","hash":"88c73f6216c5666d2f60b1e8fe690a3f6e561e42","modified":1722343122652},{"_id":"themes/icarus/include/dependency.js","hash":"e02471f80db87db43aa7d527176e195b60dc4b99","modified":1722343122655},{"_id":"themes/icarus/languages/de.yml","hash":"78421f09961ca0b24756a0688fb2cb2e2696e25f","modified":1722343122668},{"_id":"themes/icarus/languages/es.yml","hash":"38579b8fad4b6997362acc770615bcd85ff20f68","modified":1722343122669},{"_id":"themes/icarus/languages/fr.yml","hash":"b992b68705f5050a99de926525b3cb40d95c4769","modified":1722343122669},{"_id":"themes/icarus/languages/it.yml","hash":"b76999994cda6b08b53d34c3dd67947f164de655","modified":1722343122670},{"_id":"themes/icarus/languages/en.yml","hash":"3d674204d9f723c829226da745afddd180c1131d","modified":1722343122669},{"_id":"themes/icarus/languages/id.yml","hash":"5e48b1d62378cadeb64b88349477726a5c1bae47","modified":1722343122670},{"_id":"themes/icarus/languages/ko.yml","hash":"e3374265377809c1518114cf352b595840c0b416","modified":1722343122670},{"_id":"themes/icarus/languages/pl.yml","hash":"2e7debb44cd91096f30efc87bf8d6b1d0d0214c9","modified":1722343122671},{"_id":"themes/icarus/languages/ja.yml","hash":"801d9930fef48d6a3f80470d5bed4f3eb78147e6","modified":1722343122670},{"_id":"themes/icarus/languages/pt-BR.yml","hash":"ee8f73350e4c6e2f63b7fc72b34472a6b1e21244","modified":1722343122671},{"_id":"themes/icarus/languages/sv.yml","hash":"b12eee168c52aac855ffce9f78fe5fd5d6e3970c","modified":1722343122671},{"_id":"themes/icarus/languages/ru.yml","hash":"9d91358c2acbe7a0f2a25daf7f65b999ff32d068","modified":1722343122671},{"_id":"themes/icarus/languages/tk.yml","hash":"ca583168bd2025124a1cd0e977da475d7a7496fd","modified":1722343122671},{"_id":"themes/icarus/languages/tr.yml","hash":"dd0a7bfe14848d6e1aa229198fe1db03e08e305e","modified":1722343122672},{"_id":"themes/icarus/languages/zh-CN.yml","hash":"02475ba14afc70dfeaf5678467cee307835e4efa","modified":1722343122672},{"_id":"themes/icarus/languages/zh-TW.yml","hash":"a6826e0c8cdb9ad286324b682b466a9e2ad78e6f","modified":1722343122672},{"_id":"themes/icarus/languages/vn.yml","hash":"5f2fffa642110c81d8f529949711c9d19ad6bbbe","modified":1722343122672},{"_id":"themes/icarus/layout/category.jsx","hash":"2313be8301011d218830b853b294b022ce81b423","modified":1735443230745},{"_id":"themes/icarus/layout/archive.jsx","hash":"daf8eca64197709a9dc4a4792c403a32d78bdfae","modified":1722343122673},{"_id":"themes/icarus/layout/categories.jsx","hash":"b8ad43e28a4990d222bfbb95b032f88555492347","modified":1722343122673},{"_id":"themes/icarus/layout/index.jsx","hash":"0a84a2348394fa9fc5080dd396bd28d357594f47","modified":1722343122676},{"_id":"themes/icarus/layout/page.jsx","hash":"d26c2db57e5a88d6483a03aeb51cda9d191d8cea","modified":1722343122677},{"_id":"themes/icarus/scripts/index.js","hash":"93a79969c7eb47cfac097893cda36368db56902c","modified":1722343122679},{"_id":"themes/icarus/layout/layout.jsx","hash":"b66a1f94af79c69e3feb6080657fcf9954b95b0c","modified":1722354804886},{"_id":"themes/icarus/layout/post.jsx","hash":"d26c2db57e5a88d6483a03aeb51cda9d191d8cea","modified":1722343122678},{"_id":"themes/icarus/layout/tag.jsx","hash":"a9a08c9f3eec8994d37149d1ab19f2b5b8f4cd2f","modified":1735443230746},{"_id":"themes/icarus/include/migration/head.js","hash":"7189efe33d18927d3790e8afb06642fb293b8603","modified":1722343122655},{"_id":"themes/icarus/layout/tags.jsx","hash":"2c42cb64778235dd220c563a27a92108ddc50cc4","modified":1722343122679},{"_id":"themes/icarus/include/migration/v2_v3.js","hash":"a46da71c20fa9d73c1bac26fda77717abae1b308","modified":1722343122655},{"_id":"themes/icarus/include/migration/v3_v4.js","hash":"9faf2184d7fe87debfbe007f3fc9079dcbcafcfe","modified":1722343122655},{"_id":"themes/icarus/.github/ISSUE_TEMPLATE/bug_report.md","hash":"5d3abdc1a2a79ef9822865184eced6e31066d8f6","modified":1722343122650},{"_id":"themes/icarus/include/migration/v4_v5.js","hash":"6342310892d113763b5544789b45d44c0ccf2854","modified":1722343122656},{"_id":"themes/icarus/.github/ISSUE_TEMPLATE/Bug反馈.md","hash":"d801be6937df21e63113be8840b2e23c465db87b","modified":1722343122650},{"_id":"themes/icarus/include/migration/v5_v5.1.js","hash":"073f22bd16e34b56f016633b1676dab2e7d8843d","modified":1722343122656},{"_id":"themes/icarus/.github/workflows/github-release.yml","hash":"d9830273e7e23c4151b10840f131f0b78b961bae","modified":1722343122653},{"_id":"themes/icarus/.github/ISSUE_TEMPLATE/功能建议.md","hash":"c6f60f37e6cd0bc21a81b3b07f84e04e9e80fb57","modified":1722343122651},{"_id":"themes/icarus/.github/ISSUE_TEMPLATE/config.yml","hash":"b49270a202d839c298e584b5d017f56140c7e7a0","modified":1722343122651},{"_id":"themes/icarus/.github/ISSUE_TEMPLATE/feature_request.md","hash":"05313e241a3d43fdadb0f74390b562c07c25d4d0","modified":1722343122651},{"_id":"themes/icarus/.github/workflows/lint.yml","hash":"17d374bf92867a67b15d657c2d41f8e4f9271102","modified":1722343122653},{"_id":"themes/icarus/.github/workflows/npm-publish.yml","hash":"de1ac56ec6888aaeb5db81d94693248b3467e4f6","modified":1722343122653},{"_id":"themes/icarus/.github/workflows/test.yml","hash":"f24e60941bf49b124dfc6a8b6c194da4c62abc2f","modified":1722343122653},{"_id":"themes/icarus/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md","hash":"e106fa240c24c8bfbdd623549651600c6d786c9c","modified":1722343122652},{"_id":"themes/icarus/include/style/button.styl","hash":"0fb35b4786be1b387c751fa2849bc71523fcedd4","modified":1722343122665},{"_id":"themes/icarus/include/style/article.styl","hash":"105c983871b6c9148d97a0f756886e56411572bd","modified":1722343122664},{"_id":"themes/icarus/include/util/console.js","hash":"59cf9d277d3ac85a496689bd811b1c316001641d","modified":1722343122668},{"_id":"themes/icarus/include/style/base.styl","hash":"2bca6ad099949d52236c87db8db1002ffb99774c","modified":1722343122664},{"_id":"themes/icarus/include/style/card.styl","hash":"f78674422eb408cd17c17bbdc3ee1ebe4a453e05","modified":1722343122665},{"_id":"themes/icarus/include/style/codeblock.styl","hash":"ec54dc24eb4d9802d8fefc44c210558bc1641109","modified":1722343122666},{"_id":"themes/icarus/include/style/donate.styl","hash":"8d0af00628c13134b5f30a558608e7bebf18c2ec","modified":1722343122666},{"_id":"themes/icarus/include/style/footer.styl","hash":"a4ad715dee38b249538ac6cce94efc9b355a904b","modified":1722343122666},{"_id":"themes/icarus/include/style/helper.styl","hash":"9f3393e6122cc9f351091bfab960674e962da343","modified":1722343122666},{"_id":"themes/icarus/include/style/pagination.styl","hash":"b81bcd7ff915b4e9299533addc01bc4575ec35e3","modified":1722343122667},{"_id":"themes/icarus/include/style/plugin.styl","hash":"084843d5a522029e0f84a4fe791fbcb2cabd4c36","modified":1722343122667},{"_id":"themes/icarus/include/style/navbar.styl","hash":"34f09b144cb46a25ec2cc7260a6c207dd34ff1fe","modified":1722343122666},{"_id":"themes/icarus/include/style/responsive.styl","hash":"207083fe287612cddee6608b541861b14ac8de81","modified":1722343122667},{"_id":"themes/icarus/include/style/search.styl","hash":"416737e1da4e7e907bd03609b0fee9e2aacfe56c","modified":1722343122667},{"_id":"themes/icarus/include/style/widget.styl","hash":"c746902251136544eb3fe523235b3183f4189460","modified":1722343122668},{"_id":"themes/icarus/include/style/timeline.styl","hash":"ea61798a09bffdda07efb93c2ff800b63bddc4c4","modified":1722343122668},{"_id":"themes/icarus/include/schema/config.json","hash":"3186ad55b3b4592abac10252ce383c275d878700","modified":1722354804881},{"_id":"themes/icarus/layout/common/article.jsx","hash":"3cd424087a389d268adebe6078b4b19ebbaa5340","modified":1722354804883},{"_id":"themes/icarus/layout/common/footer.jsx","hash":"59ec3829b84fd1a6a4ec452acde9472c874aba6b","modified":1722354804884},{"_id":"themes/icarus/layout/common/head.jsx","hash":"bf783d5ef6d58924150472637c6c17782c83e102","modified":1722343122675},{"_id":"themes/icarus/layout/common/comment.jsx","hash":"76ee7c6687e96e6262985323665d6273a37e54c5","modified":1722343122674},{"_id":"themes/icarus/layout/common/donates.jsx","hash":"fd52330d582fd122db7f55444c2f3368ff4bd8d7","modified":1722343122674},{"_id":"themes/icarus/layout/common/plugins.jsx","hash":"2e27800b2a8a87112c96778db858c3419d890b79","modified":1722343122675},{"_id":"themes/icarus/layout/common/navbar.jsx","hash":"3e6914991b4332bb0a164cae5bf53b7962008acc","modified":1722354804885},{"_id":"themes/icarus/layout/common/search.jsx","hash":"1409627d98a92b4f5b2ab829f8e6b50b75d60e53","modified":1722343122675},{"_id":"themes/icarus/layout/common/scripts.jsx","hash":"5d07312406b401e8d4e9584b4d41ed7377993935","modified":1722343122675},{"_id":"themes/icarus/layout/common/widgets.jsx","hash":"7a89ac72a988d13b4714ab78a6dfd5cd8de85d47","modified":1722343122676},{"_id":"themes/icarus/layout/plugin/animejs.jsx","hash":"e2aa27c3501a58ef1e91e511557b77395c2c02aa","modified":1722343122677},{"_id":"themes/icarus/layout/common/share.jsx","hash":"0fad6f8a91bb5cf678b9ff2d66d2162d61625074","modified":1722343122676},{"_id":"themes/icarus/layout/plugin/pjax.jsx","hash":"65956102d5faabcedaaafb14b0201548f15e60ce","modified":1722343122677},{"_id":"themes/icarus/source/img/avatar.png","hash":"0d8236dcca871735500e9d06bbdbe0853ed6775b","modified":1722343122681},{"_id":"themes/icarus/source/img/og_image.png","hash":"b03f163096ca9c350ec962feee9836277b5c2509","modified":1722343122681},{"_id":"themes/icarus/layout/widget/profile.jsx","hash":"2322a2b24e63bfb44b2acfc07795435f8c89d511","modified":1735443230746},{"_id":"themes/icarus/source/img/favicon.svg","hash":"16fd847265845063a16596761cddb32926073dd2","modified":1722343122681},{"_id":"themes/icarus/source/img/razor-bottom-black.svg","hash":"a3eda07b1c605b456da9cdf335a1075db5e5d72c","modified":1722343122682},{"_id":"themes/icarus/source/img/logo.svg","hash":"87113c1f0d215c31245f5dcab3aa5df58e6aa5ee","modified":1722349594518},{"_id":"themes/icarus/source/img/razor-top-black.svg","hash":"201f1171a43ce667a39091fe47c0f278857f18f0","modified":1722343122682},{"_id":"themes/icarus/source/js/animation.js","hash":"0a8e361c353daa3194f4de3d646b96025d128e1a","modified":1722343122683},{"_id":"themes/icarus/layout/plugin/back_to_top.jsx","hash":"f86a0bae3a92bc07bd674f03a046fb1b6c1b48af","modified":1722343122677},{"_id":"themes/icarus/source/js/.eslintrc.json","hash":"6bf0641cb69dffac97f69baea192d7fa3ab612cb","modified":1722343122683},{"_id":"themes/icarus/source/js/column.js","hash":"0baee024ab67474c073a4c41b495f3e7f0df4505","modified":1722343122683},{"_id":"themes/icarus/source/js/back_to_top.js","hash":"d91f10c08c726135a13dfa1f422c49d8764ef03f","modified":1722343122683},{"_id":"themes/icarus/source/js/main.js","hash":"37f3b16fbd9668b9496d5f2d9bd9fb22fc6cee27","modified":1722343122684},{"_id":"themes/icarus/source/css/default.styl","hash":"b01da3028e5a1267a40aaae5c86a11187a2259e3","modified":1722343122680},{"_id":"themes/icarus/source/css/style.styl","hash":"efd5bdae679ec0bc6555d70d17b8770ae11b98a4","modified":1722354804887},{"_id":"themes/icarus/source/js/pjax.js","hash":"1c9921d4bd07795adc1d01a12c0fddf7d1124ca2","modified":1735443230748},{"_id":"themes/icarus/source/css/cyberpunk.styl","hash":"ae17d3528df0c3f089df14a06b7bd82f1bc5fed9","modified":1722343122680},{"_id":"themes/icarus/include/schema/common/donates.json","hash":"ae86e6f177bedf4afbe638502c12635027539305","modified":1722343122657},{"_id":"themes/icarus/include/schema/common/navbar.json","hash":"6691e587284c4cf450e0288680d5ff0f3565f090","modified":1722343122658},{"_id":"themes/icarus/include/schema/common/comment.json","hash":"265120b80df9808358df3ff7c4eada8a66512a4b","modified":1722343122657},{"_id":"themes/icarus/include/schema/common/article.json","hash":"e2502c39045c6a26ccd8e880858f93e78c7bda35","modified":1722343122657},{"_id":"themes/icarus/include/schema/common/footer.json","hash":"e85c9d7f2579805beb252a1b6345d5a668a13baa","modified":1722343122657},{"_id":"themes/icarus/include/schema/common/plugins.json","hash":"04c0738dc0a3ed89aecae2aee4ab60173f09e66b","modified":1722343122658},{"_id":"themes/icarus/include/schema/common/head.json","hash":"98889f059c635e6bdbd51effd04cf1cf44968a66","modified":1722343122657},{"_id":"themes/icarus/include/schema/common/providers.json","hash":"97ec953d497fb53594227ae98acaef8a8baa91da","modified":1722343122658},{"_id":"themes/icarus/include/schema/common/share.json","hash":"cf4f9ff4fb27c3541b35f57db355c228fa6873e4","modified":1722343122658},{"_id":"themes/icarus/include/schema/common/search.json","hash":"985fbcbf47054af714ead1a124869d54f2a8b607","modified":1722343122658},{"_id":"themes/icarus/include/schema/common/widgets.json","hash":"cadd9dc942740ecd5037d3943e72f8b6a8399bbe","modified":1722343122659},{"_id":"themes/icarus/include/schema/common/sidebar.json","hash":"eb241beaec4c73e3085dfb3139ce72e827e20549","modified":1722343122659},{"_id":"themes/icarus/include/schema/widget/profile.json","hash":"690ee1b0791cab47ea03cf42b5b4932ed2aa5675","modified":1722343122664},{"_id":"themes/icarus/include/schema/plugin/back_to_top.json","hash":"dc0febab7e7b67075d0ad3f80f5ec8b798b68dea","modified":1722343122661},{"_id":"themes/icarus/include/schema/plugin/animejs.json","hash":"e62ab6e20bd8862efa1ed32e7c0db0f8acbcfdec","modified":1722343122660},{"_id":"themes/icarus/include/schema/plugin/pjax.json","hash":"1f6218016569eb9cd354a06a9537c7110efb5f17","modified":1722343122661},{"_id":"themes/icarus/source/img/favicon.ico","hash":"ed1f3c74e54fb4c2d8ccd843cb7110917dc58535","modified":1722348217072},{"_id":"themes/icarus/.DS_Store","hash":"b2f2ec488f6ec84f79d4dcb4c2c2439bf0e5daba","modified":1722348389639},{"_id":"themes/icarus/source/.DS_Store","hash":"fa31da7052ba0aef43d486221a33e2474f01626a","modified":1722348389638},{"_id":"themes/icarus/source/img/favicon.png","hash":"cad785cdc11fcdd88afb1ae19cb001543f3bf3f5","modified":1722315752000},{"_id":"themes/icarus/source/img/logo.png","hash":"d40e9a4a865f1358e98b49554f33b73378197f71","modified":1722349683000},{"_id":"themes/icarus/source/js/imaegoo/night.js","hash":"ee9267b31315bd80a58a80cda99b1e4d0d49d0f9","modified":1722354804888},{"_id":"themes/icarus/source/js/imaegoo/universe.js","hash":"8dc3bd0b57cd84f01943a9992ebd11b3649340df","modified":1722354804888},{"_id":"themes/icarus/source/css/night.styl","hash":"261d3208183dc387c0ee2627ea0fd7b0eb417b4d","modified":1722354804886},{"_id":"themes/icarus/source/img/me.MP.jpg","hash":"09ab0abf391a1db046feace08f3e8ea6c93c8368","modified":1722356776725},{"_id":"public/js/algolia.js","hash":"a8df0c0abeeb4ee1d2d720161f3aea7339380704","modified":1722357646144},{"_id":"public/js/google_cse.js","hash":"1a9881669dfdeb2b3214074eee0d3e01e52db2c4","modified":1722357646144},{"_id":"public/js/insight.js","hash":"86bbdb7305d9bf19ad62d2ca2cf169fc8d9f9d31","modified":1722357646144},{"_id":"public/js/toc.js","hash":"da6fb757a1b083b8ed138bf29aad3a7bf8ec4f11","modified":1722357646144},{"_id":"public/content.json","hash":"9d1467338f7fa5439768f5a85aca4ec661403bd2","modified":1735475857577},{"_id":"public/manifest.json","hash":"af662fb1f47a081376182ae79d81110a8c172dcb","modified":1722357646144},{"_id":"public/1970/01/01/hello-world/index.html","hash":"99908b22ea2cc744924162a93c4853c96fbb1864","modified":1722357646144},{"_id":"public/archives/index.html","hash":"3fe14be1c349c215f0dc35355b32d66bf2d3681c","modified":1735475857577},{"_id":"public/archives/1970/index.html","hash":"00524fcd54b2ca0102d7783cab7cca51f2d4b4a5","modified":1722357646144},{"_id":"public/archives/1970/01/index.html","hash":"ca1ac92314216e1c8f30f918e000b655399c0478","modified":1722357646144},{"_id":"public/index.html","hash":"aae972b7cc539a61d498b69f488a66a4747109ae","modified":1735475857577},{"_id":"public/categories/index.html","hash":"1492ab954862d67b2b5676ca22bc71f4a3d21118","modified":1735475857577},{"_id":"public/tags/index.html","hash":"fd32c5863ce8254487272a94ef3276b947df22cb","modified":1735475857577},{"_id":"public/img/avatar.png","hash":"0d8236dcca871735500e9d06bbdbe0853ed6775b","modified":1722357646144},{"_id":"public/img/razor-bottom-black.svg","hash":"a3eda07b1c605b456da9cdf335a1075db5e5d72c","modified":1722357646144},{"_id":"public/img/favicon.svg","hash":"16fd847265845063a16596761cddb32926073dd2","modified":1722357646144},{"_id":"public/img/razor-top-black.svg","hash":"201f1171a43ce667a39091fe47c0f278857f18f0","modified":1722357646144},{"_id":"public/img/favicon.png","hash":"cad785cdc11fcdd88afb1ae19cb001543f3bf3f5","modified":1722357646144},{"_id":"public/img/og_image.png","hash":"b03f163096ca9c350ec962feee9836277b5c2509","modified":1722357646144},{"_id":"public/img/logo.png","hash":"d40e9a4a865f1358e98b49554f33b73378197f71","modified":1722357646144},{"_id":"public/js/back_to_top.js","hash":"d91f10c08c726135a13dfa1f422c49d8764ef03f","modified":1722357646144},{"_id":"public/js/animation.js","hash":"0a8e361c353daa3194f4de3d646b96025d128e1a","modified":1722357646144},{"_id":"public/js/main.js","hash":"37f3b16fbd9668b9496d5f2d9bd9fb22fc6cee27","modified":1722357646144},{"_id":"public/js/column.js","hash":"0baee024ab67474c073a4c41b495f3e7f0df4505","modified":1722357646144},{"_id":"public/js/pjax.js","hash":"1c9921d4bd07795adc1d01a12c0fddf7d1124ca2","modified":1735475857577},{"_id":"public/css/cyberpunk.css","hash":"55e72b3ba10db4e2ddab31054f059481a44b394c","modified":1722357646144},{"_id":"public/css/style.css","hash":"eb45dd39efb661b9a79edf00877203b3de436a3e","modified":1722357646144},{"_id":"public/css/night.css","hash":"bee8a361e43d5589036e5d05633172dca584c039","modified":1722357646144},{"_id":"public/css/default.css","hash":"eb45dd39efb661b9a79edf00877203b3de436a3e","modified":1722357646144},{"_id":"public/js/imaegoo/night.js","hash":"ee9267b31315bd80a58a80cda99b1e4d0d49d0f9","modified":1722357646144},{"_id":"public/js/imaegoo/universe.js","hash":"8dc3bd0b57cd84f01943a9992ebd11b3649340df","modified":1722357646144},{"_id":"public/img/favicon.ico","hash":"ed1f3c74e54fb4c2d8ccd843cb7110917dc58535","modified":1722357646144},{"_id":"public/img/me.MP.jpg","hash":"09ab0abf391a1db046feace08f3e8ea6c93c8368","modified":1722357646144},{"_id":"public/img/logo.svg","hash":"87113c1f0d215c31245f5dcab3aa5df58e6aa5ee","modified":1722357646144},{"_id":"source/_posts/posix.md","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1735436566152},{"_id":"source/_posts/extending_autodoc.rst","hash":"d9d65a6f9fa62f23aa9f215d1c4308b927884ecd","modified":1723609564179},{"_id":"source/_posts/semaphores.md","hash":"cb0c52e434d151ab83b8fcf31b14284eff01ad61","modified":1735474512689},{"_id":"source/_posts/npm_force_install.md","hash":"a101d28e188bd6622171f96ecf3b8429331764d5","modified":1735471697936},{"_id":"source/_posts/lua.md","hash":"e37406540dbe5d4ed3a45ff8abbaab73efaa3dc3","modified":1734352777252},{"_id":"public/2024/12/15/lua/index.html","hash":"cc8701d87be5fa1fd9f934f8225af09e8e187c9a","modified":1735475857577},{"_id":"public/2024/12/28/npm_force_install/index.html","hash":"a8a0db6b67c31fab38f615f6da96b959ad60d77f","modified":1735475857577},{"_id":"public/2024/10/15/hello-world/index.html","hash":"a9eccfb4c578874ec4f94c05078fcbc4b37c9080","modified":1735475857577},{"_id":"public/2024/12/29/posix/index.html","hash":"97b6f7b2c3e4897b7ae085626075f44c4e9cbc50","modified":1735475857577},{"_id":"public/2024/10/15/semaphores/index.html","hash":"aaae45e610169ca0a48a3ade27f2f6e0a316ce66","modified":1735475857577},{"_id":"public/archives/2024/index.html","hash":"c512b85da0ba237fc7232ac94f23be5d406fdd8a","modified":1735475857577},{"_id":"public/archives/2024/10/index.html","hash":"81102d50037199faeb554a9e056c4a11602219ce","modified":1735475857577},{"_id":"public/archives/2024/12/index.html","hash":"4831e8b9b3414b64b7f8ed543aabbc8970632499","modified":1735475857577},{"_id":"public/tags/npm/index.html","hash":"b85dac785bc2ba7d43c1f43c71f335a143af140e","modified":1735475857577},{"_id":"public/tags/javascript/index.html","hash":"255a4454b7307a66407475d089c8a4e473efd8d6","modified":1735475857577},{"_id":"public/tags/frontend/index.html","hash":"c8179fe6d01d4f3dae3a042a5ce6e8d9318fd11f","modified":1735475857577},{"_id":"public/categories/research/index.html","hash":"94ca86a6741d8035a25cd7acbce793e7574711a1","modified":1735475857577},{"_id":"public/tags/lua/index.html","hash":"df93526ef48ad584b9169aefba6348ce61dc1efc","modified":1735475857577},{"_id":"public/tags/scripting/index.html","hash":"d81f2086c35e33aa54a00a4ec9b6f1d111c2f2eb","modified":1735475857577},{"_id":"public/tags/concurrency/index.html","hash":"4606448b8bd6dedc07cdc1fa534953a0d7e7bbd4","modified":1735475857577},{"_id":"public/tags/programming/index.html","hash":"eb2f63f960b5e6dadad69c50a66582467dad44f7","modified":1735475857577},{"_id":"public/tags/c/index.html","hash":"09c429e07227fecb76b99dfe0cb6397ed987889d","modified":1735475857577},{"_id":"public/tags/linux/index.html","hash":"b858a5f1750dfa4dc70549809d677ec0fe74b5dd","modified":1735475857577},{"_id":"public/tags/macos/index.html","hash":"cb42fb9353e54a92cb3149669e148139ec23531a","modified":1735475857577},{"_id":"public/tags/synchronization/index.html","hash":"64bb52f467b5201a6d0a3abbd44cb285b8161a85","modified":1735475857577},{"_id":"public/tags/low-level/index.html","hash":"ca9c3c4fc998d1afd598d088fafb0361a6b1f6d0","modified":1735475857577},{"_id":"public/tags/posix/index.html","hash":"ae31fce8138407e72d06cadc884f7f68a4e5a5a4","modified":1735475857577}],"Category":[{"name":"research","_id":"cm59lims2000325qj9q75efup"}],"Data":[],"Page":[],"Post":[{"title":"Hello World","date":"2024-10-15T15:00:00.000Z","_content":"\nWelcome to my website! This is my first post, and it's going to be about how I set up this website: how I got the dependencies and how I was able to publish to github pages.\n\nGetting this website up and running required one night's worth of work. So, if you want to dot the same for your github page, here's how you can do it:\n\n## Getting dependencies and development container\n\n0. [hexo-icarus-theme](https://github.com/ppoffice/hexo-theme-icarus) is the main dependency of this site. To avoid accidentally breaking your website should the theme be updated *AND* for future customization-ility, we are going to fork the theme repo on Github and pull it locally.\n```\n# dont forget to fork on GH first\ngh repo clone /hexo-icarus-theme\n```\n\n1. Let's create a new repo to hold the website source tree. This will be the repo that you will push to Github Pages.\n```\nmkdir $USER.github.io\ncd $USER.github.io\ngit init\n```\nYou might want to change `$USER` to your Github user or organization name.\n\n2. Next is a Dockerfile that will build your site locally in a \"controlled environment\": no polluting your machine with node stuff, development isolation, etc\n```Dockerfile\n# Dockerfile\n\n## Base and dependencies\nFROM node:22.5.1-alpine3.19 AS base\nWORKDIR /workspace\nRUN npm install -g hexo-cli\n\n## Copy sources for build\nFROM base AS build\nCOPY . /workspace\nRUN hexo generate\n\n## Deploy\nFROM nginx:1.21.3-alpine\nCOPY --from=build /workspace/dist /usr/share/nginx/html\nEXPOSE 80\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\n```\n\n3. Add a .devcontainer for development purposes (things might break and you might want to debug why)\n\n```yaml\n# .devcontainer/compose.yml\nservices:\n web:\n build:\n context: .\n dockerfile: Dockerfile\n image: my-website-server\n ports:\n - \"80:80\"\n```\n\n4. You can now init the site, add icarus theme as a submodule, and start the server\n\n```bash\ndocker compose -f ./devcontainer/compose.yml up -d --build\ndocker compose -f ./devcontainer/compose.yml exec hexo init .\ngit submodule add https://github.com//hexo-icarus-theme themes/icarus\n# you might need to run `npm install ` to get things working\n# dont forget to set icarus as the theme in _config.yml\ndocker compose -f ./devcontainer/compose.yml exec hexo server\n```\n\n5. Get the [experimental dark theme](https://github.com/ppoffice/hexo-theme-icarus/issues/564) and apply it\n\n```bash\ncd themes/icarus\ngit checkout night4\ngit remote add imaegoo https://github.com/imaegoo/hexo-theme-icarus.git\ngit fetch imaegoo\ngit merge imaegoo/night4\n```\n\n6. add .gitignore for things like `node_modules` etc\n\n7. fix the `_config.yml` and `_config.icarus.yml` to your liking.\n\nMake sure to follow [icarus docs](https://ppoffice.github.io/hexo-theme-icarus/). For more information.\n\n## Deploying to Github Pages\n\nThe easiest way to deploy to Github pages is to follow the example from [deploy-pages action](https://github.com/actions/deploy-pages).\nCheckout my [workflow](https://github.com/wgkassem/wgkassem.github.io/blob/main/.github/workflows/pages.yml) for this website.\n\n","source":"_posts/hello-world.md","raw":"---\ntitle: Hello World\ndate: 2024-10-16\n---\n\nWelcome to my website! This is my first post, and it's going to be about how I set up this website: how I got the dependencies and how I was able to publish to github pages.\n\nGetting this website up and running required one night's worth of work. So, if you want to dot the same for your github page, here's how you can do it:\n\n## Getting dependencies and development container\n\n0. [hexo-icarus-theme](https://github.com/ppoffice/hexo-theme-icarus) is the main dependency of this site. To avoid accidentally breaking your website should the theme be updated *AND* for future customization-ility, we are going to fork the theme repo on Github and pull it locally.\n```\n# dont forget to fork on GH first\ngh repo clone /hexo-icarus-theme\n```\n\n1. Let's create a new repo to hold the website source tree. This will be the repo that you will push to Github Pages.\n```\nmkdir $USER.github.io\ncd $USER.github.io\ngit init\n```\nYou might want to change `$USER` to your Github user or organization name.\n\n2. Next is a Dockerfile that will build your site locally in a \"controlled environment\": no polluting your machine with node stuff, development isolation, etc\n```Dockerfile\n# Dockerfile\n\n## Base and dependencies\nFROM node:22.5.1-alpine3.19 AS base\nWORKDIR /workspace\nRUN npm install -g hexo-cli\n\n## Copy sources for build\nFROM base AS build\nCOPY . /workspace\nRUN hexo generate\n\n## Deploy\nFROM nginx:1.21.3-alpine\nCOPY --from=build /workspace/dist /usr/share/nginx/html\nEXPOSE 80\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\n```\n\n3. Add a .devcontainer for development purposes (things might break and you might want to debug why)\n\n```yaml\n# .devcontainer/compose.yml\nservices:\n web:\n build:\n context: .\n dockerfile: Dockerfile\n image: my-website-server\n ports:\n - \"80:80\"\n```\n\n4. You can now init the site, add icarus theme as a submodule, and start the server\n\n```bash\ndocker compose -f ./devcontainer/compose.yml up -d --build\ndocker compose -f ./devcontainer/compose.yml exec hexo init .\ngit submodule add https://github.com//hexo-icarus-theme themes/icarus\n# you might need to run `npm install ` to get things working\n# dont forget to set icarus as the theme in _config.yml\ndocker compose -f ./devcontainer/compose.yml exec hexo server\n```\n\n5. Get the [experimental dark theme](https://github.com/ppoffice/hexo-theme-icarus/issues/564) and apply it\n\n```bash\ncd themes/icarus\ngit checkout night4\ngit remote add imaegoo https://github.com/imaegoo/hexo-theme-icarus.git\ngit fetch imaegoo\ngit merge imaegoo/night4\n```\n\n6. add .gitignore for things like `node_modules` etc\n\n7. fix the `_config.yml` and `_config.icarus.yml` to your liking.\n\nMake sure to follow [icarus docs](https://ppoffice.github.io/hexo-theme-icarus/). For more information.\n\n## Deploying to Github Pages\n\nThe easiest way to deploy to Github pages is to follow the example from [deploy-pages action](https://github.com/actions/deploy-pages).\nCheckout my [workflow](https://github.com/wgkassem/wgkassem.github.io/blob/main/.github/workflows/pages.yml) for this website.\n\n","slug":"hello-world","published":1,"updated":"2024-10-16T09:54:17.119Z","_id":"clz8enf8d00003pqn6sssfl7l","comments":1,"layout":"post","photos":[],"content":"

Welcome to my website! This is my first post, and it’s going to be about how I set up this website: how I got the dependencies and how I was able to publish to github pages.

\n

Getting this website up and running required one night’s worth of work. So, if you want to dot the same for your github page, here’s how you can do it:

\n

Getting dependencies and development container

    \n
  1. hexo-icarus-theme is the main dependency of this site. To avoid accidentally breaking your website should the theme be updated AND for future customization-ility, we are going to fork the theme repo on Github and pull it locally.

    \n
    1
    2
    # dont forget to fork on GH first
    gh repo clone <your-gh-username>/hexo-icarus-theme
    \n
  2. \n
  3. Let’s create a new repo to hold the website source tree. This will be the repo that you will push to Github Pages.

    \n
    1
    2
    3
    mkdir $USER.github.io
    cd $USER.github.io
    git init
    \n

    You might want to change $USER to your Github user or organization name.

    \n
  4. \n
  5. Next is a Dockerfile that will build your site locally in a “controlled environment”: no polluting your machine with node stuff, development isolation, etc

    \n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # Dockerfile

    ## Base and dependencies
    FROM node:22.5.1-alpine3.19 AS base
    WORKDIR /workspace
    RUN npm install -g hexo-cli

    ## Copy sources for build
    FROM base AS build
    COPY . /workspace
    RUN hexo generate

    ## Deploy
    FROM nginx:1.21.3-alpine
    COPY --from=build /workspace/dist /usr/share/nginx/html
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]
    \n
  6. \n
  7. Add a .devcontainer for development purposes (things might break and you might want to debug why)

    \n
  8. \n
\n
1
2
3
4
5
6
7
8
9
# .devcontainer/compose.yml
services:
web:
build:
context: .
dockerfile: Dockerfile
image: my-website-server
ports:
- "80:80"
\n\n
    \n
  1. You can now init the site, add icarus theme as a submodule, and start the server
  2. \n
\n
1
2
3
4
5
6
docker compose -f ./devcontainer/compose.yml up -d --build
docker compose -f ./devcontainer/compose.yml exec hexo init .
git submodule add https://github.com/<your-gh-username>/hexo-icarus-theme themes/icarus
# you might need to run `npm install <some-packages>` to get things working
# dont forget to set icarus as the theme in _config.yml
docker compose -f ./devcontainer/compose.yml exec hexo server
\n\n
    \n
  1. Get the experimental dark theme and apply it
  2. \n
\n
1
2
3
4
5
cd themes/icarus
git checkout night4
git remote add imaegoo https://github.com/imaegoo/hexo-theme-icarus.git
git fetch imaegoo
git merge imaegoo/night4
\n\n
    \n
  1. add .gitignore for things like node_modules etc

    \n
  2. \n
  3. fix the _config.yml and _config.icarus.yml to your liking.

    \n
  4. \n
\n

Make sure to follow icarus docs. For more information.

\n

Deploying to Github Pages

The easiest way to deploy to Github pages is to follow the example from deploy-pages action.
Checkout my workflow for this website.

\n","excerpt":"","more":"

Welcome to my website! This is my first post, and it’s going to be about how I set up this website: how I got the dependencies and how I was able to publish to github pages.

\n

Getting this website up and running required one night’s worth of work. So, if you want to dot the same for your github page, here’s how you can do it:

\n

Getting dependencies and development container

    \n
  1. hexo-icarus-theme is the main dependency of this site. To avoid accidentally breaking your website should the theme be updated AND for future customization-ility, we are going to fork the theme repo on Github and pull it locally.

    \n
    1
    2
    # dont forget to fork on GH first
    gh repo clone <your-gh-username>/hexo-icarus-theme
    \n
  2. \n
  3. Let’s create a new repo to hold the website source tree. This will be the repo that you will push to Github Pages.

    \n
    1
    2
    3
    mkdir $USER.github.io
    cd $USER.github.io
    git init
    \n

    You might want to change $USER to your Github user or organization name.

    \n
  4. \n
  5. Next is a Dockerfile that will build your site locally in a “controlled environment”: no polluting your machine with node stuff, development isolation, etc

    \n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # Dockerfile

    ## Base and dependencies
    FROM node:22.5.1-alpine3.19 AS base
    WORKDIR /workspace
    RUN npm install -g hexo-cli

    ## Copy sources for build
    FROM base AS build
    COPY . /workspace
    RUN hexo generate

    ## Deploy
    FROM nginx:1.21.3-alpine
    COPY --from=build /workspace/dist /usr/share/nginx/html
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]
    \n
  6. \n
  7. Add a .devcontainer for development purposes (things might break and you might want to debug why)

    \n
  8. \n
\n
1
2
3
4
5
6
7
8
9
# .devcontainer/compose.yml
services:
web:
build:
context: .
dockerfile: Dockerfile
image: my-website-server
ports:
- "80:80"
\n\n
    \n
  1. You can now init the site, add icarus theme as a submodule, and start the server
  2. \n
\n
1
2
3
4
5
6
docker compose -f ./devcontainer/compose.yml up -d --build
docker compose -f ./devcontainer/compose.yml exec hexo init .
git submodule add https://github.com/<your-gh-username>/hexo-icarus-theme themes/icarus
# you might need to run `npm install <some-packages>` to get things working
# dont forget to set icarus as the theme in _config.yml
docker compose -f ./devcontainer/compose.yml exec hexo server
\n\n
    \n
  1. Get the experimental dark theme and apply it
  2. \n
\n
1
2
3
4
5
cd themes/icarus
git checkout night4
git remote add imaegoo https://github.com/imaegoo/hexo-theme-icarus.git
git fetch imaegoo
git merge imaegoo/night4
\n\n
    \n
  1. add .gitignore for things like node_modules etc

    \n
  2. \n
  3. fix the _config.yml and _config.icarus.yml to your liking.

    \n
  4. \n
\n

Make sure to follow icarus docs. For more information.

\n

Deploying to Github Pages

The easiest way to deploy to Github pages is to follow the example from deploy-pages action.
Checkout my workflow for this website.

\n"},{"_content":"","source":"_posts/posix.md","raw":"","slug":"posix","published":1,"date":"2024-12-29T01:42:46.152Z","updated":"2024-12-29T01:42:46.152Z","title":"","comments":1,"layout":"post","photos":[],"_id":"cm59limrw000025qj9oazf4x2","content":"","excerpt":"","more":""},{"title":"Force install npm dependencies","date":"2024-12-28T15:00:00.000Z","toc":true,"_content":"\nThe current website is based on [hexo](https://hexo.io) and [hexo-icarus-theme]().\nSince the icarus theme does not provide a \"night mode\" by dafault, I had to fork [imaegoo's night4 fork](https://github.com/imaegoo/hexo-theme-icarus/tree/night4).\n\nSince I am still not very proficient in frontend development, I rely on imaegoo to keep things up to date with the the upstream [ppoffice/hexo-theme-icarus](https://github.com/ppoffice/hexo-theme-icarus).\n\nThe following is a rundown of how the dependencies are managed in this project.\n\n1. I maintain [a fork](https://github.com/wgkassem/hexo-theme-icarus) of [imaegoo/hexo-theme-icarus](https://github.com/imaegoo/hexo-theme-icarus/tree/night4)\n2. The fork is synced with the upstream as often as possible.\n3. I use [my fork](https://github.com/wgkassem/hexo-theme-icarus) as a [git submodule](https://github.com/wgkassem/wgkassem.github.io/.gitmodules) in this project. The module is installed under ./themes/icarus in the source directory and copied via the [Dockerfile](https://github.com/wgkassem/wgkassem.github.io/blob/main/Dockerfile) to the final image. A Github Action mimics the docker file to build the site and push it to the gh-pages branch.\n\nRecently I noted that in some cases the `hexo generate` command would fail without the GH Action piping the failure. See [this action](https://github.com/wgkassem/wgkassem.github.io/actions/runs/12531513539/job/34949225435#step:6:24).\n","source":"_posts/npm_force_install.md","raw":"---\ntitle: Force install npm dependencies\ndate: 2024-12-29\ntoc: true\ntags: [npm, frontend, javascript]\ncategories: [research]\n---\n\nThe current website is based on [hexo](https://hexo.io) and [hexo-icarus-theme]().\nSince the icarus theme does not provide a \"night mode\" by dafault, I had to fork [imaegoo's night4 fork](https://github.com/imaegoo/hexo-theme-icarus/tree/night4).\n\nSince I am still not very proficient in frontend development, I rely on imaegoo to keep things up to date with the the upstream [ppoffice/hexo-theme-icarus](https://github.com/ppoffice/hexo-theme-icarus).\n\nThe following is a rundown of how the dependencies are managed in this project.\n\n1. I maintain [a fork](https://github.com/wgkassem/hexo-theme-icarus) of [imaegoo/hexo-theme-icarus](https://github.com/imaegoo/hexo-theme-icarus/tree/night4)\n2. The fork is synced with the upstream as often as possible.\n3. I use [my fork](https://github.com/wgkassem/hexo-theme-icarus) as a [git submodule](https://github.com/wgkassem/wgkassem.github.io/.gitmodules) in this project. The module is installed under ./themes/icarus in the source directory and copied via the [Dockerfile](https://github.com/wgkassem/wgkassem.github.io/blob/main/Dockerfile) to the final image. A Github Action mimics the docker file to build the site and push it to the gh-pages branch.\n\nRecently I noted that in some cases the `hexo generate` command would fail without the GH Action piping the failure. See [this action](https://github.com/wgkassem/wgkassem.github.io/actions/runs/12531513539/job/34949225435#step:6:24).\n","slug":"npm_force_install","published":1,"updated":"2024-12-29T11:28:17.936Z","comments":1,"layout":"post","photos":[],"_id":"cm59lims1000125qj4c7o2ygd","content":"

The current website is based on hexo and hexo-icarus-theme.
Since the icarus theme does not provide a “night mode” by dafault, I had to fork imaegoo’s night4 fork.

\n

Since I am still not very proficient in frontend development, I rely on imaegoo to keep things up to date with the the upstream ppoffice/hexo-theme-icarus.

\n

The following is a rundown of how the dependencies are managed in this project.

\n
    \n
  1. I maintain a fork of imaegoo/hexo-theme-icarus
  2. \n
  3. The fork is synced with the upstream as often as possible.
  4. \n
  5. I use my fork as a git submodule in this project. The module is installed under ./themes/icarus in the source directory and copied via the Dockerfile to the final image. A Github Action mimics the docker file to build the site and push it to the gh-pages branch.
  6. \n
\n

Recently I noted that in some cases the hexo generate command would fail without the GH Action piping the failure. See this action.

\n","excerpt":"","more":"

The current website is based on hexo and hexo-icarus-theme.
Since the icarus theme does not provide a “night mode” by dafault, I had to fork imaegoo’s night4 fork.

\n

Since I am still not very proficient in frontend development, I rely on imaegoo to keep things up to date with the the upstream ppoffice/hexo-theme-icarus.

\n

The following is a rundown of how the dependencies are managed in this project.

\n
    \n
  1. I maintain a fork of imaegoo/hexo-theme-icarus
  2. \n
  3. The fork is synced with the upstream as often as possible.
  4. \n
  5. I use my fork as a git submodule in this project. The module is installed under ./themes/icarus in the source directory and copied via the Dockerfile to the final image. A Github Action mimics the docker file to build the site and push it to the gh-pages branch.
  6. \n
\n

Recently I noted that in some cases the hexo generate command would fail without the GH Action piping the failure. See this action.

\n"},{"title":"dotfiles with Lua","date":"2024-12-15T15:00:00.000Z","_content":"\n## Why learn lua?\n\n1. Lua is a lightweight, high-level, multi-paradigm programming language designed primarily for embedded use in applications.\n2. Lua is very integrable with C and C++.\n3. Some major projects that use Lua include World of Warcraft, Adobe Lightroom, and Redis.\n4. Interesting history: Lua was created in 1993 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, and Waldemar Celes at the Pontifical Catholic University of Rio de Janeiro, Brazil because they needed a language that was powerful but also lightweight and *they could not import software*.\n5. It's functional, imperative, and object-oriented.\n6. I want to contribute and become a better neovim user.\n7. *Main reason*: improve installation of my [dotfiles](https://github.com/wgkassem/dotfiles) scripts.\n\n## Useful things:\n\n### Strings\n\n- Strings are immutable in Lua. Once a string is created, it cannot be changed.\n- Get the length of a string variable `var` with `#var`.\n- Concatenate strings with `..`. Example: `str1 = \"Hello\" .. \" \" .. \"World\"`.\n- Long strings can be created with double square brackets `[[ ]]`. This is useful for multi-line strings.\n","source":"_posts/lua.md","raw":"---\ntitle: dotfiles with Lua\ndate: 2024-12-16\ntags: [lua, scripting, programming]\n---\n\n## Why learn lua?\n\n1. Lua is a lightweight, high-level, multi-paradigm programming language designed primarily for embedded use in applications.\n2. Lua is very integrable with C and C++.\n3. Some major projects that use Lua include World of Warcraft, Adobe Lightroom, and Redis.\n4. Interesting history: Lua was created in 1993 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, and Waldemar Celes at the Pontifical Catholic University of Rio de Janeiro, Brazil because they needed a language that was powerful but also lightweight and *they could not import software*.\n5. It's functional, imperative, and object-oriented.\n6. I want to contribute and become a better neovim user.\n7. *Main reason*: improve installation of my [dotfiles](https://github.com/wgkassem/dotfiles) scripts.\n\n## Useful things:\n\n### Strings\n\n- Strings are immutable in Lua. Once a string is created, it cannot be changed.\n- Get the length of a string variable `var` with `#var`.\n- Concatenate strings with `..`. Example: `str1 = \"Hello\" .. \" \" .. \"World\"`.\n- Long strings can be created with double square brackets `[[ ]]`. This is useful for multi-line strings.\n","slug":"lua","published":1,"updated":"2024-12-16T12:39:37.252Z","comments":1,"layout":"post","photos":[],"_id":"cm59lims1000225qj0fd1biu3","content":"

Why learn lua?

    \n
  1. Lua is a lightweight, high-level, multi-paradigm programming language designed primarily for embedded use in applications.
  2. \n
  3. Lua is very integrable with C and C++.
  4. \n
  5. Some major projects that use Lua include World of Warcraft, Adobe Lightroom, and Redis.
  6. \n
  7. Interesting history: Lua was created in 1993 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, and Waldemar Celes at the Pontifical Catholic University of Rio de Janeiro, Brazil because they needed a language that was powerful but also lightweight and they could not import software.
  8. \n
  9. It’s functional, imperative, and object-oriented.
  10. \n
  11. I want to contribute and become a better neovim user.
  12. \n
  13. Main reason: improve installation of my dotfiles scripts.
  14. \n
\n

Useful things:

Strings

    \n
  • Strings are immutable in Lua. Once a string is created, it cannot be changed.
  • \n
  • Get the length of a string variable var with #var.
  • \n
  • Concatenate strings with ... Example: str1 = "Hello" .. " " .. "World".
  • \n
  • Long strings can be created with double square brackets [[ ]]. This is useful for multi-line strings.
  • \n
\n","excerpt":"","more":"

Why learn lua?

    \n
  1. Lua is a lightweight, high-level, multi-paradigm programming language designed primarily for embedded use in applications.
  2. \n
  3. Lua is very integrable with C and C++.
  4. \n
  5. Some major projects that use Lua include World of Warcraft, Adobe Lightroom, and Redis.
  6. \n
  7. Interesting history: Lua was created in 1993 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, and Waldemar Celes at the Pontifical Catholic University of Rio de Janeiro, Brazil because they needed a language that was powerful but also lightweight and they could not import software.
  8. \n
  9. It’s functional, imperative, and object-oriented.
  10. \n
  11. I want to contribute and become a better neovim user.
  12. \n
  13. Main reason: improve installation of my dotfiles scripts.
  14. \n
\n

Useful things:

Strings

    \n
  • Strings are immutable in Lua. Once a string is created, it cannot be changed.
  • \n
  • Get the length of a string variable var with #var.
  • \n
  • Concatenate strings with ... Example: str1 = "Hello" .. " " .. "World".
  • \n
  • Long strings can be created with double square brackets [[ ]]. This is useful for multi-line strings.
  • \n
\n"},{"title":"Semaphores","date":"2024-10-15T15:00:00.000Z","_content":"\n# Introduction\n\nSemaphores are a synchronization primitive that can be used to protect shared resources. They are used to control access to shared resources by multiple threads or processes.\n\n# Application\n\nA resource shared across threads or across processes, e.g. a shared memory space, a file (descriptor), or a network socket, and you need to ensure that no more\nthan 1-n threads (or processes) should access at a time. This is where [semaphores](https://en.wikipedia.org/wiki/Semaphore_%28programming%29) come in.\n\n# Mutex or Semaphore?\n\nA mutex on the other hand is there to ensure that no more than one thread can access (to read or write) a shared resource at a time. It is akin to a binary semaphore.\n\nHere's a comparison between the two as provided by ChatGPT:\n\n| Feature | Semaphore | Mutex |\n|------------------------|------------------------------------------------------|-------------------------------------------------------|\n| **Purpose** | Controls access to resources, allowing multiple threads to access (counting semaphore) or one (binary semaphore). | Ensures mutual exclusion, allowing only one thread to access a critical section. |\n| **Counter** | Maintains a count to track available resources. | Binary state: locked or unlocked (no counter). |\n| **Ownership** | No ownership; any thread can signal (release) a semaphore. | Ownership is enforced; only the thread that locks it can unlock it. |\n| **Concurrency** | Allows multiple threads to proceed if the counter is greater than 1 (in a counting semaphore). | Only one thread can proceed at a time. |\n| **Blocking Behavior** | Threads block if the counter is zero (no available resources). | Threads block if the mutex is locked. |\n| **Use Cases** | - Managing a pool of resources (e.g., thread pools, connection pools).
- Synchronizing producer-consumer workflows. | - Protecting critical sections.
- Ensuring exclusive access to shared data. |\n| **Types** | - Binary semaphore (similar to a mutex).
- Counting semaphore (allows multiple threads). | Only one type (binary lock). |\n| **Risk of Deadlock** | Higher risk if not used carefully (e.g., incorrect signaling order). | Lower risk due to strict ownership and locking rules. |\n| **Performance** | Slightly slower due to additional counter operations and flexibility. | Slightly faster because it enforces strict mutual exclusion. |\n| **Platform Support** | Available in most operating systems and threading libraries. | Available in most operating systems and threading libraries. |\n\n\nFor a very nice introduction to semaphores and their usage, [this post by Vikram Shukla](http://m.blog.chinaunix.net/uid-20341830-id-1701941.html) is a must-read.\n\n\n# POSIX Semaphores\n\n## Semaphore routines\n\nAn [overview of POSIX semaphore routines](https://man7.org/linux/man-pages/man7/sem_overview.7.html) is available via linux man pages.\n\n## Linux vs MacOS\n\nInterestingly, macOS does not support unnamed semaphores, [quora](https://www.quora.com/Why-does-OS-X-not-support-unnamed-semaphores).\nSo, if you are writing code that wants to comply with POSIX portability, you will need to use named semaphores.\n\n","source":"_posts/semaphores.md","raw":"---\ntitle: Semaphores\ndate: 2024-10-16\ntags: [concurrency, synchronization, low-level, c, c++, posix, linux, macos]\ncategories: [research]\n---\n\n# Introduction\n\nSemaphores are a synchronization primitive that can be used to protect shared resources. They are used to control access to shared resources by multiple threads or processes.\n\n# Application\n\nA resource shared across threads or across processes, e.g. a shared memory space, a file (descriptor), or a network socket, and you need to ensure that no more\nthan 1-n threads (or processes) should access at a time. This is where [semaphores](https://en.wikipedia.org/wiki/Semaphore_%28programming%29) come in.\n\n# Mutex or Semaphore?\n\nA mutex on the other hand is there to ensure that no more than one thread can access (to read or write) a shared resource at a time. It is akin to a binary semaphore.\n\nHere's a comparison between the two as provided by ChatGPT:\n\n| Feature | Semaphore | Mutex |\n|------------------------|------------------------------------------------------|-------------------------------------------------------|\n| **Purpose** | Controls access to resources, allowing multiple threads to access (counting semaphore) or one (binary semaphore). | Ensures mutual exclusion, allowing only one thread to access a critical section. |\n| **Counter** | Maintains a count to track available resources. | Binary state: locked or unlocked (no counter). |\n| **Ownership** | No ownership; any thread can signal (release) a semaphore. | Ownership is enforced; only the thread that locks it can unlock it. |\n| **Concurrency** | Allows multiple threads to proceed if the counter is greater than 1 (in a counting semaphore). | Only one thread can proceed at a time. |\n| **Blocking Behavior** | Threads block if the counter is zero (no available resources). | Threads block if the mutex is locked. |\n| **Use Cases** | - Managing a pool of resources (e.g., thread pools, connection pools).
- Synchronizing producer-consumer workflows. | - Protecting critical sections.
- Ensuring exclusive access to shared data. |\n| **Types** | - Binary semaphore (similar to a mutex).
- Counting semaphore (allows multiple threads). | Only one type (binary lock). |\n| **Risk of Deadlock** | Higher risk if not used carefully (e.g., incorrect signaling order). | Lower risk due to strict ownership and locking rules. |\n| **Performance** | Slightly slower due to additional counter operations and flexibility. | Slightly faster because it enforces strict mutual exclusion. |\n| **Platform Support** | Available in most operating systems and threading libraries. | Available in most operating systems and threading libraries. |\n\n\nFor a very nice introduction to semaphores and their usage, [this post by Vikram Shukla](http://m.blog.chinaunix.net/uid-20341830-id-1701941.html) is a must-read.\n\n\n# POSIX Semaphores\n\n## Semaphore routines\n\nAn [overview of POSIX semaphore routines](https://man7.org/linux/man-pages/man7/sem_overview.7.html) is available via linux man pages.\n\n## Linux vs MacOS\n\nInterestingly, macOS does not support unnamed semaphores, [quora](https://www.quora.com/Why-does-OS-X-not-support-unnamed-semaphores).\nSo, if you are writing code that wants to comply with POSIX portability, you will need to use named semaphores.\n\n","slug":"semaphores","published":1,"updated":"2024-12-29T12:15:12.689Z","comments":1,"layout":"post","photos":[],"_id":"cm59lims4000525qj6uf71cdy","content":"

Introduction

Semaphores are a synchronization primitive that can be used to protect shared resources. They are used to control access to shared resources by multiple threads or processes.

\n

Application

A resource shared across threads or across processes, e.g. a shared memory space, a file (descriptor), or a network socket, and you need to ensure that no more
than 1-n threads (or processes) should access at a time. This is where semaphores come in.

\n

Mutex or Semaphore?

A mutex on the other hand is there to ensure that no more than one thread can access (to read or write) a shared resource at a time. It is akin to a binary semaphore.

\n

Here’s a comparison between the two as provided by ChatGPT:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureSemaphoreMutex
PurposeControls access to resources, allowing multiple threads to access (counting semaphore) or one (binary semaphore).Ensures mutual exclusion, allowing only one thread to access a critical section.
CounterMaintains a count to track available resources.Binary state: locked or unlocked (no counter).
OwnershipNo ownership; any thread can signal (release) a semaphore.Ownership is enforced; only the thread that locks it can unlock it.
ConcurrencyAllows multiple threads to proceed if the counter is greater than 1 (in a counting semaphore).Only one thread can proceed at a time.
Blocking BehaviorThreads block if the counter is zero (no available resources).Threads block if the mutex is locked.
Use Cases- Managing a pool of resources (e.g., thread pools, connection pools).
- Synchronizing producer-consumer workflows.
- Protecting critical sections.
- Ensuring exclusive access to shared data.
Types- Binary semaphore (similar to a mutex).
- Counting semaphore (allows multiple threads).
Only one type (binary lock).
Risk of DeadlockHigher risk if not used carefully (e.g., incorrect signaling order).Lower risk due to strict ownership and locking rules.
PerformanceSlightly slower due to additional counter operations and flexibility.Slightly faster because it enforces strict mutual exclusion.
Platform SupportAvailable in most operating systems and threading libraries.Available in most operating systems and threading libraries.
\n

For a very nice introduction to semaphores and their usage, this post by Vikram Shukla is a must-read.

\n

POSIX Semaphores

Semaphore routines

An overview of POSIX semaphore routines is available via linux man pages.

\n

Linux vs MacOS

Interestingly, macOS does not support unnamed semaphores, quora.
So, if you are writing code that wants to comply with POSIX portability, you will need to use named semaphores.

\n","excerpt":"","more":"

Introduction

Semaphores are a synchronization primitive that can be used to protect shared resources. They are used to control access to shared resources by multiple threads or processes.

\n

Application

A resource shared across threads or across processes, e.g. a shared memory space, a file (descriptor), or a network socket, and you need to ensure that no more
than 1-n threads (or processes) should access at a time. This is where semaphores come in.

\n

Mutex or Semaphore?

A mutex on the other hand is there to ensure that no more than one thread can access (to read or write) a shared resource at a time. It is akin to a binary semaphore.

\n

Here’s a comparison between the two as provided by ChatGPT:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureSemaphoreMutex
PurposeControls access to resources, allowing multiple threads to access (counting semaphore) or one (binary semaphore).Ensures mutual exclusion, allowing only one thread to access a critical section.
CounterMaintains a count to track available resources.Binary state: locked or unlocked (no counter).
OwnershipNo ownership; any thread can signal (release) a semaphore.Ownership is enforced; only the thread that locks it can unlock it.
ConcurrencyAllows multiple threads to proceed if the counter is greater than 1 (in a counting semaphore).Only one thread can proceed at a time.
Blocking BehaviorThreads block if the counter is zero (no available resources).Threads block if the mutex is locked.
Use Cases- Managing a pool of resources (e.g., thread pools, connection pools).
- Synchronizing producer-consumer workflows.
- Protecting critical sections.
- Ensuring exclusive access to shared data.
Types- Binary semaphore (similar to a mutex).
- Counting semaphore (allows multiple threads).
Only one type (binary lock).
Risk of DeadlockHigher risk if not used carefully (e.g., incorrect signaling order).Lower risk due to strict ownership and locking rules.
PerformanceSlightly slower due to additional counter operations and flexibility.Slightly faster because it enforces strict mutual exclusion.
Platform SupportAvailable in most operating systems and threading libraries.Available in most operating systems and threading libraries.
\n

For a very nice introduction to semaphores and their usage, this post by Vikram Shukla is a must-read.

\n

POSIX Semaphores

Semaphore routines

An overview of POSIX semaphore routines is available via linux man pages.

\n

Linux vs MacOS

Interestingly, macOS does not support unnamed semaphores, quora.
So, if you are writing code that wants to comply with POSIX portability, you will need to use named semaphores.

\n"}],"PostAsset":[],"PostCategory":[{"post_id":"cm59lims1000125qj4c7o2ygd","category_id":"cm59lims2000325qj9q75efup","_id":"cm59lims5000825qjc5320xk4"},{"post_id":"cm59lims4000525qj6uf71cdy","category_id":"cm59lims2000325qj9q75efup","_id":"cm59lims6000a25qj1fm7abd7"}],"PostTag":[{"post_id":"cm59lims1000125qj4c7o2ygd","tag_id":"cm59lims3000425qj2caeerr4","_id":"cm59lims6000c25qj72e2eigu"},{"post_id":"cm59lims1000125qj4c7o2ygd","tag_id":"cm59lims4000725qj5jd703jw","_id":"cm59lims6000d25qjgli50lwf"},{"post_id":"cm59lims1000125qj4c7o2ygd","tag_id":"cm59lims5000925qja8ku8qbr","_id":"cm59lims6000f25qje3f61hho"},{"post_id":"cm59lims1000225qj0fd1biu3","tag_id":"cm59lims6000b25qj7b88baqa","_id":"cm59lims7000i25qj7jzcbcfz"},{"post_id":"cm59lims1000225qj0fd1biu3","tag_id":"cm59lims6000e25qjck7nf45w","_id":"cm59lims7000j25qj9ymhh2kq"},{"post_id":"cm59lims1000225qj0fd1biu3","tag_id":"cm59lims6000g25qj5wbjhsc7","_id":"cm59lims7000l25qjer8t752s"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims6000h25qj7kk96d8j","_id":"cm59lims8000s25qj4oycbj1q"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims7000k25qjhzba4od4","_id":"cm59lims8000t25qj7dk63bam"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims7000m25qjg0ekelag","_id":"cm59lims8000u25qjhqloh5gm"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims7000n25qj85job81j","_id":"cm59lims8000v25qj259scaqr"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims8000o25qj0dyse8bc","_id":"cm59lims8000w25qj51jrhdpz"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims8000p25qj9j83f42l","_id":"cm59lims9000x25qj6o0y8078"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims8000q25qj19zt0brp","_id":"cm59lims9000y25qj75n5ccy4"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims8000r25qj0iv68996","_id":"cm59lims9000z25qj3ru4a0qi"}],"Tag":[{"name":"npm","_id":"cm59lims3000425qj2caeerr4"},{"name":"frontend","_id":"cm59lims4000725qj5jd703jw"},{"name":"javascript","_id":"cm59lims5000925qja8ku8qbr"},{"name":"lua","_id":"cm59lims6000b25qj7b88baqa"},{"name":"scripting","_id":"cm59lims6000e25qjck7nf45w"},{"name":"programming","_id":"cm59lims6000g25qj5wbjhsc7"},{"name":"concurrency","_id":"cm59lims6000h25qj7kk96d8j"},{"name":"synchronization","_id":"cm59lims7000k25qjhzba4od4"},{"name":"low-level","_id":"cm59lims7000m25qjg0ekelag"},{"name":"c","_id":"cm59lims7000n25qj85job81j"},{"name":"c++","_id":"cm59lims8000o25qj0dyse8bc"},{"name":"posix","_id":"cm59lims8000p25qj9j83f42l"},{"name":"linux","_id":"cm59lims8000q25qj19zt0brp"},{"name":"macos","_id":"cm59lims8000r25qj0iv68996"}]}} \ No newline at end of file +{"meta":{"version":1,"warehouse":"5.0.1"},"models":{"Asset":[{"_id":"themes/icarus/source/img/og_image.png","path":"img/og_image.png","modified":0,"renderable":1},{"_id":"themes/icarus/source/img/razor-bottom-black.svg","path":"img/razor-bottom-black.svg","modified":0,"renderable":1},{"_id":"themes/icarus/source/img/razor-top-black.svg","path":"img/razor-top-black.svg","modified":0,"renderable":1},{"_id":"themes/icarus/source/js/animation.js","path":"js/animation.js","modified":0,"renderable":1},{"_id":"themes/icarus/source/js/back_to_top.js","path":"js/back_to_top.js","modified":0,"renderable":1},{"_id":"themes/icarus/source/js/main.js","path":"js/main.js","modified":0,"renderable":1},{"_id":"themes/icarus/source/js/column.js","path":"js/column.js","modified":0,"renderable":1},{"_id":"themes/icarus/source/js/pjax.js","path":"js/pjax.js","modified":0,"renderable":1},{"_id":"themes/icarus/source/css/cyberpunk.styl","path":"css/cyberpunk.styl","modified":0,"renderable":1},{"_id":"themes/icarus/source/css/style.styl","path":"css/style.styl","modified":0,"renderable":1},{"_id":"themes/icarus/source/css/default.styl","path":"css/default.styl","modified":0,"renderable":1},{"_id":"themes/icarus/source/img/favicon.png","path":"img/favicon.png","modified":0,"renderable":1},{"_id":"themes/icarus/source/img/logo.png","path":"img/logo.png","modified":0,"renderable":1},{"_id":"themes/icarus/source/css/night.styl","path":"css/night.styl","modified":0,"renderable":1},{"_id":"themes/icarus/source/js/imaegoo/night.js","path":"js/imaegoo/night.js","modified":0,"renderable":1},{"_id":"themes/icarus/source/js/imaegoo/universe.js","path":"js/imaegoo/universe.js","modified":0,"renderable":1},{"_id":"themes/icarus/source/img/me.MP.jpg","path":"img/me.MP.jpg","modified":0,"renderable":1}],"Cache":[{"_id":"source/_posts/hello-world.md","hash":"6d32d528cf04cc2d4a78909c54d86d0ea7165275","modified":1729072457119},{"_id":"themes/icarus/layout/comment/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122673},{"_id":"themes/icarus/layout/donate/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122676},{"_id":"themes/icarus/layout/misc/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122677},{"_id":"themes/icarus/layout/search/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122678},{"_id":"themes/icarus/layout/share/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122678},{"_id":"themes/icarus/include/schema/misc/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122660},{"_id":"themes/icarus/include/schema/comment/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122656},{"_id":"themes/icarus/include/schema/donate/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122659},{"_id":"themes/icarus/include/schema/search/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122662},{"_id":"themes/icarus/include/schema/share/.gitkeep","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1722343122663},{"_id":"themes/icarus/.eslintrc.json","hash":"ca45d8e5d80ad6b7004cddacae7fc7d8040b2d6f","modified":1722343122649},{"_id":"themes/icarus/.eslintignore","hash":"5410a1bef9807f666cd92a0d2020f700e67e4096","modified":1722343122649},{"_id":"themes/icarus/.npmignore","hash":"42242c8da7a020a3295e7dd3d18bf022cb08b661","modified":1722343122654},{"_id":"themes/icarus/.gitignore","hash":"36084c0851a22bfd393933abb8e262562ffc6802","modified":1722343122653},{"_id":"themes/icarus/CONTRIBUTING.md","hash":"70254c6778c1e41bb2ff222bbf3a70b2239b9bc1","modified":1722343122654},{"_id":"themes/icarus/LICENSE","hash":"86037e5335a49321fa73b7815cab542057fac944","modified":1722343122654},{"_id":"themes/icarus/README.md","hash":"32f9f4fc8cd7ec60b30544bd2e558b593519ae5d","modified":1722343122654},{"_id":"themes/icarus/.github/dependabot.yml","hash":"d532d0db30e42211f35823b9885f3ed1b2d51777","modified":1722343122652},{"_id":"themes/icarus/package.json","hash":"215d1ca8c4cc738ceb82a53951de702e2f1ba233","modified":1735480386779},{"_id":"themes/icarus/include/config.js","hash":"4b8a3096137e0d879fb17972a69630bde38d8212","modified":1722343122654},{"_id":"themes/icarus/include/register.js","hash":"040fed1d0d7e4d8003446d1541bc15a2c4b4e500","modified":1722343122656},{"_id":"themes/icarus/.github/stale.yml","hash":"88c73f6216c5666d2f60b1e8fe690a3f6e561e42","modified":1722343122652},{"_id":"themes/icarus/include/dependency.js","hash":"e02471f80db87db43aa7d527176e195b60dc4b99","modified":1722343122655},{"_id":"themes/icarus/languages/de.yml","hash":"78421f09961ca0b24756a0688fb2cb2e2696e25f","modified":1722343122668},{"_id":"themes/icarus/languages/es.yml","hash":"38579b8fad4b6997362acc770615bcd85ff20f68","modified":1722343122669},{"_id":"themes/icarus/languages/fr.yml","hash":"b992b68705f5050a99de926525b3cb40d95c4769","modified":1722343122669},{"_id":"themes/icarus/languages/it.yml","hash":"b76999994cda6b08b53d34c3dd67947f164de655","modified":1722343122670},{"_id":"themes/icarus/languages/en.yml","hash":"3d674204d9f723c829226da745afddd180c1131d","modified":1722343122669},{"_id":"themes/icarus/languages/id.yml","hash":"5e48b1d62378cadeb64b88349477726a5c1bae47","modified":1722343122670},{"_id":"themes/icarus/languages/ko.yml","hash":"e3374265377809c1518114cf352b595840c0b416","modified":1722343122670},{"_id":"themes/icarus/languages/pl.yml","hash":"2e7debb44cd91096f30efc87bf8d6b1d0d0214c9","modified":1722343122671},{"_id":"themes/icarus/languages/ja.yml","hash":"801d9930fef48d6a3f80470d5bed4f3eb78147e6","modified":1722343122670},{"_id":"themes/icarus/languages/pt-BR.yml","hash":"ee8f73350e4c6e2f63b7fc72b34472a6b1e21244","modified":1722343122671},{"_id":"themes/icarus/languages/sv.yml","hash":"b12eee168c52aac855ffce9f78fe5fd5d6e3970c","modified":1722343122671},{"_id":"themes/icarus/languages/ru.yml","hash":"9d91358c2acbe7a0f2a25daf7f65b999ff32d068","modified":1722343122671},{"_id":"themes/icarus/languages/tk.yml","hash":"ca583168bd2025124a1cd0e977da475d7a7496fd","modified":1722343122671},{"_id":"themes/icarus/languages/tr.yml","hash":"dd0a7bfe14848d6e1aa229198fe1db03e08e305e","modified":1722343122672},{"_id":"themes/icarus/languages/zh-CN.yml","hash":"02475ba14afc70dfeaf5678467cee307835e4efa","modified":1722343122672},{"_id":"themes/icarus/languages/zh-TW.yml","hash":"a6826e0c8cdb9ad286324b682b466a9e2ad78e6f","modified":1722343122672},{"_id":"themes/icarus/languages/vn.yml","hash":"5f2fffa642110c81d8f529949711c9d19ad6bbbe","modified":1722343122672},{"_id":"themes/icarus/layout/category.jsx","hash":"2313be8301011d218830b853b294b022ce81b423","modified":1735443230745},{"_id":"themes/icarus/layout/archive.jsx","hash":"daf8eca64197709a9dc4a4792c403a32d78bdfae","modified":1722343122673},{"_id":"themes/icarus/layout/categories.jsx","hash":"b8ad43e28a4990d222bfbb95b032f88555492347","modified":1722343122673},{"_id":"themes/icarus/layout/index.jsx","hash":"0a84a2348394fa9fc5080dd396bd28d357594f47","modified":1722343122676},{"_id":"themes/icarus/layout/page.jsx","hash":"d26c2db57e5a88d6483a03aeb51cda9d191d8cea","modified":1722343122677},{"_id":"themes/icarus/scripts/index.js","hash":"93a79969c7eb47cfac097893cda36368db56902c","modified":1722343122679},{"_id":"themes/icarus/layout/layout.jsx","hash":"b66a1f94af79c69e3feb6080657fcf9954b95b0c","modified":1722354804886},{"_id":"themes/icarus/layout/post.jsx","hash":"d26c2db57e5a88d6483a03aeb51cda9d191d8cea","modified":1722343122678},{"_id":"themes/icarus/layout/tag.jsx","hash":"a9a08c9f3eec8994d37149d1ab19f2b5b8f4cd2f","modified":1735443230746},{"_id":"themes/icarus/include/migration/head.js","hash":"7189efe33d18927d3790e8afb06642fb293b8603","modified":1722343122655},{"_id":"themes/icarus/layout/tags.jsx","hash":"2c42cb64778235dd220c563a27a92108ddc50cc4","modified":1722343122679},{"_id":"themes/icarus/include/migration/v2_v3.js","hash":"a46da71c20fa9d73c1bac26fda77717abae1b308","modified":1722343122655},{"_id":"themes/icarus/include/migration/v3_v4.js","hash":"9faf2184d7fe87debfbe007f3fc9079dcbcafcfe","modified":1722343122655},{"_id":"themes/icarus/.github/ISSUE_TEMPLATE/bug_report.md","hash":"5d3abdc1a2a79ef9822865184eced6e31066d8f6","modified":1722343122650},{"_id":"themes/icarus/include/migration/v4_v5.js","hash":"6342310892d113763b5544789b45d44c0ccf2854","modified":1722343122656},{"_id":"themes/icarus/.github/ISSUE_TEMPLATE/Bug反馈.md","hash":"d801be6937df21e63113be8840b2e23c465db87b","modified":1722343122650},{"_id":"themes/icarus/include/migration/v5_v5.1.js","hash":"073f22bd16e34b56f016633b1676dab2e7d8843d","modified":1722343122656},{"_id":"themes/icarus/.github/workflows/github-release.yml","hash":"d9830273e7e23c4151b10840f131f0b78b961bae","modified":1722343122653},{"_id":"themes/icarus/.github/ISSUE_TEMPLATE/功能建议.md","hash":"c6f60f37e6cd0bc21a81b3b07f84e04e9e80fb57","modified":1722343122651},{"_id":"themes/icarus/.github/ISSUE_TEMPLATE/config.yml","hash":"b49270a202d839c298e584b5d017f56140c7e7a0","modified":1722343122651},{"_id":"themes/icarus/.github/ISSUE_TEMPLATE/feature_request.md","hash":"05313e241a3d43fdadb0f74390b562c07c25d4d0","modified":1722343122651},{"_id":"themes/icarus/.github/workflows/lint.yml","hash":"17d374bf92867a67b15d657c2d41f8e4f9271102","modified":1722343122653},{"_id":"themes/icarus/.github/workflows/npm-publish.yml","hash":"de1ac56ec6888aaeb5db81d94693248b3467e4f6","modified":1722343122653},{"_id":"themes/icarus/.github/workflows/test.yml","hash":"f24e60941bf49b124dfc6a8b6c194da4c62abc2f","modified":1722343122653},{"_id":"themes/icarus/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md","hash":"e106fa240c24c8bfbdd623549651600c6d786c9c","modified":1722343122652},{"_id":"themes/icarus/include/style/button.styl","hash":"0fb35b4786be1b387c751fa2849bc71523fcedd4","modified":1722343122665},{"_id":"themes/icarus/include/style/article.styl","hash":"105c983871b6c9148d97a0f756886e56411572bd","modified":1722343122664},{"_id":"themes/icarus/include/util/console.js","hash":"59cf9d277d3ac85a496689bd811b1c316001641d","modified":1722343122668},{"_id":"themes/icarus/include/style/base.styl","hash":"2bca6ad099949d52236c87db8db1002ffb99774c","modified":1722343122664},{"_id":"themes/icarus/include/style/card.styl","hash":"f78674422eb408cd17c17bbdc3ee1ebe4a453e05","modified":1722343122665},{"_id":"themes/icarus/include/style/codeblock.styl","hash":"ec54dc24eb4d9802d8fefc44c210558bc1641109","modified":1722343122666},{"_id":"themes/icarus/include/style/donate.styl","hash":"8d0af00628c13134b5f30a558608e7bebf18c2ec","modified":1722343122666},{"_id":"themes/icarus/include/style/footer.styl","hash":"a4ad715dee38b249538ac6cce94efc9b355a904b","modified":1722343122666},{"_id":"themes/icarus/include/style/helper.styl","hash":"9f3393e6122cc9f351091bfab960674e962da343","modified":1722343122666},{"_id":"themes/icarus/include/style/pagination.styl","hash":"b81bcd7ff915b4e9299533addc01bc4575ec35e3","modified":1722343122667},{"_id":"themes/icarus/include/style/plugin.styl","hash":"084843d5a522029e0f84a4fe791fbcb2cabd4c36","modified":1722343122667},{"_id":"themes/icarus/include/style/navbar.styl","hash":"34f09b144cb46a25ec2cc7260a6c207dd34ff1fe","modified":1722343122666},{"_id":"themes/icarus/include/style/responsive.styl","hash":"207083fe287612cddee6608b541861b14ac8de81","modified":1722343122667},{"_id":"themes/icarus/include/style/search.styl","hash":"416737e1da4e7e907bd03609b0fee9e2aacfe56c","modified":1722343122667},{"_id":"themes/icarus/include/style/widget.styl","hash":"c746902251136544eb3fe523235b3183f4189460","modified":1722343122668},{"_id":"themes/icarus/include/style/timeline.styl","hash":"ea61798a09bffdda07efb93c2ff800b63bddc4c4","modified":1722343122668},{"_id":"themes/icarus/include/schema/config.json","hash":"3186ad55b3b4592abac10252ce383c275d878700","modified":1722354804881},{"_id":"themes/icarus/layout/common/article.jsx","hash":"3cd424087a389d268adebe6078b4b19ebbaa5340","modified":1722354804883},{"_id":"themes/icarus/layout/common/footer.jsx","hash":"59ec3829b84fd1a6a4ec452acde9472c874aba6b","modified":1722354804884},{"_id":"themes/icarus/layout/common/head.jsx","hash":"bf783d5ef6d58924150472637c6c17782c83e102","modified":1722343122675},{"_id":"themes/icarus/layout/common/comment.jsx","hash":"76ee7c6687e96e6262985323665d6273a37e54c5","modified":1722343122674},{"_id":"themes/icarus/layout/common/donates.jsx","hash":"fd52330d582fd122db7f55444c2f3368ff4bd8d7","modified":1722343122674},{"_id":"themes/icarus/layout/common/plugins.jsx","hash":"2e27800b2a8a87112c96778db858c3419d890b79","modified":1722343122675},{"_id":"themes/icarus/layout/common/navbar.jsx","hash":"3e6914991b4332bb0a164cae5bf53b7962008acc","modified":1722354804885},{"_id":"themes/icarus/layout/common/search.jsx","hash":"1409627d98a92b4f5b2ab829f8e6b50b75d60e53","modified":1722343122675},{"_id":"themes/icarus/layout/common/scripts.jsx","hash":"5d07312406b401e8d4e9584b4d41ed7377993935","modified":1722343122675},{"_id":"themes/icarus/layout/common/widgets.jsx","hash":"7a89ac72a988d13b4714ab78a6dfd5cd8de85d47","modified":1722343122676},{"_id":"themes/icarus/layout/plugin/animejs.jsx","hash":"e2aa27c3501a58ef1e91e511557b77395c2c02aa","modified":1722343122677},{"_id":"themes/icarus/layout/common/share.jsx","hash":"0fad6f8a91bb5cf678b9ff2d66d2162d61625074","modified":1722343122676},{"_id":"themes/icarus/layout/plugin/pjax.jsx","hash":"65956102d5faabcedaaafb14b0201548f15e60ce","modified":1722343122677},{"_id":"themes/icarus/source/img/avatar.png","hash":"0d8236dcca871735500e9d06bbdbe0853ed6775b","modified":1722343122681},{"_id":"themes/icarus/source/img/og_image.png","hash":"b03f163096ca9c350ec962feee9836277b5c2509","modified":1722343122681},{"_id":"themes/icarus/layout/widget/profile.jsx","hash":"2322a2b24e63bfb44b2acfc07795435f8c89d511","modified":1735443230746},{"_id":"themes/icarus/source/img/favicon.svg","hash":"16fd847265845063a16596761cddb32926073dd2","modified":1722343122681},{"_id":"themes/icarus/source/img/razor-bottom-black.svg","hash":"a3eda07b1c605b456da9cdf335a1075db5e5d72c","modified":1722343122682},{"_id":"themes/icarus/source/img/logo.svg","hash":"87113c1f0d215c31245f5dcab3aa5df58e6aa5ee","modified":1722349594518},{"_id":"themes/icarus/source/img/razor-top-black.svg","hash":"201f1171a43ce667a39091fe47c0f278857f18f0","modified":1722343122682},{"_id":"themes/icarus/source/js/animation.js","hash":"0a8e361c353daa3194f4de3d646b96025d128e1a","modified":1722343122683},{"_id":"themes/icarus/layout/plugin/back_to_top.jsx","hash":"f86a0bae3a92bc07bd674f03a046fb1b6c1b48af","modified":1722343122677},{"_id":"themes/icarus/source/js/.eslintrc.json","hash":"6bf0641cb69dffac97f69baea192d7fa3ab612cb","modified":1722343122683},{"_id":"themes/icarus/source/js/column.js","hash":"0baee024ab67474c073a4c41b495f3e7f0df4505","modified":1722343122683},{"_id":"themes/icarus/source/js/back_to_top.js","hash":"d91f10c08c726135a13dfa1f422c49d8764ef03f","modified":1722343122683},{"_id":"themes/icarus/source/js/main.js","hash":"37f3b16fbd9668b9496d5f2d9bd9fb22fc6cee27","modified":1722343122684},{"_id":"themes/icarus/source/css/default.styl","hash":"b01da3028e5a1267a40aaae5c86a11187a2259e3","modified":1722343122680},{"_id":"themes/icarus/source/css/style.styl","hash":"efd5bdae679ec0bc6555d70d17b8770ae11b98a4","modified":1722354804887},{"_id":"themes/icarus/source/js/pjax.js","hash":"1c9921d4bd07795adc1d01a12c0fddf7d1124ca2","modified":1735443230748},{"_id":"themes/icarus/source/css/cyberpunk.styl","hash":"ae17d3528df0c3f089df14a06b7bd82f1bc5fed9","modified":1722343122680},{"_id":"themes/icarus/include/schema/common/donates.json","hash":"ae86e6f177bedf4afbe638502c12635027539305","modified":1722343122657},{"_id":"themes/icarus/include/schema/common/navbar.json","hash":"6691e587284c4cf450e0288680d5ff0f3565f090","modified":1722343122658},{"_id":"themes/icarus/include/schema/common/comment.json","hash":"265120b80df9808358df3ff7c4eada8a66512a4b","modified":1722343122657},{"_id":"themes/icarus/include/schema/common/article.json","hash":"e2502c39045c6a26ccd8e880858f93e78c7bda35","modified":1722343122657},{"_id":"themes/icarus/include/schema/common/footer.json","hash":"e85c9d7f2579805beb252a1b6345d5a668a13baa","modified":1722343122657},{"_id":"themes/icarus/include/schema/common/plugins.json","hash":"04c0738dc0a3ed89aecae2aee4ab60173f09e66b","modified":1722343122658},{"_id":"themes/icarus/include/schema/common/head.json","hash":"98889f059c635e6bdbd51effd04cf1cf44968a66","modified":1722343122657},{"_id":"themes/icarus/include/schema/common/providers.json","hash":"97ec953d497fb53594227ae98acaef8a8baa91da","modified":1722343122658},{"_id":"themes/icarus/include/schema/common/share.json","hash":"cf4f9ff4fb27c3541b35f57db355c228fa6873e4","modified":1722343122658},{"_id":"themes/icarus/include/schema/common/search.json","hash":"985fbcbf47054af714ead1a124869d54f2a8b607","modified":1722343122658},{"_id":"themes/icarus/include/schema/common/widgets.json","hash":"cadd9dc942740ecd5037d3943e72f8b6a8399bbe","modified":1722343122659},{"_id":"themes/icarus/include/schema/common/sidebar.json","hash":"eb241beaec4c73e3085dfb3139ce72e827e20549","modified":1722343122659},{"_id":"themes/icarus/include/schema/widget/profile.json","hash":"690ee1b0791cab47ea03cf42b5b4932ed2aa5675","modified":1722343122664},{"_id":"themes/icarus/include/schema/plugin/back_to_top.json","hash":"dc0febab7e7b67075d0ad3f80f5ec8b798b68dea","modified":1722343122661},{"_id":"themes/icarus/include/schema/plugin/animejs.json","hash":"e62ab6e20bd8862efa1ed32e7c0db0f8acbcfdec","modified":1722343122660},{"_id":"themes/icarus/include/schema/plugin/pjax.json","hash":"1f6218016569eb9cd354a06a9537c7110efb5f17","modified":1722343122661},{"_id":"themes/icarus/source/img/favicon.ico","hash":"ed1f3c74e54fb4c2d8ccd843cb7110917dc58535","modified":1722348217072},{"_id":"themes/icarus/.DS_Store","hash":"b2f2ec488f6ec84f79d4dcb4c2c2439bf0e5daba","modified":1722348389639},{"_id":"themes/icarus/source/.DS_Store","hash":"fa31da7052ba0aef43d486221a33e2474f01626a","modified":1722348389638},{"_id":"themes/icarus/source/img/favicon.png","hash":"cad785cdc11fcdd88afb1ae19cb001543f3bf3f5","modified":1722315752000},{"_id":"themes/icarus/source/img/logo.png","hash":"d40e9a4a865f1358e98b49554f33b73378197f71","modified":1722349683000},{"_id":"themes/icarus/source/js/imaegoo/night.js","hash":"ee9267b31315bd80a58a80cda99b1e4d0d49d0f9","modified":1722354804888},{"_id":"themes/icarus/source/js/imaegoo/universe.js","hash":"8dc3bd0b57cd84f01943a9992ebd11b3649340df","modified":1722354804888},{"_id":"themes/icarus/source/css/night.styl","hash":"261d3208183dc387c0ee2627ea0fd7b0eb417b4d","modified":1722354804886},{"_id":"themes/icarus/source/img/me.MP.jpg","hash":"09ab0abf391a1db046feace08f3e8ea6c93c8368","modified":1722356776725},{"_id":"public/js/algolia.js","hash":"a8df0c0abeeb4ee1d2d720161f3aea7339380704","modified":1735485122666},{"_id":"public/js/google_cse.js","hash":"1a9881669dfdeb2b3214074eee0d3e01e52db2c4","modified":1735485122666},{"_id":"public/js/insight.js","hash":"86bbdb7305d9bf19ad62d2ca2cf169fc8d9f9d31","modified":1735485122666},{"_id":"public/js/toc.js","hash":"da6fb757a1b083b8ed138bf29aad3a7bf8ec4f11","modified":1735485122666},{"_id":"public/content.json","hash":"9d1467338f7fa5439768f5a85aca4ec661403bd2","modified":1735485122666},{"_id":"public/manifest.json","hash":"af662fb1f47a081376182ae79d81110a8c172dcb","modified":1735485122666},{"_id":"public/1970/01/01/hello-world/index.html","hash":"99908b22ea2cc744924162a93c4853c96fbb1864","modified":1722357646144},{"_id":"public/archives/index.html","hash":"62f2609231952a85836a43f6b62eebaf9ae250c2","modified":1735485122666},{"_id":"public/archives/1970/index.html","hash":"00524fcd54b2ca0102d7783cab7cca51f2d4b4a5","modified":1722357646144},{"_id":"public/archives/1970/01/index.html","hash":"ca1ac92314216e1c8f30f918e000b655399c0478","modified":1722357646144},{"_id":"public/index.html","hash":"a8574aa2d454c4d888ea2f10e8f579d7ac9b235c","modified":1735485122666},{"_id":"public/categories/index.html","hash":"b1ae8fcc7ecbb47e028ef62d85d592771bd800ae","modified":1735485122666},{"_id":"public/tags/index.html","hash":"69f16a2b7bc8260016445230829ecea6e2c96bbf","modified":1735485122666},{"_id":"public/img/avatar.png","hash":"0d8236dcca871735500e9d06bbdbe0853ed6775b","modified":1722357646144},{"_id":"public/img/razor-bottom-black.svg","hash":"a3eda07b1c605b456da9cdf335a1075db5e5d72c","modified":1735485122666},{"_id":"public/img/favicon.svg","hash":"16fd847265845063a16596761cddb32926073dd2","modified":1722357646144},{"_id":"public/img/razor-top-black.svg","hash":"201f1171a43ce667a39091fe47c0f278857f18f0","modified":1735485122666},{"_id":"public/img/favicon.png","hash":"cad785cdc11fcdd88afb1ae19cb001543f3bf3f5","modified":1735485122666},{"_id":"public/img/og_image.png","hash":"b03f163096ca9c350ec962feee9836277b5c2509","modified":1735485122666},{"_id":"public/img/logo.png","hash":"d40e9a4a865f1358e98b49554f33b73378197f71","modified":1735485122666},{"_id":"public/js/back_to_top.js","hash":"d91f10c08c726135a13dfa1f422c49d8764ef03f","modified":1735485122666},{"_id":"public/js/animation.js","hash":"0a8e361c353daa3194f4de3d646b96025d128e1a","modified":1735485122666},{"_id":"public/js/main.js","hash":"37f3b16fbd9668b9496d5f2d9bd9fb22fc6cee27","modified":1735485122666},{"_id":"public/js/column.js","hash":"0baee024ab67474c073a4c41b495f3e7f0df4505","modified":1735485122666},{"_id":"public/js/pjax.js","hash":"1c9921d4bd07795adc1d01a12c0fddf7d1124ca2","modified":1735485122666},{"_id":"public/css/cyberpunk.css","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1735485122666},{"_id":"public/css/style.css","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1735485122666},{"_id":"public/css/night.css","hash":"bee8a361e43d5589036e5d05633172dca584c039","modified":1735485122666},{"_id":"public/css/default.css","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1735485122666},{"_id":"public/js/imaegoo/night.js","hash":"ee9267b31315bd80a58a80cda99b1e4d0d49d0f9","modified":1735485122666},{"_id":"public/js/imaegoo/universe.js","hash":"8dc3bd0b57cd84f01943a9992ebd11b3649340df","modified":1735485122666},{"_id":"public/img/favicon.ico","hash":"ed1f3c74e54fb4c2d8ccd843cb7110917dc58535","modified":1722357646144},{"_id":"public/img/me.MP.jpg","hash":"09ab0abf391a1db046feace08f3e8ea6c93c8368","modified":1735485122666},{"_id":"public/img/logo.svg","hash":"87113c1f0d215c31245f5dcab3aa5df58e6aa5ee","modified":1722357646144},{"_id":"source/_posts/posix.md","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1735436566152},{"_id":"source/_posts/extending_autodoc.rst","hash":"d9d65a6f9fa62f23aa9f215d1c4308b927884ecd","modified":1723609564179},{"_id":"source/_posts/semaphores.md","hash":"cb0c52e434d151ab83b8fcf31b14284eff01ad61","modified":1735474512689},{"_id":"source/_posts/npm_force_install.md","hash":"a101d28e188bd6622171f96ecf3b8429331764d5","modified":1735471697936},{"_id":"source/_posts/lua.md","hash":"e37406540dbe5d4ed3a45ff8abbaab73efaa3dc3","modified":1734352777252},{"_id":"public/2024/12/15/lua/index.html","hash":"cc8701d87be5fa1fd9f934f8225af09e8e187c9a","modified":1735485122666},{"_id":"public/2024/12/28/npm_force_install/index.html","hash":"a8a0db6b67c31fab38f615f6da96b959ad60d77f","modified":1735485122666},{"_id":"public/2024/10/15/hello-world/index.html","hash":"9f370891011da3a87809cb062015091103263c5f","modified":1735485122666},{"_id":"public/2024/12/29/posix/index.html","hash":"a21dd67066b0d16077c7f8783fd389d151165e45","modified":1735485122666},{"_id":"public/2024/10/15/semaphores/index.html","hash":"aaae45e610169ca0a48a3ade27f2f6e0a316ce66","modified":1735485122666},{"_id":"public/archives/2024/index.html","hash":"db9f64627946e4f7b393b6e971c8ba33a84e84ba","modified":1735485122666},{"_id":"public/archives/2024/10/index.html","hash":"817b728c4a6837fb4afecb385886d066261a83e6","modified":1735485122666},{"_id":"public/archives/2024/12/index.html","hash":"17b7a620b5e703081f5c63d5e40feecfa351d8a1","modified":1735485122666},{"_id":"public/tags/npm/index.html","hash":"378f5e2f5bdc7a6ce1536a55d546dbebea9851e7","modified":1735485122666},{"_id":"public/tags/javascript/index.html","hash":"7ac6b49558f690f73c43fecf6948f5d5696f5364","modified":1735485122666},{"_id":"public/tags/frontend/index.html","hash":"01777d0496e8a459f6cbf1e7dc8a3cd40561dec7","modified":1735485122666},{"_id":"public/categories/research/index.html","hash":"d228ec3b6dbe570af89068bcc7073516548d297a","modified":1735485122666},{"_id":"public/tags/lua/index.html","hash":"af2d391f60d509da945f7967a6b2c5ef2c4eb1f3","modified":1735485122666},{"_id":"public/tags/scripting/index.html","hash":"64c71a32307e8ce2105967a5a65bd559092e2d85","modified":1735485122666},{"_id":"public/tags/concurrency/index.html","hash":"f538d2957718ebbdfc411537eff8e92fff3d7cb4","modified":1735485122666},{"_id":"public/tags/programming/index.html","hash":"629d454150420cb07f0b533b23c1bff39256cd9b","modified":1735485122666},{"_id":"public/tags/c/index.html","hash":"c993da2b51eff717d8e20f5b86ce2ffcf84f809b","modified":1735485122666},{"_id":"public/tags/linux/index.html","hash":"3cb78bf99b6511f39a2d2f7bbb7d895412a53a6b","modified":1735485122666},{"_id":"public/tags/macos/index.html","hash":"2d072678eeb9d01628d2baa8e60dd2cd18e85079","modified":1735485122666},{"_id":"public/tags/synchronization/index.html","hash":"c7cc8ca1e7308b8abbd067c85f632de5b9560753","modified":1735485122666},{"_id":"public/tags/low-level/index.html","hash":"9c221f0e560445ed3aa617e62dd12989beff32a5","modified":1735485122666},{"_id":"public/tags/posix/index.html","hash":"f8cff280d634da84cbad790801a286f45d73c9ae","modified":1735485122666}],"Category":[{"name":"research","_id":"cm59lims2000325qj9q75efup"}],"Data":[],"Page":[],"Post":[{"title":"Hello World","date":"2024-10-15T15:00:00.000Z","_content":"\nWelcome to my website! This is my first post, and it's going to be about how I set up this website: how I got the dependencies and how I was able to publish to github pages.\n\nGetting this website up and running required one night's worth of work. So, if you want to dot the same for your github page, here's how you can do it:\n\n## Getting dependencies and development container\n\n0. [hexo-icarus-theme](https://github.com/ppoffice/hexo-theme-icarus) is the main dependency of this site. To avoid accidentally breaking your website should the theme be updated *AND* for future customization-ility, we are going to fork the theme repo on Github and pull it locally.\n```\n# dont forget to fork on GH first\ngh repo clone /hexo-icarus-theme\n```\n\n1. Let's create a new repo to hold the website source tree. This will be the repo that you will push to Github Pages.\n```\nmkdir $USER.github.io\ncd $USER.github.io\ngit init\n```\nYou might want to change `$USER` to your Github user or organization name.\n\n2. Next is a Dockerfile that will build your site locally in a \"controlled environment\": no polluting your machine with node stuff, development isolation, etc\n```Dockerfile\n# Dockerfile\n\n## Base and dependencies\nFROM node:22.5.1-alpine3.19 AS base\nWORKDIR /workspace\nRUN npm install -g hexo-cli\n\n## Copy sources for build\nFROM base AS build\nCOPY . /workspace\nRUN hexo generate\n\n## Deploy\nFROM nginx:1.21.3-alpine\nCOPY --from=build /workspace/dist /usr/share/nginx/html\nEXPOSE 80\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\n```\n\n3. Add a .devcontainer for development purposes (things might break and you might want to debug why)\n\n```yaml\n# .devcontainer/compose.yml\nservices:\n web:\n build:\n context: .\n dockerfile: Dockerfile\n image: my-website-server\n ports:\n - \"80:80\"\n```\n\n4. You can now init the site, add icarus theme as a submodule, and start the server\n\n```bash\ndocker compose -f ./devcontainer/compose.yml up -d --build\ndocker compose -f ./devcontainer/compose.yml exec hexo init .\ngit submodule add https://github.com//hexo-icarus-theme themes/icarus\n# you might need to run `npm install ` to get things working\n# dont forget to set icarus as the theme in _config.yml\ndocker compose -f ./devcontainer/compose.yml exec hexo server\n```\n\n5. Get the [experimental dark theme](https://github.com/ppoffice/hexo-theme-icarus/issues/564) and apply it\n\n```bash\ncd themes/icarus\ngit checkout night4\ngit remote add imaegoo https://github.com/imaegoo/hexo-theme-icarus.git\ngit fetch imaegoo\ngit merge imaegoo/night4\n```\n\n6. add .gitignore for things like `node_modules` etc\n\n7. fix the `_config.yml` and `_config.icarus.yml` to your liking.\n\nMake sure to follow [icarus docs](https://ppoffice.github.io/hexo-theme-icarus/). For more information.\n\n## Deploying to Github Pages\n\nThe easiest way to deploy to Github pages is to follow the example from [deploy-pages action](https://github.com/actions/deploy-pages).\nCheckout my [workflow](https://github.com/wgkassem/wgkassem.github.io/blob/main/.github/workflows/pages.yml) for this website.\n\n","source":"_posts/hello-world.md","raw":"---\ntitle: Hello World\ndate: 2024-10-16\n---\n\nWelcome to my website! This is my first post, and it's going to be about how I set up this website: how I got the dependencies and how I was able to publish to github pages.\n\nGetting this website up and running required one night's worth of work. So, if you want to dot the same for your github page, here's how you can do it:\n\n## Getting dependencies and development container\n\n0. [hexo-icarus-theme](https://github.com/ppoffice/hexo-theme-icarus) is the main dependency of this site. To avoid accidentally breaking your website should the theme be updated *AND* for future customization-ility, we are going to fork the theme repo on Github and pull it locally.\n```\n# dont forget to fork on GH first\ngh repo clone /hexo-icarus-theme\n```\n\n1. Let's create a new repo to hold the website source tree. This will be the repo that you will push to Github Pages.\n```\nmkdir $USER.github.io\ncd $USER.github.io\ngit init\n```\nYou might want to change `$USER` to your Github user or organization name.\n\n2. Next is a Dockerfile that will build your site locally in a \"controlled environment\": no polluting your machine with node stuff, development isolation, etc\n```Dockerfile\n# Dockerfile\n\n## Base and dependencies\nFROM node:22.5.1-alpine3.19 AS base\nWORKDIR /workspace\nRUN npm install -g hexo-cli\n\n## Copy sources for build\nFROM base AS build\nCOPY . /workspace\nRUN hexo generate\n\n## Deploy\nFROM nginx:1.21.3-alpine\nCOPY --from=build /workspace/dist /usr/share/nginx/html\nEXPOSE 80\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\n```\n\n3. Add a .devcontainer for development purposes (things might break and you might want to debug why)\n\n```yaml\n# .devcontainer/compose.yml\nservices:\n web:\n build:\n context: .\n dockerfile: Dockerfile\n image: my-website-server\n ports:\n - \"80:80\"\n```\n\n4. You can now init the site, add icarus theme as a submodule, and start the server\n\n```bash\ndocker compose -f ./devcontainer/compose.yml up -d --build\ndocker compose -f ./devcontainer/compose.yml exec hexo init .\ngit submodule add https://github.com//hexo-icarus-theme themes/icarus\n# you might need to run `npm install ` to get things working\n# dont forget to set icarus as the theme in _config.yml\ndocker compose -f ./devcontainer/compose.yml exec hexo server\n```\n\n5. Get the [experimental dark theme](https://github.com/ppoffice/hexo-theme-icarus/issues/564) and apply it\n\n```bash\ncd themes/icarus\ngit checkout night4\ngit remote add imaegoo https://github.com/imaegoo/hexo-theme-icarus.git\ngit fetch imaegoo\ngit merge imaegoo/night4\n```\n\n6. add .gitignore for things like `node_modules` etc\n\n7. fix the `_config.yml` and `_config.icarus.yml` to your liking.\n\nMake sure to follow [icarus docs](https://ppoffice.github.io/hexo-theme-icarus/). For more information.\n\n## Deploying to Github Pages\n\nThe easiest way to deploy to Github pages is to follow the example from [deploy-pages action](https://github.com/actions/deploy-pages).\nCheckout my [workflow](https://github.com/wgkassem/wgkassem.github.io/blob/main/.github/workflows/pages.yml) for this website.\n\n","slug":"hello-world","published":1,"updated":"2024-10-16T09:54:17.119Z","_id":"clz8enf8d00003pqn6sssfl7l","comments":1,"layout":"post","photos":[],"content":"

Welcome to my website! This is my first post, and it’s going to be about how I set up this website: how I got the dependencies and how I was able to publish to github pages.

\n

Getting this website up and running required one night’s worth of work. So, if you want to dot the same for your github page, here’s how you can do it:

\n

Getting dependencies and development container

    \n
  1. hexo-icarus-theme is the main dependency of this site. To avoid accidentally breaking your website should the theme be updated AND for future customization-ility, we are going to fork the theme repo on Github and pull it locally.

    \n
    1
    2
    # dont forget to fork on GH first
    gh repo clone <your-gh-username>/hexo-icarus-theme
    \n
  2. \n
  3. Let’s create a new repo to hold the website source tree. This will be the repo that you will push to Github Pages.

    \n
    1
    2
    3
    mkdir $USER.github.io
    cd $USER.github.io
    git init
    \n

    You might want to change $USER to your Github user or organization name.

    \n
  4. \n
  5. Next is a Dockerfile that will build your site locally in a “controlled environment”: no polluting your machine with node stuff, development isolation, etc

    \n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # Dockerfile

    ## Base and dependencies
    FROM node:22.5.1-alpine3.19 AS base
    WORKDIR /workspace
    RUN npm install -g hexo-cli

    ## Copy sources for build
    FROM base AS build
    COPY . /workspace
    RUN hexo generate

    ## Deploy
    FROM nginx:1.21.3-alpine
    COPY --from=build /workspace/dist /usr/share/nginx/html
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]
    \n
  6. \n
  7. Add a .devcontainer for development purposes (things might break and you might want to debug why)

    \n
  8. \n
\n
1
2
3
4
5
6
7
8
9
# .devcontainer/compose.yml
services:
web:
build:
context: .
dockerfile: Dockerfile
image: my-website-server
ports:
- "80:80"
\n\n
    \n
  1. You can now init the site, add icarus theme as a submodule, and start the server
  2. \n
\n
1
2
3
4
5
6
docker compose -f ./devcontainer/compose.yml up -d --build
docker compose -f ./devcontainer/compose.yml exec hexo init .
git submodule add https://github.com/<your-gh-username>/hexo-icarus-theme themes/icarus
# you might need to run `npm install <some-packages>` to get things working
# dont forget to set icarus as the theme in _config.yml
docker compose -f ./devcontainer/compose.yml exec hexo server
\n\n
    \n
  1. Get the experimental dark theme and apply it
  2. \n
\n
1
2
3
4
5
cd themes/icarus
git checkout night4
git remote add imaegoo https://github.com/imaegoo/hexo-theme-icarus.git
git fetch imaegoo
git merge imaegoo/night4
\n\n
    \n
  1. add .gitignore for things like node_modules etc

    \n
  2. \n
  3. fix the _config.yml and _config.icarus.yml to your liking.

    \n
  4. \n
\n

Make sure to follow icarus docs. For more information.

\n

Deploying to Github Pages

The easiest way to deploy to Github pages is to follow the example from deploy-pages action.
Checkout my workflow for this website.

\n","excerpt":"","more":"

Welcome to my website! This is my first post, and it’s going to be about how I set up this website: how I got the dependencies and how I was able to publish to github pages.

\n

Getting this website up and running required one night’s worth of work. So, if you want to dot the same for your github page, here’s how you can do it:

\n

Getting dependencies and development container

    \n
  1. hexo-icarus-theme is the main dependency of this site. To avoid accidentally breaking your website should the theme be updated AND for future customization-ility, we are going to fork the theme repo on Github and pull it locally.

    \n
    1
    2
    # dont forget to fork on GH first
    gh repo clone <your-gh-username>/hexo-icarus-theme
    \n
  2. \n
  3. Let’s create a new repo to hold the website source tree. This will be the repo that you will push to Github Pages.

    \n
    1
    2
    3
    mkdir $USER.github.io
    cd $USER.github.io
    git init
    \n

    You might want to change $USER to your Github user or organization name.

    \n
  4. \n
  5. Next is a Dockerfile that will build your site locally in a “controlled environment”: no polluting your machine with node stuff, development isolation, etc

    \n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # Dockerfile

    ## Base and dependencies
    FROM node:22.5.1-alpine3.19 AS base
    WORKDIR /workspace
    RUN npm install -g hexo-cli

    ## Copy sources for build
    FROM base AS build
    COPY . /workspace
    RUN hexo generate

    ## Deploy
    FROM nginx:1.21.3-alpine
    COPY --from=build /workspace/dist /usr/share/nginx/html
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]
    \n
  6. \n
  7. Add a .devcontainer for development purposes (things might break and you might want to debug why)

    \n
  8. \n
\n
1
2
3
4
5
6
7
8
9
# .devcontainer/compose.yml
services:
web:
build:
context: .
dockerfile: Dockerfile
image: my-website-server
ports:
- "80:80"
\n\n
    \n
  1. You can now init the site, add icarus theme as a submodule, and start the server
  2. \n
\n
1
2
3
4
5
6
docker compose -f ./devcontainer/compose.yml up -d --build
docker compose -f ./devcontainer/compose.yml exec hexo init .
git submodule add https://github.com/<your-gh-username>/hexo-icarus-theme themes/icarus
# you might need to run `npm install <some-packages>` to get things working
# dont forget to set icarus as the theme in _config.yml
docker compose -f ./devcontainer/compose.yml exec hexo server
\n\n
    \n
  1. Get the experimental dark theme and apply it
  2. \n
\n
1
2
3
4
5
cd themes/icarus
git checkout night4
git remote add imaegoo https://github.com/imaegoo/hexo-theme-icarus.git
git fetch imaegoo
git merge imaegoo/night4
\n\n
    \n
  1. add .gitignore for things like node_modules etc

    \n
  2. \n
  3. fix the _config.yml and _config.icarus.yml to your liking.

    \n
  4. \n
\n

Make sure to follow icarus docs. For more information.

\n

Deploying to Github Pages

The easiest way to deploy to Github pages is to follow the example from deploy-pages action.
Checkout my workflow for this website.

\n"},{"_content":"","source":"_posts/posix.md","raw":"","slug":"posix","published":1,"date":"2024-12-29T01:42:46.152Z","updated":"2024-12-29T01:42:46.152Z","title":"","comments":1,"layout":"post","photos":[],"_id":"cm59limrw000025qj9oazf4x2","content":"","excerpt":"","more":""},{"title":"Force install npm dependencies","date":"2024-12-28T15:00:00.000Z","toc":true,"_content":"\nThe current website is based on [hexo](https://hexo.io) and [hexo-icarus-theme]().\nSince the icarus theme does not provide a \"night mode\" by dafault, I had to fork [imaegoo's night4 fork](https://github.com/imaegoo/hexo-theme-icarus/tree/night4).\n\nSince I am still not very proficient in frontend development, I rely on imaegoo to keep things up to date with the the upstream [ppoffice/hexo-theme-icarus](https://github.com/ppoffice/hexo-theme-icarus).\n\nThe following is a rundown of how the dependencies are managed in this project.\n\n1. I maintain [a fork](https://github.com/wgkassem/hexo-theme-icarus) of [imaegoo/hexo-theme-icarus](https://github.com/imaegoo/hexo-theme-icarus/tree/night4)\n2. The fork is synced with the upstream as often as possible.\n3. I use [my fork](https://github.com/wgkassem/hexo-theme-icarus) as a [git submodule](https://github.com/wgkassem/wgkassem.github.io/.gitmodules) in this project. The module is installed under ./themes/icarus in the source directory and copied via the [Dockerfile](https://github.com/wgkassem/wgkassem.github.io/blob/main/Dockerfile) to the final image. A Github Action mimics the docker file to build the site and push it to the gh-pages branch.\n\nRecently I noted that in some cases the `hexo generate` command would fail without the GH Action piping the failure. See [this action](https://github.com/wgkassem/wgkassem.github.io/actions/runs/12531513539/job/34949225435#step:6:24).\n","source":"_posts/npm_force_install.md","raw":"---\ntitle: Force install npm dependencies\ndate: 2024-12-29\ntoc: true\ntags: [npm, frontend, javascript]\ncategories: [research]\n---\n\nThe current website is based on [hexo](https://hexo.io) and [hexo-icarus-theme]().\nSince the icarus theme does not provide a \"night mode\" by dafault, I had to fork [imaegoo's night4 fork](https://github.com/imaegoo/hexo-theme-icarus/tree/night4).\n\nSince I am still not very proficient in frontend development, I rely on imaegoo to keep things up to date with the the upstream [ppoffice/hexo-theme-icarus](https://github.com/ppoffice/hexo-theme-icarus).\n\nThe following is a rundown of how the dependencies are managed in this project.\n\n1. I maintain [a fork](https://github.com/wgkassem/hexo-theme-icarus) of [imaegoo/hexo-theme-icarus](https://github.com/imaegoo/hexo-theme-icarus/tree/night4)\n2. The fork is synced with the upstream as often as possible.\n3. I use [my fork](https://github.com/wgkassem/hexo-theme-icarus) as a [git submodule](https://github.com/wgkassem/wgkassem.github.io/.gitmodules) in this project. The module is installed under ./themes/icarus in the source directory and copied via the [Dockerfile](https://github.com/wgkassem/wgkassem.github.io/blob/main/Dockerfile) to the final image. A Github Action mimics the docker file to build the site and push it to the gh-pages branch.\n\nRecently I noted that in some cases the `hexo generate` command would fail without the GH Action piping the failure. See [this action](https://github.com/wgkassem/wgkassem.github.io/actions/runs/12531513539/job/34949225435#step:6:24).\n","slug":"npm_force_install","published":1,"updated":"2024-12-29T11:28:17.936Z","comments":1,"layout":"post","photos":[],"_id":"cm59lims1000125qj4c7o2ygd","content":"

The current website is based on hexo and hexo-icarus-theme.
Since the icarus theme does not provide a “night mode” by dafault, I had to fork imaegoo’s night4 fork.

\n

Since I am still not very proficient in frontend development, I rely on imaegoo to keep things up to date with the the upstream ppoffice/hexo-theme-icarus.

\n

The following is a rundown of how the dependencies are managed in this project.

\n
    \n
  1. I maintain a fork of imaegoo/hexo-theme-icarus
  2. \n
  3. The fork is synced with the upstream as often as possible.
  4. \n
  5. I use my fork as a git submodule in this project. The module is installed under ./themes/icarus in the source directory and copied via the Dockerfile to the final image. A Github Action mimics the docker file to build the site and push it to the gh-pages branch.
  6. \n
\n

Recently I noted that in some cases the hexo generate command would fail without the GH Action piping the failure. See this action.

\n","excerpt":"","more":"

The current website is based on hexo and hexo-icarus-theme.
Since the icarus theme does not provide a “night mode” by dafault, I had to fork imaegoo’s night4 fork.

\n

Since I am still not very proficient in frontend development, I rely on imaegoo to keep things up to date with the the upstream ppoffice/hexo-theme-icarus.

\n

The following is a rundown of how the dependencies are managed in this project.

\n
    \n
  1. I maintain a fork of imaegoo/hexo-theme-icarus
  2. \n
  3. The fork is synced with the upstream as often as possible.
  4. \n
  5. I use my fork as a git submodule in this project. The module is installed under ./themes/icarus in the source directory and copied via the Dockerfile to the final image. A Github Action mimics the docker file to build the site and push it to the gh-pages branch.
  6. \n
\n

Recently I noted that in some cases the hexo generate command would fail without the GH Action piping the failure. See this action.

\n"},{"title":"dotfiles with Lua","date":"2024-12-15T15:00:00.000Z","_content":"\n## Why learn lua?\n\n1. Lua is a lightweight, high-level, multi-paradigm programming language designed primarily for embedded use in applications.\n2. Lua is very integrable with C and C++.\n3. Some major projects that use Lua include World of Warcraft, Adobe Lightroom, and Redis.\n4. Interesting history: Lua was created in 1993 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, and Waldemar Celes at the Pontifical Catholic University of Rio de Janeiro, Brazil because they needed a language that was powerful but also lightweight and *they could not import software*.\n5. It's functional, imperative, and object-oriented.\n6. I want to contribute and become a better neovim user.\n7. *Main reason*: improve installation of my [dotfiles](https://github.com/wgkassem/dotfiles) scripts.\n\n## Useful things:\n\n### Strings\n\n- Strings are immutable in Lua. Once a string is created, it cannot be changed.\n- Get the length of a string variable `var` with `#var`.\n- Concatenate strings with `..`. Example: `str1 = \"Hello\" .. \" \" .. \"World\"`.\n- Long strings can be created with double square brackets `[[ ]]`. This is useful for multi-line strings.\n","source":"_posts/lua.md","raw":"---\ntitle: dotfiles with Lua\ndate: 2024-12-16\ntags: [lua, scripting, programming]\n---\n\n## Why learn lua?\n\n1. Lua is a lightweight, high-level, multi-paradigm programming language designed primarily for embedded use in applications.\n2. Lua is very integrable with C and C++.\n3. Some major projects that use Lua include World of Warcraft, Adobe Lightroom, and Redis.\n4. Interesting history: Lua was created in 1993 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, and Waldemar Celes at the Pontifical Catholic University of Rio de Janeiro, Brazil because they needed a language that was powerful but also lightweight and *they could not import software*.\n5. It's functional, imperative, and object-oriented.\n6. I want to contribute and become a better neovim user.\n7. *Main reason*: improve installation of my [dotfiles](https://github.com/wgkassem/dotfiles) scripts.\n\n## Useful things:\n\n### Strings\n\n- Strings are immutable in Lua. Once a string is created, it cannot be changed.\n- Get the length of a string variable `var` with `#var`.\n- Concatenate strings with `..`. Example: `str1 = \"Hello\" .. \" \" .. \"World\"`.\n- Long strings can be created with double square brackets `[[ ]]`. This is useful for multi-line strings.\n","slug":"lua","published":1,"updated":"2024-12-16T12:39:37.252Z","comments":1,"layout":"post","photos":[],"_id":"cm59lims1000225qj0fd1biu3","content":"

Why learn lua?

    \n
  1. Lua is a lightweight, high-level, multi-paradigm programming language designed primarily for embedded use in applications.
  2. \n
  3. Lua is very integrable with C and C++.
  4. \n
  5. Some major projects that use Lua include World of Warcraft, Adobe Lightroom, and Redis.
  6. \n
  7. Interesting history: Lua was created in 1993 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, and Waldemar Celes at the Pontifical Catholic University of Rio de Janeiro, Brazil because they needed a language that was powerful but also lightweight and they could not import software.
  8. \n
  9. It’s functional, imperative, and object-oriented.
  10. \n
  11. I want to contribute and become a better neovim user.
  12. \n
  13. Main reason: improve installation of my dotfiles scripts.
  14. \n
\n

Useful things:

Strings

    \n
  • Strings are immutable in Lua. Once a string is created, it cannot be changed.
  • \n
  • Get the length of a string variable var with #var.
  • \n
  • Concatenate strings with ... Example: str1 = "Hello" .. " " .. "World".
  • \n
  • Long strings can be created with double square brackets [[ ]]. This is useful for multi-line strings.
  • \n
\n","excerpt":"","more":"

Why learn lua?

    \n
  1. Lua is a lightweight, high-level, multi-paradigm programming language designed primarily for embedded use in applications.
  2. \n
  3. Lua is very integrable with C and C++.
  4. \n
  5. Some major projects that use Lua include World of Warcraft, Adobe Lightroom, and Redis.
  6. \n
  7. Interesting history: Lua was created in 1993 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, and Waldemar Celes at the Pontifical Catholic University of Rio de Janeiro, Brazil because they needed a language that was powerful but also lightweight and they could not import software.
  8. \n
  9. It’s functional, imperative, and object-oriented.
  10. \n
  11. I want to contribute and become a better neovim user.
  12. \n
  13. Main reason: improve installation of my dotfiles scripts.
  14. \n
\n

Useful things:

Strings

    \n
  • Strings are immutable in Lua. Once a string is created, it cannot be changed.
  • \n
  • Get the length of a string variable var with #var.
  • \n
  • Concatenate strings with ... Example: str1 = "Hello" .. " " .. "World".
  • \n
  • Long strings can be created with double square brackets [[ ]]. This is useful for multi-line strings.
  • \n
\n"},{"title":"Semaphores","date":"2024-10-15T15:00:00.000Z","_content":"\n# Introduction\n\nSemaphores are a synchronization primitive that can be used to protect shared resources. They are used to control access to shared resources by multiple threads or processes.\n\n# Application\n\nA resource shared across threads or across processes, e.g. a shared memory space, a file (descriptor), or a network socket, and you need to ensure that no more\nthan 1-n threads (or processes) should access at a time. This is where [semaphores](https://en.wikipedia.org/wiki/Semaphore_%28programming%29) come in.\n\n# Mutex or Semaphore?\n\nA mutex on the other hand is there to ensure that no more than one thread can access (to read or write) a shared resource at a time. It is akin to a binary semaphore.\n\nHere's a comparison between the two as provided by ChatGPT:\n\n| Feature | Semaphore | Mutex |\n|------------------------|------------------------------------------------------|-------------------------------------------------------|\n| **Purpose** | Controls access to resources, allowing multiple threads to access (counting semaphore) or one (binary semaphore). | Ensures mutual exclusion, allowing only one thread to access a critical section. |\n| **Counter** | Maintains a count to track available resources. | Binary state: locked or unlocked (no counter). |\n| **Ownership** | No ownership; any thread can signal (release) a semaphore. | Ownership is enforced; only the thread that locks it can unlock it. |\n| **Concurrency** | Allows multiple threads to proceed if the counter is greater than 1 (in a counting semaphore). | Only one thread can proceed at a time. |\n| **Blocking Behavior** | Threads block if the counter is zero (no available resources). | Threads block if the mutex is locked. |\n| **Use Cases** | - Managing a pool of resources (e.g., thread pools, connection pools).
- Synchronizing producer-consumer workflows. | - Protecting critical sections.
- Ensuring exclusive access to shared data. |\n| **Types** | - Binary semaphore (similar to a mutex).
- Counting semaphore (allows multiple threads). | Only one type (binary lock). |\n| **Risk of Deadlock** | Higher risk if not used carefully (e.g., incorrect signaling order). | Lower risk due to strict ownership and locking rules. |\n| **Performance** | Slightly slower due to additional counter operations and flexibility. | Slightly faster because it enforces strict mutual exclusion. |\n| **Platform Support** | Available in most operating systems and threading libraries. | Available in most operating systems and threading libraries. |\n\n\nFor a very nice introduction to semaphores and their usage, [this post by Vikram Shukla](http://m.blog.chinaunix.net/uid-20341830-id-1701941.html) is a must-read.\n\n\n# POSIX Semaphores\n\n## Semaphore routines\n\nAn [overview of POSIX semaphore routines](https://man7.org/linux/man-pages/man7/sem_overview.7.html) is available via linux man pages.\n\n## Linux vs MacOS\n\nInterestingly, macOS does not support unnamed semaphores, [quora](https://www.quora.com/Why-does-OS-X-not-support-unnamed-semaphores).\nSo, if you are writing code that wants to comply with POSIX portability, you will need to use named semaphores.\n\n","source":"_posts/semaphores.md","raw":"---\ntitle: Semaphores\ndate: 2024-10-16\ntags: [concurrency, synchronization, low-level, c, c++, posix, linux, macos]\ncategories: [research]\n---\n\n# Introduction\n\nSemaphores are a synchronization primitive that can be used to protect shared resources. They are used to control access to shared resources by multiple threads or processes.\n\n# Application\n\nA resource shared across threads or across processes, e.g. a shared memory space, a file (descriptor), or a network socket, and you need to ensure that no more\nthan 1-n threads (or processes) should access at a time. This is where [semaphores](https://en.wikipedia.org/wiki/Semaphore_%28programming%29) come in.\n\n# Mutex or Semaphore?\n\nA mutex on the other hand is there to ensure that no more than one thread can access (to read or write) a shared resource at a time. It is akin to a binary semaphore.\n\nHere's a comparison between the two as provided by ChatGPT:\n\n| Feature | Semaphore | Mutex |\n|------------------------|------------------------------------------------------|-------------------------------------------------------|\n| **Purpose** | Controls access to resources, allowing multiple threads to access (counting semaphore) or one (binary semaphore). | Ensures mutual exclusion, allowing only one thread to access a critical section. |\n| **Counter** | Maintains a count to track available resources. | Binary state: locked or unlocked (no counter). |\n| **Ownership** | No ownership; any thread can signal (release) a semaphore. | Ownership is enforced; only the thread that locks it can unlock it. |\n| **Concurrency** | Allows multiple threads to proceed if the counter is greater than 1 (in a counting semaphore). | Only one thread can proceed at a time. |\n| **Blocking Behavior** | Threads block if the counter is zero (no available resources). | Threads block if the mutex is locked. |\n| **Use Cases** | - Managing a pool of resources (e.g., thread pools, connection pools).
- Synchronizing producer-consumer workflows. | - Protecting critical sections.
- Ensuring exclusive access to shared data. |\n| **Types** | - Binary semaphore (similar to a mutex).
- Counting semaphore (allows multiple threads). | Only one type (binary lock). |\n| **Risk of Deadlock** | Higher risk if not used carefully (e.g., incorrect signaling order). | Lower risk due to strict ownership and locking rules. |\n| **Performance** | Slightly slower due to additional counter operations and flexibility. | Slightly faster because it enforces strict mutual exclusion. |\n| **Platform Support** | Available in most operating systems and threading libraries. | Available in most operating systems and threading libraries. |\n\n\nFor a very nice introduction to semaphores and their usage, [this post by Vikram Shukla](http://m.blog.chinaunix.net/uid-20341830-id-1701941.html) is a must-read.\n\n\n# POSIX Semaphores\n\n## Semaphore routines\n\nAn [overview of POSIX semaphore routines](https://man7.org/linux/man-pages/man7/sem_overview.7.html) is available via linux man pages.\n\n## Linux vs MacOS\n\nInterestingly, macOS does not support unnamed semaphores, [quora](https://www.quora.com/Why-does-OS-X-not-support-unnamed-semaphores).\nSo, if you are writing code that wants to comply with POSIX portability, you will need to use named semaphores.\n\n","slug":"semaphores","published":1,"updated":"2024-12-29T12:15:12.689Z","comments":1,"layout":"post","photos":[],"_id":"cm59lims4000525qj6uf71cdy","content":"

Introduction

Semaphores are a synchronization primitive that can be used to protect shared resources. They are used to control access to shared resources by multiple threads or processes.

\n

Application

A resource shared across threads or across processes, e.g. a shared memory space, a file (descriptor), or a network socket, and you need to ensure that no more
than 1-n threads (or processes) should access at a time. This is where semaphores come in.

\n

Mutex or Semaphore?

A mutex on the other hand is there to ensure that no more than one thread can access (to read or write) a shared resource at a time. It is akin to a binary semaphore.

\n

Here’s a comparison between the two as provided by ChatGPT:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureSemaphoreMutex
PurposeControls access to resources, allowing multiple threads to access (counting semaphore) or one (binary semaphore).Ensures mutual exclusion, allowing only one thread to access a critical section.
CounterMaintains a count to track available resources.Binary state: locked or unlocked (no counter).
OwnershipNo ownership; any thread can signal (release) a semaphore.Ownership is enforced; only the thread that locks it can unlock it.
ConcurrencyAllows multiple threads to proceed if the counter is greater than 1 (in a counting semaphore).Only one thread can proceed at a time.
Blocking BehaviorThreads block if the counter is zero (no available resources).Threads block if the mutex is locked.
Use Cases- Managing a pool of resources (e.g., thread pools, connection pools).
- Synchronizing producer-consumer workflows.
- Protecting critical sections.
- Ensuring exclusive access to shared data.
Types- Binary semaphore (similar to a mutex).
- Counting semaphore (allows multiple threads).
Only one type (binary lock).
Risk of DeadlockHigher risk if not used carefully (e.g., incorrect signaling order).Lower risk due to strict ownership and locking rules.
PerformanceSlightly slower due to additional counter operations and flexibility.Slightly faster because it enforces strict mutual exclusion.
Platform SupportAvailable in most operating systems and threading libraries.Available in most operating systems and threading libraries.
\n

For a very nice introduction to semaphores and their usage, this post by Vikram Shukla is a must-read.

\n

POSIX Semaphores

Semaphore routines

An overview of POSIX semaphore routines is available via linux man pages.

\n

Linux vs MacOS

Interestingly, macOS does not support unnamed semaphores, quora.
So, if you are writing code that wants to comply with POSIX portability, you will need to use named semaphores.

\n","excerpt":"","more":"

Introduction

Semaphores are a synchronization primitive that can be used to protect shared resources. They are used to control access to shared resources by multiple threads or processes.

\n

Application

A resource shared across threads or across processes, e.g. a shared memory space, a file (descriptor), or a network socket, and you need to ensure that no more
than 1-n threads (or processes) should access at a time. This is where semaphores come in.

\n

Mutex or Semaphore?

A mutex on the other hand is there to ensure that no more than one thread can access (to read or write) a shared resource at a time. It is akin to a binary semaphore.

\n

Here’s a comparison between the two as provided by ChatGPT:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureSemaphoreMutex
PurposeControls access to resources, allowing multiple threads to access (counting semaphore) or one (binary semaphore).Ensures mutual exclusion, allowing only one thread to access a critical section.
CounterMaintains a count to track available resources.Binary state: locked or unlocked (no counter).
OwnershipNo ownership; any thread can signal (release) a semaphore.Ownership is enforced; only the thread that locks it can unlock it.
ConcurrencyAllows multiple threads to proceed if the counter is greater than 1 (in a counting semaphore).Only one thread can proceed at a time.
Blocking BehaviorThreads block if the counter is zero (no available resources).Threads block if the mutex is locked.
Use Cases- Managing a pool of resources (e.g., thread pools, connection pools).
- Synchronizing producer-consumer workflows.
- Protecting critical sections.
- Ensuring exclusive access to shared data.
Types- Binary semaphore (similar to a mutex).
- Counting semaphore (allows multiple threads).
Only one type (binary lock).
Risk of DeadlockHigher risk if not used carefully (e.g., incorrect signaling order).Lower risk due to strict ownership and locking rules.
PerformanceSlightly slower due to additional counter operations and flexibility.Slightly faster because it enforces strict mutual exclusion.
Platform SupportAvailable in most operating systems and threading libraries.Available in most operating systems and threading libraries.
\n

For a very nice introduction to semaphores and their usage, this post by Vikram Shukla is a must-read.

\n

POSIX Semaphores

Semaphore routines

An overview of POSIX semaphore routines is available via linux man pages.

\n

Linux vs MacOS

Interestingly, macOS does not support unnamed semaphores, quora.
So, if you are writing code that wants to comply with POSIX portability, you will need to use named semaphores.

\n"}],"PostAsset":[],"PostCategory":[{"post_id":"cm59lims1000125qj4c7o2ygd","category_id":"cm59lims2000325qj9q75efup","_id":"cm59lims5000825qjc5320xk4"},{"post_id":"cm59lims4000525qj6uf71cdy","category_id":"cm59lims2000325qj9q75efup","_id":"cm59lims6000a25qj1fm7abd7"}],"PostTag":[{"post_id":"cm59lims1000125qj4c7o2ygd","tag_id":"cm59lims3000425qj2caeerr4","_id":"cm59lims6000c25qj72e2eigu"},{"post_id":"cm59lims1000125qj4c7o2ygd","tag_id":"cm59lims4000725qj5jd703jw","_id":"cm59lims6000d25qjgli50lwf"},{"post_id":"cm59lims1000125qj4c7o2ygd","tag_id":"cm59lims5000925qja8ku8qbr","_id":"cm59lims6000f25qje3f61hho"},{"post_id":"cm59lims1000225qj0fd1biu3","tag_id":"cm59lims6000b25qj7b88baqa","_id":"cm59lims7000i25qj7jzcbcfz"},{"post_id":"cm59lims1000225qj0fd1biu3","tag_id":"cm59lims6000e25qjck7nf45w","_id":"cm59lims7000j25qj9ymhh2kq"},{"post_id":"cm59lims1000225qj0fd1biu3","tag_id":"cm59lims6000g25qj5wbjhsc7","_id":"cm59lims7000l25qjer8t752s"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims6000h25qj7kk96d8j","_id":"cm59lims8000s25qj4oycbj1q"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims7000k25qjhzba4od4","_id":"cm59lims8000t25qj7dk63bam"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims7000m25qjg0ekelag","_id":"cm59lims8000u25qjhqloh5gm"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims7000n25qj85job81j","_id":"cm59lims8000v25qj259scaqr"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims8000o25qj0dyse8bc","_id":"cm59lims8000w25qj51jrhdpz"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims8000p25qj9j83f42l","_id":"cm59lims9000x25qj6o0y8078"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims8000q25qj19zt0brp","_id":"cm59lims9000y25qj75n5ccy4"},{"post_id":"cm59lims4000525qj6uf71cdy","tag_id":"cm59lims8000r25qj0iv68996","_id":"cm59lims9000z25qj3ru4a0qi"}],"Tag":[{"name":"npm","_id":"cm59lims3000425qj2caeerr4"},{"name":"frontend","_id":"cm59lims4000725qj5jd703jw"},{"name":"javascript","_id":"cm59lims5000925qja8ku8qbr"},{"name":"lua","_id":"cm59lims6000b25qj7b88baqa"},{"name":"scripting","_id":"cm59lims6000e25qjck7nf45w"},{"name":"programming","_id":"cm59lims6000g25qj5wbjhsc7"},{"name":"concurrency","_id":"cm59lims6000h25qj7kk96d8j"},{"name":"synchronization","_id":"cm59lims7000k25qjhzba4od4"},{"name":"low-level","_id":"cm59lims7000m25qjg0ekelag"},{"name":"c","_id":"cm59lims7000n25qj85job81j"},{"name":"c++","_id":"cm59lims8000o25qj0dyse8bc"},{"name":"posix","_id":"cm59lims8000p25qj9j83f42l"},{"name":"linux","_id":"cm59lims8000q25qj19zt0brp"},{"name":"macos","_id":"cm59lims8000r25qj0iv68996"}]}} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d11bb1c..011cb9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,14 @@ { - "name": "hexo-site", - "version": "0.0.0", + "name": "wgkassem.github.io", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "hexo-site", - "version": "0.0.0", + "name": "wgkassem.github.io", + "version": "0.1.0", "dependencies": { - "bulma-stylus": "^0.9.1", + "bulma-stylus": "^0.9.2-rc.1", "hexo": "^7.0.0", "hexo-component-inferno": "^3.1.2", "hexo-generator-archive": "^2.0.0", @@ -2310,9 +2310,10 @@ "license": "MIT" }, "node_modules/bulma-stylus": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/bulma-stylus/-/bulma-stylus-0.9.1.tgz", - "integrity": "sha512-00u1O/RTyA+9SYZVYljliZcTltgCeZ/Ln0dLzAhYEWkS8WaMf7KWIimbnozSwemhlM0ZiDsHIMvMjoUAayRZ9Q==" + "version": "0.9.2-rc.1", + "resolved": "https://registry.npmjs.org/bulma-stylus/-/bulma-stylus-0.9.2-rc.1.tgz", + "integrity": "sha512-ROpYCEzj/9m3mjfvnFSSl2FUQnnKLsW9D0mL2CBIan4e7P7iLOXfThr+9u7HGvMywNUGgD1lXVKtTiYH2WrhXQ==", + "license": "MIT" }, "node_modules/bytes": { "version": "3.0.0", diff --git a/yarn.lock b/yarn.lock index df70830..06cffd8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28,7 +28,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz" integrity sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ== -"@babel/core@^7.23.9": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.23.9", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0": version "7.25.2" resolved "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz" integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== @@ -1185,7 +1185,7 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.23.0, browserslist@^4.23.1: +browserslist@^4.23.0, browserslist@^4.23.1, "browserslist@>= 4.21.0": version "4.23.2" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz" integrity sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA== @@ -1200,10 +1200,10 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -bulma-stylus@^0.9.1: - version "0.9.1" - resolved "https://registry.npmjs.org/bulma-stylus/-/bulma-stylus-0.9.1.tgz" - integrity sha512-00u1O/RTyA+9SYZVYljliZcTltgCeZ/Ln0dLzAhYEWkS8WaMf7KWIimbnozSwemhlM0ZiDsHIMvMjoUAayRZ9Q== +bulma-stylus@^0.9.2-rc.1: + version "0.9.2-rc.1" + resolved "https://registry.npmjs.org/bulma-stylus/-/bulma-stylus-0.9.2-rc.1.tgz" + integrity sha512-ROpYCEzj/9m3mjfvnFSSl2FUQnnKLsW9D0mL2CBIan4e7P7iLOXfThr+9u7HGvMywNUGgD1lXVKtTiYH2WrhXQ== bytes@3.0.0: version "3.0.0" @@ -1240,7 +1240,7 @@ chalk@^4.0.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chokidar@^3.5.3: +chokidar@^3.3.0, chokidar@^3.5.3: version "3.6.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -1278,16 +1278,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" @@ -1402,6 +1402,34 @@ data-urls@^3.0.2: whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" +debug@^4.1.0: + version "4.3.6" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + +debug@^4.1.1: + version "4.3.6" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + +debug@^4.3.1: + version "4.3.6" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + +debug@^4.3.2: + version "4.3.6" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + debug@2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" @@ -1409,7 +1437,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: +debug@4: version "4.3.6" resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz" integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== @@ -1436,7 +1464,7 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@2.0.0, depd@~2.0.0: +depd@~2.0.0, depd@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -1638,11 +1666,6 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" @@ -1763,7 +1786,7 @@ hexo-generator-category@^2.0.0: hexo-generator-index@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/hexo-generator-index/-/hexo-generator-index-4.0.0.tgz#2f20cf9d231db30edbccd5be32c92c8aeb5d6d63" + resolved "https://registry.npmjs.org/hexo-generator-index/-/hexo-generator-index-4.0.0.tgz" integrity sha512-KeM7mOCKWINGFAk1E+CkjMMgqFIv8oaRbGxR7ipkQAp44o4aopkVftma4sdIplOq9WQEWfVYDUK5gEv9J3nzUg== dependencies: hexo-pagination "3.0.0" @@ -1789,7 +1812,7 @@ hexo-log@^4.0.1: dependencies: picocolors "^1.0.0" -hexo-pagination@3.0.0, hexo-pagination@^3.0.0: +hexo-pagination@^3.0.0, hexo-pagination@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/hexo-pagination/-/hexo-pagination-3.0.0.tgz" integrity sha512-8oo1iozloZo7TojPVYg4IxL3SJKCBdSJ908fTlIxIK7TWJIKdYnQlW31+12DBJ0NhVZA/lZisPObGF08wT8fKw== @@ -1970,7 +1993,7 @@ inferno-vnode-flags@8.2.3: resolved "https://registry.npmjs.org/inferno-vnode-flags/-/inferno-vnode-flags-8.2.3.tgz" integrity sha512-dfC0MIwFv9PCbZCUsuk9ISejFS3fKJODC0rZ/LjxxzE+OrCk+PMwPLsUnGU6O9/jbBnPACVz1BkACDf5LWgU5Q== -inferno@8.2.3, inferno@^8.2.3: +inferno@^8.2.3, inferno@8.2.3: version "8.2.3" resolved "https://registry.npmjs.org/inferno/-/inferno-8.2.3.tgz" integrity sha512-LMeRlCe+RlXw8kHCLyOWRk2PsZ3Fo4jkESyAR1g4FfPT48N78i11YhTVXW2ukCx5MFjv+qrfa73JzJWU9sg4CQ== @@ -1987,7 +2010,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3: +inherits@^2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2084,7 +2107,7 @@ js-yaml-js-types@^1.0.0: dependencies: esprima "^4.0.1" -js-yaml@^4.1.0: +js-yaml@^4.1.0, js-yaml@4.x: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -2206,16 +2229,16 @@ micromatch@^4.0.4: braces "^3.0.3" picomatch "^2.3.1" -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - "mime-db@>= 1.43.0 < 2": version "1.53.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz" integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + mime-types@^2.1.12, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" @@ -2223,16 +2246,16 @@ mime-types@^2.1.12, mime-types@~2.1.34: dependencies: mime-db "1.52.0" -mime@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - mime@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz" integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" @@ -2345,13 +2368,6 @@ nwsapi@^2.2.2: resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz" integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - on-finished@~2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" @@ -2359,6 +2375,13 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + on-headers@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" @@ -2584,16 +2607,16 @@ rfdc@^1.3.0: resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== -safe-buffer@5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" @@ -2687,7 +2710,7 @@ source-map-support@^0.5.16: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@~0.6.1: +source-map@^0.6.0: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -2697,21 +2720,26 @@ source-map@^0.7.3: resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + sprintf-js@^1.1.2: version "1.1.3" resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz" integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - statuses@~1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" @@ -2733,7 +2761,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -stylus@^0.62.0: +stylus@*, stylus@^0.62.0: version "0.62.0" resolved "https://registry.npmjs.org/stylus/-/stylus-0.62.0.tgz" integrity sha512-v3YCf31atbwJQIMtPNX8hcQ+okD4NQaTuKGUWfII8eaqn+3otrbttGL1zSMZAAtiPsBztQnujVBugg/cXFUpyg==