commit 43ac3de919de8b30fda451245ca26efee9e67b35 Author: hernikplays Date: Sat Nov 5 11:35:49 2022 +0000 jekyll build from Action a5e9a9ab01e76088febf0547ffbfb766826fb575 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..f4765bc --- /dev/null +++ b/404.html @@ -0,0 +1,659 @@ + + + + + + + + + +Matyáš Caras | Welcome to my website/blog, full of weird stuff written by yours truly. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+ +
+
+ + +
+

404

+ +

Page not found :(

+

Try to check other pages through the menu.

+
+ +
+
+ + diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..01dd23e --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +caras.cafe diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..0c8cc73 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2019 Jeffrey Tse + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..a050978 --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +
+
+ + + jekyll-theme-yat →~ jekyll + + +

JEKYLL YAT THEME

+ +
+ +

+ Jekyll theme for elegant writers. +

+ +

+ + Github Pages + + + + Gem Version + + + + License: MIT + + + + Donate (Liberapay) + + + + Donate (Patreon) + + + + Donate (Ko-fi) + +

+ +
+ Built with ❤︎ by + jeffreytse and + contributors + +
+ diff --git a/about.html b/about.html new file mode 100644 index 0000000..edb3e4b --- /dev/null +++ b/about.html @@ -0,0 +1,803 @@ + + + + + + + + + +About | Matyáš Caras + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+ +
+
+
+
+ +
+
+ + + + + + + + + +
+ +
+ +

About

+ +

+I'm Matyáš Caras, I study IT in the Czech Republic and create software projects. +

+ + + +
+ +
+
+ + + +
+
+ + +
+ +
+ +
+
+ + diff --git a/archives.html b/archives.html new file mode 100644 index 0000000..134106a --- /dev/null +++ b/archives.html @@ -0,0 +1,772 @@ + + + + + + + + + +Archives | Matyáš Caras + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ +
+ +
+
+ + diff --git a/assets/css/main.css b/assets/css/main.css new file mode 100644 index 0000000..97b8350 --- /dev/null +++ b/assets/css/main.css @@ -0,0 +1,573 @@ +/** Reset some basic elements */ +body, h1, h2, h3, h4, h5, h6, p, blockquote, pre, hr, dl, dd, ol, ul, figure { margin: 0; padding: 0; } + +/** Basic styling */ +body { font-family: Helvetica, Arial, Oswald, sans-serif; font-weight: 400; font-size: 14px; font-display: swap; line-height: 1.6; color: #454545; background-color: #fff; -webkit-text-size-adjust: 100%; -webkit-font-feature-settings: "kern" 1; -moz-font-feature-settings: "kern" 1; -o-font-feature-settings: "kern" 1; font-feature-settings: "kern" 1; font-kerning: normal; display: flex; min-height: 100vh; flex-direction: column; } + +/** Set `margin-bottom` to maintain vertical rhythm */ +h1, h2, h3, h4, h5, h6, p, blockquote, pre, ul, ol, dl, figure { margin-bottom: 15px; } + +/** `main` element */ +main { display: block; /* Default value of `display` of `main` element is 'inline' in IE 11. */ } + +/** Images */ +img { max-width: 100%; vertical-align: middle; } + +/** Figures */ +figure > img { display: block; } + +figcaption { font-size: 12.25px; } + +/** Lists */ +ul, ol { margin-left: 30px; } + +li > ul, li > ol { margin-bottom: 0; } + +/** Headings */ +h1, h2, h3, h4, h5, h6 { font-weight: 600; } + +/** Links */ +a { color: #ff5100; text-decoration: none; } + +a:hover { text-decoration: underline; } + +.social-media-list a:hover { text-decoration: none; } + +.social-media-list a:hover .username { text-decoration: underline; } + +/** Blockquotes */ +blockquote { color: #828282; border-left: 4px solid #e8e8e8; padding-left: 15px; font-size: 15.75px; letter-spacing: -1px; font-style: italic; } + +blockquote > :last-child { margin-bottom: 0; } + +/** Code formatting */ +pre, code { font-size: 13.125px; color: #454545; } + +*:not(pre) > code { padding: 3px 6px; border-radius: 3px; background-color: #eee; margin: 0 5px; } + +pre { overflow-x: auto; position: relative; background-color: #f0f0f0; } + +pre > code { display: inline-block; padding: 20px !important; background-color: transparent; border: 0; } + +pre table, pre pre { margin-bottom: 0; } + +pre table .gutter, pre table .code, pre pre .gutter, pre pre .code { padding: 6px; border: none; } + +/** Wrapper */ +.wrapper { max-width: 920px; margin: auto; padding-right: 30px; padding-left: 30px; } + +/** Clearfix */ +.wrapper:after { content: ""; display: table; clear: both; } + +/** Tables */ +table { display: block; margin-bottom: 30px; width: 100%; text-align: left; color: #525252; border-collapse: collapse; overflow: auto; } + +table tr:nth-child(even) { background-color: #f7f7f7; } + +table th, table td { padding: 10px 15px; } + +table th { background-color: #f0f0f0; border: 1px solid #dedede; border-bottom-color: #c9c9c9; } + +table td { border: 1px solid #e8e8e8; } + +/** Flex layout */ +.framework { display: flex; } + +.framework .main, .page-content { flex: 1; min-width: 0; /* <-- fix flexbox width with pre tags */ } + +/** Flex sticky */ +/** Vertical center */ +/** Horizontal center */ +/** Center background image */ +/** Animation for transparent header */ +html[data-header-transparent] header.site-header { position: fixed; } + +html[data-scroll-status='top'] header.site-header-transparent { height: 0; margin-top: 12px; background-color: transparent; transition: 0.1s height,background-color,box-shadow; } + +html[data-scroll-status='top'] header.site-header-transparent.site-header .site-brand-inner, html[data-scroll-status='top'] header.site-header-transparent.site-header .page-link { color: #fff; transition: 0.1s color; } + +@media screen and (max-width: 800px) { html[data-scroll-status='top'] header.site-header-transparent.site-header .page-link { color: black; } html[data-scroll-status='top'] header.site-header-transparent.site-header .menu-icon > svg { fill: #fdfdfd; } } + +html[data-scroll-status='top'] footer.site-footer { color: unset; background-color: transparent; } + +html[data-scroll-status='top'] footer.site-footer .site-footer-inner { border-top: solid 1px #eee; } + +html[data-scroll-status='down'] header.site-header { top: -63.84px; } + +html[data-scroll-status='down'] .framework .sidebar { top: 20px; } + +/** Site header */ +.site-header { background-color: #ffffff; height: 63.84px; width: 100%; transition: height 0.2s, text-shadow 0.2s, top 0.2s; box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.06); position: sticky; position: -moz-sticky; /* <-- fix sticky compatibility issue */ position: -ms-sticky; position: -o-sticky; position: -webkit-sticky; align-self: flex-start; /* <-- fix the sticky not work issue */ transform: scale(0.9999); /* <-- fix the sticky x overflow issue */ top: 0; z-index: 1000; } + +.site-header > .wrapper { margin: 0 60px; padding: 0; max-width: 100%; transition: 0.2s margin; } + +@media screen and (max-width: 1024px) { .site-header > .wrapper { margin: 0 20px; max-width: unset; } } + +.site-header a { text-decoration: none; } + +.site-header .site-header-inner { position: relative; } + +.site-brand { line-height: 63.84px; margin-right: 50px; } + +.site-brand .site-brand-inner { font-size: 15.75px; font-weight: 400; letter-spacing: -1px; transition: 0.1s filter color; } + +.site-brand .site-brand-inner, .site-brand .site-brand-inner:visited { color: black; } + +.site-brand .site-brand-inner .site-favicon { display: inline-block; height: 42.56px; margin-right: 5px; } + +.site-nav { font-size: 15.75px; line-height: 63.84px; position: absolute; right: 0; top: 0; } + +.site-nav .nav-trigger { display: none; } + +.site-nav .menu-icon { display: none; } + +.site-nav .page-link { line-height: 1.6; color: black; transition: 0.1s ease-in-out; } + +.site-nav .page-link:not(:last-child) { margin-right: 24px; } + +.site-nav .page-link:not(:last-child):hover { text-decoration: underline; } + +@media screen and (max-width: 800px) { .site-nav { position: absolute; top: 0; text-align: left; } .site-nav label[for="nav-trigger"] { display: block; z-index: 2; cursor: pointer; } .site-nav .menu-icon { display: block; float: right; text-align: center; } .site-nav .menu-icon > svg { fill: black; transition: 0.1s fill; } .site-nav input ~ .trigger { clear: both; display: none; border-radius: 3px; box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.06); } .site-nav input:checked ~ .trigger { display: block; background: #ffffff; } .site-nav .page-link { display: block; padding: 5px 10px; color: black; margin: 0 25px; } } + +/** Site footer */ +.site-footer { font-size: 14px; color: #404040; background-color: #f2f2f2; text-align: left; transition: background-color 0.2s; } + +.site-footer .site-footer-inner { transition: border-top 0.2s; padding: 54px 0; } + +.site-footer a { color: #ff5100; } + +.site-footer a:hover { color: #ff7433; } + +.copyleft { display: inline-block; transform: rotate(180deg); } + +/** Post header */ +.post .post-header { margin-bottom: 30px; } + +.post .post-title { font-size: 36.75px; letter-spacing: -1px; line-height: 1; } + +@media screen and (max-width: 800px) { .post .post-title { font-size: 31.5px; } } + +.post .post-tags { padding-right: 150px; } + +.post .post-tags .post-tag { display: inline-block; margin: 0 12px 0 0; } + +/** Page content */ +.page-content { /* <-- Keep footer on the bottom */ -ms-flex: none; /* <-- Fix IE footer issue */ padding: 60px 0; padding-top: 72px; } + +.page-heading { font-size: 28px; } + +.post-list-heading { font-size: 24.5px; } + +/** Pagination page */ +.pagination .post-list { margin-left: 0; list-style: none; } + +.pagination .post-list > li { margin-bottom: 45px; padding-bottom: 30px; } + +.pagination .post-list > li:not(:last-child) { border-bottom: 1px solid #e3e3e3; } + +.pagination .post-title { margin-bottom: 6px; transition: 0.2s all; } + +.pagination .post-title a { text-decoration: none; } + +.pagination .post-title a:after { content: 'NEW'; position: absolute; margin-left: 8px; margin-top: 3px; padding: 0px 3px; background-color: #ff5100; color: #fff; font-size: 10px; font-weight: 600; border-radius: 2px; } + +.pagination .post-title a:visited:after { background-color: #fff; } + +.pagination .post-meta { font-size: 14px; color: #828282; margin-bottom: 15px; } + +.pagination .post-link { font-size: 23.1px; font-weight: 600; color: #333; } + +.pagination .post-excerpt { color: #777; word-break: break-word; overflow-wrap: break-word; } + +.pagination .post-tags .post-tag { display: inline-block; text-decoration: none; border: 1px solid; padding: 2px 4px; border-radius: 2px; transition: color 0.2s; margin-bottom: 8px; } + +.pagination .post-tags .post-tag:not(:last-child) { margin-right: 8px; } + +.pagination .post-tags .post-tag:hover { color: #787878; } + +.pagination .paginator { text-align: center; } + +.pagination .paginator > .previous:before { content: ' '; border: solid #787878; border-width: 0 2px 2px 0; display: inline-block; padding: 4px; margin-right: 8px; transform: rotate(135deg); -webkit-transform: rotate(135deg); } + +.pagination .paginator > .next:after { content: ' '; border: solid #787878; border-width: 0 2px 2px 0; display: inline-block; padding: 4px; margin-left: 8px; transform: rotate(-45deg); -webkit-transform: rotate(-45deg); } + +.pagination .paginator .previous span, .pagination .paginator .next span { color: #b3b3b3; } + +.pagination .paginator .indicator { padding: 0 15px; } + +/** Posts */ +.post .post-header { margin: 50px auto 60px; padding: 0 0 20px; border-bottom: 1px solid #ebebeb; } + +.post .post-header .post-title { margin-bottom: 6px; } + +.post .post-header .post-subtitle { font-weight: lighter; } + +.post .post-header .post-meta { color: #808080; } + +.post .post-content { margin-bottom: 30px; overflow-wrap: normal; word-wrap: normal; word-break: normal; } + +.post .post-content h2 { font-size: 28px; } + +@media screen and (max-width: 800px) { .post .post-content h2 { font-size: 24.5px; } } + +.post .post-content h3 { font-size: 22.75px; } + +@media screen and (max-width: 800px) { .post .post-content h3 { font-size: 19.25px; } } + +.post .post-content h4 { font-size: 17.5px; } + +@media screen and (max-width: 800px) { .post .post-content h4 { font-size: 15.75px; } } + +.post .post-content img, .post .post-content svg, .post .post-content iframe { margin-left: auto; margin-right: auto; display: block; } + +.post .post-content h2, .post .post-content h3, .post .post-content h4, .post .post-content h5, .post .post-content h6 { margin: 60px 0 19px; } + +.post .post-content p, .post .post-content hr { margin-bottom: 24px; } + +.post .post-content hr { height: 1px; background-color: #ebebeb; border: none; } + +.post .post-related > *:first-child { font-size: 19.95px; color: #333; margin-bottom: 14px; } + +.post .post-related ul { margin-left: 15px; } + +.post .post-related ul .post-link { font-size: 15.05px; } + +.post .post-related ul a { color: #666; } + +.post .post-related ul a:hover { color: #333; } + +.post .post-related ul a:after { content: 'NEW'; position: absolute; margin-left: 8px; margin-top: 3px; padding: 0px 3px; background-color: #ff5100; color: #fff; font-size: 10px; font-weight: 600; border-radius: 2px; } + +.post .post-related ul a:visited:after { background-color: #fff; } + +.post-comments { padding-top: 25px; } + +/** Posts misc */ +.post-nav { display: flex; justify-content: space-between; margin: 72px 0 59px; padding: 31px 0 0; } + +.post-nav a { font-size: 15.75px; line-height: 15px; color: #666; max-width: 50%; } + +.post-nav .previous:before { content: ' '; border: solid #787878; border-width: 0 2px 2px 0; display: inline-block; padding: 4px; margin-right: 8px; transform: rotate(135deg); -webkit-transform: rotate(135deg); } + +.post-nav .next:after { content: ' '; border: solid #787878; border-width: 0 2px 2px 0; display: inline-block; padding: 4px; margin-left: 8px; transform: rotate(-45deg); -webkit-transform: rotate(-45deg); } + +/** Archives page */ +.page-archives .page-archives-list { margin-left: 0; list-style: none; } + +.page-archives .archives-time { font-size: 21px; margin-bottom: 8px; } + +.page-archives .archives-time:not(:first-child) { margin-top: 18px; } + +.page-archives .post-meta { font-size: 12.25px; color: #828282; } + +/** Page banner */ +.page-banner { display: block; position: relative; height: 640px; background-color: rgba(0, 0, 0, 0.8); transition: height 0.2s; } + +.page-banner .page-banner-img { position: absolute; width: 100%; height: 100%; overflow: hidden; } + +.page-banner .page-banner-img > *:first-child { height: 100%; max-width: 1000%; background-size: cover; background-position: center center; overflow: hidden; transition: 0.1s all ease-in-out; } + +.page-banner .page-banner-img > video { width: 100vw; object-fit: cover; } + +.page-banner .page-banner-img > img.img-placeholder { display: none; } + +.page-banner .wrapper { height: 100%; } + +.page-banner .page-banner-inner { position: relative; top: 50%; transform: translateY(-50%); color: #fdfdfd; padding: 10px 5px; text-shadow: 1px 1px 2px #33333355; } + +.page-banner .page-banner-inner > *:first-child { margin: 0; } + +.page-banner .page-banner-inner > *:first-child > :nth-child(1) { font-size: 54.6px; letter-spacing: -1px; margin-bottom: 0.1em; font-weight: normal; transition: 0.2s all; } + +@media screen and (max-width: 600px) { .page-banner .page-banner-inner > *:first-child > :nth-child(1) { font-size: 27.65px; } } + +.page-banner .page-banner-inner > *:first-child > :nth-child(2) { font-weight: lighter; margin-bottom: 0.8em; transition: 0.2s all; } + +@media screen and (max-width: 600px) { .page-banner .page-banner-inner > *:first-child > :nth-child(2) { font-size: 16.45px; } } + +.page-banner .page-banner-inner > *:first-child > :last-child { margin-bottom: 0; } + +.page-banner .page-banner-inner .post-subtitle { font-size: 21.35px; color: #ffffffcc; padding-right: 280px; } + +@media screen and (max-width: 600px) { .page-banner .page-banner-inner .post-subtitle { padding-right: 0; } } + +.page-banner .page-banner-inner .post-meta { color: #ffffffcc; } + +.page-banner .page-banner-inner .left-vsplit:before { background: #e3e3e388; } + +.page-banner .page-banner-inner .post-tags { color: #999; padding-right: 280px; } + +@media screen and (max-width: 600px) { .page-banner .page-banner-inner .post-tags { padding-right: 0; } } + +.page-banner .page-banner-inner .post-tags .post-tag { font-size: 15.75px; display: inline-block; text-decoration: none; margin: 9px 12px 0 0; color: #fff; } + +.page-banner .page-banner-inner .post-tags .post-tag:hover { text-decoration: underline; } + +@media screen and (max-width: 600px) { .page-banner { height: 426.6666666667px; } } + +/** Layout and sidebar */ +.framework .sidebar { padding-left: 8px; transition: top 0.2s, display 0.2s; position: sticky; position: -moz-sticky; /* <-- fix sticky compatibility issue */ position: -ms-sticky; position: -o-sticky; position: -webkit-sticky; align-self: flex-start; /* <-- fix the sticky not work issue */ transform: scale(0.9999); /* <-- fix the sticky x overflow issue */ top: 83.84px; } + +@media screen and (max-width: 800px) { .framework .sidebar { display: none; } } + +/** Segments page */ +.page-segments .page-segments-list { margin-left: 0; list-style: none; } + +.page-segments .segment-name { font-weight: 600; margin-bottom: 8px; position: relative; font-size: 22.4px; } + +.page-segments .segment-name:not(:first-child) { margin-top: 28px; } + +.page-segments .segment-name:hover:before { content: '#'; left: -1em; position: absolute; } + +.page-segments .post-meta { font-size: 12.25px; color: #828282; } + +.page-segments li a { color: #303030; } + +.page-segments li a.post-link { margin-left: 5px; } + +.page-segments li a:hover { color: #000; } + +.page-segments li a:after { content: 'NEW'; position: absolute; margin-left: 8px; margin-top: 3px; padding: 0px 3px; background-color: #ff5100; color: #fff; font-size: 10px; font-weight: 600; border-radius: 2px; } + +.page-segments li a:visited:after { background-color: #fff; } + +.left-vsplit:before { content: ""; display: inline-block; width: 1px; height: 10px; margin: 0 10px; background-color: #e3e3e3e3; vertical-align: baseline; } + +@media screen and (max-width: 800px) { html[data-theme="dark"][data-scroll-status='top'] header.site-header-transparent.site-header .page-link { color: #f8f8f8; } } + +html[data-theme="dark"][data-scroll-status='top'] footer.site-footer .site-footer-inner { border-top: solid 1px #2f2f2f !important; transition: 0s; } + +html[data-theme="dark"] body { color: #bbb; background-color: #0e0e0e; } + +html[data-theme="dark"] *:not(pre) > code { color: #bbb; background-color: #454545; } + +html[data-theme="dark"] blockquote { border-left: 4px solid #484848; } + +html[data-theme="dark"] table { color: #9d9d9d; } + +html[data-theme="dark"] table th { background-color: #050505; } + +html[data-theme="dark"] table tr:nth-child(even) { background-color: #080808; } + +html[data-theme="dark"] .site-header { background-color: #090909; } + +html[data-theme="dark"] .site-header .site-brand .site-brand-inner, html[data-theme="dark"] .site-header .site-brand .site-brand-inner:visited { color: #f8f8f8; } + +html[data-theme="dark"] .site-header .site-nav .page-link { color: #f8f8f8; } + +html[data-theme="dark"] .site-header .ct-language-dropdown { color: #f8f8f8; background-color: #0e0e0e; box-shadow: 0 0 3px 1px #0000005b; } + +html[data-theme="dark"] .site-header .ct-language-selected, .ct-language-dropdown html[data-theme="dark"] .site-header li:hover, html[data-theme="dark"] .site-header .ct-language-dropdown li:hover { background-color: #222 !important; } + +@media screen and (max-width: 800px) { html[data-theme="dark"] .site-header .menu-icon > svg { fill: #bbbbbb; } html[data-theme="dark"] .site-header .site-nav input:checked ~ .trigger { background-color: #090909; } } + +html[data-theme="dark"] .site-footer { color: #fff; background-color: #000; } + +html[data-theme="dark"] .left-vsplit:before { background-color: #9a9a9a; } + +html[data-theme="dark"] .page-banner .page-banner-img > *:first-child { opacity: 0.718; } + +html[data-theme="dark"] .pagination .post-link { color: #bbb; } + +html[data-theme="dark"] .pagination .post-title a:visited:after { background-color: #0e0e0e; } + +html[data-theme="dark"] .pagination .post-title a:after { color: #0e0e0e; } + +html[data-theme="dark"] .pagination .post-list > li:not(:last-child) { border-bottom: 1px solid #545454; } + +html[data-theme="dark"] .pagination .post-tags .post-tag:hover { color: #d7d7d7; } + +html[data-theme="dark"] .page-segments li a { color: #ddd; } + +html[data-theme="dark"] .page-segments li a:visited:after { background-color: #0e0e0e; } + +html[data-theme="dark"] .page-segments li a:after { color: #0e0e0e; } + +html[data-theme="dark"] .post .post-content img:not([raw]) { background-color: #ffffff33; } + +html[data-theme="dark"] .post-related > *:first-child { color: #d7d7d7; } + +html[data-theme="dark"] .post-related a:visited:after { background-color: #0e0e0e; } + +html[data-theme="dark"] .post-related a:after { color: #0e0e0e; } + +html[data-theme="dark"] .post-related a:hover { color: #aaa; } + +html[data-theme="dark"] .common-list li { border-bottom: solid 1px #40404088; } + +html[data-theme="dark"] .common-list li a { color: #aaa; } + +html[data-theme="dark"] .common-list li a:hover { background-color: #272727; } + +html[data-theme="dark"] .common-list li span { background-color: #333; } + +html[data-theme="dark"] .post-menu .post-menu-title { color: #ddd; } + +html[data-theme="dark"] .post-menu .post-menu-content ul { border-left: 1px solid #787878; } + +html[data-theme="dark"] .post-menu .post-menu-content ul .active { background-color: #2d2d2d; border-left: 2px solid #aaa; } + +html[data-theme="dark"] .post-menu .post-menu-content ul a { color: #bbb; } + +html[data-theme="dark"] .post-menu .post-menu-content ul a:hover { color: #fff !important; } + +.theme-toggle { position: relative; width: 107.1px; margin-top: 10px; margin-right: 60px; margin-left: auto; transition: 0.3s cubic-bezier(0.4, 0.03, 0, 1); /* Toggle */ } + +.theme-toggle label, .theme-toggle .toggle { border-radius: 100px; } + +.theme-toggle label { display: block; background-color: rgba(120, 120, 120, 0.15); cursor: pointer; } + +.theme-toggle .toggle { position: absolute; width: 50%; height: 100%; background-color: #fff; box-shadow: 0 2px 15px rgba(0, 0, 0, 0.15); transition: transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94); } + +.theme-toggle .names { font-size: 1em; font-weight: bolder; width: 76%; margin-left: 12%; position: relative; display: flex; justify-content: space-between; user-select: none; } + +.theme-toggle .dark { opacity: .5; } + +.theme-toggle p { color: #acacac; margin-bottom: 0; line-height: 24px; } + +.theme-toggle [type="checkbox"] { display: none; } + +.theme-toggle [type="checkbox"]:checked ~ label .toggle { transform: translateX(100%); background-color: #34323D; } + +.theme-toggle [type="checkbox"]:checked ~ label .dark { opacity: 1; } + +.theme-toggle [type="checkbox"]:checked ~ label .light { opacity: .5; } + +@media screen and (max-width: 1024px) { .theme-toggle { margin-right: 35px; } } + +@media screen and (max-width: 600px) { .theme-toggle { width: 93.1px; margin-right: 20px; } .theme-toggle .names { font-size: .85em; } } + +/* Post menu */ +.post-menu { padding-left: 20px; min-width: 200px; max-width: 230px; } + +.post-menu .post-menu-title { font-size: 21px; margin-bottom: 14px; font-weight: 600; color: #222; } + +.post-menu .post-menu-content ul { border-left: 1px solid #e9ecef; } + +.post-menu .post-menu-content ul .h-h2 { padding-inline-start: 3.5px; font-size: 15.4px; line-height: 1.4; } + +.post-menu .post-menu-content ul .h-h3 { padding-inline-start: 21.7px; font-size: 15.4px; line-height: 1.4; } + +.post-menu .post-menu-content ul .h-h4 { padding-inline-start: 39.9px; font-size: 15.4px; line-height: 1.4; } + +.post-menu .post-menu-content ul .h-h5 { padding-inline-start: 58.1px; font-size: 15.4px; line-height: 1.4; } + +.post-menu .post-menu-content ul .h-h6 { padding-inline-start: 76.3px; font-size: 15.4px; line-height: 1.4; } + +.post-menu .post-menu-content ul a { display: flex; padding: 2px 8px; color: #2c2c2c; } + +.post-menu .post-menu-content ul a * { pointer-events: none; } + +.post-menu .post-menu-content ul a:hover { text-decoration: none; color: #787878 !important; } + +.post-menu .post-menu-content ul .active { background-color: #ecebec; transition: background 0.5s; border-left: 2px solid #202020; margin-left: -2px; } + +.post-menu .post-menu-content ul .active:hover { background-color: #f1f0f1; } + +.post-menu .post-menu-content ul .active a { color: #121416; } + +/** Common list */ +.common-list { font-size: 14px; min-width: 200px; } + +.common-list ul { list-style: none; margin: 0; } + +.common-list li { border-bottom: solid 1px #00000018; } + +.common-list li:last-child { border-bottom: none; } + +.common-list li a { display: flex; justify-content: space-between; padding: 8px 12px; text-decoration: none; font-weight: normal; color: #454545; transition: background 0.2s; } + +.common-list li a:hover { background-color: #eeeeee; } + +.common-list li span { font-size: 11.2px; display: inline-block; border-radius: 10px; align-self: center; background: #000000bd; padding: 0px 8px; margin-left: 20px; color: #fdfdfd; } + +/* OVERRIDE GOOGLE TRANSLATE WIDGET CSS BEGIN */ +div#google_translate_element div.goog-te-gadget-simple a.goog-te-menu-value { vertical-align: top !important; /* Remove the down arrow */ /* when dropdown open */ /* after clicked/touched */ /* on page load (not yet touched or clicked) */ /* Remove span with left border line | (next to the arrow) in Chrome & Firefox */ /* Remove span with left border line | (next to the arrow) in Edge & IE11 */ } + +div#google_translate_element div.goog-te-gadget-simple a.goog-te-menu-value:hover { text-decoration: none; } + +div#google_translate_element div.goog-te-gadget-simple a.goog-te-menu-value span { color: #aaa; } + +div#google_translate_element div.goog-te-gadget-simple a.goog-te-menu-value span:hover { color: white; } + +div#google_translate_element div.goog-te-gadget-simple a.goog-te-menu-value span[style="color: rgb(213, 213, 213);"] { display: none; } + +div#google_translate_element div.goog-te-gadget-simple a.goog-te-menu-value span[style="color: rgb(118, 118, 118);"] { display: none; } + +div#google_translate_element div.goog-te-gadget-simple a.goog-te-menu-value span[style="color: rgb(155, 155, 155);"] { display: none; } + +div#google_translate_element div.goog-te-gadget-simple a.goog-te-menu-value span[style="border-left: 1px solid rgb(187, 187, 187);"] { display: none; } + +div#google_translate_element div.goog-te-gadget-simple a.goog-te-menu-value span[style="border-left-color: rgb(187, 187, 187); border-left-width: 1px; border-left-style: solid;"] { display: none; } + +div#google_translate_element { display: inline; } + +div#google_translate_element div.goog-te-gadget { display: inline; font-size: 0; } + +div#google_translate_element div[id=':0.targetLanguage'] { display: inline; } + +div#google_translate_element div.goog-te-gadget-simple { border: none; background-color: transparent; } + +div#google_translate_element a.goog-logo-link { display: none; } + +div#google_translate_element .goog-te-gadget-icon { display: none !important; /*background: url("url for the icon") 0 0 no-repeat !important;*/ } + +div#google_translate_element a.goog-te-menu-value { margin: 0; } + +div#google_translate_element a.goog-te-menu-value span:first-child { display: none; } + +div#google_translate_element a.goog-te-menu-value:before { content: "\f1ab \f0d7"; font-family: FontAwesome; font-size: initial; color: #fefefe; border: 1px solid #fefefe85; border-radius: 3px; padding: 3px 6px; } + +.goog-te-menu-frame .goog-te-menu2 { max-width: 100%; overflow-x: auto; box-sizing: border-box; height: auto; } + +/* HIDE the google translate toolbar */ +.goog-te-banner-frame.skiptranslate { display: none !important; border: none; box-shadow: 0 0; -webkit-box-shadow: 0 0; } + +body { top: 0px !important; } + +/* OVERRIDE GOOGLE TRANSLATE WIDGET CSS END */ +.ct-language-selected, .ct-language-dropdown li:hover { background-color: #f2f2f2 !important; } + +.ct-language-dropdown { overflow: hidden; max-height: 0; position: absolute; top: 110%; right: -10px; background-color: white; -webkit-transition: all 0.25s ease-in-out; transition: all 0.25s ease-in-out; width: 100px; text-align: center; margin-top: 0; z-index: 200; border-radius: 3px; visibility: hidden; } + +.ct-language-dropdown li { padding: 5px; } + +.ct-language-dropdown li:first-child { padding-top: 12px; } + +.ct-language-dropdown li:last-child { padding-bottom: 12px; } + +.ct-language-dropdown li:not(:last-child) { border-bottom: 1px solid rgba(0, 0, 0, 0.04); } + +.ct-language-dropdown li a { display: block; color: black; } + +.ct-language-dropdown li a img { width: 24px; max-height: 24px; border: none; } + +.list-unstyled { display: inline-block; list-style: none; margin-left: 0; } + +.ct-language { display: inline-block; position: relative; background-color: #fefefe2b; padding: 3px 10px; border-radius: 3px; } + +.ct-language:hover { cursor: pointer; } + +.ct-language:hover .ct-language-dropdown { margin-top: 8px; max-height: 10000px; visibility: visible; box-shadow: 0 0 9px 3px rgba(0, 0, 0, 0.06); } + +.ct-language:before { content: "\f1ab \f0d7"; font-family: FontAwesome; } + +.gitment-container { color: #787878 !important; } + +.gitment-editor-header { background-color: #fefefe; } + +.gitment-comment-main, .gitment-editor-main { background-color: #fff; border-radius: 3px !important; } + +.gitment-heart-icon { fill: #ff0808; } + +.click-to-top { transition: 0.3s; display: flex; align-items: center; justify-content: center; position: fixed; width: 64px; height: 64px; border-radius: 32px; right: 60px; bottom: 48px; background: white; cursor: pointer; opacity: 0; transform: translateY(10px); box-shadow: 0 2px 15px rgba(0, 0, 0, 0.15); font-size: 24px; user-select: none; } + +@media screen and (max-width: 1024px) { .click-to-top { width: 48px; height: 48px; border-radius: 24px; right: 35px; font-size: 20px; } } + +@media screen and (max-width: 600px) { .click-to-top { width: 36px; height: 36px; border-radius: 18px; right: 20px; font-size: 16px; } } + +.click-to-top.show { opacity: 1; transform: translateY(0); } + +html[data-theme="dark"] .click-to-top { background: #34323D; } + +/*# sourceMappingURL=main.css.map */ \ No newline at end of file diff --git a/assets/css/main.css.map b/assets/css/main.css.map new file mode 100644 index 0000000..d2a3f5d --- /dev/null +++ b/assets/css/main.css.map @@ -0,0 +1,32 @@ +{ + "version": 3, + "file": "main.css", + "sources": [ + "main.scss", + "_sass/yat.scss", + "_sass/yat/_base.scss", + "_sass/yat/_layout.scss", + "_sass/yat/_dark.scss", + "_sass/misc/theme-toggle.scss", + "_sass/misc/article-menu.scss", + "_sass/misc/common-list.scss", + "_sass/misc/google-translate.scss", + "_sass/misc/gitment.scss", + "_sass/misc/click-to-top.scss" + ], + "sourcesContent": [ + "// Default theme colors\n$theme-colors: (\n \"coolblack\": #090a0b,\n \"spacegrey\": #353535,\n \"snowwhite\": #ffffff,\n);\n\n// Default brand colors\n$brand-colors: (\n \"orangered\": #ff5100,\n \"greatgold\": #f2cb05,\n \"greenblue\": #389092,\n);\n\n$theme-name: \"\";\n$brand-name: \"\";\n$theme-color: map-get($theme-colors, \"snowwhite\");\n$brand-color: map-get($brand-colors, \"orangered\");\n\n@if map-has-key($theme-colors, $theme-name) {\n $theme-color: map-get($theme-colors, $theme-name);\n} @else if str-index($theme-name, \"#\") == 1 {\n $theme-color: #ffffff;\n}\n\n@if map-has-key($brand-colors, $brand-name) {\n $brand-color: map-get($brand-colors, $brand-name);\n} @else if str-index($brand-name, \"#\") == 1 {\n $brand-color: #ff5100;\n}\n\n$content-width: 920px;\n\n@import \"yat\";\n", + "@charset \"utf-8\";\n\n// Define defaults for each variable.\n\n$base-font-family: Helvetica, Arial, Oswald, sans-serif, !default;\n$base-font-size: 14px !default;\n$base-font-weight: 400 !default;\n$small-font-size: $base-font-size * 0.875 !default;\n$base-line-height: 1.6 !default;\n\n$spacing-unit: 30px !default;\n\n$text-color: #454545 !default;\n$background-color: #fff !default;\n\n$grey-color: #828282 !default;\n$grey-color-light: lighten($grey-color, 40%) !default;\n$grey-color-dark: darken($grey-color, 25%) !default;\n\n$white-color: #fdfdfd !default;\n\n$table-text-align: left !default;\n\n$header-height: $base-line-height * $base-font-size * 2.85 !default;\n$header-text-color: invert($theme-color) !default;\n$header-background-color: $theme-color !default;\n\n$footer-height: $header-height * 1.05 !default;\n$footer-text-color: lighten(invert($theme-color), 25%) !default;\n$footer-background-color: darken($theme-color, 5%) !default;\n\n$banner-height: 640px !default;\n$banner-text-color: lighten($white-color, 0%) !default;\n$banner-background: rgba(0,0,0,0.8) !default;\n\n// Width of the content area\n// $content-width: 920px !default;\n\n$on-palm: 600px !default;\n$on-laptop: 800px !default;\n\n// Use media queries like this:\n// @include media-query($on-palm) {\n// .wrapper {\n// padding-right: $spacing-unit / 2;\n// padding-left: $spacing-unit / 2;\n// }\n// }\n@mixin media-query($device) {\n @media screen and (max-width: $device) {\n @content;\n }\n}\n\n@mixin relative-font-size($ratio) {\n font-size: $base-font-size * $ratio;\n}\n\n// Import partials.\n@import\n \"yat/base\",\n \"yat/layout\",\n \"yat/dark\",\n \"misc/theme-toggle\",\n \"misc/article-menu\",\n \"misc/common-list\",\n \"misc/google-translate\",\n \"misc/gitment\",\n \"misc/click-to-top\"\n;\n", + "/**\n * Reset some basic elements\n */\nbody, h1, h2, h3, h4, h5, h6,\np, blockquote, pre, hr,\ndl, dd, ol, ul, figure {\n margin: 0;\n padding: 0;\n}\n\n\n\n/**\n * Basic styling\n */\nbody {\n font-family: $base-font-family;\n font-weight: $base-font-weight;\n font-size: #{$base-font-size};\n font-display: swap;\n line-height: #{$base-line-height};\n color: $text-color;\n background-color: $background-color;\n -webkit-text-size-adjust: 100%;\n -webkit-font-feature-settings: \"kern\" 1;\n -moz-font-feature-settings: \"kern\" 1;\n -o-font-feature-settings: \"kern\" 1;\n font-feature-settings: \"kern\" 1;\n font-kerning: normal;\n display: flex;\n min-height: 100vh;\n flex-direction: column;\n}\n\n\n\n/**\n * Set `margin-bottom` to maintain vertical rhythm\n */\nh1, h2, h3, h4, h5, h6,\np, blockquote, pre,\nul, ol, dl, figure,\n%vertical-rhythm {\n margin-bottom: $spacing-unit / 2;\n}\n\n\n\n/**\n * `main` element\n */\nmain {\n display: block; /* Default value of `display` of `main` element is 'inline' in IE 11. */\n}\n\n\n\n/**\n * Images\n */\nimg {\n max-width: 100%;\n vertical-align: middle;\n}\n\n\n\n/**\n * Figures\n */\nfigure > img {\n display: block;\n}\n\nfigcaption {\n font-size: $small-font-size;\n}\n\n\n\n/**\n * Lists\n */\nul, ol {\n margin-left: $spacing-unit;\n}\n\nli {\n > ul,\n > ol {\n margin-bottom: 0;\n }\n}\n\n\n\n/**\n * Headings\n */\nh1, h2, h3, h4, h5, h6 {\n font-weight: $base-font-weight * 1.5;\n}\n\n/**\n * Links\n */\na {\n color: $brand-color;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n\n .social-media-list &:hover {\n text-decoration: none;\n\n .username {\n text-decoration: underline;\n }\n }\n}\n\n/**\n * Blockquotes\n */\nblockquote {\n color: $grey-color;\n border-left: 4px solid $grey-color-light;\n padding-left: $spacing-unit / 2;\n @include relative-font-size(1.125);\n letter-spacing: -1px;\n font-style: italic;\n\n > :last-child {\n margin-bottom: 0;\n }\n}\n\n\n\n/**\n * Code formatting\n */\npre,\ncode {\n @include relative-font-size(0.9375);\n color: $text-color;\n}\n\n*:not(pre) > code {\n padding: 3px 6px;\n border-radius: 3px;\n background-color: #eee;\n margin: 0 5px;\n}\n\npre {\n overflow-x: auto;\n position: relative;\n background-color: #f0f0f0;\n\n > code {\n display: inline-block;\n padding: 20px!important;\n background-color: transparent;\n border: 0;\n }\n\n table, pre {\n margin-bottom: 0;\n\n .gutter, .code {\n padding: 6px;\n border: none;\n }\n }\n}\n\n\n\n/**\n * Wrapper\n */\n.wrapper {\n max-width: $content-width;\n margin: auto;\n padding-right: $spacing-unit;\n padding-left: $spacing-unit;\n @extend %clearfix;\n}\n\n\n\n/**\n * Clearfix\n */\n%clearfix:after {\n content: \"\";\n display: table;\n clear: both;\n}\n\n\n/**\n * Tables\n */\ntable {\n display: block;\n margin-bottom: $spacing-unit;\n width: 100%;\n text-align: $table-text-align;\n color: lighten($text-color, 5%);\n border-collapse: collapse;\n overflow: auto;\n\n tr {\n &:nth-child(even) {\n background-color: lighten($grey-color-light, 6%);\n }\n }\n\n th, td {\n padding: ($spacing-unit / 3) ($spacing-unit / 2);\n }\n\n th {\n background-color: lighten($grey-color-light, 3%);\n border: 1px solid darken($grey-color-light, 4%);\n border-bottom-color: darken($grey-color-light, 12%);\n }\n\n td {\n border: 1px solid $grey-color-light;\n }\n}\n\n/**\n * Flex layout\n */\n%flex {\n display: flex;\n}\n\n%flex-1 {\n flex: 1;\n min-width: 0; /* <-- fix flexbox width with pre tags */\n}\n\n/**\n * Flex sticky\n */\n@mixin flex-sticky($top) {\n position: sticky;\n position: -moz-sticky; /* <-- fix sticky compatibility issue */\n position: -ms-sticky;\n position: -o-sticky;\n position: -webkit-sticky;\n align-self: flex-start; /* <-- fix the sticky not work issue */\n transform: scale(0.9999); /* <-- fix the sticky x overflow issue */\n top: $top;\n}\n\n/**\n * Vertical center\n */\n@mixin vertical-center($position) {\n position: $position;\n top: 50%;\n transform: translateY(-50%);\n}\n\n/**\n * Horizontal center\n */\n@mixin horizontal-center($position) {\n position: $position;\n left: 50%;\n transform: translateX(-50%);\n}\n\n/**\n * Center background image\n */\n@mixin center-image {\n height: 100%;\n max-width: 1000%;\n background-size: cover;\n background-position: center center;\n overflow: hidden;\n}\n\n", + "/**\n * Animation for transparent header\n */\nhtml {\n &[data-header-transparent] {\n header.site-header {\n position: fixed;\n }\n }\n\n &[data-scroll-status='top'] {\n header.site-header-transparent {\n height: 0;\n margin-top: 12px;\n background-color: transparent;\n transition: 0.1s height,background-color,box-shadow;\n\n &.site-header {\n .site-brand-inner, .page-link {\n color: #fff;\n transition: 0.1s color;\n }\n\n @include media-query($on-laptop) {\n .page-link {\n color: $header-text-color;\n }\n\n .menu-icon {\n > svg {\n fill: $white-color;\n }\n }\n }\n }\n }\n\n footer.site-footer {\n color: unset;\n background-color: transparent;\n\n .site-footer-inner {\n border-top: solid 1px #eee;\n }\n }\n }\n\n &[data-scroll-status='down'] {\n header.site-header {\n top: -$header-height;\n }\n\n .framework .sidebar {\n top: 20px;\n }\n }\n}\n\n/**\n * Site header\n */\n.site-header {\n background-color: $header-background-color;\n height: $header-height;\n width: 100%;\n transition: height 0.2s, text-shadow 0.2s, top 0.2s;\n box-shadow: 0 1px 0 0 rgba(0, 0, 0, .06);\n\n // Positioning context for the mobile navigation icon\n @include flex-sticky(0);\n z-index: 1000;\n\n & > .wrapper {\n margin: 0 60px;\n padding: 0;\n max-width: 100%;\n transition: 0.2s margin;\n\n @include media-query(1024px) {\n margin: 0 20px;\n max-width: unset;\n }\n }\n\n a {\n text-decoration: none;\n }\n\n .site-header-inner {\n position: relative;\n }\n}\n\n.site-brand {\n line-height: $header-height;\n margin-right: 50px;\n\n .site-brand-inner {\n @include relative-font-size(1.125);\n font-weight: $base-font-weight;\n letter-spacing: -1px;\n transition: 0.1s filter color;\n\n &, &:visited {\n color: $header-text-color;\n }\n\n .site-favicon {\n display: inline-block;\n height: $header-height / 1.5;\n margin-right: 5px;\n }\n }\n}\n\n.site-nav {\n @include relative-font-size(1.125);\n line-height: $header-height;\n position: absolute;\n right: 0;\n top: 0;\n\n .nav-trigger {\n display: none;\n }\n\n .menu-icon {\n display: none;\n }\n\n .page-link {\n line-height: $base-line-height;\n color: $header-text-color;\n transition: 0.1s ease-in-out;\n\n // Gaps between nav items, but not on the last one\n &:not(:last-child) {\n margin-right: 24px;\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n @include media-query($on-laptop) {\n position: absolute;\n top: 0;\n text-align: left;\n\n label[for=\"nav-trigger\"] {\n display: block;\n z-index: 2;\n cursor: pointer;\n }\n\n .menu-icon {\n display: block;\n float: right;\n text-align: center;\n\n > svg {\n fill: rgba($header-text-color, 80%);\n transition: 0.1s fill;\n }\n }\n\n input ~ .trigger {\n clear: both;\n display: none;\n border-radius: 3px;\n box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, .06);\n }\n\n input:checked ~ .trigger {\n display: block;\n background: $header-background-color;\n }\n\n .page-link {\n display: block;\n padding: 5px 10px;\n color: rgba($header-text-color, 80%);\n margin: 0 25px;\n }\n }\n}\n\n/**\n * Site footer\n */\n.site-footer {\n @include relative-font-size(1.0);\n color: $footer-text-color;\n background-color: $footer-background-color;\n text-align: left;\n transition: background-color 0.2s;\n\n .site-footer-inner {\n transition: border-top 0.2s;\n padding: $spacing-unit * 1.8 0;\n }\n\n a {\n $a-color: $brand-color;\n color: $a-color;\n\n &:hover {\n color: lighten($a-color, 10%);\n }\n }\n}\n\n.copyleft {\n display: inline-block;\n transform: rotate(180deg);\n}\n\n/**\n * Post header\n */\n%post-header {\n .post-header {\n margin-bottom: $spacing-unit;\n }\n\n .post-title {\n @include relative-font-size(2.625);\n letter-spacing: -1px;\n line-height: 1;\n\n @include media-query($on-laptop) {\n @include relative-font-size(2.25);\n }\n }\n\n .post-tags {\n padding-right: 150px;\n\n .post-tag {\n display: inline-block;\n margin: 0 12px 0 0;\n }\n }\n}\n\n/**\n * Page content\n */\n.page-content {\n @extend %flex-1; /* <-- Keep footer on the bottom */\n -ms-flex: none; /* <-- Fix IE footer issue */\n padding: $spacing-unit * 2 0;\n padding-top: 72px;\n}\n\n.page-heading {\n @include relative-font-size(2);\n}\n\n.post-list-heading {\n @include relative-font-size(1.75);\n}\n\n/**\n * Pagination page\n */\n.pagination {\n .post-list {\n margin-left: 0;\n list-style: none;\n\n > li {\n margin-bottom: $spacing-unit * 1.5;\n padding-bottom: 30px;\n\n &:not(:last-child) {\n border-bottom: 1px solid #e3e3e3;\n }\n }\n }\n\n .post-title {\n margin-bottom: $spacing-unit * 0.2;\n transition: 0.2s all;\n\n a {\n text-decoration: none;\n\n &:after {\n content: 'NEW';\n position: absolute;\n margin-left: 8px;\n margin-top: 3px;\n padding: 0px 3px;\n background-color: $brand-color;\n color: #fff;\n font-size: 10px;\n font-weight: 600;\n border-radius: 2px;\n }\n\n &:visited:after {\n background-color: #fff;\n }\n }\n }\n\n .post-meta {\n font-size: $base-font-size;\n color: $grey-color;\n margin-bottom: $spacing-unit * 0.5;\n }\n\n .post-link {\n @include relative-font-size(1.65);\n font-weight: $base-font-weight * 1.5;\n color: #333;\n }\n\n .post-excerpt {\n color: #777;\n word-break: break-word;\n overflow-wrap: break-word;\n }\n\n .post-tags .post-tag {\n display: inline-block;\n text-decoration: none;\n border: 1px solid;\n padding: 2px 4px;\n border-radius: 2px;\n transition: color 0.2s;\n margin-bottom: 8px;\n\n &:not(:last-child) {\n margin-right: 8px;\n }\n\n &:hover {\n color: #787878;\n }\n }\n\n .paginator {\n text-align: center;\n\n & > .previous:before {\n content: ' ';\n border: solid #787878;\n border-width: 0 2px 2px 0;\n display: inline-block;\n padding: 4px;\n margin-right: 8px;\n transform: rotate(135deg);\n -webkit-transform: rotate(135deg);\n }\n\n & > .next:after {\n content: ' ';\n border: solid #787878;\n border-width: 0 2px 2px 0;\n display: inline-block;\n padding: 4px;\n margin-left: 8px;\n transform: rotate(-45deg);\n -webkit-transform: rotate(-45deg);\n }\n\n .previous span, .next span {\n color: #b3b3b3;\n }\n\n .indicator {\n padding: 0 15px;\n }\n }\n}\n\n\n/**\n * Posts\n */\n.post {\n @extend %post-header;\n\n .post-header {\n margin: 50px auto 60px;\n padding: 0 0 20px;\n border-bottom: 1px solid #ebebeb;\n\n .post-title {\n margin-bottom: 6px;\n }\n\n .post-subtitle {\n font-weight: lighter;\n }\n\n .post-meta {\n color: #808080;\n }\n }\n\n .post-content {\n margin-bottom: $spacing-unit;\n overflow-wrap: normal;\n word-wrap: normal;\n word-break: normal;\n\n h2 {\n @include relative-font-size(2);\n\n @include media-query($on-laptop) {\n @include relative-font-size(1.75);\n }\n }\n\n h3 {\n @include relative-font-size(1.625);\n\n @include media-query($on-laptop) {\n @include relative-font-size(1.375);\n }\n }\n\n h4 {\n @include relative-font-size(1.25);\n\n @include media-query($on-laptop) {\n @include relative-font-size(1.125);\n }\n }\n\n img, svg, iframe {\n margin-left: auto;\n margin-right: auto;\n display: block;\n }\n\n h2, h3, h4, h5, h6 {\n margin: 60px 0 19px;\n }\n\n p, hr {\n margin-bottom: 24px;\n }\n\n hr {\n height: 1px;\n background-color: #ebebeb;\n border: none;\n }\n }\n\n .post-related {\n &>*:first-child {\n @include relative-font-size(1.425);\n color: #333;\n margin-bottom: 14px;\n }\n\n ul {\n margin-left: 15px;\n .post-link {\n @include relative-font-size(1.075);\n }\n\n a {\n color: #666;\n\n &:hover {\n color: #333;\n }\n\n &:after {\n content: 'NEW';\n position: absolute;\n margin-left: 8px;\n margin-top: 3px;\n padding: 0px 3px;\n background-color: $brand-color;\n color: #fff;\n font-size: 10px;\n font-weight: 600;\n border-radius: 2px;\n }\n\n &:visited:after {\n background-color: #fff;\n }\n }\n }\n }\n}\n\n.post-comments {\n padding-top: 25px;\n}\n\n\n/**\n * Posts misc\n */\n.post-nav {\n display: flex;\n justify-content: space-between;\n margin: 72px 0 59px;\n padding: 31px 0 0;\n\n a {\n @include relative-font-size(1.125);\n line-height: 15px;\n color: #666;\n max-width: 50%;\n }\n\n .previous:before {\n content: ' ';\n border: solid #787878;\n border-width: 0 2px 2px 0;\n display: inline-block;\n padding: 4px;\n margin-right: 8px;\n transform: rotate(135deg);\n -webkit-transform: rotate(135deg);\n }\n\n .next:after {\n content: ' ';\n border: solid #787878;\n border-width: 0 2px 2px 0;\n display: inline-block;\n padding: 4px;\n margin-left: 8px;\n transform: rotate(-45deg);\n -webkit-transform: rotate(-45deg);\n }\n}\n\n\n/**\n * Archives page\n */\n.page-archives {\n .page-archives-list {\n margin-left: 0;\n list-style: none;\n }\n\n .archives-time {\n @include relative-font-size(1.5);\n\n &:not(:first-child) {\n margin-top: 18px;\n }\n margin-bottom: 8px;\n }\n\n .post-meta {\n font-size: $small-font-size;\n color: $grey-color;\n }\n}\n\n\n/**\n * Page banner\n */\n.page-banner {\n display: block;\n position: relative;\n height: $banner-height;\n background-color: $banner-background;\n transition: height 0.2s;\n\n .page-banner-img {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n\n & > *:first-child {\n @include center-image;\n transition: 0.1s all ease-in-out;\n }\n\n & > video {\n width: 100vw;\n object-fit: cover;\n }\n\n & > img.img-placeholder {\n display: none;\n }\n }\n\n .wrapper {\n height: 100%;\n }\n\n .page-banner-inner {\n @include vertical-center(relative);\n\n color: $banner-text-color;\n padding: 10px 5px;\n text-shadow: 1px 1px 2px #33333355;\n\n & > *:first-child {\n margin: 0;\n\n > :nth-child(1) {\n @include relative-font-size(3.9);\n letter-spacing: -1px;\n margin-bottom: 0.1em;\n font-weight: normal;\n transition: 0.2s all;\n\n @include media-query($on-palm) {\n @include relative-font-size(1.975);\n }\n }\n\n > :nth-child(2) {\n font-weight: lighter;\n margin-bottom: 0.8em;\n transition: 0.2s all;\n\n @include media-query($on-palm) {\n @include relative-font-size(1.175);\n }\n }\n\n > :last-child {\n margin-bottom: 0;\n }\n }\n\n .post-subtitle {\n @include relative-font-size(1.525);\n color: #ffffffcc;\n padding-right: 280px;\n\n @include media-query($on-palm) {\n padding-right: 0;\n }\n }\n\n .post-meta {\n color: #ffffffcc;\n }\n\n .left-vsplit:before {\n background: #e3e3e388;\n }\n\n .post-tags {\n color: #999;\n padding-right: 280px;\n\n @include media-query($on-palm) {\n padding-right: 0;\n }\n\n .post-tag {\n @include relative-font-size(1.125);\n display: inline-block;\n text-decoration: none;\n margin: 9px 12px 0 0;\n color: #fff;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n }\n\n @include media-query($on-palm) {\n height: $banner-height / 1.5;\n }\n}\n\n\n/**\n * Layout and sidebar\n */\n.framework {\n @extend %flex;\n\n .main {\n @extend %flex-1;\n }\n\n .sidebar {\n padding-left: 8px;\n transition: top 0.2s, display 0.2s;\n\n @include flex-sticky($header-height + 20px);\n\n @include media-query($on-laptop) {\n display: none;\n }\n\n }\n}\n\n\n/**\n * Segments page\n */\n.page-segments {\n .page-segments-list {\n margin-left: 0;\n list-style: none;\n }\n\n .segment-name {\n font-weight: $base-font-weight * 1.5;\n margin-bottom: 8px;\n position: relative;\n\n @include relative-font-size(1.6);\n\n &:not(:first-child) {\n margin-top: 28px;\n }\n\n &:hover:before {\n content: '#';\n left: -1em;\n position: absolute;\n }\n }\n\n .post-meta {\n font-size: $small-font-size;\n color: $grey-color;\n }\n\n li a {\n &.post-link {\n margin-left: 5px;\n }\n\n color: #303030;\n\n &:hover {\n color: #000;\n }\n\n &:after {\n content: 'NEW';\n position: absolute;\n margin-left: 8px;\n margin-top: 3px;\n padding: 0px 3px;\n background-color: $brand-color;\n color: #fff;\n font-size: 10px;\n font-weight: 600;\n border-radius: 2px;\n }\n\n &:visited:after {\n background-color: #fff;\n }\n }\n}\n\n.left-vsplit:before {\n content: \"\";\n display: inline-block;\n width: 1px;\n height: 10px;\n margin: 0 10px;\n background-color: #e3e3e3e3;\n vertical-align: baseline;\n}\n", + "$dark-background-color: #0e0e0e !default;\n$dark-text-color: #bbb !default;\n\nhtml[data-theme=\"dark\"] {\n &[data-scroll-status='top'] {\n header.site-header-transparent {\n &.site-header {\n @include media-query($on-laptop) {\n .page-link {\n color: #f8f8f8;\n }\n }\n }\n }\n\n footer.site-footer {\n .site-footer-inner {\n border-top: solid 1px #2f2f2f !important;\n transition: 0s;\n }\n }\n }\n\n body {\n color: $dark-text-color;\n background-color: $dark-background-color;\n }\n\n *:not(pre) > code {\n color: $dark-text-color;\n background-color: #454545;\n }\n\n blockquote {\n border-left: 4px solid #484848;\n }\n\n table {\n color: #9d9d9d;\n\n th {\n background-color: #050505;\n }\n\n tr:nth-child(even) {\n background-color: #080808;\n }\n }\n\n .site-header {\n background-color: #090909;\n\n .site-brand {\n .site-brand-inner {\n &, &:visited {\n color: #f8f8f8;\n }\n }\n }\n\n .site-nav .page-link {\n color: #f8f8f8;\n }\n\n .ct-language-dropdown {\n color: #f8f8f8;\n background-color: $dark-background-color;\n box-shadow: 0 0 3px 1px #0000005b;\n }\n\n .ct-language-selected, .ct-language-dropdown li:hover {\n background-color: #222 !important;\n }\n\n @include media-query($on-laptop) {\n .menu-icon > svg {\n fill: rgba($dark-text-color, 80%);\n }\n\n .site-nav input:checked ~ .trigger {\n background-color: #090909;\n }\n }\n }\n\n .site-footer {\n color: #fff;\n background-color: #000;\n }\n\n .left-vsplit:before {\n background-color: #9a9a9a;\n }\n\n .page-banner {\n .page-banner-img {\n & > *:first-child {\n opacity: 0.718;\n }\n }\n }\n\n .pagination {\n .post-link {\n color: $dark-text-color;\n }\n\n .post-title {\n a:visited:after {\n background-color: $dark-background-color;\n }\n\n a:after {\n color: $dark-background-color;\n }\n }\n\n .post-list {\n & > li:not(:last-child) {\n border-bottom: 1px solid #545454;\n }\n }\n\n .post-tags .post-tag:hover {\n color: #d7d7d7;\n }\n }\n\n .page-segments {\n li {\n a {\n color: #ddd;\n }\n\n a:visited:after {\n background-color: $dark-background-color;\n }\n\n a:after {\n color: $dark-background-color;\n }\n }\n }\n\n .post .post-content {\n img:not([raw]) {\n background-color: #ffffff33;\n }\n }\n\n .post-related {\n & > *:first-child {\n color: #d7d7d7;\n }\n\n a:visited:after {\n background-color: $dark-background-color;\n }\n\n a:after {\n color: $dark-background-color;\n }\n\n a:hover {\n color: #aaa;\n }\n }\n\n .common-list {\n li {\n border-bottom: solid 1px #40404088;\n\n a {\n color: #aaa;\n }\n\n a:hover {\n background-color: #272727;\n }\n\n span {\n background-color: #333;\n }\n }\n }\n\n .post-menu {\n .post-menu-title {\n color: #ddd;\n }\n\n .post-menu-content {\n ul {\n border-left: 1px solid #787878;\n\n .active {\n background-color: #2d2d2d;\n border-left: 2px solid #aaa;\n }\n\n a {\n color: $dark-text-color;\n }\n\n a:hover {\n color: #fff !important;\n }\n }\n }\n }\n}\n\n", + ".theme-toggle {\n position: relative;\n width: $base-font-size * 7.65;\n margin-top: 10px;\n margin-right: 60px;\n margin-left: auto;\n transition: .3s cubic-bezier(.4,.03,0,1);\n\n label, .toggle {\n border-radius: 100px;\n }\n\n label {\n display: block;\n background-color: rgba(120,120,120,.15);\n cursor: pointer;\n }\n\n .toggle {\n position: absolute;\n width: 50%;\n height: 100%;\n background-color: #fff;\n box-shadow: 0 2px 15px rgba(0,0,0,.15);\n transition: transform .2s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n }\n\n .names {\n font-size: 1em;\n font-weight: bolder;\n width: 76%;\n margin-left: 12%;\n position: relative;\n display: flex;\n justify-content: space-between;\n user-select: none;\n }\n\n .dark {\n opacity: .5;\n }\n\n p {\n color: #acacac;\n margin-bottom: 0;\n line-height: 24px;\n }\n\n [type=\"checkbox\"] {\n display: none;\n }\n\n /* Toggle */\n [type=\"checkbox\"]:checked ~ label .toggle {\n transform: translateX(100%);\n background-color: #34323D;\n }\n\n [type=\"checkbox\"]:checked ~ label .dark{\n opacity: 1;\n }\n\n [type=\"checkbox\"]:checked ~ label .light{\n opacity: .5;\n }\n\n @include media-query(1024px) {\n margin-right: 35px;\n }\n\n @include media-query($on-palm) {\n width: $base-font-size * 6.65;\n margin-right: 20px;\n\n .names {\n font-size: .85em;\n }\n }\n}\n", + "/*\n * Post menu\n */\n\n.post-menu {\n padding-left: 20px;\n min-width: 200px;\n max-width: 230px;\n\n .post-menu-title {\n font-size: $base-font-size * 1.5;\n margin-bottom: 14px;\n font-weight: 600;\n color: #222;\n }\n\n .post-menu-content {\n ul {\n border-left: 1px solid #e9ecef;\n $indent: $base-font-size / 4;\n $active-bgcolor: #ecebec;\n\n @for $i from 2 to 7 {\n .h-h#{$i} {\n padding-inline-start: $indent + ($i - 2) * $base-font-size * 1.3;\n font-size: $base-font-size * 1.1;\n line-height: 1.4;\n }\n }\n\n a {\n display: flex;\n padding: 2px 8px;\n color: darken($text-color, 10%);\n\n * {\n pointer-events: none;\n }\n\n &:hover {\n text-decoration: none;\n color: lighten($text-color, 20%)!important;\n }\n }\n\n .active {\n background-color: $active-bgcolor;\n transition: background 0.5s;\n border-left: 2px solid #202020;\n margin-left: -2px;\n\n &:hover {\n background-color: lighten($active-bgcolor, 2%);\n }\n\n a {\n color: #121416;\n }\n }\n }\n }\n}\n", + "/**\n * Common list\n */\n.common-list {\n @include relative-font-size(1.0);\n min-width: 200px;\n\n ul {\n list-style: none;\n margin: 0;\n }\n\n li {\n border-bottom: solid 1px #00000018;\n\n &:last-child {\n border-bottom: none;\n }\n\n a {\n display: flex;\n justify-content: space-between;\n padding: 8px 12px;\n text-decoration: none;\n font-weight: normal;\n color: $text-color;\n transition: background 0.2s;\n\n &:hover {\n background-color: mix($theme-color, #eaeaea, 20%);\n }\n }\n\n span {\n @include relative-font-size(0.8);\n display: inline-block;\n border-radius: 10px;\n align-self: center;\n background: #000000bd;\n padding: 0px 8px;\n margin-left: 20px;\n color: $white-color;\n }\n }\n}\n", + "/* OVERRIDE GOOGLE TRANSLATE WIDGET CSS BEGIN */\n\n%goog-te-menu {\n a.goog-te-menu-value {\n vertical-align: top !important;\n\n &:hover {\n text-decoration: none;\n }\n\n span {\n color: #aaa;\n }\n\n span:hover {\n color: white;\n }\n\n /* Remove the down arrow */\n /* when dropdown open */\n span[style=\"color: rgb(213, 213, 213);\"] {\n display: none;\n }\n /* after clicked/touched */\n span[style=\"color: rgb(118, 118, 118);\"] {\n display: none;\n }\n /* on page load (not yet touched or clicked) */\n span[style=\"color: rgb(155, 155, 155);\"] {\n display: none;\n }\n\n /* Remove span with left border line | (next to the arrow) in Chrome & Firefox */\n span[style=\"border-left: 1px solid rgb(187, 187, 187);\"] {\n display: none;\n }\n /* Remove span with left border line | (next to the arrow) in Edge & IE11 */\n span[style=\"border-left-color: rgb(187, 187, 187); border-left-width: 1px; border-left-style: solid;\"] {\n display: none;\n }\n }\n}\n\ndiv#google_translate_element {\n display: inline;\n\n div.goog-te-gadget {\n display: inline;\n font-size: 0;\n }\n\n div[id=':0.targetLanguage'] {\n display: inline;\n }\n\n div.goog-te-gadget-simple {\n border: none;\n background-color: transparent;\n\n @extend %goog-te-menu;\n }\n\n a.goog-logo-link {\n display: none;\n }\n\n .goog-te-gadget-icon {\n display: none !important;\n /*background: url(\"url for the icon\") 0 0 no-repeat !important;*/\n }\n\n a.goog-te-menu-value {\n margin: 0;\n\n span:first-child {\n display: none;\n }\n\n &:before {\n content: \"\\f1ab \\f0d7\";\n font-family: FontAwesome;\n font-size: initial;\n color: #fefefe;\n border: 1px solid #fefefe85;\n border-radius: 3px;\n padding: 3px 6px;\n }\n }\n}\n\n.goog-te-menu-frame .goog-te-menu2 {\n max-width: 100%;\n overflow-x: auto;\n box-sizing: border-box;\n height: auto;\n}\n\n/* HIDE the google translate toolbar */\n.goog-te-banner-frame.skiptranslate {\n display: none !important;\n border: none;\n box-shadow: 0 0;\n -webkit-box-shadow: 0 0;\n}\n\nbody {\n top: 0px !important;\n}\n\n/* OVERRIDE GOOGLE TRANSLATE WIDGET CSS END */\n\n\n// Main look\n\n.ct-language-selected {\n background-color: darken($theme-color, 5%) !important;\n}\n\n.ct-language-dropdown {\n overflow: hidden;\n max-height: 0;\n position: absolute;\n top: 110%;\n right: -10px;\n background-color: lighten($theme-color, 5%);\n -webkit-transition: all 0.25s ease-in-out;\n transition: all 0.25s ease-in-out;\n width: 100px;\n text-align: center;\n margin-top: 0;\n z-index: 200;\n border-radius: 3px;\n visibility: hidden;\n\n li {\n padding: 5px;\n\n &:first-child {\n padding-top: 12px;\n }\n\n &:last-child {\n padding-bottom: 12px;\n }\n\n &:not(:last-child) {\n border-bottom: 1px solid rgba(0, 0, 0, .04);\n }\n\n a {\n display: block;\n color: invert($theme-color);\n\n img {\n width: 24px;\n max-height: 24px;\n border: none;\n }\n }\n\n &:hover {\n @extend .ct-language-selected;\n }\n }\n}\n\n.list-unstyled {\n display: inline-block;\n list-style: none;\n margin-left: 0;\n}\n\n.ct-language {\n display: inline-block;\n position: relative;\n background-color: #fefefe2b;\n padding: 3px 10px;\n border-radius: 3px;\n\n &:hover {\n cursor: pointer;\n\n .ct-language-dropdown {\n margin-top: 8px;\n max-height: 10000px;\n visibility: visible;\n box-shadow: 0 0 9px 3px rgba(0, 0, 0, .06);\n }\n }\n\n &:before {\n content: \"\\f1ab \\f0d7\";\n font-family: FontAwesome;\n }\n}\n\n", + ".gitment-container {\n color: #787878 !important;\n}\n\n.gitment-editor-header {\n background-color: #fefefe;\n}\n\n.gitment-comment-main, .gitment-editor-main {\n background-color: #fff;\n border-radius: 3px !important;\n}\n\n.gitment-heart-icon {\n fill: #ff0808;\n}\n", + ".click-to-top {\n transition: 0.3s;\n display: flex;\n align-items: center;\n justify-content: center;\n position: fixed;\n width: 64px;\n height: 64px;\n border-radius: 32px;\n right: 60px;\n bottom: 48px;\n background: white;\n cursor: pointer;\n opacity: 0;\n transform: translateY(10px);\n box-shadow: 0 2px 15px rgba(0, 0, 0, 0.15);\n font-size: 24px;\n user-select: none;\n\n @include media-query(1024px) {\n width: 48px;\n height: 48px;\n border-radius: 24px;\n right: 35px;\n font-size: 20px;\n }\n\n @include media-query($on-palm) {\n width: 36px;\n height: 36px;\n border-radius: 18px;\n right: 20px;\n font-size: 16px;\n }\n}\n\n.click-to-top.show {\n opacity: 1;\n transform: translateY(0);\n}\n\nhtml[data-theme=\"dark\"] {\n .click-to-top {\n background: #34323D;\n }\n}\n" + ], + "names": [], + "mappings": "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" +} \ No newline at end of file diff --git a/assets/images/banners/home.jpg b/assets/images/banners/home.jpg new file mode 100644 index 0000000..badcf7e Binary files /dev/null and b/assets/images/banners/home.jpg differ diff --git a/assets/images/codespaces/1.jpg b/assets/images/codespaces/1.jpg new file mode 100644 index 0000000..07c6b1a Binary files /dev/null and b/assets/images/codespaces/1.jpg differ diff --git a/assets/images/codespaces/2.jpg b/assets/images/codespaces/2.jpg new file mode 100644 index 0000000..623f531 Binary files /dev/null and b/assets/images/codespaces/2.jpg differ diff --git a/assets/images/rpi-arch/01.png b/assets/images/rpi-arch/01.png new file mode 100644 index 0000000..9966ec1 Binary files /dev/null and b/assets/images/rpi-arch/01.png differ diff --git a/assets/images/rpi-arch/02.png b/assets/images/rpi-arch/02.png new file mode 100644 index 0000000..523f24d Binary files /dev/null and b/assets/images/rpi-arch/02.png differ diff --git a/assets/images/rpi-arch/03.png b/assets/images/rpi-arch/03.png new file mode 100644 index 0000000..3c31dd5 Binary files /dev/null and b/assets/images/rpi-arch/03.png differ diff --git a/assets/images/rpi-arch/04.png b/assets/images/rpi-arch/04.png new file mode 100644 index 0000000..4ea29f8 Binary files /dev/null and b/assets/images/rpi-arch/04.png differ diff --git a/assets/images/rpi-arch/05.png b/assets/images/rpi-arch/05.png new file mode 100644 index 0000000..f41f96c Binary files /dev/null and b/assets/images/rpi-arch/05.png differ diff --git a/assets/images/vpn/1.png b/assets/images/vpn/1.png new file mode 100644 index 0000000..25c4df2 Binary files /dev/null and b/assets/images/vpn/1.png differ diff --git a/assets/images/vpn/10.png b/assets/images/vpn/10.png new file mode 100644 index 0000000..b34082a Binary files /dev/null and b/assets/images/vpn/10.png differ diff --git a/assets/images/vpn/11.png b/assets/images/vpn/11.png new file mode 100644 index 0000000..526b018 Binary files /dev/null and b/assets/images/vpn/11.png differ diff --git a/assets/images/vpn/12.png b/assets/images/vpn/12.png new file mode 100644 index 0000000..b440aba Binary files /dev/null and b/assets/images/vpn/12.png differ diff --git a/assets/images/vpn/13.png b/assets/images/vpn/13.png new file mode 100644 index 0000000..7b72b69 Binary files /dev/null and b/assets/images/vpn/13.png differ diff --git a/assets/images/vpn/14.png b/assets/images/vpn/14.png new file mode 100644 index 0000000..f0a3355 Binary files /dev/null and b/assets/images/vpn/14.png differ diff --git a/assets/images/vpn/2.png b/assets/images/vpn/2.png new file mode 100644 index 0000000..113af60 Binary files /dev/null and b/assets/images/vpn/2.png differ diff --git a/assets/images/vpn/3.png b/assets/images/vpn/3.png new file mode 100644 index 0000000..44e6d81 Binary files /dev/null and b/assets/images/vpn/3.png differ diff --git a/assets/images/vpn/4.png b/assets/images/vpn/4.png new file mode 100644 index 0000000..c659317 Binary files /dev/null and b/assets/images/vpn/4.png differ diff --git a/assets/images/vpn/5.png b/assets/images/vpn/5.png new file mode 100644 index 0000000..fbf1894 Binary files /dev/null and b/assets/images/vpn/5.png differ diff --git a/assets/images/vpn/6.png b/assets/images/vpn/6.png new file mode 100644 index 0000000..d5acb71 Binary files /dev/null and b/assets/images/vpn/6.png differ diff --git a/assets/images/vpn/7.png b/assets/images/vpn/7.png new file mode 100644 index 0000000..8dcceda Binary files /dev/null and b/assets/images/vpn/7.png differ diff --git a/assets/images/vpn/8.png b/assets/images/vpn/8.png new file mode 100644 index 0000000..515c0a6 Binary files /dev/null and b/assets/images/vpn/8.png differ diff --git a/assets/images/vpn/9.png b/assets/images/vpn/9.png new file mode 100644 index 0000000..c6b81fa Binary files /dev/null and b/assets/images/vpn/9.png differ diff --git a/assets/js/main.js b/assets/js/main.js new file mode 100644 index 0000000..0e5982a --- /dev/null +++ b/assets/js/main.js @@ -0,0 +1,58 @@ +// Fix DOM matches function +if (!Element.prototype.matches) { + Element.prototype.matches = + Element.prototype.matchesSelector || + Element.prototype.mozMatchesSelector || + Element.prototype.msMatchesSelector || + Element.prototype.oMatchesSelector || + Element.prototype.webkitMatchesSelector || + function(s) { + var matches = (this.document || this.ownerDocument).querySelectorAll(s), + i = matches.length; + while (--i >= 0 && matches.item(i) !== this) {} + return i > -1; + }; +} + +// Get Scroll position +function getScrollPos() { + var supportPageOffset = window.pageXOffset !== undefined; + var isCSS1Compat = ((document.compatMode || "") === "CSS1Compat"); + + var x = supportPageOffset ? window.pageXOffset : isCSS1Compat ? document.documentElement.scrollLeft : document.body.scrollLeft; + var y = supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop; + + return { x: x, y: y }; +} + +var _scrollTimer = []; + +// Smooth scroll +function smoothScrollTo(y, time) { + time = time == undefined ? 500 : time; + + var scrollPos = getScrollPos(); + var count = 60; + var length = (y - scrollPos.y); + + function easeInOut(k) { + return .5 * (Math.sin((k - .5) * Math.PI) + 1); + } + + for (var i = _scrollTimer.length - 1; i >= 0; i--) { + clearTimeout(_scrollTimer[i]); + } + + for (var i = 0; i <= count; i++) { + (function() { + var cur = i; + _scrollTimer[cur] = setTimeout(function() { + window.scrollTo( + scrollPos.x, + scrollPos.y + length * easeInOut(cur/count) + ); + }, (time / count) * cur); + })(); + } +} + diff --git a/bezpečí/2022/07/19/nordvpn.html b/bezpečí/2022/07/19/nordvpn.html new file mode 100644 index 0000000..370b3a9 --- /dev/null +++ b/bezpečí/2022/07/19/nordvpn.html @@ -0,0 +1,853 @@ + + + + + + + + + +NordVPN - Jste opravdu v takovém nebezpečí? | Matyáš Caras + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+ +
+
+
+
+ +
+
+ + + + + + + + + +
+

NordVPN - Jste opravdu v takovém nebezpečí?

+

Ale je to špatná služba?

+ + +
+
+ +
+ +

Pokud sledujete YouTube, určite jste už narazili na nespočet videí, které sponzoruje nějaký poskytovatel tzv. VPN. Většinou se dozvíte něco jako „vaše data jsou v nebezpečí“ a/nebo „použijte naše služby pro zabezpečení vašich dat před hackery“. Toto se samozřejmě netýká jen NordVPN, ale myslím, že ti mají tu nejagresivnější marketingovou strategii snad ze všech.

+

ČÁST I: Kecy

+

Kdo stojí za NordVPN

+

NordVPN vzniklo v roce 2012 jako produkt Toma Okmana, Eimantase Sabaliauskase a Jonase Karklyse. Služba má sloužit jako tzv. Virtual Private Network neboli virtuální soukromá síť. Můžete se tak skrze NordVPN servery připojovat na internet třeba z Německa. Dle zvoleného protokolu je síťový provoz šifrován. NordVPN vlastní společnost Nord Security, která zastřešuje i ostatní produkty značky Nord. Sídlo má ve Velké Británii. Nord Security kromě VPN nabízí i vlastního správce hesel a šifrovaný cloud.

+ +

NordVPN a reklamy YouTuberů

+

Reklamy uvnitř obsahu, tedy reklamy, které tvůrce přidává přímo do videa výměnou za přímou platbu od společnosti, jsou tu s námi celkem dlouho. Jsou efektivnější než běžné reklamy, protože je s běžným blokovačem reklam nepřeskočíte a často je tvůrci tvoří zábavným způsobem, aby je sledující sám nepřeskočil. Je to stabilnější příjem pro tvůrce obsahu, jelikož se nemusí spoléhat na výdělek z reklam, které YouTube často omezuje svými pravidli demonetizace. To je také jeden z důvodů, proč často youtubeři těmto druhům reklam vyjdou vstříc, i když nemusí mít o daném produktu žádnou znalost. Často tak ve svých videích poskytují nepravdivé či přímo zavádějící tvrzení. Než uvedu příklady, je nutné si uvědomit, že ne každý takový YouTuber poskytuje zavádějící informace nebo že NordVPN nejsou žádní podvodníci. Nejsem žádný „samozvaný IT expert“, takže mě neváhejte případně opravit. A o tvrzení „NordVPN je nejlepší VPN“ se bavit ani nebudu, o tom si udělejte obrázek sami.

+ +

Tvrzení č. 1:

+

Veřejné WiFi jsou nebezpečné a kdokoliv může sledovat, co na nich děláte

+ +

Zalíbila se mi odpověď Scotta Helmse, který přirovnává veřejné WiFi sítě k veřejným ulicím. Pokud budete dělat hlouposti, jako je chození s přilepenou platební kartou na čele, samozřejmě vaše údaje budou odcizeny. Proto určitě není dobrý nápad dělat nákupy či se přihlašovat do bankovnictví skrz veřejné sítě. Když se na to podíváme realisticky, je relativně malá šance, že si zrovna k vám v mekáči sedl chlapec či dívka s laptopem, na kterém projíždí vaši historii vyhledávání. Navíc většina webů je zabezpečená pomocí SSL, takže přenos dat je šifrovaný. Takže při používání VPN to vlastně šifrujete ještě jednou (?), což už ale tak užitečné není. Jak píše EFF, tyto hrozby jsou díky HTTPS/SSL spíše minulostí. Váš poskytovatel internetu může sledovat např. jakou stránku otevíráte (třeba github.com), nicméně neuvidí žádné parametry, které odesíláte, ani jestli navštěvujete github.com/hernikplays nebo github.com/ytdl. A to stejné mohou lidé, kteří jsou kolem vás připojení na veřejné WiFi. „V životě se bojíte spousty věcí, veřejné WiFi si můžete ze seznamu odškrtnout“.

+ +

Tvrzení č. 2:

+

[NordVPN poskytuje] maximální internetové bezpečí

+ +

Jak už jsem řekl v předchozí části, před vlastní blbostí vás ani to nejlepší VPN nezachrání. Pokud máte selský rozum, tak poznáte, kam zadávat a nezadávat svoje osobní údaje, což se s rostoucí popularitou sociálního inženýrství o něco zhoršuje. A pokud si vás přecijen nějaký špičkový, státem placený hacker najde, tak mu VPN určitě nebude dělat problém.

+ +

Tvrzení č. 3:

+

Zatímco [bez VPN] ti může jakýkoliv útočník vcelku jednoduše tvé zařízení nabourat, s ním jsi prakticky neviditelný […] smaže za tebou tvou stopu

+ +

Toto tvrzení je možná pravdivé pro NordVPN, jelikož nabízejí službu „Threat Protection“, která slouží k blokování reklam, sledovacích prvků a nebezpečných webů, nicméně může vzbudit dojem, že takhle operuje každé VPN. Pokud vám jde o vaše bezpečí, neměli byste sázet na řešení jedním kliknutím, ale prozkoumat různé možnosti a nástroje, včetně VPN. Pokud používáte např. služby od Googlu, už tak jim o sobě poskytujete dostatek údajů. +Útočník také nemůže „vcelku jednoduše“ vaše zařízení nabourat, to lze pouze pokud jste se rozhodli používat Windows 10 a nenainstalovali jste žádné aktualizace. V tom případě je váš systém děravý jak ementál a to už asi nikdo, kromě vás, nespraví. Takže aktualizujte svůj systém a aplikace jak to jen půjde!

+ +

Tvrzení č. 4:

+

Můžeš sledovat obsah uzamknutý pro určité země

+ +

To je samozřejmě pravda, nicméně některé služby se aktivně pokouší zamezit přístup uživatelům s VPN identifikováním IP adresy daného VPN serveru.

+ +

Tvrzení č. 5:

+

[NordVPN] ti zrychlí internet

+ +

Když máte od poskytovatele internetu omezené stahování na 10 MB/s, nemůžete očekávat, že když budete ze serveru, kde může být zároveň napojeno X tisíc lidí a je někde v tramtárii, stahovat soubor, že se bude stahovat rychleji. Pouze ve specifických případech, kdy například poskytovatel internetu záměrně zpomaluje připojení např. k Netflixu, můžete pocítit zrychlení.

+ +

NordVPN a ještě divnější praktiky

+

Zavádějícími tvrzeními to však nekončí, věděli jste, že na mnoha webech s hodnoceními VPN služeb si můžete určitou pozici jednoduše koupit? Ano, dostáváme se do takzvaného provizního systému, tedy systému, ve kterém firma proplatí provizi z provedeného nákupu jistému zprostředkovateli. Vtipná věc je, že některé tyto firmy vlastní zároveň takovéto „publikace“ a samotné VPN služby, jako např. Kape Technologies, která se původně zabývala adwarem, nyní vlastní např. ExpressVPN a zároveň web VPNmentor. NordVPN není výjimkou s jejich provizním systémem nabízejícím až 40% část z ceny nákupu. Dá se těmto „hodnocením“ vůbec věřit? Některým nejspíš ano, je dobré však zkontrolovat, jestli publikaci nevlastní nějaká mediální společnost.

+ +

Dále můžeme na webu NordVPN, služby, která vám má pomoct chránit vaše soukromí a „zneviditelnit se“, najít spoustu sledovacích prvků, jako např. sledovací prvky Twitter Ads, Google Ads, Analytics a Bing.

+ +

Ukázka sledovacích prvků na stránce NordVPN

+ +

Část II: Vzhůru dolů

+

Ano, je čas, abych se vydal do králičí nory a NordVPN otestoval. Hned na úvodní stránce na vás vyskočí tuny slev. „Nakupte do X hodin a získejte slevu X%“. No tak to abych si pohnul, co? Samozřejmě, že ne. Úplně stejná stránka s úplně stejným odpočtem se mi zobrazila i včera. Navíc tato sleva platí jen na roční plány a já s NordVPN chci strávit co nejméně času. Takže beru jejich standardních 10,49 eur na měsíc, které naštěstí také nabízejí s garancí vrácení peněz. Samozřejmě k tomu ještě musíte přičíst daně, z čehož máme 12,69 (nice). Použil jsem jejich (ne)bezpečnou bránu a vzdal se svých těžce vydělaných peněz. +Jejich stránka, ze které jsem měl stáhnout klienta, se chvástala „online zabezpečením pro všechny velké linuxové distribuce“, takže je super, že nabízejí stažení pouze pro distribuce založené na Debianu a RHEL, když jsem na Archu. Samozřejmě nic, co by Arch komunita nevyřešila.

+ +

Nemůžu hodnotit jednoduchost prostředí, protože to na linuxu ani není. Nicméně se podíváme na rychlost.

+

Rychlosti (velmi stručně)

+

Výchozí rychlost (bez VPN, WiFi)

+ +

Výchozí rychlost (bez VPN, WiFi)

+ +

NordVPN Germany #1078

+ +

NordVPN Germany #1078

+ +

Rychlost stahování torrentů na serverech v Německu

+ +

Pokles rychlosti, úplně normální, protože pakety urazí větší vzdálenost. Streamování YouTube ve Full HD má pocititelné zpomalení/zasekávání. Rychlosti stahování torrentů se držely v průměru mezi 600 a 700 KB/s.

+ +

NordVPN USA #9363

+ +

NordVPN USA #9363

+ +

Rychlost stahování torrentů na serverech v USA

+ +

Tady už změnu pocítíte víc. Zajímavé však je, že se videa z YouTube ve Full HD načítají rychleji. Nicméně rychlosti stahování torrentů skákaly nahorů a dolů.

+ +

Threat Protection Lite

+

Další funkce dostupná pro linux je TPL, který má blokovat reklamy, nebezpečné stránky a pochybná připojení během připojení na VPN.

+ +

Na webu NordVPN zablokoval sledovací prvky Twitteru, Bingu a Googlu, nicméně vynechal Google Analytics (což je asi pochopitelné, když o blokování sledujících prvků není ani zmínka).

+ +

Zablokované sledovací prvky na NordVPN.com

+ +

Na YouTube neblokuje reklamy vůbec, +Blokování reklam s TPL na YouTube

+ +

ale na jiných webech ano. +Blokování reklam s TPL na jiných webech

+ +

Takže nahradí blokovače jako uBlock Origin? Řekl bych, že ne.

+

Část III: Opouštíme králičí noru

+

Dobře, mám trochu NordVPN na vlastní kůži, ale teď se ho chci zbavit. Takže jdeme žádat zpět peníze. +Zrušení obnovení předplatného bylo relativně snadné, v nastavení účtu stačilo kliknout na „Zrušit“.

+ +

Zrušení obnovení předplatného

+ +

Teď přijde ta bolestivější část, a to žádání o vrácení peněz. Dle podmínek máte 30 dní od prvního nákupu nárok na vrácení peněz. +NordVPN říká, že podpora funguje 24/7. Na začátku jste spojeni s robotem, který vás postupně přepojí na živého člověka.

+ +

Robot na podpoře

+ +

Člověk se skutečně objevil.

+ +

Chat s podporu část 1

+ +

Chvilku mu to trvalo, takže jsem ho popostrčil.

+ +

Chat s podporu část 2

+ +

Řekl jsem mu slušně „Ne, díky“, po čemž mi nastavil vrácení peněz.

+ +

Chat s podporu část 3

+ +

Celkem rychle vyřízeno, dobrá práce. Zvláštní mi přišlo jen, že si mě nijak neověřil, pouze jsem na začátku poskytl e-mail, z čehož (doufám) vydedukoval, že to patří k mému účtu. +Další den mi skutečně odebrali přístup k jejich službě, nicméně peníze jsou stále zablokované, tak snad si banka pohne.

+ +

Část V: Závěr

+

Takže na závěr: +Je VPN úplně zbytečný nástroj? Určitě ne.

+ +

Můžou youtubeři za to, že někdy neříkají pravdivé věci? Spíš ne, nemůžete čekat každého youtubera, že je expert přes sítě, jenom se snaží se uživit a vyloženě lži říkají opravdu málokdy.

+ +

Snaží se NordVPN prodat hadí olej a moje děti na darknetu? Nejspíš ne, ale měli by víc sjednotit prezentování co se týče sponzorování youtuberů.

+ +

Můžu důvěřovat NordVPN? S jejich velikostí nejspíš ano.

+ +

Doporučil bych NordVPN? Ne. Pokud chcete opravdu 100% anonymitu a hlavně no-bullshit produkt, použijte něco jako Mullvad (toto není sponzorováno, sám ho používám a je fajn), který nenabízí žádné posrané slevy kvůli všemu možnému a kde dokonce můžete platit v hotovosti, ale nezapomeňte, že VPNkem to nekončí. Podívejte se na Surveillance Self-Defense od EFF pro více tipů na ochranu vašeho soukromí.

+ + +
+ +
+
+ +
+
+
Related Articles
+ +
+
+ + + +
+
+ + +
+ +
+ +
+
+ + diff --git a/categories.html b/categories.html new file mode 100644 index 0000000..c65ca44 --- /dev/null +++ b/categories.html @@ -0,0 +1,789 @@ + + + + + + + + + +Categories | Matyáš Caras + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ +
+ +
+
+ + diff --git a/feed.xml b/feed.xml new file mode 100644 index 0000000..9d3db6f --- /dev/null +++ b/feed.xml @@ -0,0 +1,247 @@ +Jekyll2022-11-05T11:35:48+00:00https://caras.cafe/feed.xmlMatyáš CarasWelcome to my website/blog, full of weird stuff written by yours truly.hernikplaysInstalujeme Arch Linux ARM na Raspberry Pi 32022-10-22T00:00:00+00:002022-10-22T00:00:00+00:00https://caras.cafe/tutori%C3%A1l/2022/10/22/rpi-archArch Linux ARM logo

+ +

Raspbian OS už je ohraný. Pojďme si nainstalovat ARM verzi Arch Linuxu na Raspberry Pi 3. Proces je relativně prostý.

+ +

Připravujeme SD kartu

+

Nejdřív je nutné SD kartu naformátovat a rozdělit oddíly. Můžete to udělat svým oblíbeným způsobem, já použiji GUI nástroj GParted.

+ +

Odstraníme všechny oddíly skrz kontextové menu pravého kliknutí a potvrzení fajfkou.

+ +

Odstraněné oddíly v GParted

+ +

Následně vytvoříme jeden FAT32 oddíl, který bude sloužit jako bootovací. Bude stačit 128 MiB.

+ +

Vytváření FAT32 oddílu v GParted

+ +

Druhý oddíl bude náš systémový, který bude ext4.

+ +

Vytváření ext4 oddílu v GParted

+ +

Jakmile fajfkou potvrdíme a necháme oddíly vytvořit, můžete je ještě zformátovat, nicméně je nejdůležitější nastavit boot příznak na našem boot oddílu skrz kontextové menu.

+ +

Výběr příznaků v GParted

+ +

Tak je všechno hotovo v GParted.

+ +

Přesouváme systém

+

Dále připojíme naše oddíly podle jejich identifikátoru a čísla připojíme.

+ +

Nejdřív si vytvoříme složky, sudo mkdir -p /mnt/archpi/{root,boot} nám vytvoří složky root a boot pro naše oddíly.

+ +

Dále příkazem sudo mount /dev/sdc1 /mnt/archpi/root připojíme náš FAT32 bootovácí oddíl (Označení sdc1 se u vás může lišit, podívejte se do GPartedu nebo skrz příkaz lsblk na označení jednotlivých oddílů) a příkazem sudo mount /dev/sdc2 /mnt/archpi/boot připojíme systémový oddíl.

+ +

Dle oficiální dokumentace se další proces má dělat skrz root uživatele, takže se přepneme příkazem sudo su.

+ +

Příkazem wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-armv7-latest.tar.gz stáhneme archiv a příkazem tar -xf ArchLinuxARM-rpi-armv7-latest.tar.gz -C /mnt/archpi/root ho rozbalíme.

+ +

Pak musíme přesunout bootovací soubory do bootovacího oddílu: mv /mnt/archpi/root/boot/* boot a tím jsme hotovi, stačí oddíly odpojit příkazem umount /mnt/archpi/root a umount /mnt/archpi/boot. Jakmile se příkazy dokončí, můžete SD kartu vložit do RPi a zapnout.

+ +

Výchozí jméno a zároveň heslo uživatele je alarm a roota root. Než bude systém nastavený, doporučuji použít root účet.

+ +

Připojení k Wi-Fi síti

+

Pokud používáte kabelové připojení, tak můžete přeskočit +Nyní se připojíme skrz terminál k Wi-Fi síti. Předpokládám, že název (SSID) sítě a heslo znáte a že zabezpečení je WPA2 Personal. Jinak si můžete prohlédnout Arch Wiki pro více návodů.

+ +

Příkazem iw dev zjistíte název vašeho interfacu (např. já mám wlan0). Zapneme ho pomocí ip link wlan0 up (místo wlan0 tedy použijte váš název interfacu).

+ +

Dále se tedy připojíme k nějaké Wi-Fi síti. Nejdřív musíme vytvořit konfigurační soubor pro wpa_supplicant, který slouží jako suplikant s podporou WPA, WPA2 a WPA3.

+ +

Pomocí příkazu nano /etc/wpa_supplicant/wpa_supplicant.conf vstoupíme do editace konfiguračního souboru. Do něj vložíme následující dva řádky:

+ +
ctrl_interface=/run/wpa_supplicant
+update_config=1
+
+ +

Klávesovou zkratkou Ctrl+X, zadáním y a potvrzením enterem uložíme soubor a opustíme editaci. wpa_supplicant teď můžeme spustit příkazem wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf.

+ +

S běžícím wpa_supplicant můžeme použít příkaz wpa_cli, kde můžeme konfigurovat síť.

+ +

Sítě zde můžete hledat příkazem scan, následováný scan_results.

+ +

Pro přidání sítě použijeme příkaz add_network. Terminál vrátí 0, což je ID sítě, které můžeme konfigurovat. Příkazem set_network 0 ssid "MYSSID" nastavíme SSID (název) sítě na MYSSID. Příkazem set_network 0 psk "passphrase" nastavíme heslo na passphrase. Jakmile je nastaveno, můžeme povolit síť pomocí enable_network 0. Konfiguraci uložíme příkazem save_config a opustíme pomocí quit.

+ +

Jelikož ale právě teď nemáme IP adresu, musíme nastavit službu DHCP (pokud ji samozřejmě váš router má). Stačí zapnout službu dhcpcd pomocí příkazu systemctl enable dhcpcd. Abychom při každém zapnutí nemuseli síť manuálně zapínat, můžeme do dhcpcd přidat hook, který ji automaticky zapne, stačí použít ln -s /usr/share/dhcpcd/hooks/10-wpa_supplicant /usr/lib/dhcpcd/dhcpcd-hooks/.

+ +

V tomto stádiu doporučuji restartovat příkazem reboot.

+ +

Nastavujeme správce balíků

+

Aktuálně bychom měli mít funkční síť, nicméně je potřeba pár dalších příkazů pokud chceme používat pacman správce balíků.

+ +

Nejdřív musíme vytvořit klíčenku příkazem pacman-key --init, poté přidáme klíče Arch ARM repozitářů příkazem pacman-key --populate archlinuxarm. Teď můžete příkazem pacman -Sy repozitáře synchronizovat.

+ +

Jako první balík bychom měli stáhnout sudo, abychom nemuseli používat root uživatele pro všechno nastavování. Nainstalujeme ho příkazem pacman -S sudo. Dále příkazem nano /etc/sudoers upravíme konfiguraci. Najdeme následující řádky (Ctrl+W pro hledání):

+
## Uncomment to allow members of group wheel to execute any command
+#%wheel ALL=(ALL:ALL) ALL
+
+

a odstraníme mřížku před % pro odstranění komentáře. Tím umožníme uživatelům v uživatelské skupině wheel používat příkaz sudo.

+ +

Nyní přidáme uživatele alarm do skupiny wheel příkazem gpasswd -a alarm wheel. A teď už můžeme používat uživatele alarm pro různé administrativní operace místo roota.

+ +

Nastavení SSH přístupu

+

Možná vás nebaví zapojovat RPi do monitoru nebo u něj klapat věci do klávesnice v terminálu nebo jen chcete vzdálený přístup. SSH lze povolit skrz OpenSSH, které je na Archu předinstalované. Stačí povolit službu pomocí systemctl enable sshd. Pro nějakou pokročilou konfiguraci si prohlédněte Arch Wiki.

+ +

Nyní se stačí připojit skrz nějaký SSH klient na vaše zařízení (pokud neznáte IP, podívejte se skrz příkaz ip a), třeba skrz ssh alarm@vase.ip.adresa.

+ +

HTTPS problémy

+

Pokud máte problémy s SSL nebo komunikací se zabezpečenými servery, zkuste nainstalovat balík ca-certificates a nastavit systémový čas skrz timedatectl set-time "2022-10-29 15:00:00 (samozřejmě vaše datum).

+ +

Závěr

+ +

Arch neofetch

+ +

Instalace je opravdu prostý a snadný proces (i když jsem ho sám dělal asi 5x než mi to nabootovalo), takže určitě zkoušejte a zkoušejte.

]]>
hernikplays
NordVPN - Jste opravdu v takovém nebezpečí?2022-07-19T00:00:00+00:002022-07-19T00:00:00+00:00https://caras.cafe/bezpe%C4%8D%C3%AD/2022/07/19/nordvpnPokud sledujete YouTube, určite jste už narazili na nespočet videí, které sponzoruje nějaký poskytovatel tzv. VPN. Většinou se dozvíte něco jako „vaše data jsou v nebezpečí“ a/nebo „použijte naše služby pro zabezpečení vašich dat před hackery“. Toto se samozřejmě netýká jen NordVPN, ale myslím, že ti mají tu nejagresivnější marketingovou strategii snad ze všech.

+

ČÁST I: Kecy

+

Kdo stojí za NordVPN

+

NordVPN vzniklo v roce 2012 jako produkt Toma Okmana, Eimantase Sabaliauskase a Jonase Karklyse. Služba má sloužit jako tzv. Virtual Private Network neboli virtuální soukromá síť. Můžete se tak skrze NordVPN servery připojovat na internet třeba z Německa. Dle zvoleného protokolu je síťový provoz šifrován. NordVPN vlastní společnost Nord Security, která zastřešuje i ostatní produkty značky Nord. Sídlo má ve Velké Británii. Nord Security kromě VPN nabízí i vlastního správce hesel a šifrovaný cloud.

+ +

NordVPN a reklamy YouTuberů

+

Reklamy uvnitř obsahu, tedy reklamy, které tvůrce přidává přímo do videa výměnou za přímou platbu od společnosti, jsou tu s námi celkem dlouho. Jsou efektivnější než běžné reklamy, protože je s běžným blokovačem reklam nepřeskočíte a často je tvůrci tvoří zábavným způsobem, aby je sledující sám nepřeskočil. Je to stabilnější příjem pro tvůrce obsahu, jelikož se nemusí spoléhat na výdělek z reklam, které YouTube často omezuje svými pravidli demonetizace. To je také jeden z důvodů, proč často youtubeři těmto druhům reklam vyjdou vstříc, i když nemusí mít o daném produktu žádnou znalost. Často tak ve svých videích poskytují nepravdivé či přímo zavádějící tvrzení. Než uvedu příklady, je nutné si uvědomit, že ne každý takový YouTuber poskytuje zavádějící informace nebo že NordVPN nejsou žádní podvodníci. Nejsem žádný „samozvaný IT expert“, takže mě neváhejte případně opravit. A o tvrzení „NordVPN je nejlepší VPN“ se bavit ani nebudu, o tom si udělejte obrázek sami.

+ +

Tvrzení č. 1:

+

Veřejné WiFi jsou nebezpečné a kdokoliv může sledovat, co na nich děláte

+ +

Zalíbila se mi odpověď Scotta Helmse, který přirovnává veřejné WiFi sítě k veřejným ulicím. Pokud budete dělat hlouposti, jako je chození s přilepenou platební kartou na čele, samozřejmě vaše údaje budou odcizeny. Proto určitě není dobrý nápad dělat nákupy či se přihlašovat do bankovnictví skrz veřejné sítě. Když se na to podíváme realisticky, je relativně malá šance, že si zrovna k vám v mekáči sedl chlapec či dívka s laptopem, na kterém projíždí vaši historii vyhledávání. Navíc většina webů je zabezpečená pomocí SSL, takže přenos dat je šifrovaný. Takže při používání VPN to vlastně šifrujete ještě jednou (?), což už ale tak užitečné není. Jak píše EFF, tyto hrozby jsou díky HTTPS/SSL spíše minulostí. Váš poskytovatel internetu může sledovat např. jakou stránku otevíráte (třeba github.com), nicméně neuvidí žádné parametry, které odesíláte, ani jestli navštěvujete github.com/hernikplays nebo github.com/ytdl. A to stejné mohou lidé, kteří jsou kolem vás připojení na veřejné WiFi. „V životě se bojíte spousty věcí, veřejné WiFi si můžete ze seznamu odškrtnout“.

+ +

Tvrzení č. 2:

+

[NordVPN poskytuje] maximální internetové bezpečí

+ +

Jak už jsem řekl v předchozí části, před vlastní blbostí vás ani to nejlepší VPN nezachrání. Pokud máte selský rozum, tak poznáte, kam zadávat a nezadávat svoje osobní údaje, což se s rostoucí popularitou sociálního inženýrství o něco zhoršuje. A pokud si vás přecijen nějaký špičkový, státem placený hacker najde, tak mu VPN určitě nebude dělat problém.

+ +

Tvrzení č. 3:

+

Zatímco [bez VPN] ti může jakýkoliv útočník vcelku jednoduše tvé zařízení nabourat, s ním jsi prakticky neviditelný […] smaže za tebou tvou stopu

+ +

Toto tvrzení je možná pravdivé pro NordVPN, jelikož nabízejí službu „Threat Protection“, která slouží k blokování reklam, sledovacích prvků a nebezpečných webů, nicméně může vzbudit dojem, že takhle operuje každé VPN. Pokud vám jde o vaše bezpečí, neměli byste sázet na řešení jedním kliknutím, ale prozkoumat různé možnosti a nástroje, včetně VPN. Pokud používáte např. služby od Googlu, už tak jim o sobě poskytujete dostatek údajů. +Útočník také nemůže „vcelku jednoduše“ vaše zařízení nabourat, to lze pouze pokud jste se rozhodli používat Windows 10 a nenainstalovali jste žádné aktualizace. V tom případě je váš systém děravý jak ementál a to už asi nikdo, kromě vás, nespraví. Takže aktualizujte svůj systém a aplikace jak to jen půjde!

+ +

Tvrzení č. 4:

+

Můžeš sledovat obsah uzamknutý pro určité země

+ +

To je samozřejmě pravda, nicméně některé služby se aktivně pokouší zamezit přístup uživatelům s VPN identifikováním IP adresy daného VPN serveru.

+ +

Tvrzení č. 5:

+

[NordVPN] ti zrychlí internet

+ +

Když máte od poskytovatele internetu omezené stahování na 10 MB/s, nemůžete očekávat, že když budete ze serveru, kde může být zároveň napojeno X tisíc lidí a je někde v tramtárii, stahovat soubor, že se bude stahovat rychleji. Pouze ve specifických případech, kdy například poskytovatel internetu záměrně zpomaluje připojení např. k Netflixu, můžete pocítit zrychlení.

+ +

NordVPN a ještě divnější praktiky

+

Zavádějícími tvrzeními to však nekončí, věděli jste, že na mnoha webech s hodnoceními VPN služeb si můžete určitou pozici jednoduše koupit? Ano, dostáváme se do takzvaného provizního systému, tedy systému, ve kterém firma proplatí provizi z provedeného nákupu jistému zprostředkovateli. Vtipná věc je, že některé tyto firmy vlastní zároveň takovéto „publikace“ a samotné VPN služby, jako např. Kape Technologies, která se původně zabývala adwarem, nyní vlastní např. ExpressVPN a zároveň web VPNmentor. NordVPN není výjimkou s jejich provizním systémem nabízejícím až 40% část z ceny nákupu. Dá se těmto „hodnocením“ vůbec věřit? Některým nejspíš ano, je dobré však zkontrolovat, jestli publikaci nevlastní nějaká mediální společnost.

+ +

Dále můžeme na webu NordVPN, služby, která vám má pomoct chránit vaše soukromí a „zneviditelnit se“, najít spoustu sledovacích prvků, jako např. sledovací prvky Twitter Ads, Google Ads, Analytics a Bing.

+ +

Ukázka sledovacích prvků na stránce NordVPN

+ +

Část II: Vzhůru dolů

+

Ano, je čas, abych se vydal do králičí nory a NordVPN otestoval. Hned na úvodní stránce na vás vyskočí tuny slev. „Nakupte do X hodin a získejte slevu X%“. No tak to abych si pohnul, co? Samozřejmě, že ne. Úplně stejná stránka s úplně stejným odpočtem se mi zobrazila i včera. Navíc tato sleva platí jen na roční plány a já s NordVPN chci strávit co nejméně času. Takže beru jejich standardních 10,49 eur na měsíc, které naštěstí také nabízejí s garancí vrácení peněz. Samozřejmě k tomu ještě musíte přičíst daně, z čehož máme 12,69 (nice). Použil jsem jejich (ne)bezpečnou bránu a vzdal se svých těžce vydělaných peněz. +Jejich stránka, ze které jsem měl stáhnout klienta, se chvástala „online zabezpečením pro všechny velké linuxové distribuce“, takže je super, že nabízejí stažení pouze pro distribuce založené na Debianu a RHEL, když jsem na Archu. Samozřejmě nic, co by Arch komunita nevyřešila.

+ +

Nemůžu hodnotit jednoduchost prostředí, protože to na linuxu ani není. Nicméně se podíváme na rychlost.

+

Rychlosti (velmi stručně)

+

Výchozí rychlost (bez VPN, WiFi)

+ +

Výchozí rychlost (bez VPN, WiFi)

+ +

NordVPN Germany #1078

+ +

NordVPN Germany #1078

+ +

Rychlost stahování torrentů na serverech v Německu

+ +

Pokles rychlosti, úplně normální, protože pakety urazí větší vzdálenost. Streamování YouTube ve Full HD má pocititelné zpomalení/zasekávání. Rychlosti stahování torrentů se držely v průměru mezi 600 a 700 KB/s.

+ +

NordVPN USA #9363

+ +

NordVPN USA #9363

+ +

Rychlost stahování torrentů na serverech v USA

+ +

Tady už změnu pocítíte víc. Zajímavé však je, že se videa z YouTube ve Full HD načítají rychleji. Nicméně rychlosti stahování torrentů skákaly nahorů a dolů.

+ +

Threat Protection Lite

+

Další funkce dostupná pro linux je TPL, který má blokovat reklamy, nebezpečné stránky a pochybná připojení během připojení na VPN.

+ +

Na webu NordVPN zablokoval sledovací prvky Twitteru, Bingu a Googlu, nicméně vynechal Google Analytics (což je asi pochopitelné, když o blokování sledujících prvků není ani zmínka).

+ +

Zablokované sledovací prvky na NordVPN.com

+ +

Na YouTube neblokuje reklamy vůbec, +Blokování reklam s TPL na YouTube

+ +

ale na jiných webech ano. +Blokování reklam s TPL na jiných webech

+ +

Takže nahradí blokovače jako uBlock Origin? Řekl bych, že ne.

+

Část III: Opouštíme králičí noru

+

Dobře, mám trochu NordVPN na vlastní kůži, ale teď se ho chci zbavit. Takže jdeme žádat zpět peníze. +Zrušení obnovení předplatného bylo relativně snadné, v nastavení účtu stačilo kliknout na „Zrušit“.

+ +

Zrušení obnovení předplatného

+ +

Teď přijde ta bolestivější část, a to žádání o vrácení peněz. Dle podmínek máte 30 dní od prvního nákupu nárok na vrácení peněz. +NordVPN říká, že podpora funguje 24/7. Na začátku jste spojeni s robotem, který vás postupně přepojí na živého člověka.

+ +

Robot na podpoře

+ +

Člověk se skutečně objevil.

+ +

Chat s podporu část 1

+ +

Chvilku mu to trvalo, takže jsem ho popostrčil.

+ +

Chat s podporu část 2

+ +

Řekl jsem mu slušně „Ne, díky“, po čemž mi nastavil vrácení peněz.

+ +

Chat s podporu část 3

+ +

Celkem rychle vyřízeno, dobrá práce. Zvláštní mi přišlo jen, že si mě nijak neověřil, pouze jsem na začátku poskytl e-mail, z čehož (doufám) vydedukoval, že to patří k mému účtu. +Další den mi skutečně odebrali přístup k jejich službě, nicméně peníze jsou stále zablokované, tak snad si banka pohne.

+ +

Část V: Závěr

+

Takže na závěr: +Je VPN úplně zbytečný nástroj? Určitě ne.

+ +

Můžou youtubeři za to, že někdy neříkají pravdivé věci? Spíš ne, nemůžete čekat každého youtubera, že je expert přes sítě, jenom se snaží se uživit a vyloženě lži říkají opravdu málokdy.

+ +

Snaží se NordVPN prodat hadí olej a moje děti na darknetu? Nejspíš ne, ale měli by víc sjednotit prezentování co se týče sponzorování youtuberů.

+ +

Můžu důvěřovat NordVPN? S jejich velikostí nejspíš ano.

+ +

Doporučil bych NordVPN? Ne. Pokud chcete opravdu 100% anonymitu a hlavně no-bullshit produkt, použijte něco jako Mullvad (toto není sponzorováno, sám ho používám a je fajn), který nenabízí žádné posrané slevy kvůli všemu možnému a kde dokonce můžete platit v hotovosti, ale nezapomeňte, že VPNkem to nekončí. Podívejte se na Surveillance Self-Defense od EFF pro více tipů na ochranu vašeho soukromí.

]]>
hernikplays
GitHub Codespaces aneb VS Code na VPS2022-05-31T00:00:00+00:002022-05-31T00:00:00+00:00https://caras.cafe/vychyt%C3%A1vky/2022/05/31/codespacesNedávno mi přišel e-mail, že jsem byl přidán do beta testování funkce Codespaces na GitHubu. Stručně, Codespaces má být systém ve kterém si vytvoříte vlastní prostředí pro váš repozitář, do kterého si nainstalujete všechny potřebné knihovny, SDK a balíky. Server, na kterém to všechno běží, si platíte u GitHubu a můžete na něj kdekoliv a kdykoliv přejít přes web do webové, narozdíl od výchozího webového VS Code plně vybavené, verzi VS Code nebo nainstalovaný VS Code a upravovat nebo testovat kód.

+ +

Hodí se pro lidi, kteří nechtějí tahat např. do školy nebo do práce, kde nesmí instalovat externí aplikace, svůj vlastní notebook. +Parametry

+ +

V betě je možné testovat pouze výchozí možnost 4 jádra + 8GB RAM + 32GB úložiště, což definitivně stačí pro osobní a malé projekty. Do konce bety neplatíte nic, ale 4 jádra vyjdou na $0.36 (asi 8,3 kč) za hodinu, tj za hodinu aktivního používání. Codespace se vám automaticky vypne, pokud není po stanovenou dobu nepoužíván, takže můžete předejít placení katastrofických částek. +Ceny Codespaces

+ +

Je to určitě výhodnější, než si platit např. hotové VPS, pokud ho tedy nepoužíváte i na něco smysluplnějšího. +Moje zkušenost

+ +

Samozřejmě jsem nemohl odolat a na OpenCanteen jsem si jeden nechal vytvořit, aniž bych věděl do čeho se vrhám.

+ +

Codespace se vytváří jednoduše kliknutím na tlačítko “Code” ve vašem repozitáří, kde se vám nově zobrazí možnost si Codespace vytvořit.

+ +

Ve výchozím stavu běží server na Ubuntu. Pokud nenajdete docker obraz nebo devcontainer konfigurační soubor, musíte si samozřejmě vše nainstalovat sami, což zas tolik nevadí, protože to nejspíš budete dělat jen jednou, pokud si nebudete s obrazem stroje nějak zahrávat.

+ +

Instalace všeho však probíhá svižně, jelikož asi v Microsoftu mají na rychlejší internet, než já. Samozřejmě vše musíte instalovat skrze terminál (což mě celkem ranilo, jelikož instalovat Android SDK pro flutter byla celkem fuška).

+ +

Pokud používáte Settings Sync ve VS Code, automaticky se vám synchronizují nastavení a rozšíření. Pro pokročilé upravení prostředí slouží konfigurační soubor devcontainer.json +Ceny Codespaces

+ +

Jakmile máte všechno nastavené, už stačí jen využít starého známého Visual Studio Code, které funguje úplně stejně jako na lokálním zařízení. Na Codespace se můžete kdykoli připojit přes webovou adresu.

+ +

Za mě velice praktické pro dříve uvedené typy lidí, už jen záleží, jestli se to zrovna vám za ty peníze vyplatí. Dokumentace je možná trochu chaotická, alespoň pro uživatele co se nevyznají v technologiích jako kontejnery či docker a většiny funkcí využije jen skutečný poweruser (což já určitě nejsem).

]]>
hernikplays
Automatizace, automatizace, automatizace2022-05-22T00:00:00+00:002022-05-22T00:00:00+00:00https://caras.cafe/programov%C3%A1n%C3%AD/2022/05/22/automatizaceRoboti nám brzo vezmou práci, ale mně to (prozatím) nevadí. Já nechávám robůtky pracovat za mě a ulehčovat mi práci. A vy byste měli taky! Pokud teda programujete, jinak nevím.

+ +

Nedávno jsem objevil krásy zvané GitHub Actions a musím říct, že je to opravdu radost. Nikdy předtím jsem nedokázal pochopit jejich praktičnost, než jsem pracoval na OpenCanteen. Sestavovat, podepisovat a nahrávat mě opravdu nebavilo a ještě s mým pomalým PC v kombinaci s pomalým internetem to nešlo zrovna rychle. Pak jsem si vzpomněl na GitHub Actions. Místo toho, abych dělal cokoliv produktivního, jsem strávil celé odpoledne nastavováním Actions, aby mi při novém tagu automaticky sestavil a publikoval vydání aplikace do Google Play.

+ +

Ta první část šla skvěle, avšak nahrávání do Google Play bylo o něco složitější, dokud jsem neobjevil hotové a, prozatím bezplatné, řešení CodeMagic.

+ +

Jednoduše jsem napojil repozitář, nastavil podepisovací a nahrávací údaje a všechno hned jelo! Byla to radost pro někoho tak líného jako jsem já. I přesto, že jsem sám reálně nic neudělal, cítil jsem, že jsem dosáhl něčeho úžasného.

+ +

A určitě to lze dotáhnout ještě dál, už teď používám Actions pro automatickou analýzu kódu, a kdybych si vytvořil testy tak by mi to určitě i otestovalo celou aplikaci.

+ +

Pak jsem si řekl, že by možná mohl někdo chtít do mé aplikace přispět svým kódem. Protože chci v tom mít pořádek, hned jsem začal projíždět GitHub Marketplace pro nějaké akce na pull requesty. Hned jsem jich několik objevil.

+ +

Velice jsem ocenil akci, která mi automaticky přidala labely podle souboru, který byl v PR upraven.

+ +

Určitě nepotřebujete nutně automatizovat všechno, pokud máte např. soukromý či malý projekt. Nicméně si to můžete aspoň otestovat a případně využít v budoucnu tak se do toho pusťte! Automatizovat můžete všechno možné. Určitě budete mít dobrý pocit, když se vaše akce spustí a úspěšně se dokončí.

]]>
hernikplays
\ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..6d9c0d7 --- /dev/null +++ b/index.html @@ -0,0 +1,1067 @@ + + + + + + + + + +Home | Matyáš Caras + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+

+ Hernikův Blog +

+

+ Kecy a bláboly +

+
+
+
+
+ + +
+ + + + + +
+ +
+ +
+
+
+
+ +
+ + + + + + +
+ + +
+ +
+ +
+
+ + diff --git a/jekyll-theme-yat.gemspec b/jekyll-theme-yat.gemspec new file mode 100644 index 0000000..a35ea22 --- /dev/null +++ b/jekyll-theme-yat.gemspec @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +Gem::Specification.new do |spec| + spec.name = "jekyll-theme-yat" + spec.version = "1.8.0" + spec.authors = ["jeffreytse"] + spec.email = ["jeffreytse.mail@gmail.com"] + + spec.summary = "Yet another theme for elegant writers with modern flat style and beautiful night/dark mode." + spec.homepage = "https://github.com/jeffreytse/jekyll-theme-yat" + spec.license = "MIT" + + spec.metadata["plugin_type"] = "theme" + + spec.files = `git ls-files -z`.split("\x0").select do |f| + f.match(%r!^(assets|_data|_layouts|_includes|_sass|LICENSE|README)!i) + end + + spec.add_development_dependency "bundler", ">= 1.6", "< 3.0" + spec.add_development_dependency "rake", ">= 12.0", "< 13.0" + + spec.add_runtime_dependency "jekyll", "> 3.5", "< 5.0" + spec.add_runtime_dependency "jekyll-feed", "~> 0.9" + spec.add_runtime_dependency "jekyll-seo-tag", "~> 2.1" + spec.add_runtime_dependency "jekyll-sitemap", "~> 1.3" + spec.add_runtime_dependency "jekyll-paginate", "~> 1.1" + spec.add_runtime_dependency "jekyll-spaceship", "~> 0.2" +end diff --git a/programování/2022/05/22/automatizace.html b/programování/2022/05/22/automatizace.html new file mode 100644 index 0000000..340d53a --- /dev/null +++ b/programování/2022/05/22/automatizace.html @@ -0,0 +1,750 @@ + + + + + + + + + +Automatizace, automatizace, automatizace | Matyáš Caras + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+ +
+
+
+
+ +
+
+ + + + + + + + + +
+

Automatizace, automatizace, automatizace

+

Ulehčujeme si život

+ + +
+
+ +
+ +

Roboti nám brzo vezmou práci, ale mně to (prozatím) nevadí. Já nechávám robůtky pracovat za mě a ulehčovat mi práci. A vy byste měli taky! Pokud teda programujete, jinak nevím.

+ +

Nedávno jsem objevil krásy zvané GitHub Actions a musím říct, že je to opravdu radost. Nikdy předtím jsem nedokázal pochopit jejich praktičnost, než jsem pracoval na OpenCanteen. Sestavovat, podepisovat a nahrávat mě opravdu nebavilo a ještě s mým pomalým PC v kombinaci s pomalým internetem to nešlo zrovna rychle. Pak jsem si vzpomněl na GitHub Actions. Místo toho, abych dělal cokoliv produktivního, jsem strávil celé odpoledne nastavováním Actions, aby mi při novém tagu automaticky sestavil a publikoval vydání aplikace do Google Play.

+ +

Ta první část šla skvěle, avšak nahrávání do Google Play bylo o něco složitější, dokud jsem neobjevil hotové a, prozatím bezplatné, řešení CodeMagic.

+ +

Jednoduše jsem napojil repozitář, nastavil podepisovací a nahrávací údaje a všechno hned jelo! Byla to radost pro někoho tak líného jako jsem já. I přesto, že jsem sám reálně nic neudělal, cítil jsem, že jsem dosáhl něčeho úžasného.

+ +

A určitě to lze dotáhnout ještě dál, už teď používám Actions pro automatickou analýzu kódu, a kdybych si vytvořil testy tak by mi to určitě i otestovalo celou aplikaci.

+ +

Pak jsem si řekl, že by možná mohl někdo chtít do mé aplikace přispět svým kódem. Protože chci v tom mít pořádek, hned jsem začal projíždět GitHub Marketplace pro nějaké akce na pull requesty. Hned jsem jich několik objevil.

+ +

Velice jsem ocenil akci, která mi automaticky přidala labely podle souboru, který byl v PR upraven.

+ +

Určitě nepotřebujete nutně automatizovat všechno, pokud máte např. soukromý či malý projekt. Nicméně si to můžete aspoň otestovat a případně využít v budoucnu tak se do toho pusťte! Automatizovat můžete všechno možné. Určitě budete mít dobrý pocit, když se vaše akce spustí a úspěšně se dokončí.

+ + +
+ +
+
+ +
+
+
Related Articles
+ +
+
+ + + +
+
+ + +
+ +
+ +
+
+ + diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..dae6171 --- /dev/null +++ b/robots.txt @@ -0,0 +1 @@ +Sitemap: https://caras.cafe/sitemap.xml diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..bb2f71a --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,34 @@ + + + +https://caras.cafe/programov%C3%A1n%C3%AD/2022/05/22/automatizace.html +2022-05-22T00:00:00+00:00 + + +https://caras.cafe/vychyt%C3%A1vky/2022/05/31/codespaces.html +2022-05-31T00:00:00+00:00 + + +https://caras.cafe/bezpe%C4%8D%C3%AD/2022/07/19/nordvpn.html +2022-07-19T00:00:00+00:00 + + +https://caras.cafe/tutori%C3%A1l/2022/10/22/rpi-arch.html +2022-10-22T00:00:00+00:00 + + +https://caras.cafe/about.html + + +https://caras.cafe/archives.html + + +https://caras.cafe/categories.html + + +https://caras.cafe/ + + +https://caras.cafe/tags.html + + diff --git a/tags.html b/tags.html new file mode 100644 index 0000000..51d1980 --- /dev/null +++ b/tags.html @@ -0,0 +1,913 @@ + + + + + + + + + +Tags | Matyáš Caras + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ +
+ +
+
+ + diff --git a/tutoriál/2022/10/22/rpi-arch.html b/tutoriál/2022/10/22/rpi-arch.html new file mode 100644 index 0000000..d11d239 --- /dev/null +++ b/tutoriál/2022/10/22/rpi-arch.html @@ -0,0 +1,827 @@ + + + + + + + + + +Instalujeme Arch Linux ARM na Raspberry Pi 3 | Matyáš Caras + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+ +
+
+
+
+ +
+
+ + + + + + + + + +
+

Instalujeme Arch Linux ARM na Raspberry Pi 3

+

Protože proč ne

+ + +
+
+ +
+ +

Arch Linux ARM logo

+ +

Raspbian OS už je ohraný. Pojďme si nainstalovat ARM verzi Arch Linuxu na Raspberry Pi 3. Proces je relativně prostý.

+ +

Připravujeme SD kartu

+

Nejdřív je nutné SD kartu naformátovat a rozdělit oddíly. Můžete to udělat svým oblíbeným způsobem, já použiji GUI nástroj GParted.

+ +

Odstraníme všechny oddíly skrz kontextové menu pravého kliknutí a potvrzení fajfkou.

+ +

Odstraněné oddíly v GParted

+ +

Následně vytvoříme jeden FAT32 oddíl, který bude sloužit jako bootovací. Bude stačit 128 MiB.

+ +

Vytváření FAT32 oddílu v GParted

+ +

Druhý oddíl bude náš systémový, který bude ext4.

+ +

Vytváření ext4 oddílu v GParted

+ +

Jakmile fajfkou potvrdíme a necháme oddíly vytvořit, můžete je ještě zformátovat, nicméně je nejdůležitější nastavit boot příznak na našem boot oddílu skrz kontextové menu.

+ +

Výběr příznaků v GParted

+ +

Tak je všechno hotovo v GParted.

+ +

Přesouváme systém

+

Dále připojíme naše oddíly podle jejich identifikátoru a čísla připojíme.

+ +

Nejdřív si vytvoříme složky, sudo mkdir -p /mnt/archpi/{root,boot} nám vytvoří složky root a boot pro naše oddíly.

+ +

Dále příkazem sudo mount /dev/sdc1 /mnt/archpi/root připojíme náš FAT32 bootovácí oddíl (Označení sdc1 se u vás může lišit, podívejte se do GPartedu nebo skrz příkaz lsblk na označení jednotlivých oddílů) a příkazem sudo mount /dev/sdc2 /mnt/archpi/boot připojíme systémový oddíl.

+ +

Dle oficiální dokumentace se další proces má dělat skrz root uživatele, takže se přepneme příkazem sudo su.

+ +

Příkazem wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-armv7-latest.tar.gz stáhneme archiv a příkazem tar -xf ArchLinuxARM-rpi-armv7-latest.tar.gz -C /mnt/archpi/root ho rozbalíme.

+ +

Pak musíme přesunout bootovací soubory do bootovacího oddílu: mv /mnt/archpi/root/boot/* boot a tím jsme hotovi, stačí oddíly odpojit příkazem umount /mnt/archpi/root a umount /mnt/archpi/boot. Jakmile se příkazy dokončí, můžete SD kartu vložit do RPi a zapnout.

+ +

Výchozí jméno a zároveň heslo uživatele je alarm a roota root. Než bude systém nastavený, doporučuji použít root účet.

+ +

Připojení k Wi-Fi síti

+

Pokud používáte kabelové připojení, tak můžete přeskočit +Nyní se připojíme skrz terminál k Wi-Fi síti. Předpokládám, že název (SSID) sítě a heslo znáte a že zabezpečení je WPA2 Personal. Jinak si můžete prohlédnout Arch Wiki pro více návodů.

+ +

Příkazem iw dev zjistíte název vašeho interfacu (např. já mám wlan0). Zapneme ho pomocí ip link wlan0 up (místo wlan0 tedy použijte váš název interfacu).

+ +

Dále se tedy připojíme k nějaké Wi-Fi síti. Nejdřív musíme vytvořit konfigurační soubor pro wpa_supplicant, který slouží jako suplikant s podporou WPA, WPA2 a WPA3.

+ +

Pomocí příkazu nano /etc/wpa_supplicant/wpa_supplicant.conf vstoupíme do editace konfiguračního souboru. Do něj vložíme následující dva řádky:

+ +
ctrl_interface=/run/wpa_supplicant
+update_config=1
+
+ +

Klávesovou zkratkou Ctrl+X, zadáním y a potvrzením enterem uložíme soubor a opustíme editaci. wpa_supplicant teď můžeme spustit příkazem wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf.

+ +

S běžícím wpa_supplicant můžeme použít příkaz wpa_cli, kde můžeme konfigurovat síť.

+ +

Sítě zde můžete hledat příkazem scan, následováný scan_results.

+ +

Pro přidání sítě použijeme příkaz add_network. Terminál vrátí 0, což je ID sítě, které můžeme konfigurovat. Příkazem set_network 0 ssid "MYSSID" nastavíme SSID (název) sítě na MYSSID. Příkazem set_network 0 psk "passphrase" nastavíme heslo na passphrase. Jakmile je nastaveno, můžeme povolit síť pomocí enable_network 0. Konfiguraci uložíme příkazem save_config a opustíme pomocí quit.

+ +

Jelikož ale právě teď nemáme IP adresu, musíme nastavit službu DHCP (pokud ji samozřejmě váš router má). Stačí zapnout službu dhcpcd pomocí příkazu systemctl enable dhcpcd. Abychom při každém zapnutí nemuseli síť manuálně zapínat, můžeme do dhcpcd přidat hook, který ji automaticky zapne, stačí použít ln -s /usr/share/dhcpcd/hooks/10-wpa_supplicant /usr/lib/dhcpcd/dhcpcd-hooks/.

+ +

V tomto stádiu doporučuji restartovat příkazem reboot.

+ +

Nastavujeme správce balíků

+

Aktuálně bychom měli mít funkční síť, nicméně je potřeba pár dalších příkazů pokud chceme používat pacman správce balíků.

+ +

Nejdřív musíme vytvořit klíčenku příkazem pacman-key --init, poté přidáme klíče Arch ARM repozitářů příkazem pacman-key --populate archlinuxarm. Teď můžete příkazem pacman -Sy repozitáře synchronizovat.

+ +

Jako první balík bychom měli stáhnout sudo, abychom nemuseli používat root uživatele pro všechno nastavování. Nainstalujeme ho příkazem pacman -S sudo. Dále příkazem nano /etc/sudoers upravíme konfiguraci. Najdeme následující řádky (Ctrl+W pro hledání):

+
## Uncomment to allow members of group wheel to execute any command
+#%wheel ALL=(ALL:ALL) ALL
+
+

a odstraníme mřížku před % pro odstranění komentáře. Tím umožníme uživatelům v uživatelské skupině wheel používat příkaz sudo.

+ +

Nyní přidáme uživatele alarm do skupiny wheel příkazem gpasswd -a alarm wheel. A teď už můžeme používat uživatele alarm pro různé administrativní operace místo roota.

+ +

Nastavení SSH přístupu

+

Možná vás nebaví zapojovat RPi do monitoru nebo u něj klapat věci do klávesnice v terminálu nebo jen chcete vzdálený přístup. SSH lze povolit skrz OpenSSH, které je na Archu předinstalované. Stačí povolit službu pomocí systemctl enable sshd. Pro nějakou pokročilou konfiguraci si prohlédněte Arch Wiki.

+ +

Nyní se stačí připojit skrz nějaký SSH klient na vaše zařízení (pokud neznáte IP, podívejte se skrz příkaz ip a), třeba skrz ssh alarm@vase.ip.adresa.

+ +

HTTPS problémy

+

Pokud máte problémy s SSL nebo komunikací se zabezpečenými servery, zkuste nainstalovat balík ca-certificates a nastavit systémový čas skrz timedatectl set-time "2022-10-29 15:00:00 (samozřejmě vaše datum).

+ +

Závěr

+ +

Arch neofetch

+ +

Instalace je opravdu prostý a snadný proces (i když jsem ho sám dělal asi 5x než mi to nabootovalo), takže určitě zkoušejte a zkoušejte.

+ + +
+ +
+
+ +
+
+
Related Articles
+ +
+
+ + + +
+
+ + +
+ +
+ +
+
+ + diff --git a/vychytávky/2022/05/31/codespaces.html b/vychytávky/2022/05/31/codespaces.html new file mode 100644 index 0000000..dfc6583 --- /dev/null +++ b/vychytávky/2022/05/31/codespaces.html @@ -0,0 +1,760 @@ + + + + + + + + + +GitHub Codespaces aneb VS Code na VPS | Matyáš Caras + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+ +
+
+
+
+ +
+
+ + + + + + + + + +
+

GitHub Codespaces aneb VS Code na VPS

+

Dopřejte si trochu luxusu

+ + +
+
+ +
+ +

Nedávno mi přišel e-mail, že jsem byl přidán do beta testování funkce Codespaces na GitHubu. Stručně, Codespaces má být systém ve kterém si vytvoříte vlastní prostředí pro váš repozitář, do kterého si nainstalujete všechny potřebné knihovny, SDK a balíky. Server, na kterém to všechno běží, si platíte u GitHubu a můžete na něj kdekoliv a kdykoliv přejít přes web do webové, narozdíl od výchozího webového VS Code plně vybavené, verzi VS Code nebo nainstalovaný VS Code a upravovat nebo testovat kód.

+ +

Hodí se pro lidi, kteří nechtějí tahat např. do školy nebo do práce, kde nesmí instalovat externí aplikace, svůj vlastní notebook. +Parametry

+ +

V betě je možné testovat pouze výchozí možnost 4 jádra + 8GB RAM + 32GB úložiště, což definitivně stačí pro osobní a malé projekty. Do konce bety neplatíte nic, ale 4 jádra vyjdou na $0.36 (asi 8,3 kč) za hodinu, tj za hodinu aktivního používání. Codespace se vám automaticky vypne, pokud není po stanovenou dobu nepoužíván, takže můžete předejít placení katastrofických částek. +Ceny Codespaces

+ +

Je to určitě výhodnější, než si platit např. hotové VPS, pokud ho tedy nepoužíváte i na něco smysluplnějšího. +Moje zkušenost

+ +

Samozřejmě jsem nemohl odolat a na OpenCanteen jsem si jeden nechal vytvořit, aniž bych věděl do čeho se vrhám.

+ +

Codespace se vytváří jednoduše kliknutím na tlačítko “Code” ve vašem repozitáří, kde se vám nově zobrazí možnost si Codespace vytvořit.

+ +

Ve výchozím stavu běží server na Ubuntu. Pokud nenajdete docker obraz nebo devcontainer konfigurační soubor, musíte si samozřejmě vše nainstalovat sami, což zas tolik nevadí, protože to nejspíš budete dělat jen jednou, pokud si nebudete s obrazem stroje nějak zahrávat.

+ +

Instalace všeho však probíhá svižně, jelikož asi v Microsoftu mají na rychlejší internet, než já. Samozřejmě vše musíte instalovat skrze terminál (což mě celkem ranilo, jelikož instalovat Android SDK pro flutter byla celkem fuška).

+ +

Pokud používáte Settings Sync ve VS Code, automaticky se vám synchronizují nastavení a rozšíření. Pro pokročilé upravení prostředí slouží konfigurační soubor devcontainer.json +Ceny Codespaces

+ +

Jakmile máte všechno nastavené, už stačí jen využít starého známého Visual Studio Code, které funguje úplně stejně jako na lokálním zařízení. Na Codespace se můžete kdykoli připojit přes webovou adresu.

+ +

Za mě velice praktické pro dříve uvedené typy lidí, už jen záleží, jestli se to zrovna vám za ty peníze vyplatí. Dokumentace je možná trochu chaotická, alespoň pro uživatele co se nevyznají v technologiích jako kontejnery či docker a většiny funkcí využije jen skutečný poweruser (což já určitě nejsem).

+ + +
+ +
+
+ +
+
+
Related Articles
+ +
+
+ + + +
+
+ + +
+ +
+ +
+
+ +