{"title":"uncomfy","subtitle":"uh... i have a website?","link":[{"@attributes":{"rel":"self","type":"application\/atom+xml","href":"https:\/\/uncomfyhalomacro.pl\/atom.xml"}},{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl"}}],"generator":"Zola","updated":"2026-04-07T05:06:31+00:00","id":"https:\/\/uncomfyhalomacro.pl\/atom.xml","entry":[{"title":"Part 7: So I am building a fullstack project","published":"2026-04-07T05:06:31+00:00","updated":"2026-04-07T05:06:31+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202604130543\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202604130543\/","content":"<p>It's been a while, so I kind of forgot to write this series.<\/p>\n<h1 id=\"removed-deno-fresh\">Removed Deno Fresh<a class=\"zola-anchor\" href=\"#removed-deno-fresh\" aria-label=\"Anchor link for: removed-deno-fresh\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>While developing the project, I've noticed a disadvantage of using Deno Fresh.<\/p>\n<p>The disadvantage is Deno Fresh is not well-maintained. The <em>only developer<\/em> that\nwas supposed to maintain it resigned.<\/p>\n<p>Hence, it's not really a good idea for me to write something in Fresh. Sadly, it is what it is.<\/p>\n<h1 id=\"branching-out-for-a-new-project\">Branching out for a new project<a class=\"zola-anchor\" href=\"#branching-out-for-a-new-project\" aria-label=\"Anchor link for: branching-out-for-a-new-project\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I've noticed some pattern I've been doing repetitively\u2014writing migrations.<\/p>\n<p>I was thinking of writing a project similar to alembic. I know SeaORM might\nalready have it but I was curious what the thought process be like in building\nsimilar to alembic and SeaORM.<\/p>\n<h1 id=\"recent-changes\">Recent changes<a class=\"zola-anchor\" href=\"#recent-changes\" aria-label=\"Anchor link for: recent-changes\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I recently fixed some issues on how I handle cookies in axum between backend and client. I've\nbeen using private cookies over signed or plain cookies.<\/p>\n<h1 id=\"another-similar-project\">Another similar project<a class=\"zola-anchor\" href=\"#another-similar-project\" aria-label=\"Anchor link for: another-similar-project\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I also am refreshing my FastAPI knowledge in\n<a rel=\"external\" href=\"https:\/\/codeberg.org\/uncomfyhalomacro\/news-portal\">news-portal<\/a> and\n<a rel=\"external\" href=\"https:\/\/github.com\/uncomfyhalomacro\/mgmt\">mgmt<\/a>.\n<a rel=\"external\" href=\"https:\/\/github.com\/uncomfyhalomacro\/mgmt\">mgmt<\/a> is the basis for my\n<a rel=\"external\" href=\"https:\/\/codeberg.org\/uncomfyhalomacro\/fullstack-fastapi-template\">fullstack-fastapi-template<\/a>.\nI separated the projects, mgmt in GitHub and the template in Codeberg, cause\nmgmt is LLM assisted, specifically, the frontend is generated with LLM to\nexperiment with the backend responses. Not my cup of tea but well, it is what it\nis as recruiters are looking for AI experience.<\/p>\n<h1 id=\"ah-what-are-you-doing-now\">Ah what are you doing now?<a class=\"zola-anchor\" href=\"#ah-what-are-you-doing-now\" aria-label=\"Anchor link for: ah-what-are-you-doing-now\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I don't know much. Currently, I've been looking for work, and it seems it's not\nreally working out for me despite my experience in Rust and Python. The job\nmarket is pretty saturated with LLMs as part of the development process right\nnow, and my degree and background might be a problem. I even got silently\nrejected by a local company in my city. But it is what it is. I'm confident that\nI will get a job but not around this month. Not even sure if May is a good month\ntoo.<\/p>\n"},{"title":"Part 6: So I am building a fullstack project","published":"2026-03-23T00:19:10+00:00","updated":"2026-03-23T00:19:10+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202603081856\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202603081856\/","content":"<p>For the past few days of improving backend and experimenting axum with utoipa, I\ncame to a conclusion that you can offload core logic to regular functions\nfor reuse.<\/p>\n<blockquote>\n<p>Here is a Rust pseudocode of what I mean<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">pub<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> login<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">\tState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">state<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> State<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">\tJson<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">login_details<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">UserLoginRequest<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Result<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#076678, #83A598);\">axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#076678, #83A598);\">response<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Response<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> StatusCode<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">\tlet<\/span><span style=\"color: light-dark(#076678, #83A598);\"> user<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> login_service<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">login_details<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">map_err<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\">err<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">\t\ttracing<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">error!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">?<\/span><span style=\"color: light-dark(#076678, #83A598);\">err<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">\t\tStatusCode<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);font-weight: bold;\">INTERNAL_SERVER_ERROR<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">\t}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">?<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">\tOk<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">user<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">into_response<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span><\/code><\/pre>\n<p>Currently, my code smell is actually passing the functions that process form data\nto a function that process json data when I was experimenting form based logins\nwith reverse-proxy and it hit me\u2014I should separate core business logic when handling\ndata. Oh well, I'll be on a huge refactor, mostly separating similar logic into a services\nmodule so I won't repeat myself.<\/p>\n<\/blockquote>\n<p>I also encountered a <a rel=\"external\" href=\"https:\/\/github.com\/juhaku\/utoipa\/issues\/1190\">bug<\/a> in utoipa\nof which is not very obvious at first. The workaround is ensuring that functions with\nthe same paths have different namings.<\/p>\n<p>For example, if you have function in <code>public<\/code> and <code>admin<\/code> modules that handle\nlogins, instead of naming them both as <code>login<\/code>, name them separately as\n<code>public_login<\/code> and <code>admin_login<\/code>. Another workaround I have was hard-coding the\npaths.<\/p>\n<p>I actually combined both and I think I rather do the former since I think\nnesting should be reused here.<\/p>\n<p>However, the latter is still problematic as it is affected by the same bug if\nyou accidentally rename the functions to the same name so <code>\/admin\/login<\/code> and\n<code>\/api\/login<\/code> are merged as either <code>\/admin\/login<\/code> or <code>\/api\/login<\/code> whichever comes\nfirst when generating the openapi data.<\/p>\n<blockquote>\n<p>So why talk about <strong>form data<\/strong>?<\/p>\n<\/blockquote>\n<p>I recently came across the usage of the <code>formaction<\/code> attribute. It's basically <code>href<\/code> but\nsends a form data request to the target path. Hence, I've been experimenting using <code>caddy<\/code>\nto reverse-proxy both my frontend and backend to a common URL e.g. <code>https:\/\/localhost:8888<\/code>.<\/p>\n<p>The downside is that, I won't be doing manual <code>fetch<\/code> in the frontend client, meaning,\nthis approach is unable to use JSON as a request body for requests in the backend.<\/p>\n<p>Another downside is I am not able to use the routes that use JSON as the request body.<\/p>\n<p>However, I believe that the upsides far outweigh the downsides because we can always\ncreate a toggle for the frontend to use the JSON based routes. Another upside\nis the refactor, which means it's easy to swap <code>Form&lt;T&gt;<\/code> to <code>JSON&lt;T&gt;<\/code>.<\/p>\n<p>That's all for this project's update. I think I'll be taking a 1 day break from it. Too tired since\nyesterday.<\/p>\n"},{"title":"Part 5: So I am building a fullstack project","published":"2026-03-15T07:07:34+00:00","updated":"2026-03-15T07:07:34+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202603134346\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202603134346\/","content":"<p>So I made some various experimentations with Fresh and Preact.<\/p>\n<p>Nothing really big but just some surface-level crap that I've been doing.<\/p>\n<h1 id=\"what-the-hell-even-are-signals\">What the Hell Even Are Signals?<a class=\"zola-anchor\" href=\"#what-the-hell-even-are-signals\" aria-label=\"Anchor link for: what-the-hell-even-are-signals\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I was trying to experiment with Tailwind CSS built into the\nfrontend template like for empty input or a status code that isn't\n201 or 200, specifically for the register and login modals.<\/p>\n<p>From my understanding, Signals looks similar to React's <code>useState<\/code>.<\/p>\n<p>The usage is similar as well, but I am not sure what the differences are.<\/p>\n<p>Preact describes signals as an efficient way to update UI states.<\/p>\n<blockquote>\n<p>In Preact, when a signal is passed down through a tree as props or context,\n<em>we're only passing around references to the signal<\/em>.<\/p>\n<\/blockquote>\n<p>This means that signals are efficient because they avoid reinitialisation and\nonly update the value <em>to the reference of the signal<\/em>.<\/p>\n<p>This means we can also do some minor optimisations like avoiding rerendering\nof the DOM.<\/p>\n<p>At first, I didn't get it because it was an entirely new thing to me. After a bit\nof reading, I think I get the idea now if combined with <code>useComputed<\/code>. To localise\nthe state into only a component, Preact suggests to use <code>useComputed<\/code> with <code>useSignal<\/code>.<\/p>\n<p>For example, prior to the use of <code>useComputed<\/code>, I would access a value\ninside a JSX\/TSX and compare it to another value to render a JSX\/TSX element.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"typescript\"><span class=\"giallo-l\"><span>    &lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">div<\/span><span>&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">     {<\/span><span style=\"color: light-dark(#076678, #83A598);\">statuscode<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">value<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> !==<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 200<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> &amp;&amp;<\/span><span> (<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      &lt;<\/span><span style=\"color: light-dark(#076678, #83A598);\">a<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        class<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">text-center rounded-md bg-white hover:bg-gray-100 text-black py-2 focus:outline-2 focus:outline-offset-2 focus:outline-white-500 <\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        href<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/signup<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      &gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        Create<\/span><span style=\"color: light-dark(#076678, #83A598);\"> Account<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">\/<\/span><span style=\"color: light-dark(#076678, #83A598);\">a<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&gt;<\/span><span>}<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">\/<\/span><span style=\"color: light-dark(#076678, #83A598);\">div<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span><\/code><\/pre>\n<p>After I knew about <code>useComputed<\/code>, I just put it inside a <code>useComputed<\/code> declaration<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"typescript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">  const<\/span><span style=\"color: light-dark(#076678, #83A598);\"> showSignup<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> useComputed<\/span><span>(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> =&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    statuscode<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">value<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> !==<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 200<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> &amp;&amp;<\/span><span> (<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      &lt;<\/span><span style=\"color: light-dark(#076678, #83A598);\">a<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        class<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">text-center rounded-md bg-white hover:bg-gray-100 text-black py-2 focus:outline-2 focus:outline-offset-2 focus:outline-white-500 <\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        href<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/signup<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      &gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        Create<\/span><span style=\"color: light-dark(#076678, #83A598);\"> Account<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">\/<\/span><span style=\"color: light-dark(#076678, #83A598);\">a<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span>    )<\/span><\/span>\n<span class=\"giallo-l\"><span>  )<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span><\/code><\/pre>\n<p>I won't claim that it actually does optimisations but this is what Preact said\nwhen accessing a signal's value inside a JSX.<\/p>\n<blockquote>\n<p>In Preact, accessing a signal's .value property from within a component\nautomatically re-renders the component when that signal's value changes.<\/p>\n<\/blockquote>\n<p>Accessing the signal's value in an event handler does not cause a re-render.<\/p>\n<p>Once the value changes, only that part of the component updates, and not the\nwhole component itself.<\/p>\n<p>Here is an ASMR of the login and register. Of course I will use the\ntemplate's background gradient \ud83e\udd23<\/p>\n<video width=\"640\" controls>\n  <source src=\".\/sc1.mp4\" type=\"video\/mp4\">\n<\/video>\n<h1 id=\"how-about-the-backend\">How About the Backend?<a class=\"zola-anchor\" href=\"#how-about-the-backend\" aria-label=\"Anchor link for: how-about-the-backend\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I have to adjust some changes to the backend when experimenting the frontend.<\/p>\n<p>I noticed that I have to handle empty inputs as well which sends a <code>422 UNPROCESSABLE ENTITY<\/code> (looks\nlike it's called <code>UNPROCESSABLE CONTENT<\/code> in the <a rel=\"external\" href=\"https:\/\/httpwg.org\/specs\/rfc9110.html#rfc.section.15.5.21\">https:\/\/httpwg.org\/specs\/rfc9110.html#rfc.section.15.5.21<\/a> hmmmm).<\/p>\n<p>Other errors or status codes returned are <code>401 UNAUTHORIZED<\/code>, <code>500 INTERNAL SERVER ERROR<\/code>, <code>409 CONFLICT<\/code> and <code>400 BAD REQUEST<\/code>.<\/p>\n<p>I also made an API endpoint <code>\/api\/auth\/profile<\/code> to check if the session token is still valid or not with the following code\nbelow.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">pub<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> profile<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    jar<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> CookieJar<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> anyhow<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Result<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">StatusCode<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">UserInfoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> StatusCode<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    tracing<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">info!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">?<\/span><span style=\"color: light-dark(#076678, #83A598);\">jar<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Some<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> jar<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">session_token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">map<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\">cookie<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> cookie<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">value<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_owned<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    else<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">        return<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Err<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">StatusCode<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);font-weight: bold;\">UNAUTHORIZED<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    }<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> jwt_service<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> JwtService<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">some-secret<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> None<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> claims<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> jwt_service<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">verify<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> None<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> None<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> None<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> None<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">map_err<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\">err<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">            tracing<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">error!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">%<\/span><span style=\"color: light-dark(#076678, #83A598);\">err<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">            StatusCode<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);font-weight: bold;\">UNAUTHORIZED<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">        }<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">?<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Some<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> claims<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>sub <\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">else<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">        return<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Err<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">StatusCode<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);font-weight: bold;\">UNAUTHORIZED<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    }<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Some<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">email<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> claims<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>iss <\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">else<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">        return<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Err<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">StatusCode<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);font-weight: bold;\">UNAUTHORIZED<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    }<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> mut<\/span><span style=\"color: light-dark(#076678, #83A598);\"> user_info<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> UserInfoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        email<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        roles<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Vec<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        first_name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> None<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        last_name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> None<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    }<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    if<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> let<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Some<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">extras<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> &amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">claims<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>extras <\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> first_name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> extras<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">first_name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> last_name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> extras<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">last_name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> roles_s<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> extras<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">roles<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        user_info<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>first_name <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#076678, #83A598);\"> first_name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">cloned<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        user_info<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>last_name <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#076678, #83A598);\"> last_name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">cloned<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">        if<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> let<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Some<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">roles<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> roles_s<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">            let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> role_str<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Vec<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">str<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> roles<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">split<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">collect<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">            let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> roles<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Vec<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">i32<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> role_str<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">                .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">iter<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">                .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">map<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\">x<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> x<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">parse<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">i32<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">                .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">collect<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Result<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Vec<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">i32<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> ParseIntError<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">                .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">map_err<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\">err<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">                    tracing<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">error!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">%<\/span><span style=\"color: light-dark(#076678, #83A598);\">err<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">                    StatusCode<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);font-weight: bold;\">UNAUTHORIZED<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">                }<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">?<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">            user_info<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>roles <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#076678, #83A598);\"> roles<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">        }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    }<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    tracing<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">info!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Passed validation \u2705<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Ok<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">StatusCode<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);font-weight: bold;\">OK<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">user_info<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span><\/code><\/pre>\n<p>I am pretty sure the logic can be reused as middleware for\nhandling routes that require a valid session token.<\/p>\n<p>Security-wise, I would probably ask an expert or do research\nbecause I believe if someone has the token string taken from\nthe cookie, it would be so problematic. The only protection it\nhas is the signature verification of which I am unsure if it\nis very protective enough.<\/p>\n<p>That's all. I'll continue building the database crate again\nfor the products schema.<\/p>\n"},{"title":"Part 4: So I am building a fullstack project","published":"2026-03-12T01:55:47+00:00","updated":"2026-03-12T01:55:47+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202603095442\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202603095442\/","content":"<p>Another project update for our <a href=\"\/tags\/mercado-series\">mercado-series<\/a>.<\/p>\n<h1 id=\"what-was-done-so-far\">What Was Done So Far?<a class=\"zola-anchor\" href=\"#what-was-done-so-far\" aria-label=\"Anchor link for: what-was-done-so-far\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I have implemented the initial JSON Web Token logic for the <code>auth<\/code> crate.<\/p>\n<p>Using the builder pattern, I came up with the following builder struct and its\nassociated Claims struct to generate claims (or payload) for generating the\ntoken.<\/p>\n<p>You can see how it was used here in the <a rel=\"external\" href=\"https:\/\/codeberg.org\/uncomfyhalomacro\/mercado\/src\/commit\/5d31a5361faeda729a9b0efe7dcb24b5ca768242\/crates\/auth\/src\/jwt\/service.rs#L55-L152\">following lines of\ncode, alongside the JwtService struct<\/a>\nfrom our <code>service.rs<\/code>.<\/p>\n<p>It's flexible enough that I can basically tell it's just a wrapper around the <code>jsonwebtoken<\/code> crate that it is using.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> test_correct_signature<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> secret<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">dumb_secret<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> builder<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> ClaimsBuilder<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">5<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> *<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 60<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> secret<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> claims<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> builder<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">build<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> jwt_service<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> JwtService<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">secret<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> None<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> token_res<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> jwt_service<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">sign<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">claims<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        assert!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">token_res<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">is_ok<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> token<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> token_res<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        assert!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">jwt_service<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">verify<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> None<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> None<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> None<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> None<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">is_ok<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    }<\/span><\/span><\/code><\/pre><h1 id=\"fixing-some-sql-schema-and-logic\">Fixing Some SQL Schema and Logic<a class=\"zola-anchor\" href=\"#fixing-some-sql-schema-and-logic\" aria-label=\"Anchor link for: fixing-some-sql-schema-and-logic\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>So far the <code>just<\/code> recipes for running the tests are problematic (and they still are)\nbecause I find bugs here and there.<\/p>\n<p>What I realise is because the migrations to create the tables should have <code>IF NOT EXISTS<\/code>\nso it would only create the tables if they do not exist.<\/p>\n<p>Another issue is the lack of variables that are related to the tests themselves. For now,\nthe current solution is just a band-aide. I am pretty surer there is a better way to\nstructure the tests like putting a separate justfile script in a separate directory.<\/p>\n<p>But for now, I'll just let it be.<\/p>\n<p>The next step is adding Oath2.0 logic using <code>openidconnect<\/code> crate to the <code>auth<\/code> crate.<\/p>\n<p>Once that's done, I'll try implementing the <code>payments<\/code> crate. I believe there is already\nclient libraries for Payrex and Stripe payments. Not sure about Wise, I can try Wise too\nsince I already have a Wise card.<\/p>\n<p>So far so good. No progress on the frontend yet.<\/p>\n"},{"title":"Part 3: So I am building a fullstack project","published":"2026-03-10T00:51:55+00:00","updated":"2026-03-10T00:51:55+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202603085047\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202603085047\/","content":"<p>Now back to the progress. I was busy with other personal stuff lately.<\/p>\n<p>I've decided to rework some of the SQL schemas of the tables.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"sql\"><span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">CREATE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> TABLE<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> users<\/span><span> (<\/span><\/span>\n<span class=\"giallo-l\"><span>    id uuid <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">PRIMARY KEY<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    roles <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">INTEGER<\/span><span>[]<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOT NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    first_name <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TEXT<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    last_name <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TEXT<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    email <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TEXT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOT NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    created_at <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TIMESTAMP<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TZ<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOW<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    updated_at <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TIMESTAMP<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TZ<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOW<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    CONSTRAINT<\/span><span> unique_email <\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">UNIQUE<\/span><span> (email)<\/span><\/span>\n<span class=\"giallo-l\"><span>);<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">CREATE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> TABLE<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> user_passwords<\/span><span> (<\/span><\/span>\n<span class=\"giallo-l\"><span>    id uuid <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">PRIMARY KEY<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    user_id uuid <\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">NOT NULL<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> REFERENCES<\/span><span> users(id) <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">ON DELETE CASCADE<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    password_hash <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TEXT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOT NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    created_at <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TIMESTAMP<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TZ<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOW<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    updated_at <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TIMESTAMP<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TZ<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOW<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    CONSTRAINT<\/span><span> FK_userId <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">FOREIGN KEY<\/span><span> (user_id) <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">REFERENCES<\/span><span> users(id),<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    CONSTRAINT<\/span><span> unique_user_id <\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">UNIQUE<\/span><span> (user_id)<\/span><\/span>\n<span class=\"giallo-l\"><span>);<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">CREATE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> TABLE<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> audit_logs<\/span><span> (<\/span><\/span>\n<span class=\"giallo-l\"><span>    id UUID <\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">NOT NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    table_oid <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">OID<\/span><span>, <\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">--<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> pertains to the oid of the table in the information schema. aliased to a u32 integer<\/span><\/span>\n<span class=\"giallo-l\"><span>    entity_id UUID <\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">NOT NULL<\/span><span>, <\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">--<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> this pertains to the table row&#39;s id<\/span><\/span>\n<span class=\"giallo-l\"><span>    event_type <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TEXT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOT NULL<\/span><span>, <\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">--<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> actions that happened such as adding products in stock. Removing them will remove this row as well<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    data<\/span><span> JSONB,<\/span><\/span>\n<span class=\"giallo-l\"><span>    created_at <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TIMESTAMP<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TZ<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> now<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span>);<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">CREATE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> TABLE<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> products<\/span><span> (<\/span><\/span>\n<span class=\"giallo-l\"><span>    id UUID <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">PRIMARY KEY<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    seller_id UUID <\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">NOT NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    name<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> TEXT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOT NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    description<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> TEXT<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    item_type <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TEXT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOT NULL<\/span><span>, <\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">--<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> product, service<\/span><\/span>\n<span class=\"giallo-l\"><span>    unit_price <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">NUMERIC<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">12<\/span><span>,<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">2<\/span><span>)<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    currency <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">CHAR<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">3<\/span><span>)<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    metadata JSONB, <\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">--<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> extra metadata the seller or us wants to include without changing the table<\/span><\/span>\n<span class=\"giallo-l\"><span>    is_active <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">BOOLEAN<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span> TRUE,<\/span><\/span>\n<span class=\"giallo-l\"><span>    created_at <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TIMESTAMP<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TZ<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> now<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    updated_at <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TIMESTAMP<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TZ<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> now<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span>);<\/span><\/span><\/code><\/pre>\n<p>I already made some migration scripts as well, except for products (I actually\nhave forgotten I didn't implement a migration for products).<\/p>\n<h1 id=\"switching-over-to-nix-for-development-environment-management\">Switching over to Nix for Development Environment Management<a class=\"zola-anchor\" href=\"#switching-over-to-nix-for-development-environment-management\" aria-label=\"Anchor link for: switching-over-to-nix-for-development-environment-management\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I made some changes as well on how I manage my development environment. I am\nusing <code>nix<\/code>, specifically the one made by <a rel=\"external\" href=\"https:\/\/determinate.systems\">https:\/\/determinate.systems<\/a> since\nthey have the best configuration on a macOS environment as far as I know. Since\nI don't have time to relearn the Nix language, I decided to use what I can\nremember plus with the help of LLMs like ChatGPT and Gemini.<\/p>\n<p>I also adjusted my shell environment with the help of <code>direnv<\/code>. <a rel=\"external\" href=\"https:\/\/github.com\/mmfallacy\">Mmfallacy<\/a> suggested\nto add some sort of indicator to my shell prompt that I am inside a Nix environment, so I came up with\nmodifying the following lines to my <code>~\/.zshrc<\/code>.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">export<\/span><span style=\"color: light-dark(#076678, #83A598);\"> PROMPT<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\\$vcs_info_msg_0_%F{010} %B%F{blue}%n%b%f in %F{black}%K{7}&lt;%3~&gt;%k%f %F{yellow}[%y] %F{green}@ %B%U%F{white}%M%u%b %F{red}%T %F{white}%D{%b %d %Y (%A)}<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">%{\\x1b[0m%}%(?.%F{green} .%F{red}%? )%%%F{none} <\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">export<\/span><span style=\"color: light-dark(#076678, #83A598);\"> PROMPT<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">%F{#2685bd}${DIRENV_PROMPT_PREFIX:+$DIRENV_PROMPT_PREFIX}%f<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">PROMPT<\/span><\/span><\/code><\/pre>\n<p>To get the <code>DIRENV_PROMPT_PREFIX<\/code> environment variable, I adjusted the project's <code>.envrc<\/code> that <code>direnv<\/code> uses<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>use flake<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>description=$(nix flake metadata --json | jq &#39;.description&#39; | tr -d &#39;&quot;&#39;)<\/span><\/span>\n<span class=\"giallo-l\"><span>fingerprint=$(nix flake metadata --json | jq &#39;.fingerprint&#39; | tr -d &#39;&quot;&#39; | cut -c1-6)<\/span><\/span>\n<span class=\"giallo-l\"><span>export DIRENV_PROMPT_PREFIX=&quot;\u2744\ufe0f(nix-${description}-${fingerprint})<\/span><\/span>\n<span class=\"giallo-l\"><span>&quot;<\/span><\/span><\/code><\/pre>\n<p>This way, <code>direnv<\/code> will inject new environmental variables to my shell's RC. Now, my prompt looks like\nthe screenshot below.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202603085047\/.\/alacritty-1.png\" alt=\"screenshot of tmux with four split panes with new prompt in the second pane\" \/><\/p>\n<p>I am not sure how useful <code>description<\/code> and <code>fingerprint<\/code> fields are but I guess\nthat's fine because I can determine which environment using their uniqueness whenever if I have multiple\nprojects managed by flakes in the future.<\/p>\n<p>Because of this, even I tested that it's possible to use PostgreSQL outside homebrew so I uninstalled it and\nadjusted my <code>justfile<\/code> now to look like this<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>set shell := [&quot;bash&quot;, &quot;-cu&quot;]<\/span><\/span>\n<span class=\"giallo-l\"><span>set dotenv-load<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>serve: serve<\/span><\/span>\n<span class=\"giallo-l\"><span>test-user-models:<\/span><\/span>\n<span class=\"giallo-l\"><span>\tjust migrate-down || true<\/span><\/span>\n<span class=\"giallo-l\"><span>\tjust migrate-up || true<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcargo test<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>migrate-up:<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcargo run --bin up_0001_users || true<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcargo run --bin up_0002_audit_logs<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>migrate-down:<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcargo run --bin down_0001_users || true<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcargo run --bin down_0002_audit_logs<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>build-backend:<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcargo build<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>serve-backend: build-backend<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcargo run<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>build-frontend:<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcd frontend &amp;&amp; deno task build<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>serve-frontend:<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcd frontend &amp;&amp; deno task dev<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>start-db:<\/span><\/span>\n<span class=\"giallo-l\"><span>\tif [ ! -d &quot;${PGDATA}&quot; ]; then initdb -D ${PGDATA}; fi<\/span><\/span>\n<span class=\"giallo-l\"><span>\tpg_ctl -o &quot;${INIT_DB_OPTIONS}&quot; -D ${PGDATA} start<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>stop-db:<\/span><\/span>\n<span class=\"giallo-l\"><span>\tpg_ctl -D ${PGDATA} stop<\/span><\/span>\n<span class=\"giallo-l\"><\/span><\/code><\/pre><h1 id=\"using-something-similar-to-builder-pattern\">Using Something Similar to Builder Pattern<a class=\"zola-anchor\" href=\"#using-something-similar-to-builder-pattern\" aria-label=\"Anchor link for: using-something-similar-to-builder-pattern\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I am also using the builder pattern when I am creating new methods for each of my model structs.<\/p>\n<p>For example, I made a separate method for <code>save_to_db<\/code> because I believe that it should be a separate concern.<\/p>\n<p>As demonstration, here is the <code>Users<\/code> model<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">impl<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Users<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    pub<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">first_name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Option<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">String<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> last_name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Option<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">String<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> email<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> String<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#076678, #83A598);\"> Self<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        Self<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">            id<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Uuid<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new_v4<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">            roles<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Vec<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">            first_name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">            last_name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">            email<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">            created_at<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Utc<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">now<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">            updated_at<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Utc<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">now<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">        }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    }<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    pub<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> save_to_db<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">self<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> pool<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> &amp;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Pool<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Result<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Row<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> PoolError<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> client<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> pool<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">?<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> stmt<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> client<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">prepare_cached<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">INSERT INTO users (id, roles, first_name, last_name, email, created_at, updated_at) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING *<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">?<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> roles<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Vec<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">i32<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> self<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>roles<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">iter<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">map<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">x<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> x<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> as<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> i32<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">collect<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> row<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> client<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">            .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">query_one<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">                &amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">stmt<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">                &amp;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">                    &amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">self<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">                    &amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">roles<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">                    &amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">self<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>first_name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">                    &amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">self<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>last_name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">                    &amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">self<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>email<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">                    &amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">self<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>created_at<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">                    &amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">self<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>updated_at<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">                ]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">            )<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">            .<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">?<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        Ok<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">row<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    }<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    pub<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> hash_password<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        &amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">self<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        plain_text_password<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> &amp;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">str<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    )<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Result<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">UserPasswords<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> password_hash<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Error<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> salt<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> SaltString<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">generate<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">mut<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> OsRng<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> password<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> plain_text_password<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">as_bytes<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> argon2<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Argon2<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">default<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> password_hash<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> argon2<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">hash_password<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">password<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> &amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">salt<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">?<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> id<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Uuid<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new_v4<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        Ok<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">UserPasswords<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">            id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">            user_id<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#076678, #83A598);\"> self<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">            password_hash<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">            created_at<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Utc<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">now<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">            updated_at<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Utc<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">now<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">        }<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    }<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    pub<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> get_user_password_hash<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">self<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> pool<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> &amp;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Pool<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Result<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">UserPasswords<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> PoolError<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        UserPasswords<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">from_user_id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">pool<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> &amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">self<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span><\/code><\/pre>\n<p>And the tests that go alongside it.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">\/\/<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> snipped...<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    #<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>tokio<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>test<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> add_user<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        dotenv<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">ok<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> cfg<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Config<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">from_env<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> pool<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> cfg<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>pg<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">create_pool<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Some<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Runtime<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Tokio1<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> NoTls<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        assert!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">table_exists<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">pool<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">users<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> new_user<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Users<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">            Some<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">David<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">            Some<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Attenborough<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">            &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">contact@david_attenborough.com<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">        )<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> secure_password<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">very_secure<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        new_user<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">save_to_db<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">pool<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> password<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> new_user<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">hash_password<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">secure_password<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        assert!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">password<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">save_to_db<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">pool<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">is_ok<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    }<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    #<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>tokio<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>test<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> verify_password<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        dotenv<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">ok<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> cfg<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Config<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">from_env<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> pool<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> cfg<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>pg<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">create_pool<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Some<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Runtime<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Tokio1<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> NoTls<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        assert!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">table_exists<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">pool<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">users<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> new_user<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Users<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">            Some<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Fred<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">            Some<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Adila<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">            &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">contact@fredadila.com<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">        )<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> secure_password<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">very_secure<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        new_user<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">save_to_db<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">pool<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> password<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> new_user<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">hash_password<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">secure_password<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        assert!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">password<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">save_to_db<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">pool<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">is_ok<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        assert!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">password<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">verify_password<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">incorrect<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">is_err<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        assert!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">password<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">verify_password<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">very_secure<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">is_ok<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">\/\/<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> snipped...<\/span><\/span><\/code><\/pre>\n<p>That means if we ever write something from initializing new data to saving it to a database, it would look like<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> password_plain<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">verysecure_password<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> user<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Users<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">somedata<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  \/\/<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> somedata is just placeholder<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> user_password<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> user<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">hash_password<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">password_plain<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">user<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">save_to_db<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">pool<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">user_password<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">save_to_db<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">pool<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span><\/code><\/pre>\n<p>I believe I can wrap <code>deadpool_postgres::Pool<\/code> with a <code>Mutex<\/code> or <code>Arc<\/code> because I\nfeel like I am repeating myself whenever I am passing a <code>Pool<\/code> to the method.<\/p>\n<p>The reason that I am against it is because of the nature of the struct fields\nthemselves.<\/p>\n<p>They are clearly mirrored to the SQL schema that I made so if I\nwill add a <code>pool<\/code> field, it would lose its representation and that will likely\nnot communicate well with the model I made.<\/p>\n<p>Hence, I am leaving it at that, to ensure they don't lose what they represent. <em>But I think I can wrap the <code>pool<\/code> outside the structs themselves<\/em>.<\/p>\n<h1 id=\"what-s-next\">What's next<a class=\"zola-anchor\" href=\"#what-s-next\" aria-label=\"Anchor link for: what-s-next\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I will continue adding the migration logic for products and proceed building the <code>auth<\/code> crate. The <code>auth<\/code> crate should have the following<\/p>\n<ul>\n<li>JWT attestation logic<\/li>\n<li>Basic Auth logic<\/li>\n<li>OAuth2.0 logic<\/li>\n<\/ul>\n<p>That's all for now. I'll go continue reading a new manhwa again. Binging never ends.<\/p>\n"},{"title":"Pairing Tmux and Kakoune","published":"2026-03-06T15:25:12+00:00","updated":"2026-03-06T15:25:12+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202603232503\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202603232503\/","content":"<p>Over the past few years, I've been daily driving my favourite editor,\n<a rel=\"external\" href=\"https:\/\/kakoune.org\/\">Kakoune<\/a>.<\/p>\n<p>Although, I am too lazy to fully study its capabilities, it's really a modal\neditor that actually makes sense for me in terms of how it changed text editing\nfrom Vim.<\/p>\n<p>I tried to pair it up with other multiplexers and so far, I think <strong>tmux<\/strong> is\nthe one for me.<\/p>\n<h1 id=\"prior-going-back-to-tmux\">Prior going back to tmux<a class=\"zola-anchor\" href=\"#prior-going-back-to-tmux\" aria-label=\"Anchor link for: prior-going-back-to-tmux\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I tried different terminal multiplexers so far from kitty to tmux to kitty to\n<a rel=\"external\" href=\"https:\/\/wezterm.org\/\">wezterm<\/a> and then <a rel=\"external\" href=\"https:\/\/zellij.dev\">zellij<\/a>.<\/p>\n<p><a rel=\"external\" href=\"https:\/\/github.com\/kovidgoyal\/kitty\">Kitty<\/a> was the terminal emulator that I\nreally loved from 2019-2020. I even remembered trying to create my own small\nplugin just to <a rel=\"external\" href=\"https:\/\/codeberg.org\/uncomfyhalomacro\/erudite.nvim\/src\/branch\/main\/lua\/keymaps\/kitty.lua\">move around with\nneovim<\/a>.<\/p>\n<p>The problem, however is that although neovim has a rich plugin system, it's also\na fast moving target, as the editor has a lot of contributors and experimenting its core\nfrom performance to extensibility. That is good and all but I don't want to maintain\nevery breaking change of the plugin system.<\/p>\n<p>Hence, I <a rel=\"external\" href=\"https:\/\/codeberg.org\/uncomfyhalomacro\/erudite.nvim\/commit\/7c65dad1eef7fc4aafcdfdf3769b17316b9aa473\">abandoned it on June 20,\n2024<\/a>.<\/p>\n<p>I switched kakoune around that time and I noticed that despite its very minimal\nfeatures, it is easy to create a plugin for it by utilizing the existing tools\nin your environment.<\/p>\n<p>Around that time, I think I have switched to zellij because <em>Rust<\/em>. I agree,\nit's a bad childish reason but I also saw zellij's potential. However, I noticed\nthat I am held back by it by a lot that I think I should go back to tmux.<\/p>\n<p>As for the terminal emulator, kitty, I think I abandoned it too not because it's\na bad terminal but having a multiplexer over a multiplexer seems to be a bad\nidea and I am afraid of having conflicting keys and overlapping functionality. I\neven tried wezterm + tmux or ghostty + tmux but I just don't feel like there\nshould be overlaps.<\/p>\n<p>And I don't need ligatures. I was a fan back then of ligatures but because\nligatures are inconsistent across terminal emulators, I decided to just use\nalacritty (or foot on Linux).<\/p>\n<h1 id=\"why-tmux\">Why Tmux?<a class=\"zola-anchor\" href=\"#why-tmux\" aria-label=\"Anchor link for: why-tmux\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Honestly, it's easy to write scripts on tmux. It can be done with zellij of course.\nBut the biggest reason why I prefer tmux over zellij is the default keybinds.<\/p>\n<p>Yes, there is also zellij <em>tmux mode<\/em> but tmux keybinds do not conflict with kakoune\nand that's a thing that I notice when I use kakoune over tmux e.g. reverse-search conflicts\nwith new pane.<\/p>\n<p>Another thing is customizability. Tmux is very old so a lot of plugins and built-ins were\nadded over the years as well as guides that help newcomers.<\/p>\n<blockquote>\n<p>I actually attempted to check a thing where I have to create a script to\nopen <code>fzf<\/code> and pass the selected text for buffer and file selection and\nit seems it's very hard to do with <code>zellij<\/code>. I have to create a helper shell script\nfor it e.g. <a rel=\"external\" href=\"https:\/\/github.com\/uncomfyhalomacro\/kakudite\/blob\/main\/scripts\/fzf-to-kak-client\">https:\/\/github.com\/uncomfyhalomacro\/kakudite\/blob\/main\/scripts\/fzf-to-kak-client<\/a>\nwhereas with <code>tmux<\/code>, it's just <a rel=\"external\" href=\"https:\/\/github.com\/uncomfyhalomacro\/kakudite\/blob\/aa9909d5fe8ebca4766b34ff0844186e9402cc80\/kakudite\/custom-tmux.kak#L83\">https:\/\/github.com\/uncomfyhalomacro\/kakudite\/blob\/aa9909d5fe8ebca4766b34ff0844186e9402cc80\/kakudite\/custom-tmux.kak#L83<\/a><\/p>\n<\/blockquote>\n<p>Although, <code>zellij<\/code> already has a functionality to move a pane to a tab, it does not have<\/p>\n<ul>\n<li>an <code>action<\/code> to move a pane to a tab; or<\/li>\n<li>transform a pane as a tab<\/li>\n<\/ul>\n<p>It's possible to script it but I think I won't go down that route. With <code>tmux<\/code>, it's just<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">tmux<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> break-pane<\/span><\/span><\/code><\/pre>\n<p>Overall, I just can't with <code>zellij<\/code> for now. It's possible that I can write plugins for it but\nI just don't have the time. It's still a good project, and even my friends use it so\nif things improve in the future, I might try but I don't think that's very soon\u2122\ufe0f.<\/p>\n"},{"title":"What are my visions if I became a board member for openSUSE","published":"2026-02-28T15:48:50+00:00","updated":"2026-02-28T15:48:50+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202602234057\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202602234057\/","content":"<h1 id=\"updated\">Updated<a class=\"zola-anchor\" href=\"#updated\" aria-label=\"Anchor link for: updated\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>So my friends actually don't like the idea that I have a self-deprecatory\nsection. I don't see it as self-deprecatory as I was being realistic. But I\ndon't want to disappoint them so I guess I'll have to be performative despite\nthe dire situation I currently am experiencing in my personal life while writing\nthis.<\/p>\n<hr \/>\n<p>I actually read the governance proposal and I think it should be moved forward\nbut that's a collective idea and not really my own.<\/p>\n<h1 id=\"so-what-are-my-own-ideas\">So what are my own ideas?<a class=\"zola-anchor\" href=\"#so-what-are-my-own-ideas\" aria-label=\"Anchor link for: so-what-are-my-own-ideas\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I believe openSUSE is already a popular distribution. And it is really thanks to the\ncollective effort of the community, volunteers, and contributors.<\/p>\n<p>But I also believe we can do more. My experience with volunteering and still developing\nsoftware to improve OpenBuildService packaging have shown me that it is possible to\nincrease adoption and contributions.<\/p>\n<h1 id=\"more-asian-representation\">More Asian Representation<a class=\"zola-anchor\" href=\"#more-asian-representation\" aria-label=\"Anchor link for: more-asian-representation\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>But I want to tackle another problem, I haven't seen so much visibility of\nopenSUSE in southeast Asia.  Yes, there exists an openSUSE community Asia summit\nheld in Indonesia, and I also see some openSUSE members in Discord that are from\nMalaysia, Indonesia and Philippines.  We may exist but we are few. And I think if I\nbecame an openSUSE Board, I would gladly help out promote openSUSE in various places\ne.g. encourage them to join conferences, workshops and the like.<\/p>\n<h1 id=\"a-need-to-improve-our-communications\">A need to improve our communications<a class=\"zola-anchor\" href=\"#a-need-to-improve-our-communications\" aria-label=\"Anchor link for: a-need-to-improve-our-communications\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>openSUSE so far has low barrier to contributors, and I experienced the same thing\nwhen I first joined because of very welcoming members such as Firstyear, LCP, and\nsfaulken. I also made communications albeit uncommon from and to some openSUSE\ncontributors, mostly about fixing some bugs in packaging and also improving the packaging\nsituation. That in itself does not need improvement, after all, open source is a collective\neffort and we spend our free time improving things whenever we can, hopefully not to the extent\nof burnout.<\/p>\n<h2 id=\"blackbox-nature-of-certain-infrastructure\">Blackbox nature of certain infrastructure<a class=\"zola-anchor\" href=\"#blackbox-nature-of-certain-infrastructure\" aria-label=\"Anchor link for: blackbox-nature-of-certain-infrastructure\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>However, we do have a communications problem, and I think it's not really unique to openSUSE.\nOld infra, sudden change of infra etcetera, you get it. A major issue I have with openSUSE\nis the \"blackbox\" nature of OpenBuildService itself. It is <em>open-source<\/em> but it's also\nsomething that even I have a problem with. When the new git workflow was introduced, a lot of\nit wasn't clearly stated. It was suddenly been given to contributors to adopt this workflow,\nespecially to devel projects where they are maintaining some software packages. I was able to\nadapt during that change but my problem was not if I was able to adapt it but what changed.<\/p>\n<ul>\n<li>missing devel projects?<\/li>\n<li>namespaces such as with home projects<\/li>\n<li>git itself<\/li>\n<\/ul>\n<p>I do have a blog post on it and why I was able to create my own namesspace and\n\"branched\" project in <a rel=\"external\" href=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/\">here<\/a>.<\/p>\n<p><em>But how? How do we improve the situation?<\/em> I am not a SUSE employee nor I have been involved internally. That can\nbe solved by letting stakeholders know ahead infrastructure changes and\nintroduce testing and asking them for feedback for the sudden change. Not all\nare actually welcoming the new workflow but it has happened and I don't think\nthat it is planned to be reverted as it seems this was the new workflow in the\nfuture.<\/p>\n<h1 id=\"conclusion\">Conclusion<a class=\"zola-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>If you are going to vote me, I'll find ways in the best of my ability to improve communications and increase\nnumber of contributors we have in our community. I'll find ways to ensure that some changes should be relayed\nto contributors ahead of time without leaving them confused.<\/p>\n"},{"title":"I am running for board membership","published":"2026-02-19T09:51:18+00:00","updated":"2026-02-19T09:51:18+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202602173850\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202602173850\/","content":"<p>Hi there. I am actually running for openSUSE's board membership.<\/p>\n<p><em>And the reality is... I don't know what it's like to run or lead a community.<\/em> \ud83d\ude05<\/p>\n<h1 id=\"so-why\">So why?<a class=\"zola-anchor\" href=\"#so-why\" aria-label=\"Anchor link for: so-why\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>The community is growing. With multiple derivatives, I think it's time that we\nneed to find new stewards of the community. I am not really sure where to start on this\nas, honestly, my only pressing concern is that who are going to replace the <em>oldies<\/em><sup class=\"footnote-reference\" id=\"fr-oldies-1\"><a href=\"#fn-oldies\">1<\/a><\/sup>?<\/p>\n<p>Jokes aside, the openSUSE community is growing but as a community grows, there is also\nanother pressing problem if the current structure of governance can keep up.<\/p>\n<h1 id=\"am-i-capable-to-be-a-board-member-what-even-is-a-board-member\">Am I capable to be a board member? What even is a board member?<a class=\"zola-anchor\" href=\"#am-i-capable-to-be-a-board-member-what-even-is-a-board-member\" aria-label=\"Anchor link for: am-i-capable-to-be-a-board-member-what-even-is-a-board-member\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>The short answer is <em>I don't know<\/em>. The other short answer is <em>no<\/em>.<\/p>\n<p>I am not really sure if I can commit to it either. What I do know is my\npassion for the community.<\/p>\n<p>A board member in openSUSE is to lead the overall project in different areas\nand that includes moderating conflicts, revising rules, and promoting inclusivity.<\/p>\n<p>It may also include initiatives like new projects or conferences and partnerships.<\/p>\n<p>With that said, I don't think there really is much to say to change a board member's\nrole in the community.<\/p>\n<h1 id=\"regarding-the-proposed-changes-on-governance\">Regarding the proposed changes on Governance<a class=\"zola-anchor\" href=\"#regarding-the-proposed-changes-on-governance\" aria-label=\"Anchor link for: regarding-the-proposed-changes-on-governance\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>This thread -&gt; <a rel=\"external\" href=\"https:\/\/lists.opensuse.org\/archives\/list\/project@lists.opensuse.org\/thread\/YKI5QVMT66WMZLOPTCQOEQZPTEWPDIBV\/\">https:\/\/lists.opensuse.org\/archives\/list\/project@lists.opensuse.org\/thread\/YKI5QVMT66WMZLOPTCQOEQZPTEWPDIBV\/<\/a>\ncontains the proposed governance structure for the openSUSE community. It's a lot so you have to read it\nagain and again. Took me days to get to it but I have an idea of what was being proposed.<\/p>\n<p>The proposal is intended to add <em>new committees<\/em> instead of having just the\nboard members pivoting the project. If I can understand correctly, this is meant\nto invite more contributors and allow to diversify the functions and goals of\nthe project as well as ensuring that the community is involved. By adding new\ncommittees, new independent bodies and members will take initiative on how to steer the\nproject in specific areas. Here is a copy of the proposed committees and their roles:<\/p>\n<blockquote>\n<ul>\n<li>Introducing a Technical Steering Committee to provide technical\ndirection and arbitration when consensus fails<\/li>\n<li>Introducing a Community &amp; Marketing Committee focused on community\ngrowth, communication spaces, and outreach<\/li>\n<\/ul>\n<\/blockquote>\n<p>After I read until the end, there really is nothing much that has changed but\njust an additional specificity that the project needs so new contributors are\nnot burdened by confusion. Autonomy is preserved and at least the community now\nhas a clearer way to contribute back without the need to understand the full\nhistory of the project.<\/p>\n<h1 id=\"overall-opinion-about-the-new-governance\">Overall opinion about the new governance<a class=\"zola-anchor\" href=\"#overall-opinion-about-the-new-governance\" aria-label=\"Anchor link for: overall-opinion-about-the-new-governance\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Like Bernhard said, it is well formulated.<\/p>\n<blockquote>\n<p>Although, our views might be different so <em>well formulated<\/em> might be a\ndifferent part of the proposal or the overall proposal itself.<\/p>\n<\/blockquote>\n<p>Because in my opinion, the new governance structure allows that the power to steer the project\nis for the community, by the community, to the world.<\/p>\n<h1 id=\"closing-thoughts-and-concerns\">Closing thoughts and concerns<a class=\"zola-anchor\" href=\"#closing-thoughts-and-concerns\" aria-label=\"Anchor link for: closing-thoughts-and-concerns\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>My only concern now is I have no history of being involved in discussions, especially as a newcomer\nand from Asia and no experience in being a steward of a community. But that's something I'll know\nonce I am elected.<\/p>\n<h1 id=\"answering-the-bonus-question\">Answering the bonus question<a class=\"zola-anchor\" href=\"#answering-the-bonus-question\" aria-label=\"Anchor link for: answering-the-bonus-question\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I'll be honest, the dates are overlapping with my family's celebration plan for my sister's medschool\ngraduation so there is a chance that I am not able to attend oSC2026. Maybe I can attend the openSUSE.Asia Summit\nwhich was proposed to be hosted in Indonesia, a neighbour country. I am excited to attend. Hopefully, I'll get\nemployed by then and save enough to get there (<em>currently unemployed as of writing<\/em> \ud83e\udd40\ud83e\udd40\ud83e\udd40\ud83e\udd40\ud83e\udd40)<\/p>\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn-oldies\">\n<p>Old people 50+yrs oldies. Although, there really is a bit of truth to it that I think we might need to have younger members... <a href=\"#fr-oldies-1\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section>\n"},{"title":"Part 2: So I am building a fullstack project","published":"2026-02-16T00:00:00+00:00","updated":"2026-02-16T07:03:33+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202602125701\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202602125701\/","content":"<p><strong>Update<\/strong>: I moved the project to <a rel=\"external\" href=\"https:\/\/codeberg.org\/uncomfyhalomacro\/mercado\">codeberg<\/a> because I don't want my personal projects to exist there\nexcept for work related and other open source stuff that aren't mine (with also some exceptions of the exceptions).<\/p>\n<p>Still a work in progress and I am kind of slow when planning.<\/p>\n<h1 id=\"restructure\">Restructure<a class=\"zola-anchor\" href=\"#restructure\" aria-label=\"Anchor link for: restructure\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>After doing some cleanup while also doing volunteering over the weekend, I finally decided on the\nfinal structure of the project.<\/p>\n<details>\n<summary>Current project structure<\/summary>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>.<\/span><\/span>\n<span class=\"giallo-l\"><span>\u251c\u2500\u2500 backend<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 Cargo.toml<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2514\u2500\u2500 src<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0     \u2514\u2500\u2500 main.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u251c\u2500\u2500 Cargo.lock<\/span><\/span>\n<span class=\"giallo-l\"><span>\u251c\u2500\u2500 Cargo.toml<\/span><\/span>\n<span class=\"giallo-l\"><span>\u251c\u2500\u2500 crates<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 api<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 Cargo.toml<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 src<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 lib.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 auth<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 Cargo.toml<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 src<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 lib.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 database<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 Cargo.toml<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 src<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u251c\u2500\u2500 bin<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u2514\u2500\u2500 migrations<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2502\u00a0\u00a0     \u251c\u2500\u2500 down<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u2514\u2500\u2500 0001_users.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2502\u00a0\u00a0     \u2514\u2500\u2500 up<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2502\u00a0\u00a0         \u2514\u2500\u2500 0001_users.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u251c\u2500\u2500 core.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u251c\u2500\u2500 lib.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u251c\u2500\u2500 migrations<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u251c\u2500\u2500 down<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 mod.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 users.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u251c\u2500\u2500 mod.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u2514\u2500\u2500 up<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2502\u00a0\u00a0     \u251c\u2500\u2500 mod.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2502\u00a0\u00a0     \u2514\u2500\u2500 users.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u251c\u2500\u2500 models<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u251c\u2500\u2500 mod.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u251c\u2500\u2500 products.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u2514\u2500\u2500 users.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u251c\u2500\u2500 prelude.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 utils<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0         \u2514\u2500\u2500 mod.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2514\u2500\u2500 payments<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0     \u251c\u2500\u2500 Cargo.toml<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0     \u2514\u2500\u2500 src<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0         \u2514\u2500\u2500 lib.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u251c\u2500\u2500 frontend<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 assets<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 styles.css<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ts<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 components<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 Button.tsx<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 deno.json<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 deno.lock<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 islands<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 Counter.tsx<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 main.ts<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 README.md<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 routes<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 _app.tsx<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 api<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 [name].tsx<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.tsx<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 static<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 favicon.ico<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 logo.svg<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 utils.ts<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2514\u2500\u2500 vite.config.ts<\/span><\/span>\n<span class=\"giallo-l\"><span>\u251c\u2500\u2500 justfile<\/span><\/span>\n<span class=\"giallo-l\"><span>\u251c\u2500\u2500 LICENCE<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2514\u2500\u2500 README.md<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>28 directories, 43 files<\/span><\/span><\/code><\/pre><\/details>\n<p>This project structure is still in the works but it is very effective in managing \"which is which\", especially after I realised\nthat it's more efficient to use <code>[workspace.dependencies]<\/code> in the virtual root manifest <code>Cargo.toml<\/code>.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"toml\"><span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">workspace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">members<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">        &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">backend<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">        &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">crates\/api<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">        &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">crates\/auth<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">        &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">crates\/database<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">        &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">crates\/payments<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">resolver<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">3<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">workspace<\/span><span>.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">dependencies<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">serde<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> version<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">1.0.228<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> features<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">derive<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">serde_json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">1.0.149<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">anyhow<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">1.0.101<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">argon2<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> version<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">0.5.3<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> features<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">std<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">chrono<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> version<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">0.4.43<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> features<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">serde<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">config<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">0.15.19<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">deadpool-postgres<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> version<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">0.14.1<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> features<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">serde<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">dotenvy<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">0.15.7<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">terminfo<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">0.9.0<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">tokio<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> version<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">1.49.0<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> features<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">full<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">tokio-postgres<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> version<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">0.7.16<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> features<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">with-uuid-1<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">with-serde_json-1<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">with-chrono-0_4<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">tracing<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> version<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">0.1.44<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> features<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">release_max_level_debug<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">max_level_trace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">tracing-subscriber<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> version<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">0.3.22<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> features<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">env-filter<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">uuid<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> version<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">1.21.0<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> features<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">serde<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">v4<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">utoipa<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">5.4.0<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">utoipa-axum<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">0.2.0<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">utoipa-swagger-ui<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> version<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">9.0.2<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> features<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">axum<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">axum<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">0.8.8<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">tower-http<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> version<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">0.6.8<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> features<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">full<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span><\/code><\/pre>\n<p>It ensures that I can pin 1 version of the same dependency or dependencies across the workspace members instead of\nrunning <code>cargo add<\/code> not knowing it's a version that contains a breaking change.<\/p>\n<h1 id=\"on-migrations\">On migrations<a class=\"zola-anchor\" href=\"#on-migrations\" aria-label=\"Anchor link for: on-migrations\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I was thinking of using SeaORM for migrations but decided against it because I want to try vanilla before tasting other\nflavours, especially convenient ones like SeaORM. I was very much enticed to try SeaORM out when I read their documentation.<\/p>\n<p>But for the sake of learning, I made my own migration script or more accurately, migration executables. I was able to do this\nbecause I was planning to make the <code>database<\/code> crate the entry point for where database functions are called, so it's a library\nand where the migration logic are defined, so it also contains binaries:<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"toml\"><span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">package<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">database<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">version<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">0.1.0<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">edition<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">2024<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">bin<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">up_0001_users<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">src\/bin\/migrations\/up\/0001_users.rs<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">bin<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">down_0001_users<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">src\/bin\/migrations\/down\/0001_users.rs<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">dependencies<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">anyhow<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">workspace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">argon2<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">workspace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">chrono<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">workspace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">config<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">workspace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">deadpool-postgres<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">workspace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">dotenvy<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">workspace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">serde<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">workspace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">serde_json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">workspace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">terminfo<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">workspace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">tokio<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">workspace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">tokio-postgres<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">workspace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">tracing<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">workspace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">tracing-subscriber<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">workspace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">uuid<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">workspace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span><\/code><\/pre>\n<p>Then I created a <code>just<\/code> recipe for <code>migrate-up<\/code> and <code>migrate-down<\/code> to test them out.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>migrate-up:<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcargo run --bin up_0001_users<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>migrate-down:<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcargo run --bin down_0001_users<\/span><\/span><\/code><\/pre>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202602125701\/.\/1.png\" alt=\"migrate-up result\" \/>\n<img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202602125701\/.\/2.png\" alt=\"migrate-down result\" \/><\/p>\n<p>This is just a short update. I am still currently thinking on how to structure the api and I was thinking of using tower-http for convenience\nfor middlewares.<\/p>\n"},{"title":"Part 1: So I am building a fullstack project","published":"2026-02-12T00:00:00+00:00","updated":"2026-02-12T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202602130803\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202602130803\/","content":"<p>I noticed that I haven't challenged myself in building a fullstack project,\nlet alone I have any experience integrating third-party payment APIs such as Stripe,\nand OAuth2.<\/p>\n<p>So in this project, <a rel=\"external\" href=\"https:\/\/github.com\/uncomfyhalomacro\/mercado\">mercado<\/a>. We will not be using\nLLMs or any coding agents in this endeavour. The only time I'll be using is maybe for repetitive tasks\nand for documentation.<\/p>\n<h1 id=\"this-is-a-series\">\"This is a series\"<a class=\"zola-anchor\" href=\"#this-is-a-series\" aria-label=\"Anchor link for: this-is-a-series\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Yes, writing this as a full blog post will take a while because I'll be scaffolding and building this project <em>and might\neven refactor many times<\/em>. Instead, I will write a separate posts from Part 1 until I consider it completed. I call this series\nas <strong>\"So I am building a fullstack project\"<\/strong>, also known as <strong>Mercado Series<\/strong> because it's the name of the repo and project.<\/p>\n<h2 id=\"why-are-you-doing-this\">Why are you doing this?<a class=\"zola-anchor\" href=\"#why-are-you-doing-this\" aria-label=\"Anchor link for: why-are-you-doing-this\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Cause, I noticed that I've been stagnating as well? I mean, I have learnt many things from my last jobs and I think it's high time\nto test out my skills again that I've gained and also challenge myself to build different projects for a <strong>Full Stack Developer<\/strong>\nskill.<\/p>\n<h1 id=\"chosen-technologies\">Chosen technologies<a class=\"zola-anchor\" href=\"#chosen-technologies\" aria-label=\"Anchor link for: chosen-technologies\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>In this project, I'll be using Rust for the backend and Deno+Fresh for the frontend. Why not React? Because I already have\nexperience writing with React. Not saying I am a master of it, but I can definitely write React and learn anything from\nblogs or YouTube. However, I am quite curious about <a rel=\"external\" href=\"https:\/\/fresh.deno.dev\/\">Fresh<\/a> and why the Deno team made it when\nthere are already existing solutions.<\/p>\n<p>I could have used Golang, but that would be for another fullstack project series.<\/p>\n<h1 id=\"initial-project-structure\">Initial project structure<a class=\"zola-anchor\" href=\"#initial-project-structure\" aria-label=\"Anchor link for: initial-project-structure\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I am following a monorepo style with the initial project structure below (dropdown)<\/p>\n<details>\n<summary><b>Initial project structure<\/b><\/summary>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>.<\/span><\/span>\n<span class=\"giallo-l\"><span>\u251c\u2500\u2500 backend<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 Cargo.toml<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2514\u2500\u2500 src<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0     \u2514\u2500\u2500 main.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u251c\u2500\u2500 Cargo.lock<\/span><\/span>\n<span class=\"giallo-l\"><span>\u251c\u2500\u2500 Cargo.toml<\/span><\/span>\n<span class=\"giallo-l\"><span>\u251c\u2500\u2500 crates<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 api<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 Cargo.toml<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 src<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 lib.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 auth<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 Cargo.toml<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 src<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 lib.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 database<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 Cargo.toml<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 src<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 lib.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2514\u2500\u2500 payments<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0     \u251c\u2500\u2500 Cargo.toml<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0     \u2514\u2500\u2500 src<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0         \u2514\u2500\u2500 lib.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>\u251c\u2500\u2500 frontend<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 assets<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 styles.css<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ts<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 components<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 Button.tsx<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 deno.json<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 deno.lock<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 islands<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 Counter.tsx<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 main.ts<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 README.md<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 routes<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 _app.tsx<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 api<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 [name].tsx<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.tsx<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 static<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 favicon.ico<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 logo.svg<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u251c\u2500\u2500 utils.ts<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2502\u00a0\u00a0 \u2514\u2500\u2500 vite.config.ts<\/span><\/span>\n<span class=\"giallo-l\"><span>\u251c\u2500\u2500 justfile<\/span><\/span>\n<span class=\"giallo-l\"><span>\u251c\u2500\u2500 LICENCE<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2514\u2500\u2500 README.md<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>19 directories, 30 files<\/span><\/span><\/code><\/pre><\/details>\n<h1 id=\"defining-the-project\">Defining the project<a class=\"zola-anchor\" href=\"#defining-the-project\" aria-label=\"Anchor link for: defining-the-project\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Since this project is about some webapp that can be deployed over the internet,\nI need to determine the goals and intention of the project. Obviously, one is\nfor learning. But the rest are unknown.<\/p>\n<p>So it's an ecommerce app. Therefore, we need to specify what kind of products we sell,\nand what kind of sellers we have on the platform. Given the name of the project, I guess\nI can think of<\/p>\n<ul>\n<li>fashion\n<ul>\n<li>clothing<\/li>\n<li>shoes<\/li>\n<li>accessories<\/li>\n<\/ul>\n<\/li>\n<li>food\n<ul>\n<li>ingredients<\/li>\n<li>snacks<\/li>\n<\/ul>\n<\/li>\n<li>technology\n<ul>\n<li>computer parts<\/li>\n<li>prebuilt desktops<\/li>\n<li>laptops<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>The categories can still be extended. But for now, let's focus on those. Now I can imagine if\nI were to create a database table schema for these products then it would look like the SQL below<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"sql\"><span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">CREATE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> TABLE<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> products<\/span><span> (<\/span><\/span>\n<span class=\"giallo-l\"><span>\tproduct_id uuid <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">PRIMARY KEY<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcategory <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">INTEGER<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOT NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>\tproduct_name <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TEXT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOT NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcurrency <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">VARCHAR<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">3<\/span><span>)<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOT NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>\tprice <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">NUMERIC<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">12<\/span><span>, <\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">2<\/span><span>),<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">\tdescription<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> TEXT<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcreated_at <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TIMESTAMP<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOW<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>\tupdated_at <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TIMESTAMP<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOW<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span>)<\/span><\/span><\/code><\/pre>\n<p>For users, we need to have some sort of categorisation as well. They can be<\/p>\n<ul>\n<li>sellers<\/li>\n<li>customers\/subscribers<\/li>\n<li>admins<\/li>\n<li>guests<\/li>\n<\/ul>\n<p>And the following tables can be created like this<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"sql\"><span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">CREATE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> TABLE<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> users<\/span><span> (<\/span><\/span>\n<span class=\"giallo-l\"><span>\tid uuid <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">PRIMARY KEY<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcategory <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">INTEGER<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOT NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>\tfirst_name <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TEXT<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>\tlast_name <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TEXT<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>\temail <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TEXT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOT NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>\tcreated_at <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TIMESTAMP<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOW<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>\tupdated_at <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TIMESTAMP<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOW<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">\tCONSTRAINT<\/span><span> unique_email <\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">UNIQUE<\/span><span> (email)<\/span><\/span>\n<span class=\"giallo-l\"><span>);<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">CREATE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> TABLE<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> user_passwords<\/span><span> (<\/span><\/span>\n<span class=\"giallo-l\"><span>    id uuid <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">PRIMARY KEY<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    user_id uuid <\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">NOT NULL<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> REFERENCES<\/span><span> users(id) <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">ON DELETE CASCADE<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    password_hash <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TEXT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOT NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    salt <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TEXT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOT NULL<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span>    created_at <\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">TIMESTAMP<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> DEFAULT<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> NOW<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span>,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    UNIQUE<\/span><span>(user_id)  <\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">--<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> ensures only one current password per user<\/span><\/span>\n<span class=\"giallo-l\"><span>);<\/span><\/span><\/code><\/pre>\n<p>I was thinking of using <code>SERIAL<\/code> or <code>INTEGER<\/code> for ID generation but in this small application,\nI don't think it's that important. I have yet to read or understand the performance implications but\nfor now, I am focusing on the fact that each ID is guaranteed to be unique.<\/p>\n<p><em>OAuth2?<\/em> Let's focus for now the regular login. We'll add OAuth2 later once almost everything has been finalised.<\/p>\n<p><em>How about usernames?<\/em> I don't think they're important. email addresses are already unique on their own.\nBut I can add them if that's really an impactful change.<\/p>\n<h1 id=\"adding-the-database-dependencies\">Adding the database dependencies<a class=\"zola-anchor\" href=\"#adding-the-database-dependencies\" aria-label=\"Anchor link for: adding-the-database-dependencies\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>The file at <code>crates\/database\/Cargo.toml<\/code> contains the following<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"toml\"><span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">package<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">database<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">version<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">0.1.0<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">edition<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">2024<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">dependencies<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">deadpool-postgres<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> version<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">0.14.1<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> features<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">serde<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">tokio<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> version<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">1.49.0<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> features<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">full<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span><\/code><\/pre>\n<p>With the following initial structure<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>.<\/span><\/span>\n<span class=\"giallo-l\"><span>\u251c\u2500\u2500 Cargo.toml<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2514\u2500\u2500 src<\/span><\/span>\n<span class=\"giallo-l\"><span>    \u251c\u2500\u2500 core.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>    \u251c\u2500\u2500 lib.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>    \u251c\u2500\u2500 models<\/span><\/span>\n<span class=\"giallo-l\"><span>    \u2502\u00a0\u00a0 \u2514\u2500\u2500 mod.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>    \u251c\u2500\u2500 prelude.rs<\/span><\/span>\n<span class=\"giallo-l\"><span>    \u2514\u2500\u2500 utils<\/span><\/span>\n<span class=\"giallo-l\"><span>        \u2514\u2500\u2500 mod.rs<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>4 directories, 6 files<\/span><\/span>\n<span class=\"giallo-l\"><\/span><\/code><\/pre>\n<p>The <code>models<\/code> will contain the table definitions, and <code>utils<\/code> will contain common functions that are used around.<\/p>\n<p><code>core<\/code> will encapsulate essential logic, and <code>prelude<\/code> will be used to import all commonly imported public namespaces.<\/p>\n<h1 id=\"to-be-continued\">To be continued<a class=\"zola-anchor\" href=\"#to-be-continued\" aria-label=\"Anchor link for: to-be-continued\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>This post will be continued the following day or week as I have other things to attend called life. See you in the next post.<\/p>\n"},{"title":"Reproducible Builds Does Not Prevent Threats","published":"2026-02-06T00:00:00+00:00","updated":"2026-02-06T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202602003620\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202602003620\/","content":"<blockquote>\n<p><strong>Disclaimer<\/strong>: I am not a security researcher or a cybersecurity expert.\nI am sharing my stance based on my understanding and limited research on the topic.<\/p>\n<\/blockquote>\n<p>I remembered in my project <a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo\">obs-service-cargo<\/a> that there\nwere some opened issues <a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo\/issues\/64\">#64<\/a> and <a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo\/issues\/73\">#72<\/a>. These two issues told that the\nproject does not produce <strong>idempotent<\/strong> or <strong>deterministic<\/strong> build outputs yet\nit <em>passed <strong>audits<\/strong><\/em>.<\/p>\n<p>Honestly, at that time, I don't know much about reproducible builds but I do know that\nit is an attempt to build a project from different builder sources and <strong>hopefully<\/strong>,\nit matches the checksum of their build outputs.<\/p>\n<p>PR <a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo\/pull\/78\">#78<\/a> actually \"fixed\" the bug. But I still have doubts. And after\nlearning it from William Brown, aka, <em>firstyear<\/em>, from his <a rel=\"external\" href=\"https:\/\/fy.blackhats.net.au\/blog\/2021-05-12-compiler-bootstrapping-can-we-trust-rust\/\">blog<\/a> and\nfrom <a rel=\"external\" href=\"https:\/\/web.archive.org\/web\/20200805120504\/https:\/\/blog.cmpxchg8b.com\/2020\/07\/you-dont-need-reproducible-builds.html\">Taviso's blog<\/a>, I realised that reproducible builds does not\ntake account the social engineering in risk modelling when it comes to human behaviour.<\/p>\n<blockquote>\n<p>You might wonder if Taviso has changed his stance since it is on web archive (or wayback machine) now but I did\nemail him and he replied that he didn't change his stance on the matter.\n<img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202602003620\/.\/IMG_2283.jpg\" alt=\"taviso email\" \/><\/p>\n<\/blockquote>\n<p>Yes, this post was overdue and was supposed to be written 3 years ago but I can't sleep and\nI am bored so while I still have this in mind, why not write a new post?<\/p>\n<h1 id=\"an-example-of-an-upstream-and-downstream-build\">An example of an upstream and downstream build<a class=\"zola-anchor\" href=\"#an-example-of-an-upstream-and-downstream-build\" aria-label=\"Anchor link for: an-example-of-an-upstream-and-downstream-build\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>This might not be the best excalidraw + mermaid diagram but I hope it shows an overview of\nhow a downstream and upstream builds their own sources. Let's call this project, Project UWU.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202602003620\/.\/example-vanilla.png\" alt=\"vanilla build\" \/><\/p>\n<p>As you can see here, if we take this literally like how the flowchart looks like, under\nno circumstances that sources and built sources from both upstream and downstream contains\nany malicious intent (well... there is no mention of it yet). But that's from an ideal world,\nand we are living in one where there are also evil people (<em>I am one of them<\/em> \ud83d\ude08).<\/p>\n<p>Joking aside, let's assume that the sources from upstream built the same\nchecksum following reproducible build principles.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>source has checksum &#39;abcd&#39;<\/span><\/span>\n<span class=\"giallo-l\"><span>built source has checksum &#39;uwuwu&#39;<\/span><\/span><\/code><\/pre>\n<p>Of course, the downstream one\nhas a different checksum for its built sources than the upstream one. But both will\nhave the checksum for the <em>unbuilt sources<\/em> themselves, usually a tarball or zip archive.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>source has checksum &#39;abcd&#39;<\/span><\/span>\n<span class=\"giallo-l\"><span>built source after patches has checksum &#39;notuwuenough&#39;<\/span><\/span><\/code><\/pre>\n<p>The benefit of this is that if let's say a distribution have to rebuilt its sources since other packages\nhave updated but the underlying compiler tool necessary to build Project UWU still has unchanged version\nand is the same across all updated machines. Therefore, we can skip building the downstream variant of\nProject UWU.<\/p>\n<h1 id=\"do-not-ever-forget-the-evil-people\">Do not ever forget the evil people<a class=\"zola-anchor\" href=\"#do-not-ever-forget-the-evil-people\" aria-label=\"Anchor link for: do-not-ever-forget-the-evil-people\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Remember what I said about social engineering and evil people? Yes, they exist.\nWhat can you even do about them? Nothing. They can do whatever the hell they\nwant.<\/p>\n<p>The keyword we should talk about here is <em><strong>Trust<\/strong><\/em>, (<em><a rel=\"external\" href=\"https:\/\/trust.ph\/methods\/condoms\/\">not the Filipino brand<\/a><\/em>).<\/p>\n<p>Let's update our flowchart again so you can see what I mean.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202602003620\/.\/example-threatened.png\" alt=\"threatened build\" \/><\/p>\n<p>As you can see from the flowchart above (<em>please zoom or open it in a new tab huhu<\/em>), <strong>IT ONLY TAKES 1 CHANGE OF MAINTAINER\nFOR UPSTREAM TO ACTUALLY BECOME A THREAT<\/strong>. <em>The same thing could be said to the downstream maintainer<\/em>.<\/p>\n<p>In the case of the upstream, this would affect the whole supply chain since<\/p>\n<ol>\n<li>Downstream relies on it<\/li>\n<li>It's the only thing that exists<\/li>\n<li>Because there is no other person or persons to maintain this so YOLO?<\/li>\n<\/ol>\n<p>In the case of the downstream, this would affect the partial (and sometimes whole) supply chain since<\/p>\n<ol>\n<li>They can provide \"innocent\" patches to both downstream and upstream<\/li>\n<li>Consumers are using it on the downstream distribution because they trust the downstream maintainer<\/li>\n<\/ol>\n<blockquote>\n<p>Yeah, Project UWU can un-cute itself because of evil people \ud83d\ude1d<\/p>\n<\/blockquote>\n<h1 id=\"so-how-can-reproducible-builds-not-protect-us\">So how can reproducible builds not protect us<a class=\"zola-anchor\" href=\"#so-how-can-reproducible-builds-not-protect-us\" aria-label=\"Anchor link for: so-how-can-reproducible-builds-not-protect-us\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>What I can see from here is that reproducible builds cannot protect us from these kinds of threats because<\/p>\n<ol>\n<li>It only takes 1 evil person to fuck up the supply chain<\/li>\n<li>Trusting is hard and in this kind of scenario, your only option is to trust that the\nmaintainer\/contributor is not a psychopath.<\/li>\n<li>The checksums do not matter when you are already compromised. However, <em>you can keep a record of the\nchecksum of a malicious source<\/em>.<\/li>\n<\/ol>\n<p>The only way reproducible builds can mitigate threats, from what I can\nunderstand, is <em><strong>after the threats has happened<\/strong><\/em>. <em><strong>But it does not protect\nus from any present event a compromised source\/build has happened until it is noticed<\/strong><\/em>.<\/p>\n<h1 id=\"but-what-about-being-reproducible\">But what about being reproducible?<a class=\"zola-anchor\" href=\"#but-what-about-being-reproducible\" aria-label=\"Anchor link for: but-what-about-being-reproducible\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Well, it does help with build times, but eh... that's the only benefit it can give\u2014to save energy and compute.<\/p>\n<h1 id=\"conclusion\">Conclusion<a class=\"zola-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I know I know I am repeating words, I haven't even looked at the blog posts just\nto see if I can remember what I understand about why reproducible builds cannot\nprotect us from present threats. I am not a cybersecurity expert either. But I\nhave a big imagination.<\/p>\n<p>The only benefit I can imagine from reproducible builds is a record of checksums of\nmalicious sources as well as the record of checksums of malicious built sources.<\/p>\n<p>But it is a fact that many are passionate in building infrastructure around it\njust to prove that it works. However, it still fails to address the social\nengineering which is a big factor in security.<\/p>\n<p>Anyway, goodnight. I think it's 2AM now around my timezone. I need to fix my sleep schedule.<\/p>\n"},{"title":"spacing out","published":"2026-01-24T00:00:00+00:00","updated":"2026-01-24T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/poetry\/entry4\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/poetry\/entry4\/","content":"<p>i'm spacing out tonight,<br \/>\ncold all over and heart's too tight,<\/p>\n<p>life's short but you're all so bright,<br \/>\ni wish i can glow myself light,<\/p>\n<p>i wonder what went wrong,<br \/>\ni still remember and can't move on,<\/p>\n<p>i'm spacing out tonight,<br \/>\nclosely holding on to life<\/p>\n"},{"title":"Axum with utoipa","published":"2026-01-21T00:00:00+00:00","updated":"2026-01-21T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202601195548\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202601195548\/","content":"<p>I have been looking for existing solutions for a Rust equivalent of FastAPI \u2014\nbuilding APIs with the type safety and the convenience of auto-generated API docs\nwith OpenAPI.<\/p>\n<p>And after searching all over the internet, I have found <a rel=\"external\" href=\"https:\/\/github.com\/juhaku\/utoipa\">utoipa<\/a>.\nCurrently, I am most familiar with the <a rel=\"external\" href=\"https:\/\/github.com\/tokio-rs\/axum\">Axum<\/a> web framework when building\nAPIs in Rust.<\/p>\n<p>So in this blog post, I'll show you how to create a simple API with <a rel=\"external\" href=\"https:\/\/github.com\/tokio-rs\/axum\">axum<\/a> and\n<a rel=\"external\" href=\"https:\/\/github.com\/juhaku\/utoipa\">utoipa<\/a>.<\/p>\n<h2 id=\"preparing-your-project\">Preparing your project<a class=\"zola-anchor\" href=\"#preparing-your-project\" aria-label=\"Anchor link for: preparing-your-project\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Run the following commands to initialise a new Rust project<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">cargo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> new<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> axum-api<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">cd<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> axum-api<\/span><\/span><\/code><\/pre>\n<p>Let's add the dependencies<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">cargo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> add<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> tokio<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">F<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> full<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">cargo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> add<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> serde<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">F<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> derive<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">cargo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> add<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> serde_json<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">cargo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> add<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> axum<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">cargo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> add<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> utoipa-swagger-ui<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">F<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> axum<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">cargo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> add<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> utoipa-axum<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">cargo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> add<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> utoipa<\/span><\/span><\/code><\/pre><h2 id=\"what-this-project-does\">What this project does<a class=\"zola-anchor\" href=\"#what-this-project-does\" aria-label=\"Anchor link for: what-this-project-does\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>This project will just do simple CRUD operations and have the following endpoints<\/p>\n<ul>\n<li>POST \/items\/create<\/li>\n<li>GET \/items\/{id}<\/li>\n<li>DELETE \/items\/{id}<\/li>\n<\/ul>\n<p>We can have an SQLite database or some kind of storage we can use to simulate CRUD. But\nI'll just be lazy and use a <a rel=\"external\" href=\"https:\/\/github.com\/xacrimon\/dashmap\">dashmap<\/a>. Hence, adding a new dependency.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">cargo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> add<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> dashmap<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">F<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> serde<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">cargo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> add<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> rand<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  #<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> To generate random ids<\/span><\/span><\/code><\/pre><h3 id=\"creating-our-types\">Creating our types<a class=\"zola-anchor\" href=\"#creating-our-types\" aria-label=\"Anchor link for: creating-our-types\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Let's create our types. Here, we have <code>Item<\/code> and <code>ItemBucket<\/code><\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> dashmap<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">DashMap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> serde<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Deserialize<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> serde<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Serialize<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>derive<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Debug<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Serialize<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Deserialize<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">ToSchema<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">struct<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    pub<\/span><span style=\"color: light-dark(#076678, #83A598);\"> size<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> usize<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    pub<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> String<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">type<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> ItemBucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">DashMap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span><\/code><\/pre>\n<p>The <code>ItemBucket<\/code> uses <code>Arc<\/code> or <strong>atomic reference counted<\/strong> to allow sharing\nownership of the data. The data is of type <code>DashMap&lt;u64, Item&gt;&gt;<\/code> which is just a\nwrapper for <code>HashMap&lt;u64&lt;Item&gt;&gt;<\/code> as <code>Dashmap&lt;T&gt;<\/code> is a direct replacement of\n<code>RwLock&lt;HashMap&lt;T&gt;&gt;<\/code>. Thus, we can set a new type for shared \"app state\" or API state\nto \"store\" data.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>derive<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Default<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">struct<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    bucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> ItemBucket<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span><\/code><\/pre><h3 id=\"building-our-api-endpoints\">Building our API endpoints<a class=\"zola-anchor\" href=\"#building-our-api-endpoints\" aria-label=\"Anchor link for: building-our-api-endpoints\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Here are the following methods for our POST, GET, and DELETE endpoints<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>post<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span>path<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/create<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> responses<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>status <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> OK<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> body <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> create_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> impl<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> IntoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> id<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> u64<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> random<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> generate_random_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">10<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> size<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">capacity<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> size<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>bucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">insert<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> path<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> responses<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>status<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">OK<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> body<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Option<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> get_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> impl<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> IntoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>bucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">map<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\">v<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> v<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>delete<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> path<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> responses<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>status<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">OK<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> body<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Option<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> delete_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> impl<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> IntoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>bucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">remove<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">map<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">_<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> v<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> v<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span><\/code><\/pre>\n<p>And here is the core logic of our main function<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Router<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">extract<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">response<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">IntoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> rand<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">prelude<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">*<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> std<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">sync<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">openapi<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">OpenApiBuilder<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> utoipa_axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">router<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">OpenApiRouter<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> utoipa_axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>routes<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> dashmap<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">DashMap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> rand<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>random<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> serde<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Deserialize<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> serde<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Serialize<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> utoipa_swagger_ui<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">SwaggerUi<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">\/*<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">...our other code here<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">*\/<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>tokio<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>main<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> main<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">default<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">app<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> api<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> OpenApiRouter<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">create_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">get_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">delete_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">layer<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">split_for_parts<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> open_api_builder<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> OpenApiBuilder<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">build<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">nest<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/items<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> api<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> url<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">localhost:3000<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> listener<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> tokio<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">net<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">TcpListener<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">bind<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">url<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> swagger_docs<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> SwaggerUi<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/docs<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">url<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/api-docs\/openapi.json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> open_api_builder<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Router<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">nest<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/items<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">merge<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">swagger_docs<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">serve<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">listener<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span><\/code><\/pre>\n<p>We use the following declaration<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">app<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> api<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> OpenApiRouter<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">create_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">get_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">delete_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">layer<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">split_for_parts<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span><\/code><\/pre>\n<p>to create an axum router called <code>app<\/code> and OpenAPI information called <code>api<\/code> which is passed to\n<code>OpenApiBuilder<\/code>. We used <code>.nest<\/code> method on the <code>OpenApiBuilder<\/code> so our endpoints will start with\nthe route path <code>\/items<\/code>.<\/p>\n<p>Honestly, my only issue currently with the <code>SwaggerUi<\/code> initialisation is the hard-coded <code>\/api-docs\/openapi.json<\/code>.\nIt causes some path issues if the variable is merged incorrectly into the router e.g.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Router<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">nest<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/items<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">merge<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">swagger_docs<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span><\/code><\/pre>\n<p>One would expect that <code>\/items\/docs<\/code> is the path to the OpenAPI documentation\nwhich is correct, but because of the <code>.url<\/code> method, you would also expect that\nit automatically points to <code>\/items\/api-docs\/openapi.json<\/code>... <em>which does not<\/em>.\nThus, the example gives confusion and only shows up if you edit the path by\nprepending <code>\/items\/<\/code> in the search bar. For now, my only workaround and safer\nbet is to ensure that <code>\/docs<\/code> should be at the top-level path of the URL so we\nmerge it giving the complete URL to be <code>localhost:3000\/docs<\/code> while also ensuring that\nour <code>\/api-docs<\/code> are also at the top-level path next to the root <code>\/<\/code>, hence, pointing\nto the correct <code>openapi.json<\/code> data.<\/p>\n<h2 id=\"testing-our-api\">Testing our API<a class=\"zola-anchor\" href=\"#testing-our-api\" aria-label=\"Anchor link for: testing-our-api\"\n  >\u00a7<\/a\n>\n<\/h2>\n<details>\n<summary>\nHere is the fullcode of the API (click to toggle dropdown)\n<\/summary>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Router<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">extract<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">response<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">IntoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> rand<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">prelude<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">*<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> std<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">sync<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">openapi<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">OpenApiBuilder<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> utoipa_axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">router<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">OpenApiRouter<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> utoipa_axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>routes<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> dashmap<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">DashMap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> rand<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>random<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> serde<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Deserialize<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> serde<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Serialize<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">use<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> utoipa_swagger_ui<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">SwaggerUi<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>derive<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Debug<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Serialize<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Deserialize<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">ToSchema<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">struct<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    pub<\/span><span style=\"color: light-dark(#076678, #83A598);\"> size<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> usize<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    pub<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> String<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">type<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> ItemBucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">DashMap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>derive<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Default<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">struct<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    bucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> ItemBucket<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> generate_random_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">length<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> usize<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> String<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    const<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);font-weight: bold;\"> CHARSET<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> &amp;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u8<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 62<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> b<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> mut<\/span><span style=\"color: light-dark(#076678, #83A598);\"> rng<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> rand<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">rng<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    (<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">0<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">..<\/span><span style=\"color: light-dark(#076678, #83A598);\">length<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">map<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\">_<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">            let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> idx<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> rng<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">random_range<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">0<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">..<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);font-weight: bold;\">CHARSET<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">len<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#8F3F71, #D3869B);font-weight: bold;\">            CHARSET<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#076678, #83A598);\">idx<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> as<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> char<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">        }<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">collect<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>post<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span>path<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/create<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> responses<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>status <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> OK<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> body <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> (<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> create_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> impl<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> IntoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> id<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> u64<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> random<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> generate_random_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">10<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> size<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">capacity<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> size<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>bucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">insert<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> path<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> responses<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>status<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">OK<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> body<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Option<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> get_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> impl<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> IntoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>bucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">map<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\">v<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> v<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>delete<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> path<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> responses<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>status<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">OK<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> body<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Option<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> delete_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> impl<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> IntoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>bucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">remove<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">map<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">_<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> v<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> v<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>tokio<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>main<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> main<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">default<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">app<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> api<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> OpenApiRouter<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">create_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">get_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">routes!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">delete_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">layer<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">        .<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">split_for_parts<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> open_api_builder<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> OpenApiBuilder<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">build<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">nest<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/items<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> api<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> url<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">localhost:3000<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> listener<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> tokio<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">net<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">TcpListener<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">bind<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">url<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> swagger_docs<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> SwaggerUi<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/docs<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">url<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/api-docs\/openapi.json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> open_api_builder<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Router<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">new<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">nest<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/items<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">merge<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">swagger_docs<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    axum<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">serve<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">listener<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">await<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">unwrap<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span><\/code><\/pre><\/details>\n<p>Run the following command at the root of the project<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">cargo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> run<\/span><\/span><\/code><\/pre>\n<p>And open the webpage at <code>localhost:3000\/docs<\/code> to see your API docs<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202601195548\/.\/1.png\" alt=\"image\" \/><\/p>\n<p>You can start creating new items by interacting the <code>POST \/items\/create<\/code> section.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202601195548\/.\/2.png\" alt=\"image\" \/><\/p>\n<h2 id=\"but-there-is-a-problem\">But there is a problem<a class=\"zola-anchor\" href=\"#but-there-is-a-problem\" aria-label=\"Anchor link for: but-there-is-a-problem\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>You'll notice by now that interacting with the <code>GET \/items\/{id}<\/code> with the ID presented by the\nresponse you got from <code>POST \/items\/create<\/code> gives you a similar response like below<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"json\"><span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#8F3F71, #D3869B);\">  2852292982480790000<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#8F3F71, #D3869B);\">  null<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span><\/code><\/pre>\n<p>You can test this by checking that the IDs do not really match by modifying the <code>create_item<\/code> method into<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>post<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span>path<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/create<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> responses<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>status <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> OK<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> body <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> (<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> create_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> impl<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> IntoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> id<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> u64<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> random<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    println!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Creating item with ID: <\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> generate_random_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">10<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> size<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">capacity<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> size<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>bucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">insert<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span><\/code><\/pre>\n<p>so you can get output like this<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.48s<\/span><\/span>\n<span class=\"giallo-l\"><span>     Running `target\/debug\/axum-api`<\/span><\/span>\n<span class=\"giallo-l\"><span>Creating item with ID: 4874131135699964599<\/span><\/span><\/code><\/pre>\n<p>The cause of this problem? Javascript.<\/p>\n<h4 id=\"how-to-handle-large-numbers\">How to handle large numbers<a class=\"zola-anchor\" href=\"#how-to-handle-large-numbers\" aria-label=\"Anchor link for: how-to-handle-large-numbers\"\n  >\u00a7<\/a\n>\n<\/h4>\n<p>Javascript cannot handle numbers that are larger than <code>9,007,199,254,740,991<\/code>.\nTo put that into perspective, let's say we set our path parameter as type\n<code>Path&lt;u64&gt;<\/code>. Surely enough, Rust can handle that large number but our Swagger UI\ncannot since it runs on Javascript via web browser.<\/p>\n<blockquote>\n<p>You can test with the <code>curl<\/code> command and it should work just fine though on <code>curl<\/code>.<\/p>\n<\/blockquote>\n<p>To fix this issue, you either change the integer type that can fit the integer\nlimit of <code>9,007,199,254,740,991<\/code> from Javascript e.g. <code>u8<\/code> or <code>u32<\/code>. Another nicer approach is\nto pass a custom JSON with the <code>id<\/code> as a string as part of our <strong>response<\/strong> which is the most\ncommon solution to this problem. Hence, each of our API endpoints should return numbers as\na string if we want to preserve its size and length for conversion later in the Rust backend.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>post<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span>path<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/create<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> responses<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>status <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> OK<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> body <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> (<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">String<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> create_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> impl<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> IntoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> id<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> u64<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> random<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    println!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Creating item with ID: <\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> generate_random_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">10<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> size<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">capacity<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> size<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>bucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">insert<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> path<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> responses<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>status<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">OK<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> body<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">String<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Option<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> get_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> impl<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> IntoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>bucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">map<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\">v<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> v<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>delete<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> path<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> responses<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>status<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">OK<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> body<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">String<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Option<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> delete_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> impl<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> IntoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>bucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">remove<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">map<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">_<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> v<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> v<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\">item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span><\/code><\/pre>\n<p>You can see here that we have adjusted by calling the <code>.to_string<\/code> method. You might want to add\na method for <code>Item<\/code> to convert large numbers to strings e.g.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">impl<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> to_javascript_compatible_values<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">self<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> serde_json<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Value<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> size_str<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> self<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>size<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> self<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        serde_json<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">json!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">            {<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">size<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#076678, #83A598);\"> size_str<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">               &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">            }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">        )<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span><\/code><\/pre>\n<p>of which we can now use to further update the API endpoint functions<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>post<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span>path<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/create<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> responses<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>status <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> OK<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> body <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> (<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">String<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> serde_json<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Value<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> create_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> impl<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> IntoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> id<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> u64<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> random<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    println!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Creating item with ID: <\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> generate_random_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">10<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> size<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">capacity<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> size<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>bucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">insert<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">clone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_javascript_compatible_values<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> path<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> responses<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>status<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">OK<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> body<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">String<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Option<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#076678, #83A598);\">serde_json<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Value<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> get_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> impl<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> IntoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>bucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">map<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\">v<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> v<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_javascript_compatible_values<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span>utoipa<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span>path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>delete<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> path<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> responses<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span>status<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">OK<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> body<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">String<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Option<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#076678, #83A598);\">serde_json<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Value<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">async<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> fn<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> delete_item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">u64<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">app_state<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> Extension<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Arc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">AppState<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> -&gt;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> impl<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> IntoResponse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> app_state<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>bucket<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">remove<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> maybe_item<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">map<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">_<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> v<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> v<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_javascript_compatible_values<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    Json<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">id<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">to_string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span><\/code><\/pre><h1 id=\"conclusion\">Conclusion<a class=\"zola-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>You can see the full result in the following video below<\/p>\n<video width=\"720\" controls>\n  <source src=\".\/1.mp4\" type=\"video\/mp4\">\n<\/video>\n<p>The full repository can be found <a rel=\"external\" href=\"https:\/\/codeberg.org\/uncomfyhalomacro\/axum-utoipa-example\">here<\/a>.<\/p>\n"},{"title":"Status Update, December 2025","published":"2025-12-31T00:00:00+00:00","updated":"2025-12-31T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202512220549\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202512220549\/","content":"<p>Hi. I haven't done any monthly updates for quite sometime. Although, I did\npromise to myself to do some monthly updates, I also realised that sometimes\nthere is nothing to say that is interesting.<\/p>\n<p>As for what happened in those months, I got employed as a <em>junior software\ndeveloper<\/em>. It was very exciting as it was my first time writing software to be\nused in production. It was also the first time building a system that my\ncolleague refer to as <em>data engineering<\/em> as we have to process data and\ntransform it into some form we can use for our consumers. It was also the first\ntime I was able to write multiple Rust projects (and a Go project) for message\nprocessing.<\/p>\n<p>At first, I thought I will do anything crazy to learn asynchronous programming.<\/p>\n<p>Surprisingly, it was manageable and I have grasped some concepts by imagining a system\nbased of my readings on the Erlang OTP's design and principles -\n<a rel=\"external\" href=\"https:\/\/erlang.org\/download\/armstrong_thesis_2003.pdf\">https:\/\/erlang.org\/download\/armstrong_thesis_2003.pdf<\/a>. And also with my biology background,\nit also helped me understand what a system looks like if everything is running concurrently\nand maybe in parallel at the same time.<\/p>\n<p>Not saying I am an expert yet but what I have learnt helped me create these projects.<\/p>\n<p>But what amazed me this year is that, it was also my first time writing an API in Rust\nwith OpenAPI docs, similar to FastAPI's OpenAPI docs generation. You have to try\n<a rel=\"external\" href=\"https:\/\/docs.rs\/utoipa\/latest\/utoipa\/\">utoipa<\/a> with <a rel=\"external\" href=\"https:\/\/docs.rs\/crate\/axum\/\">axum<\/a>.<\/p>\n<p>I plan to write some tutorial in the future for how to utilise these two crates in building APIs\nas it was really difficult for me the first time to understand how utoipa is being used with\nweb frameworks like axum.<\/p>\n<p>As for life happenings, my physical and mental health has recovered with the\nexception that I have stopped working out for the past few months. I resume next\nyear and set a schedule but I still need to find a gym or place to do so for\nsome personal reasons.<\/p>\n<p>I also have bought some games in Steam such as\n<a rel=\"external\" href=\"https:\/\/en.wikipedia.org\/wiki\/Dispatch_(video_game)\">Dispatch<\/a> and <a rel=\"external\" href=\"https:\/\/en.wikipedia.org\/wiki\/Metro_Exodus\">Metro\nExodus<\/a>.  I already played the\nformer and have yet to play the latter. Dispatch really is a cool interactive\nstory. Hoping for their second installment of the series!<\/p>\n<p>I also have made some cool friends in the open source community in the Philippines. I'll visit them soon!<\/p>\n<p>And lastly, my main game now is <em>Mobile Legends Bang Bang<\/em>. As much as I used to dislike the game before because\nof my opinions on game balancing, I just played it because it was fun in its own way.<\/p>\n<p>That's all for my updates for this year. And I hope everyone's 2026 is a blast as well! \ud83c\udf89<\/p>\n<p><strong>Merry Christmas and a Happy New Year<\/strong> \ud83e\udd73<\/p>\n"},{"title":"Status Update, September 2025","published":"2025-09-25T00:00:00+00:00","updated":"2025-09-25T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202509004656\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202509004656\/","content":"<p>Not really sure what to write on this blog. But for this month's status\nupdate, I don't really have much anything going except volunteer stuff\nin <a rel=\"external\" href=\"https:\/\/ossph.org\">https:\/\/ossph.org<\/a> and <a rel=\"external\" href=\"https:\/\/opensuse.org\">https:\/\/opensuse.org<\/a>.<\/p>\n<p>There are lots of things going on actually and I can't really be bothered\nto type them all.<\/p>\n<p>So I am going to write them in bullet points:<\/p>\n<ul>\n<li>Finally got <code>devel:languages:zig<\/code> approved in openSUSE Build Service. This is to\nexperiment on how we package <a rel=\"external\" href=\"https:\/\/ziglang.org\">Zig<\/a> in openSUSE (and to fix\nother issues such as packages that are still stuck in a Zig version).<\/li>\n<li>Resuming <a rel=\"external\" href=\"https:\/\/boot.dev\">boot.dev<\/a> course. I need to understand\nhow cloud storage works (but it seems to be straightforward... security side of things though i\nsomething I am looking towards into).<\/li>\n<li>Reviving <a rel=\"external\" href=\"https:\/\/ossph.org\">https:\/\/ossph.org<\/a>. The org now plans to revive the community\nby introducing more activities such as talks, workshops or meetups. For\nnow we are doing meetups and increasing engagement in the Discord community.<\/li>\n<li>Got a MacBook Air M2. I might have gone for an M3 or M4 but I can't be bothered\nsince the machine exceeded my expectations. I am writing this post currently\non my MBA. Maybe I will give this to my sister once I had more money as she currently struggles\nwith her MBA M1 (broken kind of keyboard).<\/li>\n<li>Realising that the effort to do something should be compensated with better\nopportunities. And that energy is reciprocated at the same level.<\/li>\n<li>I need to think of solutions to help out the Filipino community. So far, none.<\/li>\n<\/ul>\n<p>Well, that's all for this monthly update.<\/p>\n"},{"title":"Status Update, August 2025","published":"2025-08-15T00:00:00+00:00","updated":"2025-08-15T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202508151949\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202508151949\/","content":"<p>Hello there! I skipped a lot of months because I don't have anything to write actually\nand I was busy improving my skills and learning <a rel=\"external\" href=\"https:\/\/go.dev\">Go<\/a> at <a rel=\"external\" href=\"https:\/\/boot.dev\">Boot.dev<\/a>.<\/p>\n<p>I was also focused on improving my Resume\/CV to land a job. Hopefully, it will be a stable\nfull-time job.<\/p>\n<p>So what happened within those few months before August?<\/p>\n<p>In June 26, I joined <a rel=\"external\" href=\"https:\/\/boot.dev\">Boot.dev<\/a> to improve my skills and relearn\nfundamentals. There, I revisited Python, Data Structures and Algorithms, and Go.<\/p>\n<p>In July 18, I participated <a rel=\"external\" href=\"https:\/\/blog.boot.dev\/news\/hackathon-2025\/\">Boot.dev 2025 Hackathon<\/a> and won <strong>first place<\/strong>\nin their amateur category. I am not sure really if I should have participated in the Pro category but I have\nnot worked as a software developer before, but only as a <strong>technical writer<\/strong>. My project, <a rel=\"external\" href=\"https:\/\/github.com\/uncomfyhalomacro\/bunny\">bunny<\/a>\nis a markdown parser library written in <a rel=\"external\" href=\"https:\/\/harelang.org\"><strong>Harelang<\/strong><\/a> that won in hackathon.<\/p>\n<p>I don't have any other new projects as of the moment but I plan to finish the Golang backend course\nfrom Boot.dev.<\/p>\n<p>Oh yeah, I am still looking for a job, so if you have read this, and find that I fit for a role or believe\nthat I can do it, please contact me!<\/p>\n<p>Bye!<\/p>\n"},{"title":"call","published":"2025-08-13T00:00:00+00:00","updated":"2025-08-13T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/poetry\/entry3\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/poetry\/entry3\/","content":"<p>here i am,<br \/>\nwaiting for your call,<br \/>\nthinking through it all,<br \/>\nfeeling as our hearts fall<\/p>\n<p>close your eyes,<br \/>\npressing skin to skin,<br \/>\nasking what you mean,<br \/>\nliving is not a sin<\/p>\n<p>this is for you,<br \/>\ndon't be sad at all,<br \/>\nlet's face it through it all,<br \/>\nlove will be waiting for your call<\/p>\n"},{"title":"live life it's your last","published":"2025-08-09T00:00:00+00:00","updated":"2025-08-09T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/poetry\/entry2\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/poetry\/entry2\/","content":"<p>you glisten and glow<br \/>\nso do not worry, my love<br \/>\nlive life like it's your last<\/p>\n"},{"title":"Let's revisit packaging with SCMSync workflow","published":"2025-07-20T00:00:00+00:00","updated":"2025-07-21T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/","content":"<p>So here I am doing another attempt at updating a package in openSUSE. This package is <a rel=\"external\" href=\"https:\/\/biomejs.dev\">biome<\/a>. As of writing,\nit's way behind 1 minor version, and still at version 2.0.5.<\/p>\n<h1 id=\"preparing-to-fork-and-clone\">Preparing to fork and clone<a class=\"zola-anchor\" href=\"#preparing-to-fork-and-clone\" aria-label=\"Anchor link for: preparing-to-fork-and-clone\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>The first thing I did was login to <a rel=\"external\" href=\"https:\/\/src.opensuse.org\">https:\/\/src.opensuse.org<\/a> with my openSUSE account.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-19_26_47.png\" alt=\"openSUSE OpenID\" \/><\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-19_30_13.png\" alt=\"openSUSE Login portal\" \/><\/p>\n<p>Once logged in, I headed to <a rel=\"external\" href=\"https:\/\/src.opensuse.org\/javascript\/biome\">https:\/\/src.opensuse.org\/javascript\/biome<\/a>.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-19_32_27.png\" alt=\"openSUSE Gitea Biome Repository\" \/><\/p>\n<p>I clicked the fork button on the upper-right and cloned the repository to inside a local directory, in this case,\nmine is located at <code>~\/development\/git-obs\/<\/code> since this kind of workflow does not really require a \"root\"\nOBS directory e.g. <code>~\/development\/obs<\/code> where it contains directories to projects such as my home project\n<code>home:uncomfyhalomacro<\/code> that contains packages or subprojects.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-19_36_09.png\" alt=\"Forked repo\" \/><\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-19_37_30.png\" alt=\"Running git clone of the forked repo\" \/><\/p>\n<h1 id=\"updating-the-sources\">Updating the sources<a class=\"zola-anchor\" href=\"#updating-the-sources\" aria-label=\"Anchor link for: updating-the-sources\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I deleted the sources first with the following commands:<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">cd<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> biome<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  #<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> heading into the git repository<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> rm<\/span><span style=\"color: light-dark(#076678, #83A598);\"> *<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.tar<\/span><span style=\"color: light-dark(#076678, #83A598);\">*<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  #<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> deleting the sources<\/span><\/span><\/code><\/pre>\n<p>FYI, I accidentally ran <code>osc rm *.tar*<\/code> at first because I was still stuck with the mindset using the old workflow.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-19_40_16.png\" alt=\"Oopsie with the command\" \/><\/p>\n<p>The latest version as of writing is now at 2.1.2 or specifically, at the git tag <code>@biomejs\/biome@2.1.2<\/code>. Seems they use a\ndifferent naming scheme for tagging versions but it's still 2.1.2. No worries because the <code>Source0<\/code> points to\nthe archive of the same naming scheme.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-19_43_21.png\" alt=\"Naming scheme in SOURCE0\" \/><\/p>\n<p>Then I ran the following command.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">osc<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> service<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">vvv<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> mr<\/span><\/span><\/code><\/pre>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-19_46_26.png\" alt=\"Command output for osc service -vvv mr\" \/><\/p>\n<p>As you can see from the image above, biome has a lot of crate dependencies.<\/p>\n<p>This command produced two new tarballs, <code>biome-2.1.2.tar.gz<\/code> and a refreshed <code>vendor.tar.zst<\/code>.<\/p>\n<h1 id=\"updating-the-changes-file\">Updating the changes file<a class=\"zola-anchor\" href=\"#updating-the-changes-file\" aria-label=\"Anchor link for: updating-the-changes-file\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I ran the following command to update the <code>biome.changes<\/code> file.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">osc<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> vc<\/span><\/span><\/code><\/pre>\n<p>However, this makes this a manual process because there is no perfect way to get all changelogs. Hence,\nI have to clone the upstream biome repository on GitHub.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-19_56_39.png\" alt=\"Cloning upstream repo\" \/><\/p>\n<p>Then ran the following commands to get each commit summary between 2.0.5 and 2.1.2.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> log<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> @biomejs\/biome@2.0.5..@biomejs\/biome@2.1.2<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-oneline<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> cut<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">d<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">f2-<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> wl-copy<\/span><\/span><\/code><\/pre>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-20_05_01.png\" alt=\"new changes file\" \/><\/p>\n<h1 id=\"commiting-and-pushing-the-changes\">Commiting and pushing the changes<a class=\"zola-anchor\" href=\"#commiting-and-pushing-the-changes\" aria-label=\"Anchor link for: commiting-and-pushing-the-changes\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Then I committed those changes after adding the updated files and removing the old sources.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-20_06_58.png\" alt=\"commit image\" \/><\/p>\n<p>I ran <code>git push<\/code>. Remember that this operation should have Git LFS enabled.<\/p>\n<h1 id=\"setting-the-meta-project-and-meta-package\">Setting the meta project and meta package<a class=\"zola-anchor\" href=\"#setting-the-meta-project-and-meta-package\" aria-label=\"Anchor link for: setting-the-meta-project-and-meta-package\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>At this point, if I was sure that this will build correctly, I can just open a PR to <a rel=\"external\" href=\"https:\/\/src.opensuse.org\/javascript\/biome\">https:\/\/src.opensuse.org\/javascript\/biome<\/a>.<\/p>\n<p>However, just for showing how I set a meta project and a meta package, I ran the following commands.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">osc<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> meta<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> prj<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">e<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> home:uncomfyhalomacro:biomejs<\/span><\/span><\/code><\/pre>\n<p>The XML file configuration for this meta project is this.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"xml\"><span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">&lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">project<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">home:uncomfyhalomacro:biomejs<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">title<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">title<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> &lt;!--<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Short title of NewProject <\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">--&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">description<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">description<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">    &lt;!--<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> This is for a longer description of the purpose of the project <\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">--&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  &lt;!--<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Uncomment and specify an URL and branch if your project is managed in git.<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  &lt;scmsync&gt;url#branch&lt;\/scmsync&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  --&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">person<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> role<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">maintainer<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> userid<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">uncomfyhalomacro<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\"> \/&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">person<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> role<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">bugowner<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> userid<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">uncomfyhalomacro<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\"> \/&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">&lt;!--<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> remove this block to publish your packages on the mirrors <\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">--&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">publish<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">disable<\/span><span style=\"color: light-dark(#076678, #83A598);\"> \/&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">publish<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">build<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">enable<\/span><span style=\"color: light-dark(#076678, #83A598);\"> \/&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">build<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">debuginfo<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">enable<\/span><span style=\"color: light-dark(#076678, #83A598);\"> \/&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">debuginfo<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">repository<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">openSUSE_Factory<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">path<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> project<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">openSUSE:Factory<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> repository<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">snapshot<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\"> \/&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">arch<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>x86_64<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">arch<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">arch<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>i586<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">arch<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">repository<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">project<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span><\/code><\/pre>\n<p>Take <strong>note<\/strong> that I did not set scmsync option for this because I don't need to or I have not learned to set a git project as a meta project's scmsync option yet.<\/p>\n<p>For package setup, I pointed it to the new meta project and then added a suffix <code>\/biome<\/code> to create a package biome.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">osc<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> meta<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> pkg<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">e<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> home:uncomfyhalomacro:biomejs\/biome<\/span><\/span><\/code><\/pre>\n<p>Sadly, I am not too fluent with how the XML configuration works. So I just passed this one instead<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"xml\"><span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">&lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">package<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">biome<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">title<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">title<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> &lt;!--<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Title of package <\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">--&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">description<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">description<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> &lt;!--<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> for long description <\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">--&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">scmsync<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>https:\/\/src.opensuse.org\/uncomfyhalomacro\/biome#main<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">scmsync<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">&lt;!--<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> following roles are inherited from the parent project<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  &lt;person role=&quot;maintainer&quot; userid=&quot;uncomfyhalomacro&quot;\/&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  &lt;person role=&quot;bugowner&quot; userid=&quot;uncomfyhalomacro&quot;\/&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">--&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">&lt;!--<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  &lt;url&gt;PUT_UPSTREAM_URL_HERE&lt;\/url&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">--&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">&lt;!--<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  use one of the examples below to disable building of this package<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  on a certain architecture, in a certain repository,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  or a combination thereof:<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  &lt;disable repository=&quot;SUSE_SLE-10&quot;\/&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  &lt;disable repository=&quot;SUSE_SLE-10&quot; arch=&quot;x86_64&quot;\/&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  Possible sections where you can use the tags above:<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  &lt;build&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  &lt;\/build&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  &lt;debuginfo&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  &lt;\/debuginfo&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  &lt;publish&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  &lt;\/publish&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  &lt;useforbuild&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  &lt;\/useforbuild&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  Please have a look at:<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  http:\/\/en.opensuse.org\/Restricted_formats<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  Packages containing formats listed there are NOT allowed to<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  be packaged in the openSUSE Buildservice and will be deleted!<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">--&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">package<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span><\/code><\/pre>\n<p>Notice the scmsync option. I pointed it to my fork and with the branch \"main\".<\/p>\n<p>Fortunately, the meta project has the correct config for setting which images to use for the build workers.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-20_19_25.png\" alt=\"Package is building\" \/><\/p>\n<p>For clarity, the full link to the build after setting the meta project and meta package is <a rel=\"external\" href=\"https:\/\/build.opensuse.org\/package\/show\/home:uncomfyhalomacro:biomejs\/biome\">https:\/\/build.opensuse.org\/package\/show\/home:uncomfyhalomacro:biomejs\/biome<\/a>. You may not be able to access this in the future because\nI probably deleted the meta project.<\/p>\n<p>I waited for the builds to succeed.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-20_22_51.png\" alt=\"Building status\" \/><\/p>\n<p>One of the builds succeeded after a while.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-20_30_12.png\" alt=\"Build succeeded\" \/><\/p>\n<h1 id=\"making-a-pr\">Making a PR<a class=\"zola-anchor\" href=\"#making-a-pr\" aria-label=\"Anchor link for: making-a-pr\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Lastly, I created a PR from my fork to the javascript project<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-20_31_15.png\" alt=\"PR to project\" \/><\/p>\n<p>The <strong>autogits-devel<\/strong> bot will stage my changes (with the <strong>autogits_obs_staging_bot<\/strong>) and creates a new meta project for testing my PR.<\/p>\n<p>It basically just did what I did in the last steps where I created a meta project and meta package and check if the builds succeed.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-20_32_50.png\" alt=\"Auto gits devel bot\" \/><\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-20_36_15.png\" alt=\"Auto gits obs staging bot comment\" \/><\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-20_37_00.png\" alt=\"New meta project and package generated from staging bot\" \/><\/p>\n<p>Once the builds succeed, my changes are then merged.<\/p>\n<p>The merge message should look similar to the one I had for <strong>rusty_v8<\/strong> (see image below).<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202507192430\/.\/wayshot-2025_07_20-20_39_30.png\" alt=\"rusty_v8 merge\" \/><\/p>\n<h1 id=\"conclusion\">Conclusion<a class=\"zola-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p><del>At this point, I am not familiar how those changes are pushed into Factory<\/del>. I believe there will be an automation as well\nfor pushing devel packages from devel projects to Factory. I also believe that the <a rel=\"external\" href=\"https:\/\/opensuse.github.io\/scm-staging\/user_guide.html\">https:\/\/opensuse.github.io\/scm-staging\/user_guide.html<\/a> is\ndeprecated or inaccurate because of this experience.<\/p>\n<p>In conclusion, I guess this is how far I can understand how the SCMSync workflow works. If you have any questions, just\n<a href=\"mailto:uncomfyhalomacro@opensuse.org\">email me<\/a> or message me in <a rel=\"external\" href=\"https:\/\/discord.gg\/opensuse\">openSUSE Discord<\/a>.<\/p>\n<h1 id=\"updated-last-step-sr-a-devel-project-to-factory\">Updated Last Step\u2013SR a devel project to Factory<a class=\"zola-anchor\" href=\"#updated-last-step-sr-a-devel-project-to-factory\" aria-label=\"Anchor link for: updated-last-step-sr-a-devel-project-to-factory\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Avindra, one of the packagers, messaged me on Discord and that there is a part I missed. To submit a devel project\nto Factory, one can just do the same thing as mentioned in <a rel=\"external\" href=\"https:\/\/en.opensuse.org\/openSUSE:OBS_to_Git#How_to_submit_from_devel_project_to_Factory?\">https:\/\/en.opensuse.org\/openSUSE:OBS_to_Git#How_to_submit_from_devel_project_to_Factory?<\/a>.<\/p>\n<p>Hence, for biome, it would be just<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">osc<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> sr<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> devel:languages:javascript\/biome<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> openSUSE:Factory<\/span><\/span><\/code><\/pre>\n<p>But when I did this, the rev is suspicious and also there was no changelog. I aborted because I then discovered that\nthe meta package is still building for RISCv64. It's still building after I slept for 8 hours... \ud83e\udd23<\/p>\n<p>Thus, I SR-ed for rusty_v8. I will SR for deno too after a few days to let the snapshot have rusty_v8. \ud83d\ude42<\/p>\n"},{"title":"Colorpicker script for Wayland","published":"2025-06-22T00:00:00+00:00","updated":"2025-06-22T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/scripts\/colorpicker-sh\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/scripts\/colorpicker-sh\/","content":"<p><strong>Dependencies<\/strong>:<\/p>\n<ul>\n<li><code>grim<\/code><\/li>\n<li><code>ImageMagick<\/code><\/li>\n<li><code>xclip<\/code><\/li>\n<li><code>libnotify-tools<\/code><\/li>\n<li><code>waysip<\/code><\/li>\n<li><code>hexcolor<\/code><\/li>\n<\/ul>\n<p><code>hexcolor<\/code>:<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#!<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">\/bin\/bash<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Copyright 2019 sharkwouter<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the &quot;Software&quot;), 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:<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, 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.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Variables<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">IMAGE<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/tmp\/screen.bmp<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> #<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> temporary image file<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">DEPS<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">xwininfo xdotool import convert<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> printed when -h option is used<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">usage<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> (<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> )<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">\tcat<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> &lt;&lt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">EOF<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">0<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> [OPTION]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">Returns the rgb color code of of the pixel under the mouse after clicking.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">Options:<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">  -h\tPrint this message<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">EOF<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> checks if all dependencies are installed<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">deps<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> (<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> )<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">\tfor<\/span><span style=\"color: light-dark(#076678, #83A598);\"> dep<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> in<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">DEPS<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> do<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">\t\tif<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> which<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">dep<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> &gt;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/dev\/null<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> 2<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&gt;&amp;1<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> then<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">\t\t\t:<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">\t\telse<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">\t\t\techo<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">The command <\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">\\&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">dep<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">\\&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> is unavailable, make sure all dependencies are installed.<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">\t\t\texit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 1<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">\t\tfi<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">\tdone<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> getopts:<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">while<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> getopts<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">:h<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> option<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">do<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">\tcase<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">option<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> in<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">\t\th<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">\t\t\tusage<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">\t\t\texit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 0<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">\t\t;;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">\tesac<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">done<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Actual script:<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Check if all required dependencies are installed first<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">deps<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Change the cursor and wait until a click has been made. Using xwininfo for this works, but there may be better options<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">xwininfo<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> &gt;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/dev\/null<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Get the mouse location, make a screenshot and get the information on the pixel on which the mouse was<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">RESULT<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$(<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">eval<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">xdotool<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> getmouselocation<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-shell<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &amp;&amp;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> import<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">window<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> root<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">IMAGE<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &amp;&amp;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> convert<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">IMAGE<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">crop<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> 1x1+<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">X<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">+<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">Y<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> txt:<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">clean up<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">rm<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">f<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">IMAGE<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> return only the hex code for the rgb color<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">echo<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">RESULT<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">|<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">cut<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">f8<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">d<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><\/span><\/code><\/pre>\n<p><code>colorpicker.sh<\/code>:<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#!<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">\/bin\/bash<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">shopt<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">s<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> lastpipe<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">if<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> [<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -z<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">WAYLAND_DISPLAY<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> ]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">then<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  COLOR<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$(<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">HOME<\/span><span>\/.local\/bin\/hexcolor<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">  notify-send<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">a<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Colorpicker<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Color on selected pixel: <\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">COLOR<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Hex value copied to clipboard<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">  printf<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">COLOR<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> xclip<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">sel<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> clip<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">else<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  COLOR<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">grim<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">g<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">waysip<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">p<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> -<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> \/usr\/bin\/gm<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> convert<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">format<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">%[{0,0}]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> txt:-<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">  [<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -z<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">COLOR<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> ]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &amp;&amp;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> exit<\/span><span> <\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">  notify-send<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">a<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Colorpicker<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Color on selected pixel: <\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">COLOR<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Hex value copied to clipboard<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  HEX<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$(<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\">echo<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $<\/span><span style=\"color: light-dark(#076678, #83A598);\">COLOR<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> cut<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">d<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">f2<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> cut<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">d<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">f2<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">  wl-copy<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">HEX<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">fi<\/span><\/span><\/code><\/pre>"},{"title":"Screenshot script I use on both X11 and Wayland","published":"2025-06-22T00:00:00+00:00","updated":"2025-06-22T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/scripts\/screenshot-sh\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/scripts\/screenshot-sh\/","content":"<p><strong>Dependencies<\/strong>:<\/p>\n<ul>\n<li><code>grim<\/code><\/li>\n<li><code>ImageMagick<\/code><\/li>\n<li><code>xdg-user-dirs<\/code> or <code>xdg-utils<\/code><\/li>\n<li><code>swappy<\/code><\/li>\n<li><code>xclip<\/code><\/li>\n<li><code>libnotify-tools<\/code><\/li>\n<li><code>waysip<\/code><\/li>\n<\/ul>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#!<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">\/bin\/bash<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">export<\/span><span style=\"color: light-dark(#076678, #83A598);\"> APP_NAME<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">My Grim Shot<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">export<\/span><span style=\"color: light-dark(#076678, #83A598);\"> SCREENSHOTS_PATH<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">xdg-user-dir<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> PICTURES<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/Screenshots<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">if<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> !<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> [<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -d<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">SCREENSHOTS_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> ]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> then<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    mkdir<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">p<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">SCREENSHOTS_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">fi<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">function<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> fullscreenshot<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    SAVE_PATH<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">xdg-user-dir<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> PICTURES<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/Screenshots\/Screenshot-<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">date<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> +<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">%m%d%H%M%S.png<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    if<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> [<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -n<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">WAYLAND_DISPLAY<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> ]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> then<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        grim<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> -<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> swappy<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">f<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">o<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">        #<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Press ctrl c instead<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        wl-copy<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">t<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> image\/png<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> &lt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    else<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        TEMP_PNG<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">mktemp<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">p<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">n<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">g<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        import<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">window<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> root<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">TEMP_PNG<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        swappy<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">f<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">TEMP_PNG<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">o<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        xclip<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">selection<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> clipboard<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">target<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> image\/png<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">i<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        rm<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">TEMP_PNG<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    fi<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    if<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> [<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -s<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> ]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> then<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        notify-send<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-app-name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">APP_NAME<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-icon<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Successfully<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Screenshot saved as <\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    else<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        rm<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        notify-send<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-app-name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">APP_NAME<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-icon<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Aborted<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-urgency<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> critical<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    fi<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">function<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> selectarea<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    SAVE_PATH<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">xdg-user-dir<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> PICTURES<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/Screenshots\/Screenshot-<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">date<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> +<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">%m%d%H%M%S.png<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    if<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> [<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -n<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">WAYLAND_DISPLAY<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> ]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> then<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">        GEOMETRY<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">waysip<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">d<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        grim<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">g<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">GEOMETRY<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> -<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> swappy<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">f<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">o<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">        #<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> press ctrl c instead<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        wl-copy<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> &lt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    else<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">        #<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> TMPFILE=&quot;\/tmp\/$(cat \/dev\/urandom | tr -cd &#39;a-f0-9&#39; | head -c 32)&quot;.png<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        import<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">format<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> png<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        swappy<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">f<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">o<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span> <\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        xclip<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">selection<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> clipboard<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">target<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> image\/png<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">i<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">        #<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> rm &quot;${TMPFILE}&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    fi<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    if<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> [<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -s<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> ]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> then<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        notify-send<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-app-name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">APP_NAME<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-icon<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Successful<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Screenshot saved as <\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    else<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        rm<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        notify-send<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-app-name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">APP_NAME<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-icon<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">SAVE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Aborted<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-urgency<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> critical<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    fi<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">whichMode<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    if<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">1<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">full<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> ]<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> |<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">|<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">1<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> ]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> then<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        fullscreenshot<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    elif<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">1<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">area<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> ]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> then<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        selectarea<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    else<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        notify-send<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Please select &#39;area&#39; or &#39;full&#39;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    fi<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">whichMode<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">@<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span><\/code><\/pre>"},{"title":"Nushell Script for Fuzzy Finding Lobster Posts","published":"2025-06-13T00:00:00+00:00","updated":"2025-06-13T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/scripts\/lobsters-nu\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/scripts\/lobsters-nu\/","content":"<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"nushell\"><span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#!\/usr\/bin\/nu<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> command_menu<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.XDG_SESSION_TYPE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> ==<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">wayland<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">fuzzel<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> -<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">d<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> else<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">bemenu<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">alias<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> MENU<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> ^$command_menu<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> sections<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">active<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">recent<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">comments<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span> ]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">$env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.CACHE_PATH<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">~\/.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">cache<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">lobsters<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> path expand<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">$env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.ACTIVE_RSS<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.CACHE_PATH<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">  |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> path join<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">active<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">xml<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">$env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.COMMENTS_RSS<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.CACHE_PATH<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">  |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> path join<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">comments<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">xml<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">$env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.RECENT_RSS<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.CACHE_PATH<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">  |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> path join<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">recent<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">xml<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.CACHE_PATH<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> path exists<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> else<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> mkdir<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.CACHE_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">if<\/span><span> (<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">ls<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.CACHE_PATH<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> is-empty<\/span><span>)<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> or<\/span><span> (<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">ls<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.CACHE_PATH<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">i<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> size<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> any<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span> |<\/span><span style=\"color: light-dark(#076678, #83A598);\">s<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $s<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> ==<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 0KB<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">  {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">  for<\/span><span style=\"color: light-dark(#076678, #83A598);\"> section<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> in<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $sections<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    http get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">https<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">:\/\/<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">lobste<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">rs<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">rss<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">          |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> save<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">f<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.ACTIVE_RSS<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    http get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">https<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">:\/\/<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">lobste<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">rs<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">newest<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">rss<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">   |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> save<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">f<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.RECENT_RSS<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    http get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">https<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">:\/\/<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">lobste<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">rs<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">comments<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">rss<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> save<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">f<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.COMMENTS_RSS<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">  }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> else if<\/span><span> (<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">ls<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.CACHE_PATH<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">i<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> modified<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> all<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span> |<\/span><span style=\"color: light-dark(#076678, #83A598);\">i<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $i<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> &lt;<\/span><span> (<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">date now<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><span> )<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span> <\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    http get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">https<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">:\/\/<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">lobste<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">rs<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">rss<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">          |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> save<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">f<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.ACTIVE_RSS<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    http get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">https<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">:\/\/<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">lobste<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">rs<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">newest<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">rss<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">   |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> save<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">f<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.RECENT_RSS<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    http get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">https<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">:\/\/<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">lobste<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">rs<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">comments<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">rss<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> save<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">f<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.COMMENTS_RSS<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> else<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> section<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$sections<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> to text<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> str trim<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> MENU<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">p<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">choose<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> lobsters<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> section<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> active_list<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">                 =<\/span><span> (<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> open<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> --<\/span><span style=\"color: light-dark(#076678, #83A598);\">raw<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.ACTIVE_RSS<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">   |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> query xml<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/\/item<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/\/item<\/span><span> )<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> comment_list<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">               =<\/span><span> (<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> open<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> --<\/span><span style=\"color: light-dark(#076678, #83A598);\">raw<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.COMMENTS_RSS<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> query xml<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/\/item<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/\/item<\/span><span> )<\/span><span> <\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> recent_list<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">                 =<\/span><span> (<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> open<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> --<\/span><span style=\"color: light-dark(#076678, #83A598);\">raw<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $env<\/span><span style=\"color: light-dark(#076678, #83A598);\">.RECENT_RSS<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">   |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> query xml<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/\/item<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/\/item<\/span><span> )<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$section<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> is-empty<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   exit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 1<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"># line 2 -&gt; link to post<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"># line 6 -&gt; link to comment<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$section<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =~<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">active<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> TITLES<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$active_list<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> each<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\">it<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $it<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> lines<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> str trim<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 1<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> uniq<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> LINKS<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$active_list<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> each<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\">it<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $it<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> lines<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> str trim<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 2<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> POSTS<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$active_list<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> each<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\">it<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $it<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> lines<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> str trim<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 6<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> TITLE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$TITLES<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> to text<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> MENU<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">p<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">active<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> section<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> list<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$TITLE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> is-empty<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">      exit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 1<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">   }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> options<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">link<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> to<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> comment<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">link<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> to<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> title<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span> ]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> option<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$options<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> to text<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> str trim<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> MENU<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">p<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">select<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> option<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span> )<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$option<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =~<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">link<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> to<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> title<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">      for<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $title<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> in<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$TITLES<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> enumerate<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">         if<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $TITLE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =~<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $title<\/span><span style=\"color: light-dark(#076678, #83A598);\">.item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">            xdg-open<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">$LINKS<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $title<\/span><span style=\"color: light-dark(#076678, #83A598);\">.index<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">         }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">      }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">   }<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> else if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$option<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =~<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">link<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> to<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> comment<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">     for<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $title<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> in<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$TITLES<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> enumerate<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">         if<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $TITLE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =~<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $title<\/span><span style=\"color: light-dark(#076678, #83A598);\">.item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">            xdg-open<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">$POSTS<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $title<\/span><span style=\"color: light-dark(#076678, #83A598);\">.index<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">         }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">     }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">   }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> else if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$section<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =~<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">comments<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">   # line to title -&gt; 1<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">   # line to link comments -&gt; 2<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> TITLES<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$comment_list<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> each<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\">it<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $it<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> lines<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> str trim<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 1<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> uniq<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> TITLE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$TITLES<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> to text<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> MENU<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">p<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">active<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> section<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> list<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$TITLE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> is-empty<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">      exit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 1<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">   }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> link<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$comment_list<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> each<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\">item<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $item<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> lines<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> str trim<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">  |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> to text<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> where<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$it<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =~<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">$TITLE<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> each<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\">link<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $link<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> lines<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 2<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> to text<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> MENU<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">p<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">link<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">   to<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> comments<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">   xdg-open<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">$link<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> else if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$section<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =~<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">recent<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> TITLES<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$recent_list<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> each<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\">it<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $it<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> lines<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> str trim<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 1<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> uniq<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> LINKS<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$recent_list<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> each<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\">it<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $it<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> lines<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> str trim<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 2<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> POSTS<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$recent_list<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> each<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\">it<\/span><span>|<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $it<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> lines<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> str trim<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 6<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> TITLE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$TITLES<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> to text<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> MENU<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">p<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">active<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> section<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> list<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$TITLE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> is-empty<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">      exit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 1<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">   }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> options<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">link<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> to<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> comment<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">link<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> to<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> title<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span> ]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> option<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$options<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> to text<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> str trim<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> MENU<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">p<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">select<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> option<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span> )<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">   if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$option<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =~<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">link<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> to<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> title<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">      for<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $title<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> in<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$TITLES<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> enumerate<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">         if<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $TITLE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =~<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $title<\/span><span style=\"color: light-dark(#076678, #83A598);\">.item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">            xdg-open<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">$LINKS<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $title<\/span><span style=\"color: light-dark(#076678, #83A598);\">.index<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">         }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">      }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">   }<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> else if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$option<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =~<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">link<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> to<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> comment<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">     for<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $title<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> in<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$TITLES<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> enumerate<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">         if<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $TITLE<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =~<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $title<\/span><span style=\"color: light-dark(#076678, #83A598);\">.item<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">            xdg-open<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">$POSTS<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $title<\/span><span style=\"color: light-dark(#076678, #83A598);\">.index<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">         }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">     }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">   }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> else<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">  exit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 1<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span><\/code><\/pre>"},{"title":"First impression of the scmsync workflow of OpenBuildService","published":"2025-06-08T00:00:00+00:00","updated":"2025-06-08T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202505110154\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202505110154\/","content":"<p>Also called the Git workflow, I am quite confused of how the process works.\nThere is a <a rel=\"external\" href=\"https:\/\/opensuse.github.io\/scm-staging\/user_guide.html\">guide<\/a>\nand even following it, I am more confused than before since there are missing\npieces and information about this workflow even though each step looks \"straight-forward\".<\/p>\n<p>Honestly, I don't have issues if this new git workflow was communicated well\nto volunteers and packagers, alike. I actually see potential in it but I\nalso see potential problems with it assuming this will become the main\nworkflow in the future.<\/p>\n<p>Firstly, the lack of information on what Git config to have. When I tried it for the\nfirst time, Git LFS needs to be enabled. What's interesting is Git LFS by nature is slow\nas indexing and tracking large files can really slow down uploads and downloads of\npackage sources. As a volunteer living in the Philippines, in a city with at least\n\"okay-ish\" internet, <strong><em>it took me at least 30 minutes<\/em><\/strong> to download the LFS \"objects\" for the\nvendored tarball for rusty v8.<\/p>\n<p>Secondly, after I was able to push the Git sources to my fork, I performed a PR but\nhere are other things that got me confused.<\/p>\n<ol>\n<li>There are two git branches, <code>devel<\/code> vs <code>factory<\/code> in\n<a rel=\"external\" href=\"https:\/\/src.opensuse.org\/javascript\/rusty_v8\">https:\/\/src.opensuse.org\/javascript\/rusty_v8<\/a>.<\/li>\n<li>As mentioned in the guide, you have to make a PR to the <code>factory<\/code>\nbranch. But isn't the point of <code>devel<\/code> in the old workflow to attempt building\nthe project before pushing it to Factory as part of the checks?<\/li>\n<li>The <strong>scm-staging-bot<\/strong> was not present even after the PR was approved.<\/li>\n<\/ol>\n<p>Lastly, there should be some form of CI but maybe the build runs on OBS\nthrough the <strong>scm-staging-bot<\/strong> \ud83d\ude15. But there was none present.<\/p>\n<p>The new workflow is such a blocker because, for example, as of writing,\nthere is a need to update <a rel=\"external\" href=\"https:\/\/github.com\/denoland\/deno\/\">deno<\/a> as\nmentioned in <a rel=\"external\" href=\"https:\/\/bugzilla.suse.com\/show_bug.cgi?id=1244070#c4\">here<\/a>.\nKnowing that, I also searched and found that there were some that\nshared my frustration or confusion with the move to git workflow in\n<a rel=\"external\" href=\"https:\/\/bugzilla.suse.com\/show_bug.cgi?id=1244110#c4\">here<\/a>.<\/p>\n<p>Overall, this is still a developing issue, so I might update this post\nafter some things are cleared up? Yeah...<\/p>\n"},{"title":"Packaging with Roast and Roast SCM","published":"2025-06-01T00:00:00+00:00","updated":"2025-06-01T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202506163227\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202506163227\/","content":"<p>Hello!<\/p>\n<p>In the iteration of all the changes for\n<a rel=\"external\" href=\"https:\/\/codeberg.org\/Rusty-Geckos\/roast\">roast<\/a>, we have finally\nreleased a new major version, 7.x series. Although, I really\ndon't care much about the strictness of version numbers, this\nrelease brings a new addition, a feature flag called <code>obs<\/code>. This is\n<a rel=\"external\" href=\"https:\/\/openbuildservice.org\/\">OpenBuildService<\/a> specific, and it allows it\nto become an alternative to <code>obs-service-set_version<\/code> + <code>obs-service-obs_scm<\/code>,\nhence, a combination of both services.<\/p>\n<p>roast itself is using this to package itself to\n<a rel=\"external\" href=\"https:\/\/build.opensuse.org\">b-o-o<\/a> using the following <code>_service<\/code> file\nconfiguration.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"xml\"><span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">&lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">services<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">service<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">roast_scm<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> mode<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">manual<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">     &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">url<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>https:\/\/codeberg.org\/Rusty-Geckos\/roast<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">     &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">revision<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>v7.1.1<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">     &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">versionrewriteregex<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>v(.*)<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">     &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">versionrewritepattern<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>${1}<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">     &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">changesgenerate<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>true<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">     &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">changesauthor<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>Soc Virnyl Estela<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">     &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">changesemail<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>uncomfyhalomacro@opensuse.org<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">service<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">service<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">cargo_vendor<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> mode<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">manual<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">     &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">src<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>roast*.tar.zst<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">     &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">update<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>true<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">service<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">services<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span><\/code><\/pre>\n<p>which can be seen <a rel=\"external\" href=\"https:\/\/opensuse.org\/package\/show\/Archiving\/roast\">here<\/a>.<\/p>\n<p>In the future, I will release a small video tutorial on how to use <code>roast_scm<\/code>\nfor <a rel=\"external\" href=\"https:\/\/build.opensuse.org\">b-o-o<\/a>.<\/p>\n<p>Because the crate is written in Rust, I intentionally made it part of\n<a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo\/\">obs-service-cargo<\/a>\nbecause of this <a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo\/pull\/124\">PR<\/a>\nwhich is now merged. With this, sources can now be fetched from git sources\nand vendored in just one XML file, like for <code>obs-service-cargo<\/code> itself:<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"xml\"><span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">&lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">services<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">service<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">cargo_vendor<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> mode<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">manual<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">src<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">update<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>true<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">versionrewriteregex<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>^v?(.*)<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">versionrewritepattern<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>${1}<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">changesgenerate<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>true<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">revision<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>master<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">changesauthor<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>Soc Virnyl Estela<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">    &lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span>=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">changesemail<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><span>uncomfyhalomacro@opensuse.org<\/span><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">param<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  &lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">service<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">services<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span><\/code><\/pre>\n<p>which can also be seen <a rel=\"external\" href=\"https:\/\/build.opensuse.org\/package\/show\/devel:languages:rust\/obs-service-cargo\">here<\/a>.<\/p>\n<p>Since I am one of the active Rust packagers in openSUSE, I plan to just switch\nand use this new feature for vendoring auto-magically.<\/p>\n<p>Well, that's just it for this short update.<\/p>\n"},{"title":"Status Update, May 2025","published":"2025-05-26T00:00:00+00:00","updated":"2025-05-26T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202505102517\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202505102517\/","content":"<p>Hello! Another monthly update!<\/p>\n<p><a rel=\"external\" href=\"https:\/\/codeberg.org\/Rusty-Geckos\/roast\/commit\/b8b1be9855a2a8836131359bfa9c16b96fab082a\">roast<\/a> has finally released v6.1.1 including a new feature\u2014<strong>roast\nscm<\/strong>. As explained in the project's <code>README.md<\/code>:<\/p>\n<blockquote>\n<p>roast_scm is an extended utility of roast. Its purpose is to create\ntarballs from a remote repository. The behaviour is similar to roast but\nonly at some point.<\/p>\n<\/blockquote>\n<p>Development still continues in this <a rel=\"external\" href=\"https:\/\/codeberg.org\/Rusty-Geckos\/roast\/src\/branch\/20250523-improve-scm\">branch<\/a>\nas I plan to make it an alternative or a replacement of\n<a rel=\"external\" href=\"https:\/\/github.com\/openSUSE\/obs-service-tar_scm\/\">https:\/\/github.com\/openSUSE\/obs-service-tar_scm\/<\/a>.<\/p>\n<p>After all that is implemented, I plan to incorporate\nit to <a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo\/\">obs-service-cargo<\/a> in this\n<a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo\/pull\/124\">PR<\/a>.<\/p>\n<p>The next project I am planning to resume is <a rel=\"external\" href=\"https:\/\/codeberg.org\/Rusty-Geckos\/otap\">otap<\/a> but that would require me\nto read the codebase again as I haven't touched it for a very long time.<\/p>\n<p>Next month, you'll probably see more updates.<\/p>\n<p>That's all for May's updates!<\/p>\n"},{"title":"Getting sentimental on my personal projects","published":"2025-05-25T00:00:00+00:00","updated":"2025-05-25T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202505214709\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202505214709\/","content":"<p>I don't know where to start. So I am just writing this out of my head. This thought\nstarted after I looked at my projects, including dead ideas and I saw the\nnumber of years that passed and for me, it felt sentimental. Yes, it felt\nnostalgic.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/202505214709\/.\/rdflib-sample.png\" alt=\"rudolf crate\" \/><\/p>\n<p>Take for example, the <a rel=\"external\" href=\"https:\/\/codeberg.org\/uncomfyhalomacro\/rudolf\">rudolf<\/a>\ncrate.  It started as an idea, though by now after 2 years, it's probably\ndead but it was still something I tried to work on. I have many project\nideas and they were either just sitting there collecting digital dust.<\/p>\n<p>But honestly, writing software projects for me is a fun escape from the\nmundane things in life. I do read comics a lot, go out with some friends,\nchat online, play a bit of games\u2014but writing software became something\nthat I always look forward to, as long as I am not burnt out, of course.<\/p>\n<p>I think the most probable reason for why I decided to write this is to remind\nmyself that these projects, dead or not, are proof that I tried to make a\ndifference for myself and validate my existence on this planet?<\/p>\n<p>As I grow older, it's one responsibility after another and it sometimes\noverwhelm me to the point that I get so tired, I don't want to do anything at\nall but focus on finding some form of escape\u2014I mean aren't we all finding\na way to make life seem a bit <em>bearable<\/em>?<\/p>\n<p>And for me, writing software and getting involved in open source was my way\nof proving myself that I at least have some purpose. Each commit message,\neach commit date, and each refactor\u2014they're proof that I tried to work\nhard, that I have a talent to learn and keep on learning despite the living\nconditions, and the harshness of life while earning through honest work.<\/p>\n<p>I might have made some mistakes here and there, any kind of mistake, not\njust software, but writing software and journaling also became my way of\nclearing out my thoughts. It's kind therapeutic.<\/p>\n<p>I find myself laughing writing this, telling myself I am older when I am\nat the age of 25 or 26 (since I will turn 26 this year), and most people\nconsider it \"young\".<\/p>\n<p>But it does not change what I have felt that time really flies so fast...<\/p>\n<p>and the only way to prove that I exist is to put my name into those commit messages.<\/p>\n<p>Anyway, I am just sharing my thoughts. And I hope this post does help you a\nbit validate that you're not the only one thinking like this.<\/p>\n"},{"title":"Why I stopped maintaining Julia in openSUSE","published":"2025-05-15T00:00:00+00:00","updated":"2025-05-15T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202505151925\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202505151925\/","content":"<p>So recently, I noticed that I have a lot of emails about some build problems in openSUSE, specifically,\nthe <a rel=\"external\" href=\"https:\/\/julialang.org\">Julia<\/a> package. I attempted to package this software for openSUSE in hopes that\nI can help out bring the programming language to the Linux distribution. However, it was kind of hairy,\nnot to mention, a lot of workarounds... like a lot \u2014 imagine you have to patch and create a lot of patches\nfor the patches to patch the patches.<\/p>\n<p>So I have ignored it for a very long while, thinking that I can do it in the future. But as of writing?\nI gave up. It's a tiresome software to package, and it is incompatible most of the time with OpenBuildService's\npolicies.<\/p>\n<p>But if you still want to use Julia in openSUSE, you can always use the <a rel=\"external\" href=\"https:\/\/github.com\/JuliaLang\/juliaup\">juliaup<\/a>\npackage. It is a version multiplexer for Julia similar to <a rel=\"external\" href=\"https:\/\/rustup.rs\">rustup<\/a>. Just run the following\ncommand on your terminal if you are using openSUSE.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">sudo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> zypper<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> install<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> juliaup<\/span><\/span><\/code><\/pre>\n<p>Nothing much I can say further as this is just a small update. Bye!<\/p>\n"},{"title":"gasping for air","published":"2025-04-26T00:00:00+00:00","updated":"2025-04-26T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/poetry\/entry1\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/poetry\/entry1\/","content":"<p>what i believe to be love\u2014was just me painting a picture\nthat does not hold any water<\/p>\n<p>if only life was a little bit kind,<br \/>\nbut what i get was the harsh reality\u2014<br \/>\nthat one mistake is enough<\/p>\n<p>a mistake that could have been fixed,<br \/>\nbut no one reached out\u2014<br \/>\nto reassure me that \"to err is human\"<\/p>\n<p>i was willing,<br \/>\ndetermined,<br \/>\nto fix myself,<br \/>\nto prove for them,<br \/>\nthat i also deserve to be understood,<br \/>\nbut here i am,<br \/>\ntrying to heal up,<br \/>\nwhile gasping for air<\/p>\n<p>i hope someday,<br \/>\ni'll be able to swim back to the shore,<br \/>\nbut now, i am still in this life raft\u2014<br \/>\nthinking what to do next<\/p>\n<p>may time give me the peace i need<\/p>\n"},{"title":"Status Update, April 2025 (updated)","published":"2025-04-23T00:00:00+00:00","updated":"2025-04-23T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202504093310\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202504093310\/","content":"<p>Hello there,<\/p>\n<p>I haven't written in a while. I was busy touching grass.<\/p>\n<p>As for tech updates, I have figured out or at least I have some sample code for\nan additional feature for <a rel=\"external\" href=\"https:\/\/codeberg.org\/Rusty-Geckos\/roast\">roast<\/a>. It\nis a feature to create tarballs from remote git repositories. Currently,\nit is still on-pause even though I believe I can write the feature in a\nday. Kind of burnt out lately, hence, I am engaging in casual dating and\nfriendships online, which I don't usually do. I just followed my friend's\nsuggestion. He is quite supportive. Thanks my man if you ever read this.<\/p>\n<p>That's all for the update. I hope I will continue to write more updates but\nthis burnt out feeling is hindering my ability to. I'll probably hit to the gym\nafter writing this.<\/p>\n"},{"title":"Status Update, January 2025","published":"2025-01-20T00:00:00+00:00","updated":"2025-01-20T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202501193742\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202501193742\/","content":"<p>Hello again! And a very late new year I guess??? That was 20 days ago as of\nwriting \ud83e\udd74<\/p>\n<p>For this month's update, there is nothing much technical going on, no\nproject updates and no project progress. I've been taking a break from\nsoftware development like I always do every year's January. Although, I do\nmake exceptions on some days but this January is zero progress. I will\nbe back on February for more updates on my personal projects. For now,\nI am more focused on trying to socialise and my personal health as of\nthe moment.<\/p>\n<p>As for my personal life happenings, I've been geared to focus on my physical\nhealth to get back in shape. I am quite surprised I am still <em>somewhat<\/em>\nin shape despite my lack of physical exercise a few years ago. I plan to at\nleast make a 3-day walk+sprint, each have at least 6km of distance to cover.\nI did it in two days, consecutively. But I was not able to do it on a third\nday because it seems there was an imminent downpour. But I will resume\ntomorrow as of writing.<\/p>\n<p>That's all for this month's update! And yes, I will be voting for the\nopenSUSE Board elections for this month. \ud83d\ude4f<\/p>\n"},{"title":"Status Update, December 2024","published":"2024-12-25T00:00:00+00:00","updated":"2024-12-25T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202412010457\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202412010457\/","content":"<p>Hello! It's time for another status update!<\/p>\n<p>December was quite uneventful. I really took a break from learning software\ndevelopment (not entirely but like I lessened my interaction with it).<\/p>\n<p>For tech related stuff, I have fully migrated\n<a rel=\"external\" href=\"https:\/\/codeberg.org\/Rusty-Geckos\/roast\">roast<\/a> from GitHub to\n<a rel=\"external\" href=\"https:\/\/codeberg.org\">Codeberg<\/a>. The reason? For a long time, I want\nto start slowly migrating away from GitHub for my open-source projects. I\nwant to inspire or advocate that it is possible to foster a community and\ncontribute with no big tech corporation managing our code with questionable\ndecisions and copyright issues.<\/p>\n<p>Other than that, roast's development has come to a pause. I plan to write\nan equivalent<\/p>\n<p><a rel=\"external\" href=\"https:\/\/codeberg.org\/Rusty-Geckos\/otap\">Otap<\/a> is still on-pause for a\nyear. But I really plan to resume its development starting 2025 alongside\nroast.<\/p>\n<p>For <a rel=\"external\" href=\"https:\/\/codeberg.org\/Rusty-Geckos\/rypper\/\">rypper<\/a>, that is still in\nmy mind. I hope that once otap is done, I will go back to rypper and start\nworking on it full-time. I really plan to make it a zypper alternative,\nand if better, a zypper replacement.<\/p>\n<p>Merry Christmas \ud83c\udf84\ud83c\udf84\ud83c\udf84 and see you all again next year where I will\nbe learning assembly, C, Elixir, Zig, Go, and Gleam to increase my knowledge\nin computer programming! \ud83c\udf89<\/p>\n"},{"title":"Status Update, November 2024","published":"2024-11-17T00:00:00+00:00","updated":"2024-11-17T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202411000345\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202411000345\/","content":"<p>Hey! If you noticed the similarities between <a rel=\"external\" href=\"https:\/\/emersion.fr\/\">https:\/\/emersion.fr\/<\/a>'s blog,\nthat's because I really liked his format. Thanks Simon Ser.<\/p>\n<p>This month's update is about my projects, <a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo\">obs-service-cargo<\/a>,\n<a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/roast\">roast<\/a>, and <a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo-vendor-home-registry\">obs-service-cargo-vendor-home-registry<\/a>. I will\njust combine what happened last month.<\/p>\n<p><a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo-vendor-home-registry\">obs-service-cargo-vendor-home-registry<\/a> was an attempt to use the\n<code>$CARGO_HOME<\/code> registry cache as vendored source. Now, it was archived\nsince the code was merged over to <a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo\">obs-service-cargo<\/a>.<\/p>\n<p>And yes, I did a whole rewrite of <a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo\">obs-service-cargo<\/a> before doing that<sup class=\"footnote-reference\" id=\"fr-r-1\"><a href=\"#fn-r\">1<\/a><\/sup>.\nThe only issue now is that <code>cargo-fetch<\/code> does not cache for platforms because\nof <a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo\/issues\/114\">this<\/a> and\n<a rel=\"external\" href=\"https:\/\/github.com\/rust-lang\/cargo\/pull\/14116\">this<\/a>.<\/p>\n<p><a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/roast\">roast<\/a> is basically functionally complete. The next plan is to create a\nRust equivalent of <a rel=\"external\" href=\"https:\/\/github.com\/openSUSE\/obs-service-tar_scm\">obs-service-scm<\/a>,\nwith roast.<\/p>\n<p>That's all for this short monthly update! Most of my time now is learning <a rel=\"external\" href=\"https:\/\/deno.com\">deno<\/a>\nand building Typescript projects with deno. See you next month!<\/p>\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn-r\">\n<p><a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/roast\">roast<\/a> was part of this rewrite since some of its code came from <a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo\">obs-service-cargo<\/a>. <a href=\"#fr-r-1\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section>\n"},{"title":"How To Deploy A Webpage to GitHub Pages","published":"2024-11-15T00:00:00+00:00","updated":"2024-11-15T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/202411094841\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/202411094841\/","content":"<p>There are many existing documentation about deploying webpages to GitHub pages.<\/p>\n<p>This guide is just a guide for those that are interested in a very manual setup.<\/p>\n<p>There is already a <a rel=\"external\" href=\"https:\/\/docs.github.com\/en\/pages\/quickstart\">full documentation<\/a>\nfor GitHub Pages if you want the full doc experience.<\/p>\n<p>Also, readers are expected that they are competent enough to know basic Git commands.<\/p>\n<p>Commands used here are for Bash shell.<\/p>\n<hr \/>\n<h1 id=\"deploying-a-small-html-file\">Deploying a small HTML file<a class=\"zola-anchor\" href=\"#deploying-a-small-html-file\" aria-label=\"Anchor link for: deploying-a-small-html-file\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>If you are not yet familiar with how the CI works, do not worry as you will\nnotice that writing CI workflows as basic as this is not that really\ndifficult.<\/p>\n<p>To start with, you have to do the following as prerequisites.<\/p>\n<ol>\n<li>Create a GitHub Account.<\/li>\n<li>Create a repository.<\/li>\n<li>Clone the new repository locally.<\/li>\n<\/ol>\n<p>The full commands starting for step 3 are<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> clone<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> https:\/\/github.com\/uncomfyhalomacro\/simple-site<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">cd<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> simple-site<\/span><\/span><\/code><\/pre>\n<p>Adjust the URL to your repository. If you prefer SSH, the full commands are<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> clone<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> git@github.com:uncomfyhalomacro\/simple-site.git<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">cd<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> simple-site<\/span><\/span><\/code><\/pre>\n<p>One can check that the remote for the repository is set properly by\nrunning the following command.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> remote<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">v<\/span><\/span><\/code><\/pre>\n<p>By default, it's named as <code>origin<\/code>. Your output could look like this<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>origin\tgit@github.com:uncomfyhalomacro\/simple-site.git (fetch)<\/span><\/span>\n<span class=\"giallo-l\"><span>origin\tgit@github.com:uncomfyhalomacro\/simple-site.git (push)<\/span><\/span><\/code><\/pre>\n<p>Now that everything is setup, let's create an <code>index.html<\/code> at the root\ndirectory of the project.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">touch<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> index.html<\/span><\/span><\/code><\/pre>\n<p>Open and edit it with your editor. I use <a rel=\"external\" href=\"https:\/\/github.com\/mawww\/kakoune\">kakoune<\/a>.<\/p>\n<p>Copy this simple HTML code below to your new file <code>index.html<\/code>.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"html\"><span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">&lt;!<\/span><span style=\"color: light-dark(#427B58, #8EC07C);font-weight: bold;\">DOCTYPE<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> html<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">&lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);font-weight: bold;\">html<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> lang<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">en<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">&lt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);font-weight: bold;\">body<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span>Hello World!<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);font-weight: bold;\">body<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">&lt;\/<\/span><span style=\"color: light-dark(#427B58, #8EC07C);font-weight: bold;\">html<\/span><span style=\"color: light-dark(#076678, #83A598);\">&gt;<\/span><\/span><\/code><\/pre>\n<p>This should suffice.<\/p>\n<h2 id=\"setting-up-your-personal-access-token\">Setting Up Your PERSONAL ACCESS TOKEN<a class=\"zola-anchor\" href=\"#setting-up-your-personal-access-token\" aria-label=\"Anchor link for: setting-up-your-personal-access-token\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>To setup your <strong>Personal Access Token<\/strong> (<strong>PAT<\/strong>), you must be logged in to your\nGitHub account. Then head over to <a rel=\"external\" href=\"https:\/\/github.com\/settings\/apps\">https:\/\/github.com\/settings\/apps<\/a>.<\/p>\n<p>You should see an option \"Personal access tokens\". Click that button.<\/p>\n<p>You should get a drop down with some options. Click \"Tokens (classic)\".<\/p>\n<p>In the upper-right, you can see the \"Generate new token\" button. Click that.<\/p>\n<p>You should get a drop down with some options. Click \"Generate new token (classic)\".<\/p>\n<p>You will be redirected to either enter your password or TOTP for 2FA. Please enter\nwhat was asked.<\/p>\n<p>Name your TOKEN to whatever you want e.g. \"simple-site\". Feel free to set the expiration\ndate of the TOKEN.<\/p>\n<p>You will also see a lot of scopes. Just select the one with <code>[ ] repo Full control of private repositories<\/code>.<\/p>\n<p>This will give full control for both private and public repositories that you have.<\/p>\n<p>Now on the bottom-right, click the \"Generate token\" button. You will be redirected with a\none time copy of the token. Copy or write it down somewhere safe.<\/p>\n<p>\u26a0\ufe0f Be careful not to share your token once it's generated.<\/p>\n<h2 id=\"setting-up-github-workflows\">Setting Up GitHub Workflows<a class=\"zola-anchor\" href=\"#setting-up-github-workflows\" aria-label=\"Anchor link for: setting-up-github-workflows\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Now, in your local repository, create a directory <code>.github\/workflows\/<\/code>.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">mkdir<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">p<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> .github\/workflows\/<\/span><\/span><\/code><\/pre>\n<p>Create a new file called <code>pubish.yml<\/code> at <code>.github\/workflows\/<\/code>.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">touch<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> .github\/workflows\/publish.yml<\/span><\/span><\/code><\/pre>\n<p>Copy the following code snippet to your <code>publish.yml<\/code>.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"yaml\"><span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">n<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">ame<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> P<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">ublish<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">p<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">ermissions<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> w<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">rite-all<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#8F3F71, #D3869B);\">on<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> p<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">ush<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">j<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">obs<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  b<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">uild<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">    r<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">uns-on<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> u<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">buntu-latest<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">    e<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">nv<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      T<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">OKEN<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> $<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">{{ secrets.TOKEN }}<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">    s<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">teps<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    -<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> n<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">ame<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> C<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">heckout<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      u<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">ses<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> a<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">ctions\/checkout@v4<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    -<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> n<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">ame<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> P<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">ublish static site<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      r<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">un<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        mkdir -p public<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        pushd public<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        cp ..\/index.html index.html<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        touch .nojekyll<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git init<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git branch -m gh-pages<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git config --global user.email &quot;youremail&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git config --global user.name &quot;yourusername&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git remote add origin &quot;https:\/\/yourusername:$TOKEN@github.com\/yourusername\/simple-site.git&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git add -A<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git commit -m &quot;update site page&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git push --force -u origin gh-pages<\/span><\/span><\/code><\/pre>\n<p>Ensure you have replaced the following<\/p>\n<ul>\n<li>\"youremail\" should be your email address<\/li>\n<li>\"yourusername\" should be your username e.g. username for GitHub account<\/li>\n<\/ul>\n<p>Be careful with the indentations as YAML can be quite confusing.<\/p>\n<p>Now before pushing to your remote repository, you have to set your TOKEN\nas a GitHub secret in your repository. You should head to the link like<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>https:\/\/github.com\/yourusername\/simple-site\/settings\/secrets\/actions<\/span><\/span><\/code><\/pre>\n<p>Replace first the \"yourusername\" with your username on GitHub before\ncopying it and pasting it on your browser.<\/p>\n<p>You will see two options once you head to the webpage<\/p>\n<ul>\n<li>Environment secrets<\/li>\n<li>Repository secrets<\/li>\n<\/ul>\n<p>Choose the one with Repository secrets and click \"New repository secret\". You will\nbe redirected to a page where you will input your TOKEN. Set the name as \"TOKEN\".\nThen paste the value of your PERSONAL ACCESS TOKEN.<\/p>\n<p>Once set, click \"Add secret\" button.<\/p>\n<p>Lastly, add and commit your local changes and push it to your remote repository.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> add<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">A<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> commit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">m<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">initial commit<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> push<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">u<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> origin<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> main<\/span><\/span><\/code><\/pre>\n<p>Your site will now be at <code>https:\/\/yourgithubusername.github.io\/simple-site<\/code>\nwhere <code>yourgithubusername<\/code> is your GitHub username. You should see\na \"Hello World!\" on your browser.<\/p>\n<p>See the source repository for how we did it at <a rel=\"external\" href=\"https:\/\/github.com\/uncomfyhalomacro\/simple-site\">https:\/\/github.com\/uncomfyhalomacro\/simple-site<\/a>.<\/p>\n<h1 id=\"convenient-static-site-generators\">Convenient Static Site Generators<a class=\"zola-anchor\" href=\"#convenient-static-site-generators\" aria-label=\"Anchor link for: convenient-static-site-generators\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>At this point, you already know how to setup and deploy a webpage. However,\nwriting a complex webpage with pure HTML can be tedious.<\/p>\n<p>That's where <em>static site generators<\/em> come into the picture.<\/p>\n<p>There are many popular static site generators to choose from such as<\/p>\n<ul>\n<li><a rel=\"external\" href=\"https:\/\/gohugo.io\/getting-started\/quick-start\/\">Hugo<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/getzola.org\">Zola<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/docs.astro.build\/en\/getting-started\/\">Astro<\/a><\/li>\n<\/ul>\n<p>For this part of the tutorial, you are going to use zola, a simple static\nsite generator written in Rust.<\/p>\n<p>First create a new repository named \"ssg-site\".<\/p>\n<p>Clone it locally and change directory into the <code>ssg-site<\/code> directory.<\/p>\n<p>An example command will look like this. This uses SSH as the remote repository.\nAdjust to your configuration.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> clone<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> git@github.com:yourusername\/ssg-site.git<\/span><\/span><\/code><\/pre>\n<p>Replace \"yourusername\" with your GitHub username.<\/p>\n<p>Then you must install zola. Follow installation instructions\n<a rel=\"external\" href=\"https:\/\/www.getzola.org\/documentation\/getting-started\/installation\/\">here<\/a>.<\/p>\n<h2 id=\"initialising-zola\">Initialising Zola<a class=\"zola-anchor\" href=\"#initialising-zola\" aria-label=\"Anchor link for: initialising-zola\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Run the following command at the root directory of the project.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">zola<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> init<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> .<\/span><\/span><\/code><\/pre>\n<p>It will ask you the following questions.<\/p>\n<p>For the first question<\/p>\n<blockquote>\n<p>What is the URL of your site? (https:\/\/example.com):<\/p>\n<\/blockquote>\n<p>You should input the following format <code>https:\/\/yourusername.github.io\/ssg-site<\/code> where\n\"yourusername\" is your GitHub username.<\/p>\n<p>The next question will be<\/p>\n<blockquote>\n<p>Do you want to enable Sass compilation?<\/p>\n<\/blockquote>\n<p>Type \"Y\" then press Enter.<\/p>\n<p>The third question will be<\/p>\n<blockquote>\n<p>Do you want to enable syntax highlighting?<\/p>\n<\/blockquote>\n<p>Type \"Y\" then press Enter.<\/p>\n<p>The last question will be<\/p>\n<blockquote>\n<p>Do you want to build a search index of the content?<\/p>\n<\/blockquote>\n<p>Feel free to type \"Y\" or \"N\". It does not matter yet, unless in the future, you want\nyour site to have a search bar.<\/p>\n<p>You have finally setup your Zola configuration. Now try running the command<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">zola<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> serve<\/span><\/span><\/code><\/pre>\n<p>It should serve your webpage locally at <a rel=\"external\" href=\"http:\/\/127.0.0.1:1111\">http:\/\/127.0.0.1:1111<\/a>. It might change if another\nhas already parked that port.<\/p>\n<p>But our site is still bland. Let's proceed adding a theme.<\/p>\n<h2 id=\"setting-up-zola-theme\">Setting Up Zola Theme<a class=\"zola-anchor\" href=\"#setting-up-zola-theme\" aria-label=\"Anchor link for: setting-up-zola-theme\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Zola has many cool themes. You can check the theme collection at <a rel=\"external\" href=\"https:\/\/www.getzola.org\/themes\/\">https:\/\/www.getzola.org\/themes\/<\/a>.<\/p>\n<p>Let's use <a rel=\"external\" href=\"https:\/\/www.getzola.org\/themes\/anemone\/\">anemone<\/a>, one of my favourite themes in Zola.<\/p>\n<p>At the root directory of your project, run the following command.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> submodule<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> add<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">https:\/\/github.com\/Speyll\/anemone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> themes\/anemone<\/span><\/span><\/code><\/pre>\n<p>This should create a git submodule in your project.<\/p>\n<p>Now open and edit your <code>config.toml<\/code>. It should look like the following.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"toml\"><span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> The URL the site will be built for<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">base_url<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">https:\/\/yourusername.github.io\/ssg-site<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Whether to automatically compile all Sass files in the sass directory<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">compile_sass<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Whether to build a search index to be used later on by a JavaScript library<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">build_search_index<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> false<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">theme<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">anemone<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">markdown<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Whether to do syntax highlighting<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">highlight_code<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">extra<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Put all your custom variables here<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">toc<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">display_author<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">list_pages<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">header_nav<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">  {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> url<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> name_en<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/home\/<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><\/span><\/code><\/pre>\n<p>Replace \"yourusername\" with your GitHub username. Save the file.<\/p>\n<p>Your webpage will reload and it will be an empty page with a footer. The colors\nare new as well because of the theme.<\/p>\n<h2 id=\"adding-some-content\">Adding some content<a class=\"zola-anchor\" href=\"#adding-some-content\" aria-label=\"Anchor link for: adding-some-content\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Now that our theme is up, let's add some content. At the root directory of your project,\nhead to <code>content<\/code> directory. Create a new markdown file <code>_index.md<\/code>. Now copy and paste\nthis <em>Lorem ipsum<\/em> to <code>_index.md<\/code> file.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>+++<\/span><\/span>\n<span class=\"giallo-l\"><span>title = &quot;Lorem Ipsum&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span>+++<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span># Lorem Ipsum<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod<\/span><\/span>\n<span class=\"giallo-l\"><span>tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<\/span><\/span>\n<span class=\"giallo-l\"><span>quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo<\/span><\/span>\n<span class=\"giallo-l\"><span>consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse<\/span><\/span>\n<span class=\"giallo-l\"><span>cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat<\/span><\/span>\n<span class=\"giallo-l\"><span>non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<\/span><\/span>\n<span class=\"giallo-l\"><span>## Dolor sit amet<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod<\/span><\/span>\n<span class=\"giallo-l\"><span>tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<\/span><\/span>\n<span class=\"giallo-l\"><span>quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo<\/span><\/span>\n<span class=\"giallo-l\"><span>consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse<\/span><\/span>\n<span class=\"giallo-l\"><span>cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat<\/span><\/span>\n<span class=\"giallo-l\"><span>non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>### Consectetur adipiscing elit<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod<\/span><\/span>\n<span class=\"giallo-l\"><span>tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<\/span><\/span>\n<span class=\"giallo-l\"><span>quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo<\/span><\/span>\n<span class=\"giallo-l\"><span>consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse<\/span><\/span>\n<span class=\"giallo-l\"><span>cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat<\/span><\/span>\n<span class=\"giallo-l\"><span>non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<\/span><\/span><\/code><\/pre>\n<p>Then run the following commands.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">cp<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> _index.md<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> 1.md<\/span><\/span><\/code><\/pre>\n<p>To understand what these files do, <code>_index.md<\/code> serves as the \"home\" page. It will\nlist our posts such as <code>1.md<\/code>.<\/p>\n<p>Now try to edit <code>_index.md<\/code> such as an introduction about yourself and what you do.<\/p>\n<p>Then edit <code>1.md<\/code> with your new goals in life or tips and tricks.<\/p>\n<p>Once satisfied, let's finally deploy your site to GitHub Pages.<\/p>\n<h2 id=\"deploying-to-github-pages\">Deploying to GitHub Pages<a class=\"zola-anchor\" href=\"#deploying-to-github-pages\" aria-label=\"Anchor link for: deploying-to-github-pages\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>At this point, you can either regenerate a new TOKEN or use the previous one you\nhave created from <code>simple-site<\/code>. Let's just assume you already have a TOKEN.<\/p>\n<p>First, run this command at the root directory of your project.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">echo<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">public<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> &gt;&gt;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> .gitignore<\/span><\/span><\/code><\/pre>\n<p>This should ignore the generated <code>public<\/code> directory. You should always do this\nbecause otherwise, you will end up having duplicated files <em>unless you have other\nplans<\/em>. The <code>public<\/code> directory is only created when you run this command.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">zola<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> build<\/span><\/span><\/code><\/pre>\n<p>Next, add the new TOKEN as a <strong>Repository secret<\/strong>. You can repeat the steps you did on how to add\na new TOKEN to your repository like in the <code>simple-site<\/code>.<\/p>\n<p>Here is the fun part. Do the following commands.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">mkdir<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">p<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> .github\/workflows\/<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">touch<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> .github\/workflows\/publish.yml<\/span><\/span><\/code><\/pre>\n<p>Then edit your <code>publish.yml<\/code> file which is located at <code>.github\/workflows\/<\/code> with the following code.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"yaml\"><span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">n<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">ame<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> P<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">ublish<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">p<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">ermissions<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> w<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">rite-all<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#8F3F71, #D3869B);\">on<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> p<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">ush<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">j<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">obs<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  b<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">uild<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">    r<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">uns-on<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> u<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">buntu-latest<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">    c<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">ontainer<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> o<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">pensuse\/tumbleweed:latest<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">    e<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">nv<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      T<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">OKEN<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> $<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">{{ secrets.TOKEN }}<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">    s<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">teps<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    -<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> n<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">ame<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> C<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">heckout<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      u<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">ses<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> a<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">ctions\/checkout@v4<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    -<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> n<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">ame<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> I<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">nstall dependencies<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      r<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">un<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        zypper --non-interactive in zola git<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    -<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> n<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">ame<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> G<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">enerate static site<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      r<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">un<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        rm -rf themes\/<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        mkdir -p themes\/<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        pushd themes\/<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git clone --depth 1 https:\/\/github.com\/Speyll\/anemone<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        popd<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        zola build<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    -<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> n<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">ame<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> P<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">ublish static site<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      r<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">un<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">:<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        pushd public<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        touch .nojekyll<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        echo &quot;uncomfyhalomacro.pl&quot; &gt;&gt; CNAME<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git init<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git branch -m gh-pages<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git config --global user.email &quot;youremail&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git config --global user.name &quot;yourusername&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git remote add origin &quot;https:\/\/yourusername:$TOKEN@github.com\/yourusername\/ssg-site.git&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git add -A<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git commit -m &quot;update site page&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        git push --force -u origin gh-pages<\/span><\/span><\/code><\/pre>\n<p>Ensure you change \"yourusername\" to your GitHub username and \"youremail\" to the email you are using for your GitHub account.<\/p>\n<p>Save the file. Now run the following command to add and commit your changes, then push.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> add<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">A<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> commit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">m<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">my first blog<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> push<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">u<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> origin<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> main<\/span><\/span><\/code><\/pre>\n<p>Notice that in the YAML file, it uses a custom image. That's because that\nlinux distribution image, Tumbleweed, already has an updated version of zola.<\/p>\n<p>Once your site has been generated in the GitHub actions, you can head over to this link format\n<code>yourusername.github.io\/ssg-site<\/code> where \"yourusername\" is your GitHub username.<\/p>\n<p>Feel free to use this or learn and use other SSGs to prettify your blogs and web pages!<\/p>\n<h1 id=\"faq\">FAQ<a class=\"zola-anchor\" href=\"#faq\" aria-label=\"Anchor link for: faq\"\n  >\u00a7<\/a\n>\n<\/h1>\n<blockquote>\n<p>I noticed that you didn't use a GitHub action plugin <code>shalzz\/zola-deploy-action@master<\/code>. Why?<\/p>\n<\/blockquote>\n<p>If you know the process, then you can trust yourself more than some random plugin. Not saying they could not be trusted\nbut you have to weigh your risks<\/p>\n<ol>\n<li>You already know how to deploy, then you are more sure that you can trust yourself.<\/li>\n<li>Trust is a spectrum.<\/li>\n<\/ol>\n<p>Therefore, I don't need someone's tool if I already know how to do things. It's for the security side of things since\nGitHub actions can be a potential attack surface.<\/p>\n<hr \/>\n<p>Okay that's a wrap. Feel free to reach out to me in my preferred communication channels \ud83e\udd2a<\/p>\n"},{"title":"Local Remote Development with VSCode","published":"2024-09-12T00:00:00+00:00","updated":"2024-09-12T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/local-remote-development-with-vscode-setup\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/local-remote-development-with-vscode-setup\/","content":"<p>This is just a note for someone who really is unfamiliar with how SSH works.<\/p>\n<hr \/>\n<p>I have issues managing my SSH keys and using them to<\/p>\n<ul>\n<li>authenticate myself to GitHub and other forges<\/li>\n<li>signing using SSH instead of GPG<\/li>\n<\/ul>\n<p>in a remote environment. Most of my stuff is now using <a rel=\"external\" href=\"https:\/\/github.com\/89luca89\/distrobox\/\"><code>distrobox<\/code><\/a>. If you want to learn more about it, check out Luca's blog post about it --- <a rel=\"external\" href=\"https:\/\/fedoramagazine.org\/run-distrobox-on-fedora-linux\">https:\/\/fedoramagazine.org\/run-distrobox-on-fedora-linux<\/a>, he is the author of distrobox.<\/p>\n<p>Anyway, back to the topic, the issue is <em>I want to manage and use my SSH keys that resides in my <strong>REAL<\/strong> home directory but I can't because the ssh running inside my distrobox points to the distrobox's <code>$HOME<\/code> directory<\/em>. The solution?<\/p>\n<p>For authentication<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> config<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> set<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-local<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> core.sshCommand<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">ssh -F \/dev\/null -i \/home\/uncomfy\/.ssh\/id_ed25519<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span><\/code><\/pre>\n<p>For signing keys<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> config<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> set<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-local<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> user.signingKey<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/home\/uncomfy\/.ssh\/id_new_ssh_key<\/span><\/span><\/code><\/pre>\n<p>The signing keys do not need to know where the SSH config file is. We don't even need it for the auth as well (see <code>-F \/dev\/null<\/code>) unless you need to use a config from somewhere else.<\/p>\n<blockquote>\n<p><strong>TPM-generated SSH Keys<\/strong>\nI think for SSH keys generated by TPM is still something I am trying to figure out first. As far as I know, the TPM library I installed in my host system relies on the hardware TPM that I have (I have yet to confirm). Hence, I can't use my TPM-generated SSH keys for the time being for remote development. You can check out <del>my old blog<\/del> on how to set up one -&gt; <a rel=\"external\" href=\"https:\/\/uncomfyhalomacro.pl\/blog\/using-ssh-keys-with-tpm-and-git\">https:\/\/uncomfyhalomacro.pl\/blog\/using-ssh-keys-with-tpm-and-git<\/a>. Gentoo Wiki has a good write-up about it too (it's also where I myself decided to try and use it). See <a rel=\"external\" href=\"https:\/\/wiki.gentoo.org\/wiki\/Trusted_Platform_Module\/SSH\">https:\/\/wiki.gentoo.org\/wiki\/Trusted_Platform_Module\/SSH<\/a><\/p>\n<\/blockquote>\n<p>Okay, that's all you need to know. If you have some concerns regarding remote development, just reach out to me through email (I rarely not check out after being so busy but I'm going to get back to regularly check emails) or in openSUSE Discord.<\/p>\n<blockquote>\n<p><strong>SSH Troubleshooting<\/strong>\nAlso, if you experience SSHD using port 22 in your container and it fails? That's because it conflicts with port 22 of your host's SSHD. I changed mine to <strong>69<\/strong> \ud83e\udd74<\/p>\n<\/blockquote>\n"},{"title":"Exploring Efficient Ways To Package Rust Software in openSUSE","published":"2024-08-22T00:00:00+00:00","updated":"2024-11-10T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/exploring-efficient-ways-to-package-rust-software-in-opensuse\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/exploring-efficient-ways-to-package-rust-software-in-opensuse\/","content":"<blockquote>\n<p><strong>Update<\/strong>\nI am moving over some logic as another package called\n<a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/roast\">roast<\/a>. This\nis to prepare this vendoring alternative called\n<a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo-vendor-home-registry\">obs-service-cargo-vendor-home-registry<\/a>.\nThe project is still worked on during my free time.<\/p>\n<\/blockquote>\n<p>I have re-investigated possible solutions for confusing packaging in Rust. Currently,\nwe are using <code>cargo vendor<\/code> to vendor package dependencies. This comes at a cost.<\/p>\n<ul>\n<li>Back and forth copying of <code>.cargo\/config.toml<\/code> for possible projects that use monorepo\nconfigurations i.e. workspace and real monorepos.\n<ul>\n<li>Examples of these are: zellij, wezterm and python-tokenizers<\/li>\n<\/ul>\n<\/li>\n<li>We always want to ensure <code>Cargo.lock<\/code> and I doubt the solution will not avoid this\nsince lockfiles are always essential when building software with Rust.<\/li>\n<li>Existing <code>.cargo\/config.toml<\/code> from projects will be overridden with our generated\n<code>.cargo\/config.toml<\/code>.<\/li>\n<\/ul>\n<p>The first solution I thought of is a global <code>.cargo\/config.toml<\/code> for projects. This\nhas been done with <strong>python-tokenizers<\/strong> in openSUSE because it is possible to use\n<code>--manifest-path<\/code> to specify a manifest <code>Cargo.toml<\/code> file in the specfile for cargo\ninvocations.<\/p>\n<p>Seeing this, I realised, why not just use the <code>$CARGO_HOME<\/code> since we are pointing at a global cache anyway? This blog is about tracking my future project\n<a rel=\"external\" href=\"https:\/\/github.com\/uncomfyhalomacro\/obs-service-cargo-vendor-home-registry\">https:\/\/github.com\/uncomfyhalomacro\/obs-service-cargo-vendor-home-registry<\/a> of which I plan to integrate into <a rel=\"external\" href=\"https:\/\/github.com\/Firstyear\/obs-service-cargo\">https:\/\/github.com\/Firstyear\/obs-service-cargo<\/a> as an alternative vendor generating utility for Open Build Service or OBS.<\/p>\n<h1 id=\"storage-size-eaten-by-cargo-home-vs-cargo-vendor-comparison\">Storage size eaten by <code>CARGO_HOME<\/code> vs <code>cargo vendor<\/code> comparison<a class=\"zola-anchor\" href=\"#storage-size-eaten-by-cargo-home-vs-cargo-vendor-comparison\" aria-label=\"Anchor link for: storage-size-eaten-by-cargo-home-vs-cargo-vendor-comparison\"\n  >\u00a7<\/a\n>\n<\/h1>\n<blockquote>\n<p><strong>NOTE<\/strong>\n<code>cargo fetch<\/code>, <code>cargo vendor<\/code>, <code>cargo build<\/code>, and <code>cargo generate-lockfile<\/code> all update the <code>CARGO_HOME<\/code> or what we call the cargo home registry or just cargo home. We use <code>cargo fetch<\/code> here because it's designed to update the registry cache instead of other commands.<\/p>\n<p><strong>WARNING<\/strong> Behaviours between <code>cargo fetch<\/code> and <code>cargo generate-lockfile<\/code>\n<code>cargo fetch<\/code> updates the registry to latest version of crates and also regenerates <code>Cargo.lock<\/code> to reflect the versions unless <code>--locked<\/code> flag is passed where it tries to respect the versions of the crates from the existing <code>Cargo.lock<\/code> despite this <em>contradicting<\/em> description in the manpage that\nIf a Cargo.lock file is available, this command will ensure that all of the git dependencies and\/or registry dependencies are downloaded and locally available. Subsequent Cargo commands will be able to run offline after a cargo fetch unless the lock file changes.<\/p>\n<p>However, <code>cargo generate-lockfile<\/code> updates the registry + updates the <code>Cargo.lock<\/code> which in my opinion is just a duplication of the other cargo sub-command <code>cargo update<\/code>. Why? Both do the same behaviour. Even the part where you pass <code>--locked<\/code> will give you the same error \"<strong>error: the lock file \/run\/host\/tmp\/jay-1.4.0\/Cargo.lock needs to be updated but --locked<\/strong>\".<\/p>\n<\/blockquote>\n<p>Here are the zstd compressed tarballs for the following after running the cargo commands<\/p>\n<p><strong>wezterm<\/strong><\/p>\n<ul>\n<li><code>cargo-vendor<\/code>: 1.1GB<\/li>\n<li><code>cargo-fetch<\/code>: 1.3GB<\/li>\n<\/ul>\n<p><strong>jay<\/strong><\/p>\n<ul>\n<li><code>cargo-vendor<\/code>: 24MB<\/li>\n<li><code>cargo-fetch<\/code>: 76MB<\/li>\n<\/ul>\n<p><strong>zellij<\/strong><\/p>\n<ul>\n<li><code>cargo-vendor<\/code>: 66MB<\/li>\n<li><code>cargo-fetch<\/code>: 133MB<\/li>\n<\/ul>\n<p>Why does it seem like <code>cargo-fetch<\/code> duplicates the contents in the tarball? Because it really does. The registry contains the following directory structure<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>.<\/span><\/span>\n<span class=\"giallo-l\"><span>\u2514\u2500\u2500 registry<\/span><\/span>\n<span class=\"giallo-l\"><span>    \u251c\u2500\u2500 cache<\/span><\/span>\n<span class=\"giallo-l\"><span>    \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.crates.io-6f17d22bba15001f<\/span><\/span>\n<span class=\"giallo-l\"><span>    \u251c\u2500\u2500 index<\/span><\/span>\n<span class=\"giallo-l\"><span>    \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.crates.io-6f17d22bba15001f<\/span><\/span>\n<span class=\"giallo-l\"><span>    \u2514\u2500\u2500 src<\/span><\/span>\n<span class=\"giallo-l\"><span>        \u2514\u2500\u2500 index.crates.io-6f17d22bba15001f<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>8 directories, 0 files<\/span><\/span>\n<span class=\"giallo-l\"><\/span><\/code><\/pre>\n<p>One can remove the <code>.cargo\/registry\/src<\/code> directory as that contains the extracted crates and then create a <code>tar.zst<\/code> file using the following commands<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Assuming $CARGO_HOME is set to $PWD\/.cargo<\/span><\/span>\n<span class=\"giallo-l\"><span>pushd .cargo<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">rm<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">rfv<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> registry\/src<\/span><\/span>\n<span class=\"giallo-l\"><span>popd<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">tar<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-zstd<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">cvf<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> vendor.tar.zst<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> .cargo\/<\/span><\/span><\/code><\/pre><h1 id=\"how-to-get-cache-from-cargo-home\">How to get cache from <code>$CARGO_HOME<\/code><a class=\"zola-anchor\" href=\"#how-to-get-cache-from-cargo-home\" aria-label=\"Anchor link for: how-to-get-cache-from-cargo-home\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Any of these commands will generate the cargo home registry cache<\/p>\n<ul>\n<li>build<\/li>\n<li>generate-lockfile<\/li>\n<li>vendor<\/li>\n<li>fetch<\/li>\n<li>update<\/li>\n<\/ul>\n<p><del>Some commands are duplication of the other commands i.e. update and\ngenerate-lockfile. It's just that the former prefetches the latest crate versions\nwhile the latter doesn't.<\/del><\/p>\n<p>To update the registry cache, one must either go with <code>cargo fetch<\/code> or even <code>cargo vendor<\/code> to avoid building or updating (unless update is set).<\/p>\n<p>All commands try to regenerate the <code>Cargo.lock<\/code> with the latest compatible MSRV. If\n<code>--locked<\/code> is passed, it will try to attempt to respect the versions in the <code>Cargo.lock<\/code>.\nHowever, if the version of a dependency in <code>Cargo.lock<\/code> got yanked and there is a\nnewer version, then an operation with <code>--locked<\/code> will fail. Also, passing <code>--locked<\/code> to\n<code>cargo-update<\/code> is ambiguous as it will always almost fail since it tries to update the\n<code>Cargo.lock<\/code>.<\/p>\n<h3 id=\"why-not-go-with-cargo-vendor-sync\">Why not go with <code>cargo vendor --sync<\/code><a class=\"zola-anchor\" href=\"#why-not-go-with-cargo-vendor-sync\" aria-label=\"Anchor link for: why-not-go-with-cargo-vendor-sync\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Reason? Uncertainty of how that command respect <code>Cargo.lock<\/code> for each crate. I would\nrather have do<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">cargo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> fetch<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-locked<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-manifest-path=path\/to\/Cargo.toml<\/span><\/span><\/code><\/pre>\n<p>for each manifest found since one can flexibly turn <code>--locked<\/code> on and off.<\/p>\n<h1 id=\"building-now-with-cargo-home\">Building now with <code>$CARGO_HOME<\/code><a class=\"zola-anchor\" href=\"#building-now-with-cargo-home\" aria-label=\"Anchor link for: building-now-with-cargo-home\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>It's always has been possible to use <code>$CARGO_HOME<\/code>, specifically, <code>$CARGO_HOME\/registry<\/code>.<\/p>\n<p>There was an attempt in this repository, <a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo-vendor-home-registry\">https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo-vendor-home-registry<\/a>.<\/p>\n<p>Now, that project has been merged into <a rel=\"external\" href=\"https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo\">https:\/\/github.com\/openSUSE-Rust\/obs-service-cargo<\/a>.<\/p>\n<p>You can see this working in <a rel=\"external\" href=\"https:\/\/build.opensuse.org\/package\/show\/editors\/kak-lsp\">https:\/\/build.opensuse.org\/package\/show\/editors\/kak-lsp<\/a>. But we lied a bit here.\nWe will explain that in the later sections.<\/p>\n<h2 id=\"path-dependencies-in-cargo-toml-needs-to-be-revisited\">Path dependencies in <code>Cargo.toml<\/code> needs to be revisited<a class=\"zola-anchor\" href=\"#path-dependencies-in-cargo-toml-needs-to-be-revisited\" aria-label=\"Anchor link for: path-dependencies-in-cargo-toml-needs-to-be-revisited\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Membered crates (in workspace configurations) and local crates (both are local and in path actually)\nshould also be taken consideration when vendoring dependencies.<\/p>\n<p>For example, <a rel=\"external\" href=\"https:\/\/build.opensuse.org\/package\/show\/science:machinelearning\/python-tokenizers\">https:\/\/build.opensuse.org\/package\/show\/science:machinelearning\/python-tokenizers<\/a> have\ntwo different dependencies that are actually related to each other.<\/p>\n<p>The solution to this is to eagerly check their manifest and lockfiles. Hence, either with multiple vendor\ntarballs or a vendored <code>$CARGO_HOME<\/code>.<\/p>\n<h2 id=\"lockfiles-are-always-inconsistent\">Lockfiles are always inconsistent<a class=\"zola-anchor\" href=\"#lockfiles-are-always-inconsistent\" aria-label=\"Anchor link for: lockfiles-are-always-inconsistent\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>See <a rel=\"external\" href=\"https:\/\/github.com\/rust-lang\/cargo\/issues\/7169\">https:\/\/github.com\/rust-lang\/cargo\/issues\/7169<\/a>. This is a glaring issue\nand not just for <code>cargo install<\/code> but almost all cargo commands such as <code>cargo fetch<\/code>. That's why in openSUSE, we try to include the lockfile as much as\npossible even if passing <code>--locked<\/code>. I think I would agree to this comment\n<a rel=\"external\" href=\"https:\/\/github.com\/rust-lang\/cargo\/issues\/7169#issuecomment-539226733\">https:\/\/github.com\/rust-lang\/cargo\/issues\/7169#issuecomment-539226733<\/a>.<\/p>\n<p>Observation<\/p>\n<ul>\n<li><code>cargo fetch --locked<\/code> does not work because it tries to keep the registry cache updated<\/li>\n<li><code>cargo vendor --locked<\/code> works because I don't know why???<\/li>\n<\/ul>\n<p>Now is the use of <code>--sync<\/code> idea thrown out the window?<\/p>\n<p>For crates that don't ship with a lockfile, we will run either<code>cargo generate-lockfile<\/code>\nor <code>cargo update<\/code>, former is more semantically correct to do as opposed to <code>cargo update<\/code>. But <code>update<\/code> makes sense the most because we are going to add update options\non the new project anyway.<\/p>\n<h2 id=\"cargo-fetch-vs-cargo-update\"><code>cargo-fetch<\/code> vs <code>cargo-update<\/code><a class=\"zola-anchor\" href=\"#cargo-fetch-vs-cargo-update\" aria-label=\"Anchor link for: cargo-fetch-vs-cargo-update\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Two days ago as of writing, I filed a bug report regarding inconsistencies\nbetween <code>cargo-fetch<\/code> and <code>cargo-vendor<\/code>. Link to bug report\n<a rel=\"external\" href=\"https:\/\/github.com\/rust-lang\/cargo\/issues\/14795\">https:\/\/github.com\/rust-lang\/cargo\/issues\/14795<\/a>.<\/p>\n<p>The inconsistency specifically is the way the two handle dependencies differently\nespecially when it comes to <code>cargo-fetch<\/code>'s <code>--target<\/code> flag.<\/p>\n<p>I had high hopes that by default<sup class=\"footnote-reference\" id=\"fr-but not really-1\"><a href=\"#fn-but not really\">1<\/a><\/sup>, it gets <strong>all<\/strong> target architectures. But I was\nmet with failed builds on <del>not so commonly used<\/del> architectures whereas vendored\ndependencies from <code>cargo-vendor<\/code> compiles. They fail because they cannot find their\ndependencies fetched from <code>cargo-fetch<\/code>.<\/p>\n<p>I will just have to wait for a feedback regarding how <code>cargo-fetch<\/code> behaves as compared\nto <code>cargo-vendor<\/code>. I believe though that both should be at least similar in almost\nall aspects.<\/p>\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn-but not really\">\n<p>This is still not a <em><strong>loss<\/strong><\/em> yet for me since most of the software I used in openSUSE\nare used by people who either use x86_64 and aarch64. I don't believe that the other\narchitectures are used commonly so I have removed support. <a href=\"#fr-but not really-1\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section>\n"},{"title":"Cow is weird","published":"2024-06-24T00:00:00+00:00","updated":"2024-06-24T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/copy-on-write-is-weird\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/copy-on-write-is-weird\/","content":"<p>So I just found out something weird while learning and writing a\ntutorial for Rust,<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"rust\"><span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">    let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> body<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">:<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> &amp;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">std<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">borrow<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">::<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">Cow<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&lt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">_<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> str<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&gt;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#076678, #83A598);\"> http_req<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">body<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">    if<\/span><span style=\"color: light-dark(#076678, #83A598);\"> buf_str<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">contains<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&amp;<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">*<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">*<\/span><span style=\"color: light-dark(#076678, #83A598);\">body<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        println!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Body is same in buf<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    }<\/span><\/span><\/code><\/pre>\n<p>So I found out that <code>&amp;**body<\/code> is possible because<\/p>\n<p>body() -&gt; &amp;Cow -&gt; deref -&gt; Cow -&gt; deref -&gt; str (Size cannot be known at compile time)<\/p>\n<p>therefore, add a reference -&gt; &amp; -&gt; &amp;str<\/p>\n<p>OR<\/p>\n<p>we can just use <code>.deref<\/code> and since Cow already has Deref trait, it's actually\na \"double\" deref like the previous explanation. However, there is a slight difference<\/p>\n<p>OR<\/p>\n<p>we can also just use <code>.as_ref<\/code> since Cow has Deref trait and the <code>.as_ref<\/code>\nmethod will reference the inferred type T <code>self<\/code> which is String but since it's\na ref so it's &amp;String which is then coerced to &amp;str because of String's Deref\ntrait. See <a rel=\"external\" href=\"https:\/\/doc.rust-lang.org\/stable\/src\/alloc\/string.rs.html#2683\">https:\/\/doc.rust-lang.org\/stable\/src\/alloc\/string.rs.html#2683<\/a>\nand <a rel=\"external\" href=\"https:\/\/doc.rust-lang.org\/stable\/src\/alloc\/string.rs.html#2479\">https:\/\/doc.rust-lang.org\/stable\/src\/alloc\/string.rs.html#2479<\/a><\/p>\n"},{"title":"How To Setup Julia with Kakoune","published":"2024-06-08T00:00:00+00:00","updated":"2024-06-08T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/how-to-setup-julia-with-kakoune\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/how-to-setup-julia-with-kakoune\/","content":"<p>This short post talks about how I setup Julia for Kakoune based of from my\n<a rel=\"external\" href=\"https:\/\/github.com\/uncomfyhalomacro\/kakudite\">config<\/a>. I rarely use\nJulia nowadays but some people still ask me how to setup Julia for X and Y\neditor lmao. So I'm just going to write it here to help others out a bit.<\/p>\n<h1 id=\"what-is-kakoune\">What is Kakoune?<a class=\"zola-anchor\" href=\"#what-is-kakoune\" aria-label=\"Anchor link for: what-is-kakoune\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p><a rel=\"external\" href=\"https:\/\/github.com\/mawww\/kakoune\">Kakoune<\/a> is a modal editor that tries to\nbe better than Vim. It reverses the action-verb syntax of Vim e.g. <code>dw<\/code> for\ndelete word in Vim, <code>wd<\/code> in Kakoune.  And it also removes some inconsistencies\nof the Vim editor when it comes to other functions of which I won't discuss\nand which you have to find out yourself.<\/p>\n<p>The editor also has multi-cursors which is a controversial topic among\nterminal editor enthusiasts. But it's a good fit for Kakoune because of its\n\"haptic\" feedback or more accurately visual feedback that shows a selection\nbefore we can do any action.<\/p>\n<p>The editor also has some kind of session\/server support where you can edit in\nthe same server socket. This allows multi-window editing without the actual\nneed of a multiplexer (although, most users do actually use a multiplexer to\nmake the experience better). Here is an example script to allow me to connect\nan existing session with <code>sk<\/code> or <a rel=\"external\" href=\"https:\/\/github.com\/lotabout\/skim\">skim<\/a>\n(an fzf clone in Rust).<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#!<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">\/bin\/bash<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">set<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">euo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> pipefail<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">shopt<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">s<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> lastpipe<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">SESSION<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">kak<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">l<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> \\<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">\t|<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> sk<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> \\<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#8F3F71, #D3869B);\">\t-<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-prompt<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">choose an existing kakoune session&gt; <\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">\\<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#8F3F71, #D3869B);\">\t-<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-header<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">sessions<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-reverse<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">export<\/span><span style=\"color: light-dark(#076678, #83A598);\"> SESSION<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">[<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -z<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">SESSION<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> ]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &amp;&amp;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> exit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 1<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">kak<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">c<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $<\/span><span style=\"color: light-dark(#076678, #83A598);\">SESSION<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $<\/span><span style=\"color: light-dark(#076678, #83A598);\">@<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &amp;&amp;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> exit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 0<\/span><\/span><\/code><\/pre>\n<p>The editor also has its own configuration language called kakscript. Although\nit's better for you to explore what it is since it will be discussed in\nthis post.<\/p>\n<p>This editor is highly opinionated and has many mixed opinions among Vimmers.\nI don't consider myself a Vim expert nor a Kakoune expert but I have experienced\nusing many editors since the start of COVID-19.<\/p>\n<h1 id=\"setup\">Setup<a class=\"zola-anchor\" href=\"#setup\" aria-label=\"Anchor link for: setup\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Some prerequisites needed:<\/p>\n<ul>\n<li>Installed <code>cargo<\/code> from Rust<\/li>\n<li>Kakoune itself<\/li>\n<li>Julia<\/li>\n<\/ul>\n<p>Assuming you already have the prerequisites, head to <code>$XDG_CONFIG_HOME\/kak<\/code> or\n<code>~\/.config\/kak<\/code>.  If the directory does not exist, create it with <code>md<\/code> or\n<code>mkdir<\/code>. Next, at the root of the <code>$XDG_CONFIG_HOME\/kak<\/code>\nor <code>~\/.config\/kak<\/code> let's add a bootstrap install script for\n<a rel=\"external\" href=\"https:\/\/github.com\/jdugan6240\/kak-bundle\">kak-bundle<\/a> in the file <code>kakrc<\/code>.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">evaluate-commands<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> %sh{<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">  #<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> We&#39;re assuming the default bundle_path here...<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">  plugins<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">kak_config<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/bundle<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">  mkdir<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">p<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">plugins<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">  [<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> !<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -e<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">plugins<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/kak-bundle<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#AF3A03, #FE8019);\"> ]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &amp;&amp;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> \\<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    git<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> clone<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">q<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> https:\/\/github.com\/jdugan6240\/kak-bundle<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">plugins<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/kak-bundle<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">  printf<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">%s\\n<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">source &#39;<\/span><span style=\"color: light-dark(#076678, #83A598);\">$<\/span><span style=\"color: light-dark(#076678, #83A598);\">plugins<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/kak-bundle\/rc\/kak-bundle.kak&#39;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span>}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">bundle-noload<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> kak-bundle<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> https:\/\/github.com\/jdugan6240\/kak-bundle<\/span><\/span><\/code><\/pre>\n<p>The script was written in a configuration language called kakoune script\nor kakscript. The idea behind the language is to utilise the built-in shell\nthat is assumed to be POSIX-compliant or POSIX-compatible e.g.  bash, zsh,\nsh, dash, et cetera.<\/p>\n<h2 id=\"installing-kakoune-lsp\">Installing Kakoune LSP<a class=\"zola-anchor\" href=\"#installing-kakoune-lsp\" aria-label=\"Anchor link for: installing-kakoune-lsp\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Some people including me can't live without LSP so let's include that to\nour <code>kakrc<\/code> file.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">bundle<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> kakoune-lsp<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">git clone --depth 1 -b v17.0.1 https:\/\/github.com\/kakoune-lsp\/kakoune-lsp<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">  %{<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    hook<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> global<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> WinSetOption<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> filetype=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">julia<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> %{<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        set<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> global<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> lsp_hover_anchor<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> false<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">        set<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> global<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> lsp_auto_show_code_actions<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        lsp-enable-window<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        map<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> global<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> user<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> l<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> %{:<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> enter-user-mode<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> lsp<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&lt;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">re<\/span><span>t<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">&gt;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">}<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">docstring<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">lsp mode commands<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        map<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> global<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> goto<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> w<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&lt;esc&gt;: lsp-hover-buffer lsp-info-window &lt;ret&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">docstring<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">lsp-info-window<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">        #<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> define-command -docstring &#39;lsp-logs: shows lsp logs on tmux window&#39; lsp-logs -params 0 %{<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">            #<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> terminal sh -c &#39;less +F \/tmp\/kak-lsp.log&#39;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">        #<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">        #<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> map global goto L &#39;&lt;esc&gt;: lsp-logs &lt;ret&gt;&#39; -docstring &#39;show lsp logs on another window&#39;<\/span><\/span>\n<span class=\"giallo-l\"><span>    }<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    hook<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> global<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> KakEnd<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> .<\/span><span style=\"color: light-dark(#076678, #83A598);\">*<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> %{<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        lsp-exit<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">        nop<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> %sh{<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">            rm<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">v<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/tmp\/kak-lsp.log<\/span><\/span>\n<span class=\"giallo-l\"><span>        }<\/span><\/span>\n<span class=\"giallo-l\"><span>    }<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>} %{}<\/span><\/span><\/code><\/pre>\n<p>We also need to add a bootstrap script to install the LanguageServer.jl package with\nPackageCompiler.jl. At the root of the <code>$XDG_CONFIG_HOME\/kak<\/code> or <code>~\/.config\/kak<\/code>, create\nthe directory <code>scripts<\/code>. Then create the file <code>scripts\/julia-ls-install<\/code> with the following\ncontents<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"julia\"><span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">import<\/span><span> Pkg<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span> Pkg<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>add<\/span><span>(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">PackageCompiler<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span> <\/span><\/span>\n<span class=\"giallo-l\"><span>Pkg<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>add<\/span><span>(<\/span><span>url<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">https:\/\/github.com\/julia-vscode\/LanguageServer.jl<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> rev<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">master<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span> <\/span><\/span>\n<span class=\"giallo-l\"><span>Pkg<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>update<\/span><span>(<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">using<\/span><span> PackageCompiler<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span> create_sysimage<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">:LanguageServer<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> sysimage_path<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span>dirname<\/span><span>(<\/span><span>Pkg<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>Types<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>Context<\/span><span>(<\/span><span>)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>env<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>project_file<\/span><span>)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> *<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/languageserver.so<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span><\/code><\/pre>\n<p>And in the <code>$XDG_CONFIG_HOME\/kak\/kakrc<\/code> or <code>~\/.config\/kak\/kakrc<\/code> file, append the following contents<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">bundle-install-hook<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> kakoune-lsp<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> %{<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    cargo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> install<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-path<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> .<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-root<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">HOME<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/.local<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">    julia<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-project=@kak-lsp<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">{<\/span><span style=\"color: light-dark(#076678, #83A598);\">kak_config<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/scripts\/julia-ls-install<\/span><\/span>\n<span class=\"giallo-l\"><span>}<\/span><\/span><\/code><\/pre>\n<p>This will allow you to install kakoune-lsp as well as Julia's LanguageServer.jl and PackageCompiler.jl.<\/p>\n<p>The script allows you to run a precompiled sysimage of the Julia LanguageServer.jl (although it's not needed\nthat much ever since precompilation has improved since version 1.9 of Julia).<\/p>\n<h2 id=\"configuring-the-lsp\">Configuring the LSP<a class=\"zola-anchor\" href=\"#configuring-the-lsp\" aria-label=\"Anchor link for: configuring-the-lsp\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>kakoune-lsp also needs to have a file that configures the LSP of any language. At the root\nof the <code>$XDG_CONFIG_HOME\/kak-lsp<\/code> or <code>~\/.config\/kak-lsp<\/code>, create the file <code>kak-lsp.toml<\/code>. If the\ndirectory does not exist, create it first before creating the file. Add the following\ncontents to the file<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"toml\"><span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">snippet_support<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">verbosity<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 2<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">server<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">timeout<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 1800<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> #<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> seconds = 30 minutes<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">language_server<\/span><span>.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">julia<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">filetypes<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">julia<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">roots<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Project.toml<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.git<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.hg<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Manifest.toml<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">command<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">sh<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">args<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">-c<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">   &quot;&quot;&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">   julia --startup-file=no --history-file=no --project=@kak-lsp ~\/.config\/kak\/scripts\/julia-ls-kak<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">   &quot;&quot;&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">language_server<\/span><span>.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">julia<\/span><span>.<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">settings<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">julia<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">format<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">indent<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 4<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">julia<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">lint<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">call<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">julia<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">lint<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">run<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">julia<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">missingrefs<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">all<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">julia<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">lint<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">iter<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">julia<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">.<\/span><span style=\"color: light-dark(#076678, #83A598);\">modname<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">semantic_tokens<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">faces<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    {<\/span><span style=\"color: light-dark(#076678, #83A598);\">face<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">documentation<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">comment<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> modifiers<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">documentation<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    {<\/span><span style=\"color: light-dark(#076678, #83A598);\">face<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">comment<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">comment<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    {<\/span><span style=\"color: light-dark(#076678, #83A598);\">face<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">function<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">function<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    {<\/span><span style=\"color: light-dark(#076678, #83A598);\">face<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">keyword<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">keyword<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    {<\/span><span style=\"color: light-dark(#076678, #83A598);\">face<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">module<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">namespace<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    {<\/span><span style=\"color: light-dark(#076678, #83A598);\">face<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">operator<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">operator<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    {<\/span><span style=\"color: light-dark(#076678, #83A598);\">face<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">string<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    {<\/span><span style=\"color: light-dark(#076678, #83A598);\">face<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">type<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">type<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    {<\/span><span style=\"color: light-dark(#076678, #83A598);\">face<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">default+d<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">variable<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> modifiers<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">readonly<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    {<\/span><span style=\"color: light-dark(#076678, #83A598);\">face<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">default+d<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">variable<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> modifiers<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">[<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">constant<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    {<\/span><span style=\"color: light-dark(#076678, #83A598);\">face<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">variable<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">variable<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span><\/code><\/pre>\n<p>Then at the root of the <code>$XDG_CONFIG_HOME\/kak<\/code> or <code>~\/.config\/kak<\/code>, add a new file <code>scripts\/julia-ls-kak<\/code>\nwith the following content<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"julia\"><span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">import<\/span><span> Pkg<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">  `buffer_file_path`<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">Gets `buffer-file-name` value which gives<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">the full path to the file associated with the buffer.<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span>buffer_file_path <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> if<\/span><span> haskey<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">ENV<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">kak_buffile<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#8F3F71, #D3869B);\">    ENV<\/span><span>[<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">kak_buffile<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">elseif<\/span><span> haskey<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">ENV<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">KAK_LSP_PROJECT_ROOT_JULIA<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#8F3F71, #D3869B);\">    ENV<\/span><span>[<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">kak_buffile<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>]<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> ENV<\/span><span>[<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">KAK_LSP_PROJECT_ROOT_JULIA<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">else<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#8F3F71, #D3869B);\">    ENV<\/span><span>[<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">kak_buffile<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>]<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span> Pkg<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>Types<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>Context<\/span><span>(<\/span><span>)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>env<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>project_file<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">end<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">  `project_path`<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">Gets the full path of the project where the LSP should<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">start. The steps starts with the following:<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">1. Check if there is an explicitly set project.<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">2. Check for Project.toml from buffer&#39;s full file path exluding the file name.<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">3. Check for Project.toml in current working directory.<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">4. Fallback to global environment.<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span>project_path <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> let<\/span><\/span>\n<span class=\"giallo-l\"><span>    dirname<\/span><span>(<\/span><span>something<\/span><span>(<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>        Base<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>load_path_expand<\/span><span>(<\/span><span>(<\/span><\/span>\n<span class=\"giallo-l\"><span>            p <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span> get<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">ENV<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">JULIA_PROJECT<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> nothing<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span>            p <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">===<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> nothing<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> ?<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> nothing<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> :<\/span><span> isempty<\/span><span>(<\/span><span>p<\/span><span>)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> ?<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> nothing<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> :<\/span><span> p<\/span><\/span>\n<span class=\"giallo-l\"><span>        )<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span>        Base<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>current_project<\/span><span>(<\/span><span>strip<\/span><span>(<\/span><span>buffer_file_path<\/span><span>)<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span>        Base<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>current_project<\/span><span>(<\/span><span>pwd<\/span><span>(<\/span><span>)<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span>        Pkg<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>Types<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>Context<\/span><span>(<\/span><span>)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>env<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>project_file<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span>        Base<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>active_project<\/span><span>(<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span>    )<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">end<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Activate the project<\/span><\/span>\n<span class=\"giallo-l\"><span>Pkg<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>activate<\/span><span>(<\/span><span>project_path<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Install packages if they weren&#39;t installed<\/span><\/span>\n<span class=\"giallo-l\"><span>Pkg<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>instantiate<\/span><span>(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><span> verbose<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">true<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> Then remove it from the LOAD_PATH<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> We did this just to get the packages for the<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> project, we do not need it for the LSP.<\/span><\/span>\n<span class=\"giallo-l\"><span>popfirst!<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">LOAD_PATH<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>ls_install_path <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span> joinpath<\/span><span>(<\/span><span>get<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">DEPOT_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 1<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> joinpath<\/span><span>(<\/span><span>homedir<\/span><span>(<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.julia<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">environments<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">kak-lsp<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span>pushfirst!<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">LOAD_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> ls_install_path<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">using<\/span><span> LanguageServer<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span>popfirst!<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">LOAD_PATH<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span>depot_path <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span> get<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">ENV<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">JULIA_DEPOT_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span>symbol_server_path <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span> joinpath<\/span><span>(<\/span><span>homedir<\/span><span>(<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.cache<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">julia_lsp_symbol_server<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span>mkpath<\/span><span>(<\/span><span>symbol_server_path<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span>server <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span> LanguageServer<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>LanguageServerInstance<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">stdin<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> stdout<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> project_path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> depot_path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> nothing<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> symbol_server_path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span>server<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>runlinter <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span>run<\/span><span>(<\/span><span>server<\/span><span>)<\/span><\/span><\/code><\/pre>\n<p>This is a custom LSP script I made to avoid the limitations of just running\n<code>run(server)<\/code>. See the comments above the <code>project_path<\/code> variable.<\/p>\n<h1 id=\"conclusion\">Conclusion<a class=\"zola-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>That's it. You have finally reached the end of the post and have configured\nyour kakoune editor to work with Julia.<\/p>\n<p>Here are what the result should look like if (ignoring the statusline and\nthe gruvbox theme) if you have the config:<\/p>\n<p>Hover:\n<img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/how-to-setup-julia-with-kakoune\/.\/Screenshot-0608211900.webp\" alt=\"LSP Hover\" \/><\/p>\n<p>Snippets and Completions:\n<img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/how-to-setup-julia-with-kakoune\/.\/Screenshot-0608211948.webp\" alt=\"Completions\" \/><\/p>\n<h1 id=\"versions-of-software-used-at-the-time-of-writing\">Versions of software used at the time of writing<a class=\"zola-anchor\" href=\"#versions-of-software-used-at-the-time-of-writing\" aria-label=\"Anchor link for: versions-of-software-used-at-the-time-of-writing\"\n  >\u00a7<\/a\n>\n<\/h1>\n<ul>\n<li>Julia v1.10.4<\/li>\n<li>Rust 1.78<\/li>\n<li>Kakoune v2023.08.05<\/li>\n<li>Kakoune LSP v17.0.1<\/li>\n<\/ul>\n"},{"title":"Self hosting is fun but...","published":"2024-06-02T00:00:00+00:00","updated":"2024-06-02T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/self-hosting-is-fun-but\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/self-hosting-is-fun-but\/","content":"<h1 id=\"hi\">Hi!<a class=\"zola-anchor\" href=\"#hi\" aria-label=\"Anchor link for: hi\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Hello there!<\/p>\n<p>I have decided to start self-hosting my website! My current plans after this\nis to start donating to <a rel=\"external\" href=\"https:\/\/codeberg.org\">Codeberg<\/a>, starting July. The reason why I\ndecided to self-host is page load. My website, despite being a static website,\nis slow to load because of Codeberg Pages. Codeberg Pages is fine actually, but\nat some points in time it does a bit weird. This is probably because the data\ncenters are in Germany or somewhere in Europe while I am in the Philippines.<\/p>\n<p>The self-hosting provider I use for here is <a rel=\"external\" href=\"https:\/\/www.linode.com\/\">Linode<\/a>. But I plan\nto change after a month. I think I am looking at <a rel=\"external\" href=\"https:\/\/contabo.com\">Contabo<\/a> next.\nMore reasons why below.<\/p>\n<h1 id=\"about-linode\">About Linode<a class=\"zola-anchor\" href=\"#about-linode\" aria-label=\"Anchor link for: about-linode\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Linode. Hmm. I can't give much opinions about it. This is my first time\ntrying out self-hosting after all.<\/p>\n<p>The pricing is in my opinion, could be better? Not sure. Now that I found\nout about <a rel=\"external\" href=\"https:\/\/contabo.com\">Contabo<\/a>, I plan to ditch this instance and move over.<\/p>\n<p>Documentation is actually there in Linode but most of it is either outdated\nor possibly wrong? I have a lot of things I read from the docs that did not\nwork well for me so I read official sources instead aka <strong>the<\/strong> documentation\nof the software I am going to use. They could have done it better I guess\n<strong>and they lack docs for openSUSE too<\/strong> \ud83d\ude22.<\/p>\n<p>I plan to have two compute instances in <a rel=\"external\" href=\"https:\/\/contabo.com\">Contabo<\/a> because I plan\nto use the other instance for a database, and also self-hosting <a rel=\"external\" href=\"https:\/\/woodpecker-ci.org\">Woodpecker\nCI<\/a>. Possibly I will add other services as well such as<\/p>\n<ul>\n<li>NextCloud<\/li>\n<li>VaultWarden (Bitwarden basically) or I just use password-store.<\/li>\n<li>Collabora Office<\/li>\n<\/ul>\n<p>I might share one of these services to my family or friends I guess.<\/p>\n<p>The reason being, for experience and it's also very fun.<\/p>\n<h1 id=\"what-i-learned-so-far\">What I learned so far<a class=\"zola-anchor\" href=\"#what-i-learned-so-far\" aria-label=\"Anchor link for: what-i-learned-so-far\"\n  >\u00a7<\/a\n>\n<\/h1>\n<h2 id=\"experimenting-forgejo\">Experimenting Forgejo<a class=\"zola-anchor\" href=\"#experimenting-forgejo\" aria-label=\"Anchor link for: experimenting-forgejo\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>It would be a waste to not use the remaining compute resources so I decided\nto give <a rel=\"external\" href=\"https:\/\/forgejo.org\">Forgejo<\/a> a <a rel=\"external\" href=\"https:\/\/go.dev\/\">Go<\/a>. \ud83d\ude09<\/p>\n<p>Forgejo is available now in openSUSE. Although, I am quite confused\nby the systemd service but now I understand the implications for\nwhy it was decided not to use the home directory of whatever\ninvokes the <code>forgejo<\/code> binary. This was discussed in the\nhttps:\/\/en.opensuse.org\/openSUSE:Security_Features#Systemd_hardening_effort.<\/p>\n<p>Anyhow, I had a lot of hiccups configuring <a rel=\"external\" href=\"https:\/\/forgejo.org\">Forgejo<\/a> but I just\ndecided to just use whatever that systemd script has and just edit the file\nto point to a custom config by running<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">EDITOR<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">k<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">a<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">k<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> systemctl<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> edit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-full<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> forgejo.service<\/span><\/span><\/code><\/pre>\n<p>specifically, I edited the line containing <code>ExecStart=<\/code>.<\/p>\n<blockquote>\n<p><code>EDITOR=kak<\/code> is so annoying. openSUSE does have a way\nto set this by adding that to <code>\/etc\/profile.local<\/code>.\nLocal configs or those that are suffixed with <code>*.local<\/code> is\nunique to openSUSE. Users are encouraged to edit the\nlocal configs rather than the defaults. This is how\nI got so confused at first when trying it out the first time.\nAlso, this explains why I also edit the apache config\nat a different file instead of the <code>httpd.conf<\/code> file. Specifically,\nby editing <code>\/etc\/sysconfig\/apache2<\/code> \ud83e\udd74.<\/p>\n<\/blockquote>\n<p>Anyway, the site is up at <a rel=\"external\" href=\"https:\/\/forgejo.uncomfyhalomacro.pl\">https:\/\/forgejo.uncomfyhalomacro.pl<\/a>. Feel free\nto take a look around. However, <strong>registrations are closed<\/strong> so if you want\nto make an account, you are not able to unless we are friends. \u26a0\ufe0f\nIf you are my friend, do keep in mind that this is experimental and still\npossible that I will kill this instance. Once I get the hang of it, I will\nstart putting my projects to the self-hosted vm.<\/p>\n<p>Another issue I have is setting the <code>[mailer]<\/code> configuration. Because it seems\nto be not working to be honest and I am not sure why. I filed a ticket to\nmy mail provider if MTA is part of their service because I might be mistaken.<\/p>\n<h2 id=\"nginx\">Nginx<a class=\"zola-anchor\" href=\"#nginx\" aria-label=\"Anchor link for: nginx\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>To manage redirects and subdomain URLs, I tried my hand at Nginx. I read it\nas ngeenx and not like 'engine X' or like how I read Lynx.<\/p>\n<h3 id=\"first-impressions\">First Impressions<a class=\"zola-anchor\" href=\"#first-impressions\" aria-label=\"Anchor link for: first-impressions\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>The language looks like <a rel=\"external\" href=\"https:\/\/kdl.dev\/\">KDL<\/a>. I actually do not know\nwhat Nginx use but whatever. The syntax confuses me a lot to be honest and\nI really don't like how it looks when configuring. Some of you might find\nthe language simple. But what really confused me a lot is doing redirects. I\nguess I didn't read enough documentation \ud83e\udd74.<\/p>\n<h3 id=\"certbot-integration-impressions\">Certbot Integration Impressions<a class=\"zola-anchor\" href=\"#certbot-integration-impressions\" aria-label=\"Anchor link for: certbot-integration-impressions\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Certbot integration is nice. The pressing issue is when certbot rewrites\nfiles for Nginx.  This causes a lot of confusion to me because the\nrewritten configs to point to the SSL certificates are faulty and can\ncause misredirects. I have to manually edit the files to be honest.<\/p>\n<h2 id=\"apache\">Apache<a class=\"zola-anchor\" href=\"#apache\" aria-label=\"Anchor link for: apache\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>I am not sure why but after the onslaught of trying Nginx, I decided\nto use Apache.<\/p>\n<h3 id=\"first-impressions-1\">First Impressions<a class=\"zola-anchor\" href=\"#first-impressions-1\" aria-label=\"Anchor link for: first-impressions-1\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>I got pampered by openSUSE because it contains templates at <code>\/etc\/apache2\/vhosts.d<\/code>.\nAt first, I was so confused because when I read the default config at\n<code>\/etc\/apache2\/httpd.conf<\/code>, the documentation from Linode and other sources\nconflict because openSUSE's default config has a lot of comments to discourage\nthe use of it. Instead, I have to edit <code>\/etc\/sysconfig\/apache2<\/code> and add a\nnew file <code>\/etc\/apache2\/httpd.conf.local<\/code>. This file is added to <code>\/etc\/sysconfig\/apache2<\/code>,\nspecifically, <code>APACHE_CONF_INCLUDE_FILES<\/code>. Here is a snippet of the updated sysconfig.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span># Here you can name files, separated by spaces, that should be Include&#39;d from <\/span><\/span>\n<span class=\"giallo-l\"><span># httpd.conf. <\/span><\/span>\n<span class=\"giallo-l\"><span>#<\/span><\/span>\n<span class=\"giallo-l\"><span># This allows you to add e.g. VirtualHost statements without touching <\/span><\/span>\n<span class=\"giallo-l\"><span># \/etc\/apache2\/httpd.conf itself, which makes upgrading easier. <\/span><\/span>\n<span class=\"giallo-l\"><span>#<\/span><\/span>\n<span class=\"giallo-l\"><span>APACHE_CONF_INCLUDE_FILES=&quot;\/etc\/apache2\/httpd.conf.local&quot;<\/span><\/span><\/code><\/pre><h3 id=\"better-syntax-plugins-and-tooling\">Better syntax, plugins, and tooling<a class=\"zola-anchor\" href=\"#better-syntax-plugins-and-tooling\" aria-label=\"Anchor link for: better-syntax-plugins-and-tooling\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>I am not saying that I did not have difficulty using Apache. But\nas I roamed around the Internet, I just found out that it uses\nutility tools that helps installs plugins. As of writing, I have\nadded the <code>filter<\/code> and <code>deflate<\/code> module. The latter was already\nadded by default but the <code>filter<\/code> module was not. This was\nto enhance page loads (yeah I know it's a static site \ud83e\udd23) but\na small speed up helps \ud83e\udd2a.<\/p>\n<p>It's also easy to just add additional subdomains as well\nin <code>\/etc\/apache2\/vhosts.d<\/code>. You just have to configure if what you want\nis a reverse proxy and a redirect or serve directly the directory\nspecifically those in <code>\/srv\/www\/vhosts<\/code>.<\/p>\n<h3 id=\"certbot-integration-impressions-1\">Certbot Integration Impressions<a class=\"zola-anchor\" href=\"#certbot-integration-impressions-1\" aria-label=\"Anchor link for: certbot-integration-impressions-1\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>I am just going to say that the integration with certbot is amazing.  Even as\nto correctly configure my configs. Running <code>certbot --apache -d mydomain.com -d other.mydomain.com<\/code> is a breeze. It will add a new file corresponding\nto the config name with <code>-le-ssl.conf<\/code> suffix. I just add a small modification\nbut so far only to the one that contains <code>www.mydomain.com<\/code>.<\/p>\n<h2 id=\"dns\">DNS<a class=\"zola-anchor\" href=\"#dns\" aria-label=\"Anchor link for: dns\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>In regards to DNS, I have some issues configuring it. I manage to learn more\nabout A\/AAAA and CNAME records. So far, it's all good and working.<\/p>\n<p>I am just surprised that I don't know how long it will really propagate. One\nhiccup I made before was a mistypo of configuring spam reputation for\na mail provider I use for my custom domain. And yes, it did propagate\nthe domain and because of that, I have or had an ephemeral URL domain\n<code>autoconfig.mydomain.com<\/code> which points to my atuin instance. It's gone now.<\/p>\n<h1 id=\"closing-thoughts\">Closing Thoughts<a class=\"zola-anchor\" href=\"#closing-thoughts\" aria-label=\"Anchor link for: closing-thoughts\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Self-hosting is a fun idea. Although, I might be looking at other hosting solutions\nlike Contabo. I heard they have a good price over ratio but I also\nheard mixed reviews from different communities e.g. they lower the quality\nof network bandwidth (?) but I can't seem to see what's the issue yet\nso I might have to experience that myself.<\/p>\n"},{"title":"I probably need less information","published":"2024-05-26T00:00:00+00:00","updated":"2024-05-26T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/i-probably-need-less-information-on-my-prompts\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/i-probably-need-less-information-on-my-prompts\/","content":"<p>\"I probably need less information for your prompts.\" I told myself and\nhere is why I am convinced.<\/p>\n<h1 id=\"experience\">Experience<a class=\"zola-anchor\" href=\"#experience\" aria-label=\"Anchor link for: experience\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Throughout my adventurous search for the best terminal prompts out there,\nI am utterly convinced that I don't need fancy terminal prompts. Despite\nwhat they have to offer like speed and performance, you only need a handful\nof information and information you have to re-verify again and again in\nthe terminal.<\/p>\n<p>You might be wondering, \"but you need that information\". Well, that depends\non the scenario.<\/p>\n<p>Let's say, you are in a Julia project, you get the version number of Julia and\nthis glyph \"\ue800\" that may not render properly if your font does not support it.\nHow many times do you have to see it? How many times do you need to see it?<\/p>\n<p>In my experience, I rarely do it. I just usually run <code>ls<\/code> and call it a day.<\/p>\n<h1 id=\"i-always-check-the-files\">I always check the files<a class=\"zola-anchor\" href=\"#i-always-check-the-files\" aria-label=\"Anchor link for: i-always-check-the-files\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>And I rarely look at the fancy version and language indicator. When I work\non projects, what's most important to me are<\/p>\n<ul>\n<li>where i am aka\n<ul>\n<li>folder<\/li>\n<li>directory<\/li>\n<li>\"everything is files on linux<sup class=\"footnote-reference\" id=\"fr-lmao-1\"><a href=\"#fn-lmao\">1<\/a><\/sup>\"<\/li>\n<\/ul>\n<\/li>\n<li>git information<\/li>\n<li>time and date<\/li>\n<\/ul>\n<p>I was not convinced at first because probably it's a lot of\nwork to change what I used to do. But thanks to this <a rel=\"external\" href=\"https:\/\/fosstodon.org\/@blainsmith\/112054633913133165\">post by\nblainsmith<\/a> in the\nfediverse, I changed my mind.<\/p>\n<p>Now my prompt uses this configuration.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">autoload<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">Uz<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> vcs_info<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">zstyle<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">:vcs_info:*<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> enable<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> git<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">zstyle<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">:vcs_info:*<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> check-for-changes<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">zstyle<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">:vcs_info:*<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> unstagedstr<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">zstyle<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">:vcs_info:*<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> stagedstr<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">+<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">zstyle<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">:vcs_info:git:*<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> formats<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">%F{green}(%s)%F{yellow}(%b)%F{green}(%c)%F{red}(%u)%F{blue}(%m)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">zstyle<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">:vcs_info:git:*<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> actionformats<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">%F{green}(%s)%F{yellow}(%b)%F{green}(%c)%F{red}(%u)%F{blue}(%m)%F{002}(%a)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">precmd_vcs_info<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> vcs_info<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">precmd_functions<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">+=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">(<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> p<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">r<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">e<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">c<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">m<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">d<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">_<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">v<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">c<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">s<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">_<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">i<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">n<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">f<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">o<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> )<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">setopt<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> prompt_subst<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">export<\/span><span style=\"color: light-dark(#076678, #83A598);\"> PROMPT<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">$&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\\$vcs_info_msg_0_%F{010} %B%F{blue}%n%b%f in %F{black}%K{7}&lt;%3~&gt;%k%f %F{yellow}[%y] %F{green}@ %B%U%F{white}%M%u%b %{\\x1b[3m%F{red}%T%} %F{white}%D{%b %d,%Y (%A)}<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">%{\\x1b[0m%}%(?.%F{green} .%F{red}%? )%%%F{none} <\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><\/span><\/code><\/pre>\n<p>But keep in mind, I just skimmed through the <a rel=\"external\" href=\"https:\/\/zsh.sourceforge.io\/Doc\/Release\/Prompt-Expansion.html\">Zsh\nDocumentation<\/a>\nand just look at whatever all over the internet just to change some colors and\nsuch. But it works so I guess that's also cool?<\/p>\n<h1 id=\"new-prompt-look\">New prompt look<a class=\"zola-anchor\" href=\"#new-prompt-look\" aria-label=\"Anchor link for: new-prompt-look\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Btw my old prompt uses default starship prompt so I guess everyone knows what\nthe default looks like so no need to give a screenshot. Now, my prompt\nlooks like this<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/i-probably-need-less-information-on-my-prompts\/.\/new-prompt.webp\" alt=\"New prompt\" \/><\/p>\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn-lmao\">\n<p><a rel=\"external\" href=\"https:\/\/en.wikipedia.org\/wiki\/Everything_is_a_file\">https:\/\/en.wikipedia.org\/wiki\/Everything_is_a_file<\/a> <a href=\"#fr-lmao-1\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section>\n"},{"title":"Using SSH keys with TPM and Git","published":"2024-05-05T00:00:00+00:00","updated":"2024-05-05T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/using-ssh-keys-with-tpm-and-git\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/using-ssh-keys-with-tpm-and-git\/","summary":"<p>So my mentor has already made a\n<a rel=\"external\" href=\"https:\/\/fy.blackhats.net.au\/blog\/2023-04-20-using-a-tpm-for-ssh-keys-on-opensuse-tumbleweed\/\">post<\/a>\nabout how to use TPMs in openSUSE.<\/p>\n<p>I followed a bit, did some weird stuff because it doesn't work at first. It turns out I made a typo and missed a flag\n\ud83e\udd74<\/p>"},{"title":"I fell in love with Rust","published":"2024-04-23T00:00:00+00:00","updated":"2024-04-23T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/i-fell-in-love-with-rust\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/i-fell-in-love-with-rust\/","summary":"<p>For quite some time, I am getting more interested in programming\nlanguages that have good documentation, a large community and\naccelerating adoption in various sectors in the industry.<\/p>"},{"title":"Nushell script for opening Youtube videos with MPV","published":"2024-03-05T00:00:00+00:00","updated":"2024-03-05T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/scripts\/yt-cli-nu\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/scripts\/yt-cli-nu\/","content":"<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"nushell\"><span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#!\/usr\/bin\/nu<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">alias<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> MENU<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> fuzzel<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">d<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> subbed_channels<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> [<\/span><span> <\/span><\/span>\n<span class=\"giallo-l\"><span>  <\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> chrisbiscardi<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> Coderized<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> CodeAesthetic<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> dreamsofcode<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> fasterthanlime<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> fireship<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> fknight<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> freecodecamp<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> LearnLinuxTV<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> LowLevelLearning<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> niccoloveslinux<\/span><span> <\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> NoBoilerplate<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> _noisecode<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> RustVideos<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> VideosByDefault<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> ThePrimeTimeagen<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\"> TraversyMedia<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>]<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> channel<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$subbed_channels<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> to text<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> MENU<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">p<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">choose<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> channel<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> str trim<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$channel<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> is-empty<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\"> exit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 0<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">if<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $channel<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> not-in<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $subbed_channels<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">  notify-send<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> --<\/span><span style=\"color: light-dark(#076678, #83A598);\">icon<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> dialog-error<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> --<\/span><span style=\"color: light-dark(#076678, #83A598);\">app-name<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> Error<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">u<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> critical<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Not<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> in<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> the<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> list<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">$channel<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> channel is not in the list of your subs!<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">  exit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 1<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> titles<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">http get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">http get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">https:\/\/www.youtube.com\/@<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">$channel<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> to text<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> str trim<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> query web<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">q<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">link<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">a<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> href<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> find<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> feeds<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 0<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> ansi strip<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> --<\/span><span style=\"color: light-dark(#076678, #83A598);\">raw<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> query web<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">q<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">title<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> channel_title<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$titles<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 0<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> video_titles<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$titles<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> skip<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 1<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> chosen_video_title<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$titles<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> to text<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> MENU<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">p<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">open link to&gt;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> str trim<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$chosen_video_title<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> is-empty<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\"> exit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 0<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> video_hashes<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span> (<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">http get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\">http get<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">https:\/\/www.youtube.com\/@<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">$channel<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> str trim<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> query web<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">q<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">link<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">a<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> href<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> find<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> feeds<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 0<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> ansi strip<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> --<\/span><span style=\"color: light-dark(#076678, #83A598);\">raw<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> query web<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">q<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">yt\\:videoId<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">for<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $video_title<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> in<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $video_titles<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> --numbered<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\"> if<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $chosen_video_title<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> ==<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $channel_title<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">  notify-send<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> --<\/span><span style=\"color: light-dark(#076678, #83A598);\">icon<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> firefox<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> --<\/span><span style=\"color: light-dark(#076678, #83A598);\">app-name<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> firefox<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Opening Youtube channel - <\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">$channel_title<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> - in default browser<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">  setsid<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/bin\/sh<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">c<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">xdg-open &#39;https:\/\/youtube.com\/@<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">$channel<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&#39;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">  sleep<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 0.3sec<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">  exit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 0<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\"> if<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$chosen_video_title<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> in<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $video_titles<\/span><span>)<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> and<\/span><span> (<\/span><span style=\"color: light-dark(#076678, #83A598);\">$chosen_video_title<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> in<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $video_title<\/span><span style=\"color: light-dark(#076678, #83A598);\">.item<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">  notify-send<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> --<\/span><span style=\"color: light-dark(#076678, #83A598);\">icon<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> mpv<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> --<\/span><span style=\"color: light-dark(#076678, #83A598);\">app-name<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> mpv<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Opening &#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">$video_title<\/span><span style=\"color: light-dark(#076678, #83A598);\">.item<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&#39; in mpv<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">  let<\/span><span style=\"color: light-dark(#076678, #83A598);\"> ytflags<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">mp4<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">,<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">webm<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)[<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">height<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&lt;?<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">1080<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">]+<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">bestaudio<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">best<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>  <\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">  setsid<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/bin\/sh<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> -<\/span><span style=\"color: light-dark(#076678, #83A598);\">c<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> $&#39;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">mpv --slang=en --ytdl-raw-options=ignore-config=,sub-lang=en,write-auto-sub= --ytdl-format=&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">$ytflags<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot; --no-fs &quot;https:\/\/youtube.com\/watch?v=<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">(<\/span><span style=\"color: light-dark(#076678, #83A598);\">$video_hashes<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> |<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> get<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $video_title<\/span><span style=\"color: light-dark(#076678, #83A598);\">.index<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">)<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&#39;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">  sleep<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 0.3sec<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">  exit<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 0<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">}<\/span><\/span><\/code><\/pre>"},{"title":"Waycrate is now a GSoC 2024 mentor organization","published":"2024-02-23T00:00:00+00:00","updated":"2024-02-23T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/gsoc\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/gsoc\/","content":"<p>Our open-source organization is now a mentor organization for GSoC 2024.<\/p>\n<p>We would like to thank openSUSE for vouching our application which increased\nour chances of getting accepted as a mentoring organization.<\/p>\n<p>Thanks a lot Douglas DeMaio and William Brown!<\/p>\n<p>Our application was spearheaded by our founding organization member, Aakash\nSen Sharma, a very talented individual who is going to have a new research\nsoon on artificial intelligence and large language models. Love the effort!<\/p>\n<p>If you read this and are interested to check us out, here is a link to\nother links \u2014 <a rel=\"external\" href=\"https:\/\/summerofcode.withgoogle.com\/organizations\/waycrate\/\">https:\/\/summerofcode.withgoogle.com\/organizations\/waycrate\/<\/a>.<\/p>\n"},{"title":"I will say this again \"Science is not the issue, intent is\"","published":"2024-02-20T00:00:00+00:00","updated":"2024-02-20T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/i-will-say-this-again-science-is-not-an-issue-intent-is\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/i-will-say-this-again-science-is-not-an-issue-intent-is\/","content":"<p>As a child, I was always into the field of science. Always curious, always\nwanting to explore things to find an answer to all my questions.<\/p>\n<p>Now as an adult, that intensity is now a small candle rather than a roaring\nflame. It is not because I do not love science anymore. But it is because\nof how the world changed a lot. Or to be more accurate, I have finally\nnoticed what the real world is like. Living as a child was living in a bliss\nof ignorance.<\/p>\n<p>Priorities change when you become an adult. Fortunately, science is always\nprogressing, and technology is always innovating and that brings excitement\nor disappointment not because science and technology is a bad thing. But\nbecause science can be also used for nefarious purposes. That's not new.\nI already know that. I am just not happy with the state of the world right now.<\/p>\n<p>In my generation, of whom are born around the year 1990s and 2000s,\nwe have finally reached the peak of <strong>enshittification<\/strong>.  From our\ninternet and social networks, to the full-blown browser trackers\nor spyware and advertisements that do not even make sense at all,\nto the low-quality service and the not-stealing-stealing from many\nsubscription based media companies \u2014 we can see the world is now full of\nnightmare-cocaine-fuel-dopamine-addicting-technology-to-false-science things.<\/p>\n"},{"title":"Technology is the cause of all the braindrain","published":"2024-02-12T00:00:00+00:00","updated":"2024-02-12T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/technology-is-the-cause-of-all-brain-drain\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/technology-is-the-cause-of-all-brain-drain\/","summary":"<p>I haven't finished reading <a rel=\"external\" href=\"https:\/\/en.wikipedia.org\/wiki\/Amusing_Ourselves_to_Death\">Amusing ourselves to\ndeath<\/a>.\nBut it is kind of obvious that the result of technology's effects on youth\nand how tech companies pursue this abuse of cocktail concoction of digital\naddiction are \"zombification\" of people today.<\/p>"},{"title":"The problem with today's research and academic writing","published":"2024-02-12T00:00:00+00:00","updated":"2024-02-12T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/the-problem-with-research-and-academic-writing\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/the-problem-with-research-and-academic-writing\/","summary":"<p>A <a rel=\"external\" href=\"https:\/\/arxiv.org\/pdf\/2402.04607.pdf\">recent study<\/a> about how citations\nare manipulatable have caused controversy in the integrity and honesty of\nthose in academia.<\/p>"},{"title":"Introduction to Microbiology","published":"2024-02-10T00:00:00+00:00","updated":"2024-02-10T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/lecture\/mc1-introduction-to-microbiology\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/lecture\/mc1-introduction-to-microbiology\/","content":"<h1 id=\"introduction-to-microbiology\">Introduction to Microbiology<a class=\"zola-anchor\" href=\"#introduction-to-microbiology\" aria-label=\"Anchor link for: introduction-to-microbiology\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Microbiology is the study of the structure, lifestyle, and diversity of microorganisms.\nThe field also focuses on how to handle microorganisms and produce microbial culture\nin a laboratory or controlled setting.<\/p>\n<p>Microbiology is also a discipline used to understand disease dynamics in Epidemiology\nand also in Biodiversity.<\/p>\n<h1 id=\"historical-antecedents\">Historical Antecedents<a class=\"zola-anchor\" href=\"#historical-antecedents\" aria-label=\"Anchor link for: historical-antecedents\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>The history of biology is vast that we will only need to cover a few proponents\nor those that are involved in the improvement and innovation of the field. Some\nof them discovered new drugs because of messy accidents, and others are purely\nto improve food security.<\/p>\n<h2 id=\"robert-hooke\">Robert Hooke<a class=\"zola-anchor\" href=\"#robert-hooke\" aria-label=\"Anchor link for: robert-hooke\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Robert Hooke is well-renowned for his book \"Micrographia\", a collection of his explorations\nand illustrations of microbes and small organisms under his microscope. His discovery from\nhis microscope forced the realization of the existence of structures that were too small\nto be seen by the unaided eye.<\/p>\n<h2 id=\"antoni-van-leeuwenhoek\">Antoni van Leeuwenhoek<a class=\"zola-anchor\" href=\"#antoni-van-leeuwenhoek\" aria-label=\"Anchor link for: antoni-van-leeuwenhoek\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Also known as the \"Father of Microbiology\", Antoni van Leeuwenhoek was probably first to\nobserve microorganisms under the microscope of which he called <em>animalcules<\/em>. He published\nhis works to the Royal Society in London.<\/p>\n<h2 id=\"louis-pasteur\">Louis Pasteur<a class=\"zola-anchor\" href=\"#louis-pasteur\" aria-label=\"Anchor link for: louis-pasteur\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>In the 1850s, <strong>Louis Pasteur<\/strong> is a chemist and a microbiologist known\nfor his works and studies about fermentation. He discovered th at wine is\nproduced through fermentation caused by <strong>yeast cells<\/strong>.<\/p>\n<p>He also proposed that microorganisms can cause disease and later developed\na method to remove microbes from food called <em><strong>pasteurizat ion<\/strong><\/em>.<\/p>\n<h2 id=\"robert-koch-and-julius-petri\">Robert Koch and Julius Petri<a class=\"zola-anchor\" href=\"#robert-koch-and-julius-petri\" aria-label=\"Anchor link for: robert-koch-and-julius-petri\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Because of Louis Pasteur's work, it influenced <strong>Robert Koch<\/strong> who studied\n<strong>anthrax<\/strong> - a disease for cattle and sheep.<\/p>\n<p>He is also one of the founders of bacteriology and discovered the bacteria\nresponsible for <strong>tuberculosis<\/strong> and <strong>cholera<\/strong>.<\/p>\n<p>His assistant, <strong>Julius Petri<\/strong>, designed a shallow dish we know today as\nthe <strong>Petri dish<\/strong>.<\/p>\n<p>Koch then proposed that there are four conditions that proved a disease is\ncaused by a suspected bacteria. These are known as <strong>Koch's postulates<\/strong>.<\/p>\n<p><strong>Koch's Postulates<\/strong><\/p>\n<ol>\n<li>the organism was present in every case of the disease<\/li>\n<li>it could be cultured outside the body<\/li>\n<li>inoculation of the culture caused the disease in an animal<\/li>\n<li>the organism could be found in that animal<\/li>\n<\/ol>\n<h2 id=\"martinus-beijerinck-and-dmitrii-ivanowski\">Martinus Beijerinck and Dmitrii Ivanowski<a class=\"zola-anchor\" href=\"#martinus-beijerinck-and-dmitrii-ivanowski\" aria-label=\"Anchor link for: martinus-beijerinck-and-dmitrii-ivanowski\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>They were one of the <strong>founders of virology<\/strong> because of their work on\n<strong>tobacco mosaic viruses<\/strong>. They studied juices extracted from the leaves\nof plants infected with what is now known to be tobacco mosaic virus. They\nfiltered the juices to remove bacteria and found that even when highly diluted,\nthe liquid still could cause infection in plants. Ivanowski concluded that\nan infectious agent other than a bacterium\u2014a filterable \u201cvirus\u201d\u2014led\nto the disease. Beijerinck called the substance \u201ccontagious living fluid.\u201d<\/p>\n<h2 id=\"wendell-stanley-and-ernst-ruska\">Wendell Stanley and Ernst Ruska<a class=\"zola-anchor\" href=\"#wendell-stanley-and-ernst-ruska\" aria-label=\"Anchor link for: wendell-stanley-and-ernst-ruska\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p><strong>Wendell Stanley<\/strong> further studied the tobacco mosaic virus and isolated\nthe crystals of the hypothesized disease-causing agents.<\/p>\n<p>Because of the invention of the transmission electron microscope by <strong>Ernst\nRuska<\/strong> in 1933, this made it possible to observe viruses for the first time.<\/p>\n<p>Ruska received the Nobel Prize in physics because of his transmission\nelectron microcoscope.<\/p>\n<h2 id=\"alexander-fleming\">Alexander Fleming<a class=\"zola-anchor\" href=\"#alexander-fleming\" aria-label=\"Anchor link for: alexander-fleming\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>The <strong>discovery of penicillin<\/strong> was nothing short of an accident. <strong>Alexander\nFleming<\/strong> was busy with other things so he left his laboratory uncleaned\nfor a few weeks.<\/p>\n<p>When he returned, he noticed some of his petri dishes have fungus on\nthem. But what interested him was there was no bacteria growing near the\nfungal contamination. There he identified this fungus as <em>Penicillium rubens<\/em>.<\/p>\n<p>The mold or fungus produced an antibiotic substance for which he called\n<strong>penicillin<\/strong>.<\/p>\n<h1 id=\"summary-historical-antecedents\">Summary - Historical Antecedents<a class=\"zola-anchor\" href=\"#summary-historical-antecedents\" aria-label=\"Anchor link for: summary-historical-antecedents\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>The most crucial tool that helped progress the field of microbiology is the <strong>microscope<\/strong>. Without such a tool, we wouldn't have progressed our understanding of life, diseases, and influence in our lives.<\/p>\n<p>Microbes are an essential part of the biosphere, each of us filled with them.<\/p>\n<p>Pasteur invented the pasteurization and increased food safety and food security.<\/p>\n<p>Wendell Standley discovered the crystals that caused the tobacco mosaic disease.<\/p>\n<p>Ruska invented the transmission electron microscope and helped further our understanding of viruses.<\/p>\n<p>Everything we know about medicine and diseases are thanks to the curiousity of those people who\nare always curious about the things around them.<\/p>\n<h1 id=\"investigating-microbial-life\">Investigating microbial life<a class=\"zola-anchor\" href=\"#investigating-microbial-life\" aria-label=\"Anchor link for: investigating-microbial-life\"\n  >\u00a7<\/a\n>\n<\/h1>\n<h2 id=\"defining-life\">Defining life<a class=\"zola-anchor\" href=\"#defining-life\" aria-label=\"Anchor link for: defining-life\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>The smallest unit of life is the cell. Life will not exist without the\nexistence of this biological unit. But how do we define life? What are\nthe current consensus when it comes to the field of cell biology and\nmicrobiology? The answer is still, as of today, an open question.<\/p>\n<p>Currently, these are the criteria that most biologists agree to say something\nis \"alive\":<\/p>\n<ol>\n<li>Able to respond to stimuli.<\/li>\n<li>Able to reproduce.<\/li>\n<li>Maintains homeostasis.<\/li>\n<li>Has growth and development.<\/li>\n<li>Consists of cells.<\/li>\n<li>Has complex biochemical processes.<\/li>\n<\/ol>\n<blockquote>\n<p>We will have an open discussion about these. Prepare and study and do your\nown research for I will ask each of you regarding the following criteria.<\/p>\n<\/blockquote>\n<p>Cells can either be unicellular or multicellular. However, cellular complexity\nis best described in terms of structure rather than the number of cells.<\/p>\n<h2 id=\"prokaryotes\">Prokaryotes<a class=\"zola-anchor\" href=\"#prokaryotes\" aria-label=\"Anchor link for: prokaryotes\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>The simplest cells are the prokaryotes. The name itself means \"before the nut\"\nas the words is a combination of two Greek words that are read as \"pro\" and\n\"karyon\".<\/p>\n<p>These cells are simple in a sense these structures are enough for it to exist<\/p>\n<ul>\n<li>plasma membrane<\/li>\n<li>nucleoid<\/li>\n<li>plasmid<\/li>\n<li>cytoplasm<\/li>\n<li>ribosomes<\/li>\n<\/ul>\n<p>Additional extensions such as a \"cell wall\" and a flagellum may exist. Some even have hair-like\nextensions called as \"cillia\".<\/p>\n<h2 id=\"eukaryotes\">Eukaryotes<a class=\"zola-anchor\" href=\"#eukaryotes\" aria-label=\"Anchor link for: eukaryotes\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Eukaryotes are more complex since they have a \"true nucleus\" and also contain small structures\ncalled organelles of which have specific functions. A table below explains those key\ndifferences.<\/p>\n<p><em>Key differences or similarities between a <strong>eukaryote<\/strong> and a <strong>prokaryote<\/strong><\/em><\/p>\n<table><thead><tr><th style=\"text-align: center\">Eukaryote<\/th><th style=\"text-align: center\">Prokaryote<\/th><\/tr><\/thead><tbody>\n<tr><td style=\"text-align: center\">Nucleus<\/td><td style=\"text-align: center\">No nucleus<\/td><\/tr>\n<tr><td style=\"text-align: center\">Membrane-bound organelles<\/td><td style=\"text-align: center\">No membrane-bound organelles<\/td><\/tr>\n<tr><td style=\"text-align: center\">Unicellular &amp; Multicellular<\/td><td style=\"text-align: center\">Unicellular (also in colonies)<\/td><\/tr>\n<tr><td style=\"text-align: center\">Circular DNA<\/td><td style=\"text-align: center\">Linear<\/td><\/tr>\n<tr><td style=\"text-align: center\">Has mitochondria<\/td><td style=\"text-align: center\">No mitochondria<\/td><\/tr>\n<tr><td style=\"text-align: center\">Asexual and sexual<\/td><td style=\"text-align: center\">Asexual<\/td><\/tr>\n<\/tbody><\/table>\n<p>With that said, these organelles are small functional structures that help\neukaryotic cells live and thrive. Functions vary from waste management to\nenergy production.<\/p>\n<p>As your task, define the function of the following membrane-bound\norganelles:<\/p>\n<ul>\n<li>mitochondria<\/li>\n<li>lysosome<\/li>\n<li>vacuole<\/li>\n<li>nucleus<\/li>\n<li>golgi body<\/li>\n<li>rough and smooth endoplasmic reticulum<\/li>\n<\/ul>\n<p>Prepare for a quiz and an oral recitation next meeting.<\/p>\n<h1 id=\"key-questions\">Key questions<a class=\"zola-anchor\" href=\"#key-questions\" aria-label=\"Anchor link for: key-questions\"\n  >\u00a7<\/a\n>\n<\/h1>\n<ol>\n<li>There are many membrane-bound organelles. Can you cite one example and\ndescribe its function?<\/li>\n<li>Do you think there are other criteria that can be added to define \"life\"?<\/li>\n<li>Research about viruses. How is it that they are not considered \"alive\"?<\/li>\n<li>We listed some notable mentions of scientists. Give another example who\nare also notable in this field and their contributions.<\/li>\n<li>What are the two modes of sexual reproduction? Define.<\/li>\n<\/ol>\n"},{"title":"Tools I use ever since","published":"2024-01-30T00:00:00+00:00","updated":"2024-01-30T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/tools-i-use-since-2024\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/tools-i-use-since-2024\/","content":"<h1 id=\"editors\">Editors<a class=\"zola-anchor\" href=\"#editors\" aria-label=\"Anchor link for: editors\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I am very familiar with any editor now from Emacs, to VSCode, from IntelliJ to\nVim. But my notable favorite editors are Helix and Kakoune. Visual feedback\nis more convenient for me that is why I prefer the reverse mode of Helix\nand Kakoune over Vim or Neovim.<\/p>\n<h1 id=\"web-browser\">Web Browser<a class=\"zola-anchor\" href=\"#web-browser\" aria-label=\"Anchor link for: web-browser\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I still use Firefox. I have been a Firefox user for 3 years now ever since\nCOVID-19 happened<\/p>\n<h1 id=\"calendar\">Calendar<a class=\"zola-anchor\" href=\"#calendar\" aria-label=\"Anchor link for: calendar\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>The funny thing about calendars is I always look at my phone. I guess\nit is either the <code>cal<\/code> command or Thunderbird's Calendar.<\/p>\n<h1 id=\"note-taking\">Note-taking<a class=\"zola-anchor\" href=\"#note-taking\" aria-label=\"Anchor link for: note-taking\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I have tried many note-taking apps. I believe that Org mode from Emacs has\npotential, especially my favorite Org Roam + UI plugin,  but the fact that\nit is only for Emacs is a deal breaker for me. I plan to write something\nsimilar that is editor-agnostic and platform-agnostic. But for now, I am\nusing on just plain text markdown. Obsidian looks enticing though.<\/p>\n"},{"title":"Non-technicals, why am I not a purist, and other stuff","published":"2024-01-12T00:00:00+00:00","updated":"2024-01-14T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/non-technicals\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/non-technicals\/","summary":"<p>At least 2 years being part of open source, I feel like I am witnessing an\nage where the future of open source and its movement is uncertain. Open source\nhas come a long way where computing has become openly accessible for everyone\nand I mean desktop computing. However, most non-technicals are not aware or at\nleast unfamiliar with open source and the organizations that advocate for it.<\/p>"},{"title":"What to look forward on 2024","published":"2023-12-31T00:00:00+00:00","updated":"2023-12-31T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/what-to-look-forward-for-on-2024\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/what-to-look-forward-for-on-2024\/","summary":"<p>To be honest I am just writing this out of boredom. I have lots of plans\nfor next year and I was hoping they won't go awry, at least.<\/p>"},{"title":"Opinion: Sustainable development is unsustainable","published":"2023-12-19T00:00:00+00:00","updated":"2023-12-19T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/sustainable-development-is-unsustainable\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/sustainable-development-is-unsustainable\/","summary":"<p>How come that the most sought after solution to our problems in sustainability\nis actually <em>NOT REAL<\/em>?<\/p>"},{"title":"I am trying out kakoune again","published":"2023-11-22T00:00:00+00:00","updated":"2023-11-22T00:00:00+00:00","author":{"name":"\n            \n              Unknown\n            \n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/i-am-trying-out-kakoune-again\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/i-am-trying-out-kakoune-again\/","content":"<h1 id=\"update-on-my-editor-usage\">Update on my editor usage<a class=\"zola-anchor\" href=\"#update-on-my-editor-usage\" aria-label=\"Anchor link for: update-on-my-editor-usage\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>There is nothing much to say here but I really like the idea\nof how kakoune literally changed how editing works than usual\nvi-like or vim editors.<\/p>\n<p>For now I will test how far I can go using this editor.<\/p>\n<blockquote>\n<p>Actually, I noticed that I even forget sometimes that I am using kakoune\nuntil I hit a minor difference e.g <code>&lt;s-W&gt;<\/code> instead of pressing\n<code>v<\/code> then <code>w<\/code><\/p>\n<\/blockquote>\n"},{"title":"Why Philippine Institutions Should Use FOSS","published":"2023-10-01T00:00:00+00:00","updated":"2023-10-11T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/why-ph-institutions-should-use-foss\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/why-ph-institutions-should-use-foss\/","content":"<h1 id=\"background\">Background<a class=\"zola-anchor\" href=\"#background\" aria-label=\"Anchor link for: background\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>For a very long time, the Philippines is no stranger for the problems of\nscience and tech illiteracy, especially when it comes to the usage of their\nown computers. From controversial topics such as privacy and security,\nand also from the ethical and moral perspectives of using software such as\npiracy and scams.<\/p>\n<p>Most Filipinos do not even know the term \"Open Source\" nor any software that\nare actually Free and Open Source Software.<\/p>\n<p>Hence, I am advocating the idea of raising awareness of Free and Open Source\nSoftware or FOSS so multiple institutions in the country would reconsider\nusing FOSS alternatives over proprietary ones. With this, I hope that we\nlearn its importance and how it will shape our lives for the better.<\/p>\n<h1 id=\"so-what-is-open-source-software-oss\">So what is Open Source Software (OSS)?<a class=\"zola-anchor\" href=\"#so-what-is-open-source-software-oss\" aria-label=\"Anchor link for: so-what-is-open-source-software-oss\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Basically, <em>open source<\/em> is a philosophy. It is a belief that open code\ncollaboration is vital for the improvement and innovation of technology and\nsoftware. Open means, the code is accessible by or for everyone. Think of it\nas a <em>humanitarian<\/em> mission to <strong><strong>improve the livelihood of many people<\/strong><\/strong>,\n<em><strong>not just developers<\/strong><\/em>, in many areas such as education, and research.<\/p>\n<h2 id=\"so-what-is-free\">So what is \"Free\"?<a class=\"zola-anchor\" href=\"#so-what-is-free\" aria-label=\"Anchor link for: so-what-is-free\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>So there is also another philosophy in the tech space called FOSS or\n<em><strong>Free and Open Source Software<\/strong><\/em>. It is a belief that everything in\nsoftware <em>should<\/em> be free and free as in free beer <em><strong>and<\/strong><\/em> it should be\naccessible for everyone (therefore, freedom). However, please do note that\nFOSS and OSS should compensated for the <em>free time<\/em> they used for creating wonderful\nsoftware. You can help by donating to them and helping out their issues,\nnot just technically, but socially and emotionally as well.<\/p>\n<p>After this, what we refer as \"Open Source Software\" will either mean FOSS or OSS.<\/p>\n<h1 id=\"there-is-x-proprietary-software-why-use-some-free-software\">\"There is X proprietary software, why use some free software?\"<a class=\"zola-anchor\" href=\"#there-is-x-proprietary-software-why-use-some-free-software\" aria-label=\"Anchor link for: there-is-x-proprietary-software-why-use-some-free-software\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>There is nothing wrong in using proprietary software. It always comes down\nto <strong>tolerance<\/strong>\u2014what you can allow and what you cannot allow. These\nkind of \"tolerances\" can be in terms of \"security\", \"trust\", and \"privacy\"\nor whatever you can come up with.<\/p>\n<p>However, proprietary software is usually a <em><strong>blackbox<\/strong><\/em>, which means that\nyou really cannot check the source if there is something malicious going\non unlike Open Source Software. This is <em><strong>partially true<\/strong><\/em> though because\nOSS can still end up being malicious, it's just more <em>transparent<\/em>.<\/p>\n<p>There are many reasons Philippines should use OSS over proprietary. These usually\ncomes from some of the following factors:<\/p>\n<ul>\n<li>Finances<\/li>\n<li>Transparency<\/li>\n<li>Privacy<\/li>\n<\/ul>\n<p>There are many others but we will focus on these for now.<\/p>\n<h2 id=\"finances\">Finances<a class=\"zola-anchor\" href=\"#finances\" aria-label=\"Anchor link for: finances\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Philippines is a poverty-stricken country (or corrupt-stricken?) and buying\nproprietary software will cost you a lot of your salary. Because of the\nculture that people should use proprietary software such productivity suites,\nFilipinos are forced to find \"cracked\" or \"hacked\" forms of these proprietary\nsoftware for \"free\" usage ending up getting malicious programs without their\nknowledge in the process such as viruses and trojans, lessening the lifespan\nof their machines or even losing their files and data.<\/p>\n<p>To avoid that, Filipinos should install OSS alternatives for productivity.<\/p>\n<ul>\n<li><a rel=\"external\" href=\"https:\/\/www.libreoffice.org\/\">Libreoffice<\/a> for office suites.<\/li>\n<li><a rel=\"external\" href=\"https:\/\/joplinapp.org\/\">Joplin<\/a> for note taking.<\/li>\n<li><a rel=\"external\" href=\"https:\/\/jitsi.org\">Jitsi<\/a> for video conferences and meetings.<\/li>\n<li><a rel=\"external\" href=\"https:\/\/www.thunderbird.net\/\">Thunderbird Mail<\/a> for local mail client on the desktop.<\/li>\n<li><a rel=\"external\" href=\"https:\/\/signal.org\/\">Signal<\/a> for E2E private messaging.<\/li>\n<\/ul>\n<h3 id=\"educational-institutions-benefit-more\">Educational Institutions Benefit More<a class=\"zola-anchor\" href=\"#educational-institutions-benefit-more\" aria-label=\"Anchor link for: educational-institutions-benefit-more\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>The Department of Education, and the Commission on Higher Education can\nencourage the usage of OSS. By using OSS, they can focus more of their finances\non infrastructure rather than buying proprietary software subscriptions.<\/p>\n<p>Filipino students do not actually need to pay when they just want to write\ndocuments and create presentations. I mean, if they have the money, they can\nstill buy and use proprietary alternatives. But using OSS empowers students\nto finish school and use OSS confidently without having issues of money\nand finances, especially those that do not have the means to pay.<\/p>\n<h2 id=\"transparency\">Transparency<a class=\"zola-anchor\" href=\"#transparency\" aria-label=\"Anchor link for: transparency\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Open source is <strong>more<\/strong> transparent. Institutions can have a look at the\nsource of the software and see what is going to be removed or added in the\nfuture or if there were new leadership or maintainers of said software. They\nare also encouraged to donate because they rely on OSS.<\/p>\n<p>This transparency equates to increased trust of using software and allow\nFilipinos to use the software with the necessary trust they can offer to\nthat software.<\/p>\n<h2 id=\"privacy\">Privacy<a class=\"zola-anchor\" href=\"#privacy\" aria-label=\"Anchor link for: privacy\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Because of the introduction of OSS to the masses, curiousity for why this\nsoftware exists will allow Filipinos to define their privacy choices of\ntheir usage of software.<\/p>\n<p>There are many privacy-oriented alternatives against <strong>unethical data collection<\/strong>\nof popular software such as Zoom, and Instagram. With the presence of OSS software\nwhich promotes freedom and frowns on such practices, people are more likely\nto have more understanding what privacy is, and how important it is\nto respect someone's privacy.<\/p>\n<h1 id=\"are-there-things-you-would-like-to-add-to-this-post\">Are there things you would like to add to this post?<a class=\"zola-anchor\" href=\"#are-there-things-you-would-like-to-add-to-this-post\" aria-label=\"Anchor link for: are-there-things-you-would-like-to-add-to-this-post\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>If you have more to add, please email me at <a href=\"mailto:uncomfy@uncomfyhalomacro.pl\">uncomfy@uncomfyhalomacro.pl<\/a>.<\/p>\n"},{"title":"I decided to move back to helix","published":"2023-09-30T00:00:00+00:00","updated":"2023-09-30T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/i-decided-to-move-back-to-helix\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/i-decided-to-move-back-to-helix\/","summary":"<p>Emacs is good but it's not for me.<\/p>"},{"title":"Change of plans and priorities","published":"2023-09-26T00:00:00+00:00","updated":"2023-09-26T17:10:39+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/change-of-plans-and-priorities\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/change-of-plans-and-priorities\/","content":"<p>As my selection of what to learn grows, I think there will be a change of\nplans and priorities. It's time to narrow down what is essential.<\/p>\n<p>Currently, I am learning Rust, and will do some Go. This added more and more of\nmy to-do list of learning things.<\/p>\n<h1 id=\"and-it-became-unproductive\">And it became unproductive<a class=\"zola-anchor\" href=\"#and-it-became-unproductive\" aria-label=\"Anchor link for: and-it-became-unproductive\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>My attention span on learning stuff were getting lower and lower to a point,\nI need to reassess which and which are not to learn.<\/p>\n<p>Here are the list of things I need to do<\/p>\n<ul>\n<li>Setting aside System Administration<\/li>\n<li>Setting aside Kanidm<\/li>\n<li>Setting aside Crystal<\/li>\n<\/ul>\n<p>They're really not set aside. I can go back to them in the future if I have the time.<\/p>\n<h2 id=\"crystal-is-good-why-not-keep-it\">Crystal is good, why not keep it?<a class=\"zola-anchor\" href=\"#crystal-is-good-why-not-keep-it\" aria-label=\"Anchor link for: crystal-is-good-why-not-keep-it\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Sadly, only a few companies I know use Crystal. \ud83d\ude25 Even though it's actually a more\nuseful language to learn and can replace Go.<\/p>\n<h1 id=\"now-what-should-i-learn\">Now what should I learn<a class=\"zola-anchor\" href=\"#now-what-should-i-learn\" aria-label=\"Anchor link for: now-what-should-i-learn\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Rust will always stay. Erlang will stay. Go is added. Python will be revisited. And one database?\nI'm planning to at least learn one but never got the chance to. Possibly, Postgres or MySQL.<\/p>\n<h2 id=\"why-erlang\">Why Erlang?<a class=\"zola-anchor\" href=\"#why-erlang\" aria-label=\"Anchor link for: why-erlang\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Concurrency. Also, some of Go's ideas are taken from Erlang so I also need to check those as well.<\/p>\n<h2 id=\"why-python\">Why Python?<a class=\"zola-anchor\" href=\"#why-python\" aria-label=\"Anchor link for: why-python\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>It's not hard to relearn. I just need to revisit it. It's good for scripts and prototyping.<\/p>\n<h2 id=\"why-rust\">Why Rust?<a class=\"zola-anchor\" href=\"#why-rust\" aria-label=\"Anchor link for: why-rust\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Because blazingly \ud83d\ude80\ud83d\ude80\ud83d\ude80 fast \ud83d\ude1c<\/p>\n<h1 id=\"what-now\">What now?<a class=\"zola-anchor\" href=\"#what-now\" aria-label=\"Anchor link for: what-now\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Yes. I am going to watch Learn Go in 3 hours from a Humble Bundle I got last year. And then\nread Thorsten Ball's Writing an Interpreter in Go. I will check out Erlang's language reference\ntoo \u263a\ufe0f<\/p>\n"},{"title":"First impressions on my first non-Google email provider","published":"2023-09-19T00:00:00+00:00","updated":"2023-09-20T21:28:31+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/first-impressions-on-my-first-non-google-email-provider\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/first-impressions-on-my-first-non-google-email-provider\/","content":"<p>I was planning last year that I will have to start looking for ways to avoid\nGoogle as much as possible or at least minimize my dependence on Google\nservices. <em>It's most likely the latter<\/em>.<\/p>\n<h1 id=\"on-september-18-2023\">On September 18, 2023<a class=\"zola-anchor\" href=\"#on-september-18-2023\" aria-label=\"Anchor link for: on-september-18-2023\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I finally switched to a new email provider called\n<a rel=\"external\" href=\"https:\/\/mailbox.org\">Mailbox<\/a>. I have little information about the company\nbut it seems it's well known from various tech people I met.<\/p>\n<h1 id=\"first-impressions\">First impressions<a class=\"zola-anchor\" href=\"#first-impressions\" aria-label=\"Anchor link for: first-impressions\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>When I went to their website, it looks so clean and green like the \"green\nenergy\" message they have on their landing page.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/first-impressions-on-my-first-non-google-email-provider\/.\/landing-page-mailbox.webp\" alt=\"Mailbox Dot Org Landing Page\" \/><\/p>\n<p>But sadly, when I bought for their services, I was not really impressed by\ntheir web client. It was... uncared for? I am not sure why the landing page\nlooks so cool but the placement for their settings is so weird. Here are a\nlist of screenshots so you would understand what I mean.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/first-impressions-on-my-first-non-google-email-provider\/.\/webclient.webp\" alt=\"The web client\" \/><\/p>\n<p>Another nitpick is the inconsistency of the tooltip. It should show the tooltip\n<em>when the selection happens<\/em> and NOT <em>after you are centered on the button<\/em>.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/first-impressions-on-my-first-non-google-email-provider\/.\/buttons.gif\" alt=\"Tooltip\" \/><\/p>\n<p>Also, when clicking settings, I have to click... <em>twice<\/em>? One for the\ngear icon, which will create two options as a drop-down; one for settings,\nand one for \"connect your device\". That's the weirdest way to navigate to\nsettings. It's subtle but it's such a <strong>huge<\/strong> inconsistency. Kind of\na missed opportunity.<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/first-impressions-on-my-first-non-google-email-provider\/.\/gear-setting-inconsistency.webp\" alt=\"Inconsistent gear button\" \/><\/p>\n<h2 id=\"then-what\">Then what?<a class=\"zola-anchor\" href=\"#then-what\" aria-label=\"Anchor link for: then-what\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>For other stuff, it was alright. But it feels so dated. It's good since it's\nlight I am fine with that. I just don't know why the placement\/behavior of\nthe buttons\/settings are all over the place. Maybe I am wrong? If anyone\nreading this is a front-end designer or specializes in UI\/UX, please tell me\nif I am wrong.<\/p>\n<h1 id=\"services\">Services<a class=\"zola-anchor\" href=\"#services\" aria-label=\"Anchor link for: services\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Well enough of the UI, how about their services?<\/p>\n<p>So I bought the 9EUR per month <em>monthly plan<\/em> which amounts to\n545.74PHP\u2014<em><strong>Premium Plan<\/strong><\/em>:<\/p>\n<ul>\n<li>Mail Storage of 25GB<\/li>\n<li>Cloud Storage of 50GB<\/li>\n<li>25 Mail aliases<\/li>\n<li>Allows 250 aliases for custom domains<\/li>\n<li>Gets more support\n<ul>\n<li>Online office<\/li>\n<li>Priority &amp; phone<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Sounds great? To be honest, I bought this plan because I want to try the\nmost expensive offering.<\/p>\n<p>But it's too early to tell so I will try this for a year and get the yearly\nplan. So I will get a month using the monthly plan and once for the yearly\nplan; a total of 13 months. Unlucky!<\/p>\n<p>I will be going to skip a bit of the features since I haven't got used to it\nyet. But one thing that interests me to use more and more is the DavFS\/WebDav\nfeature. Although, their documentation was not really accurate nor informative\nabout it. Yes, they have a documentation but what I mean is, it feels rushed.<\/p>\n<p>Other features are mentioned in\nhttps:\/\/mailbox.org\/en\/private-customers#price-plans.<\/p>\n<h1 id=\"overall\">Overall<a class=\"zola-anchor\" href=\"#overall\" aria-label=\"Anchor link for: overall\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Again, it's too early to say anything. But one thing I already did is\n\"forwarding\" all my emails from my previous Gmail account to my new mailbox\nemail addresses and aliases. And I already copied almost all of my old inboxes\nto my new inboxes.<\/p>\n<h1 id=\"other-considerations\">Other considerations<a class=\"zola-anchor\" href=\"#other-considerations\" aria-label=\"Anchor link for: other-considerations\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I was eyeing for <a rel=\"external\" href=\"https:\/\/www.fastmail.com\/\">Fastmail<\/a> since<\/p>\n<ol>\n<li>It's recommended by my mentor (bias)<\/li>\n<li>It's in Aussieland, so it's closer. And also the only email service near\nsoutheast asia because Asia seems to have no email service company. <em>Kind of\nmakes sense, but I will keep it to myself<\/em> \ud83d\ude1b<\/li>\n<li>Has more enticing offerings and features. At the same price, you get 100GB and 600+ aliases.<\/li>\n<li>Probably has a better UI for their web client. Their website says it all.<\/li>\n<\/ol>\n<p>For now, I will be using this for a year.<\/p>\n"},{"title":"I should have learned about state machines!","published":"2023-09-15T00:00:00+00:00","updated":"2023-09-15T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/learning-state-machines\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/learning-state-machines\/","content":"<p>While rewriting\n<a rel=\"external\" href=\"https:\/\/github.com\/openSUSE\/obs-service-cargo_vendor\">OBS Service Cargo<\/a> in Rust, I was thinking of how the logic\nbe represented clearly. Here and there, I thought I was done but after\nreading my code, I was like, damn this looks awful. And then my mentor came\nin to give me hints through his code comments in Discord and from his code\nreviews on GitHub. He gave me a link of his talk for PurpleCon, a volunteer\nconference for some hackers in Oceania and NZ?<\/p>\n<p>Link to youtube video so you can watch as well: <a rel=\"external\" href=\"https:\/\/youtu.be\/VbtsQjbnNw8?si=cKcbednftxxsaIPs\">https:\/\/youtu.be\/VbtsQjbnNw8?si=cKcbednftxxsaIPs<\/a><\/p>\n<h2 id=\"i-am-a-biologist-too\">I am a biologist too<a class=\"zola-anchor\" href=\"#i-am-a-biologist-too\" aria-label=\"Anchor link for: i-am-a-biologist-too\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>The answer was right in front of me all along! I was just too\nfocused on the tech jargon that I got lost.<\/p>\n<p>State machines exist in nature too. In many ways, cells and their\ncomponents use some form of <em>state<\/em> to signify a certain kind of\naction, the same way microwave ovens have a state when to turn off\ne.g. if you open the lid or turn off the power, and when to turn\non e.g. when to turn the knob to the right and start the timer.<\/p>\n<p>Hormones, and other forms of cell signalling tell cells what to\ndo. Something damaged? Just release histamines to let other immune\ncells know you are damaged.  Are you high on glucose? Oh crap,\nproduce more insulin!<\/p>\n<p>The <em>state<\/em> of your body also can cause some <em>form of action<\/em>.\nAnd life does this to achieve homeostasis and other forms of\nbiological actions such as defending against a predator or migrating\nto another area to get more food.<\/p>\n<h2 id=\"so-how-does-this-help-me-about-state-machines-and-maybe-writing-code\">So how does this help me about state machines and maybe writing code?<a class=\"zola-anchor\" href=\"#so-how-does-this-help-me-about-state-machines-and-maybe-writing-code\" aria-label=\"Anchor link for: so-how-does-this-help-me-about-state-machines-and-maybe-writing-code\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>I guess I always like think each function is a particular organelle or a cell in a\nsoftware system.<\/p>\n<p>Each module is a tissue<\/p>\n<p>Each set of modules interrelated of each other is an organ<\/p>\n<p>And these organs form an organ system, thus, forming an organism.<\/p>\n<p>Similar, if not the same, as how software is written.<\/p>\n<p><strong>State machines<\/strong> exist and we just get used to it that we forget they exist around\nus.<\/p>\n<p>If we think each component has a set of states, it's easier to imagine the logic of\nmany components of your program.<\/p>\n<h2 id=\"rust-is-one-of-the-perfect-language-to-imagine-anything-as-states\">Rust is one of the perfect language to imagine anything as states<a class=\"zola-anchor\" href=\"#rust-is-one-of-the-perfect-language-to-imagine-anything-as-states\" aria-label=\"Anchor link for: rust-is-one-of-the-perfect-language-to-imagine-anything-as-states\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Rust has types and enums that can be over(ab)used to think of important components\nto have some set of states. I like this part of Rust where I can just slap an\nenum defining a state or condition and just use it all over the code base for\nthings that actually make sense to have it. Even the <code>Option<\/code> and <code>Result<\/code>\ntypes can be thought of as a <em>state of having something<\/em> and a <em>state of\nhaving something that does not bite you<\/em>.<\/p>\n<h2 id=\"now-what\">Now what?<a class=\"zola-anchor\" href=\"#now-what\" aria-label=\"Anchor link for: now-what\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>This is just a short post to remind myself how powerful it is to use state machines.<\/p>\n"},{"title":"Calling Executables Outside Distrobox That Are From Another Distrobox","published":"2023-08-06T00:00:00+00:00","updated":"2024-01-30T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/calling-executables-outside-distrobox-that-are-from-another-distrobox\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/calling-executables-outside-distrobox-that-are-from-another-distrobox\/","content":"<h1 id=\"update\">Update<a class=\"zola-anchor\" href=\"#update\" aria-label=\"Anchor link for: update\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>This old post is outdated and requires a small update. To run an executable from another\ncontainer (here we use distrobox, a frontend for podman or docker), you just need to run\nthis command inside the desired container where you want to run the executable.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">sudo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> ln<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/usr\/bin\/distrobox-host-exec<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/usr\/local\/bin\/my-executable<\/span><\/span><\/code><\/pre>\n<p>Make sure that the <code>my-executable<\/code> was already <code>distrobox-export<\/code>ed to the host.<\/p>\n<h1 id=\"old-post\">Old post<a class=\"zola-anchor\" href=\"#old-post\" aria-label=\"Anchor link for: old-post\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>To anyone that might have asked themselves<\/p>\n<blockquote>\n<p>How do I call an executable from Y distro to the current X distro I am using in distrobox?<\/p>\n<\/blockquote>\n<p>The answer is to <strong>create a script<\/strong>. But first you will have to use <code>distrobox-host-exec<\/code>. Create a symlink inside your distrobox. You can either declare\nan init-hook or do it manually. The command is<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">ln<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">sf<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> distrobox-host-exec<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/usr\/local\/bin\/podman<\/span><\/span><\/code><\/pre>\n<p>This will create a pseudo podman executable that will run the host system's <code>podman<\/code>, assuming you have that installed in your host system.<\/p>\n<p>To check if it works, run<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">podman<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> ps<\/span><\/span><\/code><\/pre>\n<p>This will give you a list of available containers that are active.<\/p>\n<h2 id=\"example-situation\">Example situation<a class=\"zola-anchor\" href=\"#example-situation\" aria-label=\"Anchor link for: example-situation\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>So let's assume you are in a weird situation. You want to use <a rel=\"external\" href=\"https:\/\/ziglang.org\">zig<\/a> but the one on openSUSE Tumbleweed distrobox is 0.10.0 because it has an\nissue with <a rel=\"external\" href=\"https:\/\/ziglang.org\/download\/0.11.0\/release-notes.html#glibc-234\">glibc<\/a> versions. But it builds correctly on openSUSE Leap 15.5! The next thing you did was to create your leap distrobox<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">distrobox-create<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">i<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> leap:latest<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">n<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> leap<\/span><\/span><\/code><\/pre>\n<p>And then you ran the following command inside your leap distrobox<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">sudo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> zypper<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> addrepo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> https:\/\/download.opensuse.org\/repositories\/devel:tools:compiler\/15.5\/devel:tools:compiler.repo<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">sudo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> zypper<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> refresh<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">sudo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> zypper<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> install<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> zig<\/span><\/span><\/code><\/pre>\n<blockquote>\n<p>So uh... how do I use zig from leap when I am in a tumbleweed distrobox?<\/p>\n<\/blockquote>\n<p>By using <code>distrobox-host-exec<\/code> which calls your <code>podman<\/code> executable! Remember the symlink? Here is the idea<\/p>\n<p><code>podman<\/code> has an <code>exec<\/code> command. Running <code>podman exec --help<\/code> gives you the following output:<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Run a process in a running container<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>Description:<\/span><\/span>\n<span class=\"giallo-l\"><span>  Execute the specified command inside a running container.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>Usage:<\/span><\/span>\n<span class=\"giallo-l\"><span>  podman exec [options] CONTAINER [COMMAND [ARG...]]<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>Examples:<\/span><\/span>\n<span class=\"giallo-l\"><span>  podman exec -it ctrID ls<\/span><\/span>\n<span class=\"giallo-l\"><span>  podman exec -it -w \/tmp myCtr pwd<\/span><\/span>\n<span class=\"giallo-l\"><span>  podman exec --user root ctrID ls<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>Options:<\/span><\/span>\n<span class=\"giallo-l\"><span>  -d, --detach               Run the exec session in detached mode (backgrounded)<\/span><\/span>\n<span class=\"giallo-l\"><span>      --detach-keys string   Select the key sequence for detaching a container. Format is a single character [a-Z] or ctrl-&lt;value&gt; where &lt;value&gt; is one of: a-z, @, ^, [, , or _ (default &quot;ctrl-p,ctrl-q&quot;)<\/span><\/span>\n<span class=\"giallo-l\"><span>  -e, --env stringArray      Set environment variables<\/span><\/span>\n<span class=\"giallo-l\"><span>      --env-file strings     Read in a file of environment variables<\/span><\/span>\n<span class=\"giallo-l\"><span>  -i, --interactive          Keep STDIN open even if not attached<\/span><\/span>\n<span class=\"giallo-l\"><span>  -l, --latest               Act on the latest container podman is aware of<\/span><\/span>\n<span class=\"giallo-l\"><span>                             Not supported with the &quot;--remote&quot; flag<\/span><\/span>\n<span class=\"giallo-l\"><span>      --preserve-fds uint    Pass N additional file descriptors to the container<\/span><\/span>\n<span class=\"giallo-l\"><span>      --privileged           Give the process extended Linux capabilities inside the container.  The default is false<\/span><\/span>\n<span class=\"giallo-l\"><span>  -t, --tty                  Allocate a pseudo-TTY. The default is false<\/span><\/span>\n<span class=\"giallo-l\"><span>  -u, --user string          Sets the username or UID used and optionally the groupname or GID for the specified command<\/span><\/span>\n<span class=\"giallo-l\"><span>  -w, --workdir string       Working directory inside the container<\/span><\/span><\/code><\/pre>\n<p>Since it says here that we can run a process from a running container, we can create a script to run <code>zig<\/code> in your tumbleweed distrobox!<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#!<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">\/bin\/bash<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">\/usr\/local\/bin\/podman<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> exec<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-user<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $<\/span><span style=\"color: light-dark(#076678, #83A598);\">USER<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">it<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">w<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $<\/span><span style=\"color: light-dark(#076678, #83A598);\">PWD<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> leap<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> zig<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $<\/span><span style=\"color: light-dark(#076678, #83A598);\">@<\/span><\/span><\/code><\/pre>\n<p>And save it to <code>\/usr\/local\/bin\/zig<\/code> and run <code>sudo chmod +x \/usr\/local\/bin\/zig<\/code>.<\/p>\n<h2 id=\"testing-your-zig-executable\">Testing your zig executable<a class=\"zola-anchor\" href=\"#testing-your-zig-executable\" aria-label=\"Anchor link for: testing-your-zig-executable\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Inside your tumbleweed distrobox which now contains your pseudo zig executable, you can test if it works by doing the commands<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">md<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> hello-zig\/<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">cd<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $<\/span><span style=\"color: light-dark(#076678, #83A598);\">_<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">zig<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> init-exe<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">zig<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> build<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">.\/zig-out\/hello-zig<\/span><\/span><\/code><\/pre>\n<p>The last command should output<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>All your codebase are belong to us.<\/span><\/span>\n<span class=\"giallo-l\"><span>Run `zig build test` to run the tests.<\/span><\/span><\/code><\/pre><h2 id=\"how-it-works\">How it works<a class=\"zola-anchor\" href=\"#how-it-works\" aria-label=\"Anchor link for: how-it-works\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>We have <code>distrobox-host-exec<\/code> (which calls <code>host-spawn<\/code> in the background), and <code>podman<\/code>. By using <code>distrobox-host-exec<\/code> to\nrun the host system <code>podman<\/code>, we can also check other running containers, not just from <code>leap<\/code> distrobox in the previous examples.<\/p>\n<p>With <code>podman<\/code>, we can use its <code>exec<\/code> command to run executables <em>from other containers<\/em>. The important flags are<\/p>\n<ul>\n<li><code>-w<\/code> or <code>--workdir<\/code>. This is where you set <code>$PWD<\/code><\/li>\n<li><code>-i<\/code> or <code>--interactive<\/code>. This allows interactivity<\/li>\n<li><code>-t<\/code> or <code>--tty<\/code>. This will allow it to work somewhat okay-ish in a terminal.<\/li>\n<\/ul>\n<p>Plus <code>$@<\/code> to add possible other subcommands of an executable e.g. <code>build<\/code>, <code>test<\/code>, <code>--help<\/code>.<\/p>\n<p>The <code>--user<\/code> is set to <code>$USER<\/code> so it respects your user inside the container. Otherwise, it will become <code>root<\/code> which\nmaybe is not what you want.<\/p>\n<p>So the final and cool command for the pseudo zig executable is:<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#!<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">\/bin\/bash<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> leap can be anything: container ID or container NAME<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">\/usr\/local\/bin\/podman<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> exec<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-user<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $<\/span><span style=\"color: light-dark(#076678, #83A598);\">USER<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">it<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">w<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $<\/span><span style=\"color: light-dark(#076678, #83A598);\">PWD<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> leap<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> zig<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $<\/span><span style=\"color: light-dark(#076678, #83A598);\">@<\/span><\/span><\/code><\/pre><h2 id=\"more-information\">More information<a class=\"zola-anchor\" href=\"#more-information\" aria-label=\"Anchor link for: more-information\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>You can find more information from the following links:<\/p>\n<ul>\n<li><a rel=\"external\" href=\"https:\/\/distrobox.privatedns.org\/usage\/distrobox-host-exec\/\">https:\/\/distrobox.privatedns.org\/usage\/distrobox-host-exec\/<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/manpages.opensuse.org\/Tumbleweed\/podman\/podman-exec.1.en.html\">https:\/\/manpages.opensuse.org\/Tumbleweed\/podman\/podman-exec.1.en.html<\/a><\/li>\n<\/ul>\n"},{"title":"Packaging Crystal Software for openSUSE","published":"2023-07-31T00:00:00+00:00","updated":"2023-07-31T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/how-to-package-crystal-software-in-opensuse\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/how-to-package-crystal-software-in-opensuse\/","content":"<h2 id=\"prerequisites\">Prerequisites<a class=\"zola-anchor\" href=\"#prerequisites\" aria-label=\"Anchor link for: prerequisites\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>You will need the following:<\/p>\n<ul>\n<li><code>osc<\/code> and <code>obs-service-download_files<\/code><\/li>\n<li>your editor of choice e.g. emacs, helix<\/li>\n<li><code>tar<\/code><\/li>\n<li>familiarity of how to use <a rel=\"external\" href=\"https:\/\/build.opensuse.org\/\">https:\/\/build.opensuse.org\/<\/a>. See <a rel=\"external\" href=\"https:\/\/en.opensuse.org\/Portal:Packaging\">https:\/\/en.opensuse.org\/Portal:Packaging<\/a> for guides. Fedora has one too, see <a rel=\"external\" href=\"https:\/\/docs.fedoraproject.org\/en-US\/packaging-guidelines\">https:\/\/docs.fedoraproject.org\/en-US\/packaging-guidelines<\/a>.<\/li>\n<li><code>crystal<\/code><\/li>\n<\/ul>\n<p>Check with zypper if <code>osc<\/code> is installed.<\/p>\n<blockquote>\n<p><strong>Tip<\/strong>: Use the <code>cnf<\/code> command to check which package <code>osc<\/code> comes from.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">cnf<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> osc<\/span><\/span><\/code><\/pre><\/blockquote>\n<h2 id=\"recipe\">Recipe<a class=\"zola-anchor\" href=\"#recipe\" aria-label=\"Anchor link for: recipe\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>The following subtopics explain how to package crystal software step-by-step. Adjust accordingly based on your setup.<\/p>\n<h3 id=\"create-a-new-package\">Create a new package<a class=\"zola-anchor\" href=\"#create-a-new-package\" aria-label=\"Anchor link for: create-a-new-package\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>You can do it at <a rel=\"external\" href=\"https:\/\/build.opensuse.org\/\">https:\/\/build.opensuse.org\/<\/a> but if you prefer the commandline,\nyou can do for example<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">osc<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> mkpac<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> blahaj<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#AF3A03, #FE8019);\">cd<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> blahaj<\/span><\/span><\/code><\/pre>\n<p>In this tutorial, we will try to package <a rel=\"external\" href=\"https:\/\/github.com\/GeopJr\/BLAHAJ\">BLAHAJ<\/a> using the <a rel=\"external\" href=\"https:\/\/github.com\/crystal-lang\/shards\">shards<\/a> project and dependency manager for\n<a rel=\"external\" href=\"https:\/\/crystal-lang.org\">Crystal<\/a> and <code>tar<\/code>.<\/p>\n<h2 id=\"package-without-a-dependency\">Package without a dependency<a class=\"zola-anchor\" href=\"#package-without-a-dependency\" aria-label=\"Anchor link for: package-without-a-dependency\"\n  >\u00a7<\/a\n>\n<\/h2>\n<h3 id=\"write-the-specfile\">Write the specfile<a class=\"zola-anchor\" href=\"#write-the-specfile\" aria-label=\"Anchor link for: write-the-specfile\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Using your preferred editor, create a file named <code>blahaj.spec<\/code>. The following prelude should be enough for the specfile:<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Name: blahaj<\/span><\/span>\n<span class=\"giallo-l\"><span>Version: 2.1.0<\/span><\/span>\n<span class=\"giallo-l\"><span>License: BSD-2-Clause<\/span><\/span>\n<span class=\"giallo-l\"><span>Summary: Gay sharks at your local terminal<\/span><\/span>\n<span class=\"giallo-l\"><span>Url: https:\/\/github.com\/GeopJr\/BLAHAJ<\/span><\/span>\n<span class=\"giallo-l\"><span>Source0: https:\/\/github.com\/GeopJr\/BLAHAJ\/archive\/refs\/tags\/v2.1.0.tar.gz#\/%{name}-%{version}.tar.gz<\/span><\/span>\n<span class=\"giallo-l\"><span>Source1: vendor.tar.zst<\/span><\/span>\n<span class=\"giallo-l\"><span>BuildRequires: crystal<\/span><\/span>\n<span class=\"giallo-l\"><span>BuildRequires: shards<\/span><\/span>\n<span class=\"giallo-l\"><span>BuildRequires: make<\/span><\/span><\/code><\/pre>\n<blockquote>\n<p>How do I have <code>shards<\/code> and <code>crystal<\/code>?<\/p>\n<\/blockquote>\n<p>You can branch packages from my home project at Open Build Service - <a rel=\"external\" href=\"https:\/\/build.opensuse.org\/project\/show\/home:uncomfyhalomacro\">https:\/\/build.opensuse.org\/project\/show\/home:uncomfyhalomacro<\/a>. Or even just add an repository\nimage of that project. I have <code>shards<\/code> and <code>crystal<\/code> there. The latter can also be found at <a rel=\"external\" href=\"https:\/\/build.opensuse.org\/package\/show\/devel:languages:crystal\/crystal\">https:\/\/build.opensuse.org\/package\/show\/devel:languages:crystal\/crystal<\/a> if\nyou want that too.<\/p>\n<p>For the sake of simplicity, we will assume that we are going to use <code>crystal<\/code>, <code>shards<\/code>, and <code>make<\/code> at your home project in Open Build Service.<\/p>\n<p>Add the following sections: description, prep, build, install, files and changelog section.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Name: blahaj<\/span><\/span>\n<span class=\"giallo-l\"><span>Version: 2.1.0<\/span><\/span>\n<span class=\"giallo-l\"><span>Release: 0<\/span><\/span>\n<span class=\"giallo-l\"><span>License: BSD-2-Clause<\/span><\/span>\n<span class=\"giallo-l\"><span>Summary: Colorize your terminal with gay sharks<\/span><\/span>\n<span class=\"giallo-l\"><span>Url: https:\/\/github.com\/GeopJr\/BLAHAJ<\/span><\/span>\n<span class=\"giallo-l\"><span>Source0: https:\/\/github.com\/GeopJr\/BLAHAJ\/archive\/refs\/tags\/v2.1.0.tar.gz#\/%{name}-%{version}.tar.gz<\/span><\/span>\n<span class=\"giallo-l\"><span>BuildRequires: crystal<\/span><\/span>\n<span class=\"giallo-l\"><span>BuildRequires: shards<\/span><\/span>\n<span class=\"giallo-l\"><span>BuildRequires: make<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>%description<\/span><\/span>\n<span class=\"giallo-l\"><span>Apart from a cute cuddly shark plushie from IKEA, BL\u00c5HAJ is a lolcat-like CLI tool<\/span><\/span>\n<span class=\"giallo-l\"><span>that colorizes your input, shows flags and prints colorful sharks!<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>It has a wide variety of flags\/colors to choose from and many options from flag size<\/span><\/span>\n<span class=\"giallo-l\"><span>to whether to colorize by line, word or character.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>%prep<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>%build<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>%install<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>%files<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>%changelog<\/span><\/span><\/code><\/pre>\n<p>At the root of your project package e.g. <code>home:yourusername\/blahaj<\/code>, run <code>osc service localrun download_files<\/code>. You will get a file called <code>blahaj-2.1.0.tar.gz<\/code>.\nExtracting the file gets us the directory <code>BLAHAJ-2.1.0\/<\/code>. This means that in our <code>%prep<\/code> section, we need to add <code>%setup -qa1 -n BLAHAJ-%{version}<\/code>. This is to\nredirect the rpm macros that building should be at <code>RPM_BUILDDIR\/BLAHAJ-2.1.0\/<\/code> since by default, it is <code>RPM_BUILDDIR\/nameofpackage-version\/<\/code>\nbased on the <code>Name:<\/code> and <code>Version:<\/code> RPM specfile prelude.<\/p>\n<h3 id=\"building-and-installing-the-package\">Building and Installing the package<a class=\"zola-anchor\" href=\"#building-and-installing-the-package\" aria-label=\"Anchor link for: building-and-installing-the-package\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>The following sections should be easy here since <code>make<\/code> as build dependency has convenient macros such as <code>%make_build<\/code> and <code>%make_install<\/code>.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Name: blahaj<\/span><\/span>\n<span class=\"giallo-l\"><span>Version: 2.1.0<\/span><\/span>\n<span class=\"giallo-l\"><span>Release: 0<\/span><\/span>\n<span class=\"giallo-l\"><span>Summary: Colorize your terminal with gay sharks<\/span><\/span>\n<span class=\"giallo-l\"><span>License: BSD-2-Clause<\/span><\/span>\n<span class=\"giallo-l\"><span>Url: https:\/\/github.com\/GeopJr\/BLAHAJ<\/span><\/span>\n<span class=\"giallo-l\"><span>Source0: https:\/\/github.com\/GeopJr\/BLAHAJ\/archive\/refs\/tags\/v2.1.0.tar.gz#\/%{name}-%{version}.tar.gz<\/span><\/span>\n<span class=\"giallo-l\"><span>BuildRequires: crystal<\/span><\/span>\n<span class=\"giallo-l\"><span>BuildRequires: shards<\/span><\/span>\n<span class=\"giallo-l\"><span>BuildRequires: make<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>%description<\/span><\/span>\n<span class=\"giallo-l\"><span>Apart from a cute cuddly shark plushie from IKEA, BL\u00c5HAJ is a lolcat-like CLI tool<\/span><\/span>\n<span class=\"giallo-l\"><span>that colorizes your input, shows flags and prints colorful sharks!<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>It has a wide variety of flags\/colors to choose from and many options from flag size<\/span><\/span>\n<span class=\"giallo-l\"><span>to whether to colorize by line, word or character.<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>%prep<\/span><\/span>\n<span class=\"giallo-l\"><span>%setup -q -n BLAHAJ-%{version}<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>%build<\/span><\/span>\n<span class=\"giallo-l\"><span>%make_build<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>%install<\/span><\/span>\n<span class=\"giallo-l\"><span>%make_install<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>%files<\/span><\/span>\n<span class=\"giallo-l\"><span>%{_bindir}\/blahaj<\/span><\/span>\n<span class=\"giallo-l\"><span>%doc README.md CODE_OF_CONDUCT.md<\/span><\/span>\n<span class=\"giallo-l\"><span>%license LICENSE<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>%changelog<\/span><\/span><\/code><\/pre>\n<p>As for <code>%files<\/code>, you can just do a \"best guess\" or \"best observation\" approach. Here, we based it from the <code>Makefile<\/code> and for documentation and license, those are\nself-explanatory.<\/p>\n<p>Changelog can be left as is since we are not Fedora \ud83d\ude18. We use <code>blahaj.changes<\/code> for that generated with <code>osc vc<\/code>. It creates a temporary file you can edit\nfrom like below<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>-------------------------------------------------------------------<\/span><\/span>\n<span class=\"giallo-l\"><span>Mon Jul 31 12:34:07 UTC 2023 - Your Name &lt;youremail@example.com&gt;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>- Initial spec for blahaj 2.1.0<\/span><\/span>\n<span class=\"giallo-l\"><\/span><\/code><\/pre><h3 id=\"add-the-files\">Add the files<a class=\"zola-anchor\" href=\"#add-the-files\" aria-label=\"Anchor link for: add-the-files\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Add the files by running the command<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">osc<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> add<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> blahaj.spec<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> blahaj-2.1.0.tar.gz<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> blahaj.changes<\/span><\/span><\/code><\/pre>\n<p>And then push it to your home project at Open Build Service with <code>osc ci<\/code>, which allows you to check the diff and see what was changed based from the\n<code>blahaj.changes<\/code> file.<\/p>\n<h3 id=\"check-if-it-builds-correctly\">Check if it builds correctly<a class=\"zola-anchor\" href=\"#check-if-it-builds-correctly\" aria-label=\"Anchor link for: check-if-it-builds-correctly\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Now check your new blahaj package at your home project. If it fails, investigate what went wrong! Check mine at\n<a rel=\"external\" href=\"https:\/\/build.opensuse.org\/package\/show\/home:uncomfyhalomacro\/blahaj\">https:\/\/build.opensuse.org\/package\/show\/home:uncomfyhalomacro\/blahaj<\/a>.<\/p>\n<blockquote>\n<p><strong>NOTE:<\/strong>\nIt seems at the time of writing, I missed some dependencies or optional dependencies for\ncrystal! Anyway, <em>I am confident<\/em> it will build this correctly after that's fixed.<\/p>\n<\/blockquote>\n<h2 id=\"package-with-dependencies\">Package With dependencies<a class=\"zola-anchor\" href=\"#package-with-dependencies\" aria-label=\"Anchor link for: package-with-dependencies\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>This is where <code>tar<\/code> and <code>shards<\/code> comes in. An example of this is <code>shards<\/code> itself. See <a rel=\"external\" href=\"https:\/\/build.opensuse.org\/package\/show\/home:uncomfyhalomacro\/shards\">https:\/\/build.opensuse.org\/package\/show\/home:uncomfyhalomacro\/shards<\/a>.<\/p>\n<p>What I did here is at the root of the project e.g. home:yourname\/shards, I extracted the shards source tarball, <code>tar xvf shards-0.17.3.tar.gz<\/code>. Changed directory\nto the extracted directory, <code>shards-0.17.3\/<\/code> and then ran <code>shards check<\/code> and <code>shards install<\/code>. You will get a new directory called <code>lib\/<\/code>. This is where you\n<em>vendor<\/em> your dependencies like how Rust and Go do.<\/p>\n<p>To <em>vendor<\/em> it, it's simple. Just run<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">tar<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-zstd<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">cvf<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> vendor.tar.zst<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> lib\/<\/span><\/span><\/code><\/pre>\n<p>Copy <code>vendor.tar.zst<\/code> to the root of the project package folder. Add it to one of the sources of your project and adjust your <code>%setup<\/code> with flags <code>-qa1<\/code>\nwhich <code>a1<\/code> means extract <code>Source1: vendor.tar.zst<\/code> to the root of <code>RPM_BUILDDIR\/shards-0.17.3<\/code> including the root folder of the archive <code>lib\/<\/code>.<\/p>\n<p>This will create a new directory called <code>lib\/<\/code>, and contains other crystal packages that are dependencies of that project.<\/p>\n<p>Then I just used <code>crystal<\/code> to build <code>shards<\/code> as seen from the build section and do a manual install with <code>install<\/code> command at the install section.<\/p>\n<h2 id=\"other-possibilities\">Other possibilities<a class=\"zola-anchor\" href=\"#other-possibilities\" aria-label=\"Anchor link for: other-possibilities\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>You can also remove <code>make<\/code> or <code>shards<\/code> as well if you prefer just using <code>crystal<\/code> on the build section.<\/p>\n"},{"title":"My Migration to Emacs","published":"2023-07-22T00:00:00+00:00","updated":"2023-07-22T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/migration-to-emacs\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/migration-to-emacs\/","content":"<h2 id=\"why-i-tried-emacs\">Why I tried Emacs<a class=\"zola-anchor\" href=\"#why-i-tried-emacs\" aria-label=\"Anchor link for: why-i-tried-emacs\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>I tried Emacs for the following reasons<\/p>\n<ul>\n<li><a href=\"https:\/\/uncomfyhalomacro.pl\/blog\/migration-to-emacs\/#org-mode\">org mode<\/a><\/li>\n<li><a href=\"https:\/\/uncomfyhalomacro.pl\/blog\/migration-to-emacs\/#org-roam\">org roam<\/a><\/li>\n<\/ul>\n<p>I heard many memes and praises of the editor. But one thing that interests me was that emacs can do note taking\nand task scheduling through <a rel=\"external\" href=\"https:\/\/orgmode.org\">org mode<\/a>. Additionally, note taking using the <a rel=\"external\" href=\"https:\/\/zettelkasten.de\">zettelkasten<\/a> through <a rel=\"external\" href=\"https:\/\/www.orgroam.com\">org roam<\/a> greatly\nenhances that experience!<\/p>\n<p>I tried it for a few weeks now and ... it is amazing! \ud83d\udc40<\/p>\n<h3 id=\"org-mode\">Org Mode<a class=\"zola-anchor\" href=\"#org-mode\" aria-label=\"Anchor link for: org-mode\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>I wouldn't use emacs without this feature. It can allow you to schedule your stuff with <a rel=\"external\" href=\"https:\/\/orgmode.org\/manual\/Agenda-Views.html\">org agenda<\/a>. These\nincludes <em>note taking<\/em>, <em>task scheduling<\/em>, and <em>dailies<\/em>. Hell, combined that with <a rel=\"external\" href=\"https:\/\/www.orgroam.com\/\">org roam<\/a>, and you get\nthe best of zettelkasten method plus a growing connections of tasks.<\/p>\n<h3 id=\"org-roam\">Org Roam<a class=\"zola-anchor\" href=\"#org-roam\" aria-label=\"Anchor link for: org-roam\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>This feature actually hooked me into using emacs. Without it, my notes would be everywhere without knowing\nwhich part of this note connects to this note. Yes, you can do it by linking URL links but that's not ideal\nto do that manually. Org roam does that for you and it's such a breeze.<\/p>\n<p>Lastly, org roam has another plugin called <a rel=\"external\" href=\"https:\/\/github.com\/org-roam\/org-roam-ui\">org roam ui<\/a> which allows you to create a graphical representation\nof your knowledge base like how <a rel=\"external\" href=\"https:\/\/obsidian.md\">Obsidian<\/a> and other knowledge base note taking apps do. I forked the project\nas seen <a rel=\"external\" href=\"https:\/\/github.com\/uncomfyhalomacro\/org-roam-ui\/tree\/feature\/add-export-functionality\">here<\/a> to allow me to generate a static web app for my knowledge base and upload it as a standalone\nwebsite. The result is my <a rel=\"external\" href=\"https:\/\/zettelkasten.uncomfyhalomacro.pl\">https:\/\/zettelkasten.uncomfyhalomacro.pl<\/a>!<\/p>\n<img src=\"\/assets\/photos\/zettelkasten-sample.webp\" \/><h2 id=\"conclusion\">Conclusion<a class=\"zola-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>I think I am slowly migrating all of my workflow to Emacs now. I do still use helix for small fast edits but\nfor powerful features such as task scheduling, todolists and zettelkasten? I guess it's Emacs.<\/p>\n<p>If you want to see how a professional Emacs user use Emacs, you can check out this <a rel=\"external\" href=\"https:\/\/youtu.be\/urcL86UpqZc\">link<\/a>. It's very informative.<\/p>\n"},{"title":"Not Threads, Not Twitter. Come Join Us!","published":"2023-07-18T00:00:00+00:00","updated":"2023-07-18T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/not-bsky-not-threads-just-the-fedi\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/not-bsky-not-threads-just-the-fedi\/","content":"<p>The Fediverse is growing. Joining the Fediverse is good. But <strong>I do not recommend you joining <em>Threads<\/em>,\nor go back to <em>Twitter<\/em><\/strong>.<\/p>\n<h2 id=\"not-threads-not-twitter\">Not Threads, Not Twitter<a class=\"zola-anchor\" href=\"#not-threads-not-twitter\" aria-label=\"Anchor link for: not-threads-not-twitter\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Twitter is self-explanatory. Threads, however, are new platforms that support <a rel=\"external\" href=\"https:\/\/www.w3.org\/TR\/activitypub\/\">ActivityPub<\/a>. This means it can\ncommunicate with other platforms that also support this <em>protocol<\/em> e.g. you can follow people from your instance\nto someone who is on Threads.<\/p>\n<p>But <strong>Threads is owned by Meta<\/strong>, who are notorious for their aggressive data collection and poor privacy protection\nand policies. And they are also known for manipulating public information, and spreading propaganda to accommodate\npersonal interests from politics to mass misinformation.<\/p>\n<p><em>Why should you join a platform who is backed by a company\nknown for such practices<\/em>?<\/p>\n<p>You may have your reasons. It maybe valid e.g. because your fam uses Facebook, specifically, Facebook Messenger to\ncommunicate, but if you have the option to do so, do so now. These companies do not care much about your well-being\nsince they designed these platform for clout-chasing, dopamine addiction, and a new culture of attention-seekers\nthat are dumb to a point.<\/p>\n<h2 id=\"come-join-the-fediverse\">Come Join the Fediverse!<a class=\"zola-anchor\" href=\"#come-join-the-fediverse\" aria-label=\"Anchor link for: come-join-the-fediverse\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>The fediverse is good.<\/p>\n"},{"title":"VSCodium Flatpak on openSUSE Aeon","published":"2023-07-14T00:00:00+00:00","updated":"2023-07-15T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/codium-on-opensuse-aeon\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/codium-on-opensuse-aeon\/","content":"<h2 id=\"prerequisites\">Prerequisites<a class=\"zola-anchor\" href=\"#prerequisites\" aria-label=\"Anchor link for: prerequisites\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>To start, you must have an immutable linux desktop distribution such as openSUSE Aeon. In this short post,\nI will explain how to set up VSCodium Flatpak in an immutable linux desktop. Some of the steps\ncan be imitated to other immutable distros such as Fedora Silverblue and VanillaOS.<\/p>\n<h3 id=\"reason\">Reason<a class=\"zola-anchor\" href=\"#reason\" aria-label=\"Anchor link for: reason\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>There are ongoing issues and questions amongst Linux users and skepticisms regarding the usability of\nimmutable desktops and the push for an all <strong>flatpak<\/strong> (or <strong>snap<\/strong>, if you prefer that,) immutable desktop\ndistribution.<\/p>\n<p>This post, however, only debunks misinformation of how to use VSCodium Flatpak (or even VSCode Flatpak) properly\nin this kind of system.<\/p>\n<h2 id=\"the-guide\">The Guide<a class=\"zola-anchor\" href=\"#the-guide\" aria-label=\"Anchor link for: the-guide\"\n  >\u00a7<\/a\n>\n<\/h2>\n<h3 id=\"setting-up-flatpak\">Setting up Flatpak<a class=\"zola-anchor\" href=\"#setting-up-flatpak\" aria-label=\"Anchor link for: setting-up-flatpak\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>openSUSE Aeon already has flatpak set up out of the box but it's <code>system-wide<\/code>. If you prefer <em>user-wide<\/em> installations, you can do:<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">flatpak<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-user<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> remote-add<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> \\<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#8F3F71, #D3869B);\">        -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-if-not-exists<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> flathub<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> \\<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#79740E, #B8BB26);\">        https:\/\/dl.flathub.org\/repo\/flathub.flatpakrepo<\/span><\/span><\/code><\/pre><h3 id=\"installing-vscodium-flatpak\">Installing VSCodium Flatpak<a class=\"zola-anchor\" href=\"#installing-vscodium-flatpak\" aria-label=\"Anchor link for: installing-vscodium-flatpak\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Assuming you use openSUSE Aeon, you can install VSCodium Flatpak through GNOME Software. If you love to use the\nCLI, you can do the following:<\/p>\n<h4 id=\"user-wide-install\">User-wide install<a class=\"zola-anchor\" href=\"#user-wide-install\" aria-label=\"Anchor link for: user-wide-install\"\n  >\u00a7<\/a\n>\n<\/h4>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">flatpak<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-user<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> install<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> com.vscodium.codium<\/span><\/span><\/code><\/pre><h4 id=\"system-wide-install\">System-wide install<a class=\"zola-anchor\" href=\"#system-wide-install\" aria-label=\"Anchor link for: system-wide-install\"\n  >\u00a7<\/a\n>\n<\/h4>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">flatpak<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> install<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> com.vscodium.codium<\/span><\/span><\/code><\/pre>\n<p>Then install Open-Remote-SSH Plugin for VSCodium - <a rel=\"external\" href=\"https:\/\/github.com\/jeanp413\/open-remote-ssh\">https:\/\/github.com\/jeanp413\/open-remote-ssh<\/a>.<\/p>\n<h3 id=\"setting-up-distrobox\">Setting up distrobox<a class=\"zola-anchor\" href=\"#setting-up-distrobox\" aria-label=\"Anchor link for: setting-up-distrobox\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>openSUSE Aeon comes with <a rel=\"external\" href=\"https:\/\/github.com\/89luca89\/distrobox\">distrobox<\/a> out of the <em>box<\/em> \ud83d\ude1c<\/p>\n<p>Distrobox is a <a rel=\"external\" href=\"https:\/\/podman.io\">podman<\/a> frontend much like <a rel=\"external\" href=\"https:\/\/github.com\/containers\/toolbox\">toolbx<\/a>. I prefer distrobox because it's way more flexible in my experience.<\/p>\n<p>To create my own container, I run the following command<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">distrobox-enter<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> tumbleweed<\/span><\/span><\/code><\/pre>\n<p>This will create a podman container named as \"tumbleweed\". I advise you to set a <strong>custom<\/strong> <code>HOME<\/code> directory\nthough. You can do that by using the command<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">distrobox-create<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">n<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> tumbleweed<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">H<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> somedir\/you\/really\/want\/to\/set\/as\/HOME\/for\/that\/container<\/span><\/span><\/code><\/pre>\n<p>For more information, check out the documentation at <a rel=\"external\" href=\"https:\/\/distrobox.privatedns.org\/usage\">https:\/\/distrobox.privatedns.org\/usage<\/a>.<\/p>\n<h3 id=\"setting-up-ssh-and-sshd-in-your-container\">Setting up SSH and SSHD in your container<a class=\"zola-anchor\" href=\"#setting-up-ssh-and-sshd-in-your-container\" aria-label=\"Anchor link for: setting-up-ssh-and-sshd-in-your-container\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>After entering your container (here we use \"tumbleweed\"), do<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">sudo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/usr\/sbin\/sshd-gen-keys-start<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> assuming you have vim installed in the podman container<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\"> I use vim here<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">sudo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> vim<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/etc\/ssh\/sshd_config<\/span><\/span><\/code><\/pre>\n<p>Then add the following to your <code>\/etc\/ssh\/sshd_config<\/code> in that container<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Port 10000<\/span><\/span>\n<span class=\"giallo-l\"><span>ListenAddress localhost<\/span><\/span>\n<span class=\"giallo-l\"><span>PermitEmptyPasswords yes<\/span><\/span>\n<span class=\"giallo-l\"><span>PermitUserEnvironment yes<\/span><\/span>\n<span class=\"giallo-l\"><span>X11Forwarding yes<\/span><\/span><\/code><\/pre>\n<p>Next, run the <code>sshd<\/code> command like so<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">sudo<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> \/usr\/sbin\/sshd<\/span><\/span><\/code><\/pre>\n<p>Make sure the container is running during all of your sessions. Distrobox does it by default.<\/p>\n<p>Then in your <strong>host system<\/strong>, edit <code>~\/.ssh\/config<\/code> with the following content<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"plain\"><span class=\"giallo-l\"><span>Host tumbleweed<\/span><\/span>\n<span class=\"giallo-l\"><span>  HostName localhost<\/span><\/span>\n<span class=\"giallo-l\"><span>  Port 10000<\/span><\/span><\/code><\/pre>\n<p>Finally, use your Open-Remote-SSH plugin in VSCodium to connect to that container and set up your\ndevelopment environment!<\/p>\n<h2 id=\"conclusion\">Conclusion<a class=\"zola-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Setting up VSCodium flatpak is complicated but not that hard as long as you are familiar with how containers\nwork and how to choose the right plugins. I believe that a development environment that is mostly SSH-ing\nto containers bring benefits that outweighs its disadvantages:<\/p>\n<ul>\n<li>clean base system; install dev dependencies in the container<\/li>\n<li>throw the container away to start fresh if desired<\/li>\n<li>allows developers to install only the necessary stuff on their base system<\/li>\n<li>encourages the use of flatpaks, a universal distribution\/packaging format<\/li>\n<li>explores possibilities of making immutable desktops as a viable development environment<\/li>\n<\/ul>\n"},{"title":"Introduction to Environmental Science","published":"2023-07-07T00:00:00+00:00","updated":"2023-07-09T00:00:00+00:00","author":{"name":"\n            Soc Virnyl S. Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/lecture\/introduction-to-environmental-science\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/lecture\/introduction-to-environmental-science\/","content":"<h2 id=\"definition\">Definition<a class=\"zola-anchor\" href=\"#definition\" aria-label=\"Anchor link for: definition\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Environmental Science is an interdisciplinary field that tackles the importance of the environment\nsuch as forests and marine ecosystems and addressing issues and societal problems that harms the future\nof our biosphere.<\/p>\n<p>But before we tackle the subject, let us understand first what is an ecosystem.<\/p>\n<h2 id=\"ecosystems-and-habitats\">Ecosystems and habitats<a class=\"zola-anchor\" href=\"#ecosystems-and-habitats\" aria-label=\"Anchor link for: ecosystems-and-habitats\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>These two terms are interchangeable; habitats refer to different levels composition of functional units of\nvarious organisms and abiotic components such as humidity, and may be terrestrial or aquatic. Ecosystems,\nhowever, can encompass from the microscopic level to the entirety of the biosphere. A habitat is, therefore,\njust another name for a small part of an ecosystem.<\/p>\n<blockquote>\n<p>To understand what this means, <strong>the whole planet can be considered an ecosystem as a whole<\/strong>. A pile of rotten\nlogs is also an ecosystem. Habitats are just subjective terms to identify various differences in geographical components\njust like how we name things in general.<\/p>\n<\/blockquote>\n<h3 id=\"components-of-an-ecosystem\">Components of an ecosystem<a class=\"zola-anchor\" href=\"#components-of-an-ecosystem\" aria-label=\"Anchor link for: components-of-an-ecosystem\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>An ecosystem is composed of two major parts: <span class=\"underline\">Abiotic Components<\/span> and <span class=\"underline\">Biotic Components<\/span>. These components interact with\neach other with varying results. The goal is to achieve a more stable system through trial and error.<\/p>\n<p>Ecosystems work in a way that each component has a <em><strong>role<\/strong><\/em>. The environment forces these components with assigned\nroles usually in a form of evolutionary features in biotic components and physical barriers e.g. cliffs and rivers.<\/p>\n<ul>\n<li>\n<p>Biotic components are organisms or life such as mosquitoes and humans.<\/p>\n<\/li>\n<li>\n<p>Abiotic components are geological features and components in an ecosystem e.g. minerals and water.<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"energy-flow-in-the-ecosystem\">Energy Flow in the ecosystem<a class=\"zola-anchor\" href=\"#energy-flow-in-the-ecosystem\" aria-label=\"Anchor link for: energy-flow-in-the-ecosystem\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p><strong>Energy<\/strong> is the whole driving force for everything that is happening in or on the planet. Life requires energy to do various functions\nwhere the end goal is to reproduce and to sustain a stable population.<\/p>\n<p>Simplified models of how energy flows in the ecosystem are presented as <strong>energy pyramids<\/strong>, <strong>food\/energy chain<\/strong>, and the <strong>food web<\/strong>.\nAll of these models contain the same or similar components in the following:<\/p>\n<ul>\n<li>Producers; where composed of autotrophic organisms such as plants.<\/li>\n<li>Consumers; where these can be further broken down as\n<ul>\n<li>Primary consumers<\/li>\n<li>Secondary consumers<\/li>\n<li>Tertiary consumers<\/li>\n<\/ul>\n<\/li>\n<li>Decomposers; mostly comprised of microorganisms such as fungi and bacteria which breakdown dead matter into simpler compounds.<\/li>\n<\/ul>\n<p>The model explains in a manner where energy flows from <strong>high density<\/strong> to <strong>low density<\/strong>.<\/p>\n<h3 id=\"flaws-of-these-models\">Flaws of these models<a class=\"zola-anchor\" href=\"#flaws-of-these-models\" aria-label=\"Anchor link for: flaws-of-these-models\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Unfortunately, these models do not really explain much of how the ecosystems <strong>actually work<\/strong>. For example, where can we assign\norganisms that generate energy from inorganic sources such as sulfur and methane and not directly from the Sun? These models\nfail to actually account for anything <strong>beyond<\/strong> photosynthesis, herbivory, carnivory, and omnivory.<\/p>\n<h2 id=\"biodiversity\">Biodiversity<a class=\"zola-anchor\" href=\"#biodiversity\" aria-label=\"Anchor link for: biodiversity\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>As the words literally means \"life in variety\" or \"life in diversity\", biodiversity refers to the <strong>level of desirable <em>variety<\/em><\/strong>\nof organisms living in an area. These areas can be any habitat from forest ecosystems to a small pond. Before we can see the importance\nof biodiversity, let's understand first what is an <strong>ecological niche<\/strong> or <strong>niche<\/strong>.<\/p>\n<h3 id=\"ecological-niche\">Ecological Niche<a class=\"zola-anchor\" href=\"#ecological-niche\" aria-label=\"Anchor link for: ecological-niche\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>You should read the whole article that describes niches in National Geographic's <a rel=\"external\" href=\"https:\/\/education.nationalgeographic.org\/resource\/niche\/\">Niche encyclopedic entry<\/a>,<\/p>\n<blockquote>\n<p>A species' niche is all of the environment factors and interspecies\nrelationships that influence the species.<\/p>\n<\/blockquote>\n<p>Species are assigned from their environment for what roles they have. These assignments are either <strong>specialists<\/strong>\nand <strong>generalists<\/strong>; the former is a result of narrow and limited niches and the latter is a result of broader niches.<\/p>\n<blockquote>\n<p>No two species can have the same exact same niche.<\/p>\n<\/blockquote>\n<p>Otherwise, one species may outcompete over the other for resources and space and may lead the other to extinction or moving\nto another area where competition is less.<\/p>\n<p>In a sense, each species have designated roles in their habitat because of environmental factors. These designated roles\ndecides the fate of different species in that ecosystem. A loss of a species may cause an imbalance of roles and cause\na resources shift because of lack of competition or the increase thereof.<\/p>\n<h3 id=\"three-levels-of-biodiversity\">Three levels of biodiversity<a class=\"zola-anchor\" href=\"#three-levels-of-biodiversity\" aria-label=\"Anchor link for: three-levels-of-biodiversity\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>There are three levels of biodiversity which focuses on specific aspects as per their names<\/p>\n<h4 id=\"genetic-diversity\">Genetic Diversity<a class=\"zola-anchor\" href=\"#genetic-diversity\" aria-label=\"Anchor link for: genetic-diversity\"\n  >\u00a7<\/a\n>\n<\/h4>\n<p>Genetic diversity pertains to the high variation of the <em>gene pool<\/em> of a population.\nGenetic diversity is important because this variability lessens the likelihood of a population\nto be all affected by environmental factors such as disease.<\/p>\n<h4 id=\"species-diversity\">Species Diversity<a class=\"zola-anchor\" href=\"#species-diversity\" aria-label=\"Anchor link for: species-diversity\"\n  >\u00a7<\/a\n>\n<\/h4>\n<p>Species diversity is the number of different species in a community or an ecosystem. It may also mean for another term\ncalled <em>species richness<\/em>.<\/p>\n<h4 id=\"ecosystem-diversity\">Ecosystem diversity<a class=\"zola-anchor\" href=\"#ecosystem-diversity\" aria-label=\"Anchor link for: ecosystem-diversity\"\n  >\u00a7<\/a\n>\n<\/h4>\n<p>Ecosystem diversity deals with the variation of the components, both abiotic and biotic, in an ecosystem. It addresses the\ncombined characteristics of <em><strong>biodiversity<\/strong><\/em> and <em><strong>geodiversity<\/strong><\/em>.<\/p>\n<h3 id=\"niches-and-biodiversity\">Niches and Biodiversity<a class=\"zola-anchor\" href=\"#niches-and-biodiversity\" aria-label=\"Anchor link for: niches-and-biodiversity\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>According to <a rel=\"external\" href=\"https:\/\/faculty.washington.edu\/jhrl\/Levine&amp;HRL09.pdf\">Levine and HilleRisLambers (2009)<\/a>,<\/p>\n<blockquote>\n<p>Niches are important in maintaining species diversity<\/p>\n<\/blockquote>\n<p>And this may hold true for most since an increase species diversity may also mean that there is a high chance <em>roles<\/em> are <em><strong>specialized<\/strong><\/em>\nfor the species of that ecosystem. Niches are dynamic and they are assigned to the species because of environmental pressures\nand evolutionary pressures. If there are two or more species having similar roles, there is a high chance of increased competition\nwhich either eliminates the species in that space, either as extinction or migrating to other ecosystems for lesser competition.<\/p>\n<h2 id=\"offtopic-the-scientific-method\">Offtopic: The Scientific Method<a class=\"zola-anchor\" href=\"#offtopic-the-scientific-method\" aria-label=\"Anchor link for: offtopic-the-scientific-method\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>What is the scientific method?<\/p>\n<p>The scientific method is a systematic process of getting the answer or closest answer to a phenomenon or a problem. It starts with<\/p>\n<ol>\n<li><strong>Observation<\/strong>, it does not necessarily mean you should actually observe. Sometimes it happens in front of you and then you do a;<\/li>\n<li><strong>Hypothesis<\/strong>, where which you form a statement or an \"educated guess\" using existing facts and information you gathered to create the possible closest explanation to a phenomena and then do an;<\/li>\n<li><strong>Experimentation<\/strong>, where which you formulate a method that is <strong>reproducible<\/strong> and applies your hypothesis to answer your question. Finally you will reach the;<\/li>\n<li><strong>Conclusion<\/strong>. However, the conclusion may not give you the exact answer to your question or you may have used the wrong methodology. Sometimes, it gives you more questions than answers.<\/li>\n<\/ol>\n<h2 id=\"review-questions\">Review Questions<a class=\"zola-anchor\" href=\"#review-questions\" aria-label=\"Anchor link for: review-questions\"\n  >\u00a7<\/a\n>\n<\/h2>\n<ol>\n<li>What is an ecosystem?<\/li>\n<li>What are examples of an ecosystem?<\/li>\n<li>What are its components? How do they interact with each other?<\/li>\n<li>Ecosystems are not static\/stagnant. Why is this so?<\/li>\n<li>Why are ecosystems important?<\/li>\n<li>What is biodiversity? How is biodiversity related to ecosystems?<\/li>\n<li>How can biodiversity an indicator of a healthy ecosystem?<\/li>\n<li>What are threats to an ecosystem?<\/li>\n<li>What are invasive species? Why is an introduction of a species not native to its habitat can be a disaster?<\/li>\n<li>Why is the circulation of nutrients in an ecosystem important?<\/li>\n<\/ol>\n"},{"title":"Journey to openSUSE","published":"2023-06-09T00:00:00+00:00","updated":"2023-06-09T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/16\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/16\/","content":"<h1 id=\"about-opensuse\">About openSUSE<a class=\"zola-anchor\" href=\"#about-opensuse\" aria-label=\"Anchor link for: about-opensuse\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p><i class=\"fa-brands fa-suse\"><\/i> openSUSE is a community derivative of the\nSUSE Linux Enterprise geared for developers, servers, and enthusiasts. Like any\nLinux distribution, it provides loads of quality software for many users and\nsupports modern systems.<\/p>\n<p>Try out openSUSE by following the link <a rel=\"external\" href=\"https:\/\/get.opensuse.org\">https:\/\/get.opensuse.org<\/a>.<\/p>\n<h1 id=\"when-i-hopped-over-to-opensuse\">When I hopped over to openSUSE<a class=\"zola-anchor\" href=\"#when-i-hopped-over-to-opensuse\" aria-label=\"Anchor link for: when-i-hopped-over-to-opensuse\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p><strong>IT WAS NOT GOOD<\/strong>. Keyword \"was\". Hear me out. I tried out openSUSE around the year 2020.<\/p>\n<img alt=\"caught in 4k joining opensuse\" src=\".\/os-discord-screenshot.webp\" style=\"width:60%;display:block;margin-left:auto;margin-right:auto\" >\n<p>I joined openSUSE Discord but left as soon as I realized the mirror situation. I complained\nlike <em><strong>a lot<\/strong><\/em>. The distribution is actually very good. I just don't want to live in\na time where I suffer from slow updates. It's why I came back to <a rel=\"external\" href=\"https:\/\/manjarno.snorlax.sh\">Manjarno<\/a>.<\/p>\n<p>But before we get into the part where I <a href=\"https:\/\/uncomfyhalomacro.pl\/blog\/16\/#i-hopped-back-to-opensuse-twice\">hopped back<\/a> to openSUSE, let me talk about the\nbrief history of my Linux journey.<\/p>\n<h1 id=\"my-linux-journey\">My Linux Journey<a class=\"zola-anchor\" href=\"#my-linux-journey\" aria-label=\"Anchor link for: my-linux-journey\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>So my Linux journey started around the year 2019 when the COVID-19 pandemic happened. My old laptop became slow around that\ntime. To save money and to avoid the cost of buying a new laptop, we bought replacement parts and while waiting for them to\narrive, I decided to try Linux on the month of May of 2020. Windows 10 became so slow on my old machine and I was thinking,\n\"I know I am smart enough to read books and manuals, so why not Linux?\". I got my flashdrive, downloaded\n<a rel=\"external\" href=\"https:\/\/www.debian.org\">Debian<\/a> Stable, burned the ISO to the flashdrive through <a rel=\"external\" href=\"https:\/\/rufus.ie\">Rufus<\/a> and then just basically\nwiped Windows and replaced it with Debian. I was pretty sure the first DE I tried was KDE Plasma.<\/p>\n<p>The distributions I tried are actually enough for writing, presenting, and schooling!<\/p>\n<h2 id=\"arch-linux-for-the-new-year-of-2021\">Arch Linux for the new year of 2021<a class=\"zola-anchor\" href=\"#arch-linux-for-the-new-year-of-2021\" aria-label=\"Anchor link for: arch-linux-for-the-new-year-of-2021\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>I was very curious of <a rel=\"external\" href=\"https:\/\/archlinux.org\">Arch Linux<\/a> and the hype around the distribution.\nIt turns out, the appealing aspect of Arch was the fact that you can modify and install what you\nwant on this distribution. I daily drived it <em>with some hopping over to other *nix distributions of course (such\nas FreeBSD which is not a linux distribution)<\/em>.<\/p>\n<h2 id=\"the-rest-of-the-stuff-is-distrohopping-facepalm-male-sign\">The rest of the stuff is distrohopping \ud83e\udd26\u200d\u2642\ufe0f<a class=\"zola-anchor\" href=\"#the-rest-of-the-stuff-is-distrohopping-facepalm-male-sign\" aria-label=\"Anchor link for: the-rest-of-the-stuff-is-distrohopping-facepalm-male-sign\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>I mean if we want to breakdown all the distros I tried, not just Linux, here it is:<\/p>\n<ul>\n<li>2020\n<ul>\n<li>Debian<\/li>\n<li>Xubuntu<\/li>\n<li>Manjaro<\/li>\n<li>Artix<\/li>\n<\/ul>\n<\/li>\n<li>2021\n<ul>\n<li>Arch<\/li>\n<li>Void<\/li>\n<li>Fedora<\/li>\n<li>FreeBSD<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>In 2022, I daily drived Void Linux from January to June-ish. Once my new laptop arrived, I then just full hopped on Fedora,\nonly to be disappointed, I forgot what it was though. Went to Arch for a little bit. Then I came back top openSUSE.<\/p>\n<h1 id=\"i-hopped-back-to-opensuse-twice\">I hopped back to openSUSE. Twice.<a class=\"zola-anchor\" href=\"#i-hopped-back-to-opensuse-twice\" aria-label=\"Anchor link for: i-hopped-back-to-opensuse-twice\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>It was 2021. I hopped back to openSUSE and uh, the mirror situation was still not great. I will have to time it every late at night just\nfor an update to complete by the next day... <em>imagine that<\/em>...<\/p>\n<p>But I persevered. It's annoying enough to hop back and forth only because of the mirrors but I believed and hoped that\nimprovements of the mirror situation. And someone did improve it!!!<\/p>\n<h2 id=\"firstyear-steps-in\">Firstyear steps in<a class=\"zola-anchor\" href=\"#firstyear-steps-in\" aria-label=\"Anchor link for: firstyear-steps-in\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>I tried many mirrors around and I was not very happy. Many times, I either get an outdated mirror or a dead mirror.<\/p>\n<p><a rel=\"external\" href=\"https:\/\/github.com\/firstyear\">Firstyear<\/a> was one of the victims of the mirror situation. I think at that time, he was\nexploring some ways on how to fix the mirror issue. Because he is not just a user, the mirror situation affected\nhis work. tl;dr he works at <a rel=\"external\" href=\"https:\/\/www.suse.com\">SUSE LLC<\/a> and mirrors were bad.<\/p>\n<p>Here are some screenshots of our conversation in <a rel=\"external\" href=\"https:\/\/discord.gg\/opensuse\">openSUSE Discord<\/a> regarding mirrors:<\/p>\n<p>I was probably a few days late for an update but oh well...<\/p>\n<img alt=\"firstyear and I talking about my situation\" src=\".\/its-time.webp\" style=\"width:70%;display:block;margin-left:auto;margin-right:auto\" >\n<img alt=\"firstyear complaining about the mirror situation\" src=\".\/firstyear-complains.webp\" style=\"width:50%;display:block;margin-left:auto;margin-right:auto\" >\n<p>Basically, he just did a Thanos move.<\/p>\n<img src=\"https:\/\/media.tenor.com\/u8YEMwIfJGMAAAAC\/thanos.gif\" alt=\"fine. i will do it myself\" style=\"width:50%;display:block;margin-left:auto;margin-right:auto\" >\n<p>It took a while. Or more like a year before it has improved.<\/p>\n<h2 id=\"took-a-while\">Took a while<a class=\"zola-anchor\" href=\"#took-a-while\" aria-label=\"Anchor link for: took-a-while\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>It did took another year after that because there were still some rough edges.<\/p>\n<p>So I came back to Void for quite a while until 2022 happened. I came back again for openSUSE for the reason that I feel\nlike I do not really belong in the Void community. I felt at home to openSUSE so it's why I came back. And I came back with\nimproved infrastructure because Firstyear and co-contributors finally solved the mirror issue!<\/p>\n<img src=\".\/im-officially-back.webp\" alt=\"im officially back\" style=\"width:60%;display:block;margin-left:auto;margin-right:auto\" >\n<p>And I stayed using openSUSE until the time I was writing this. \ud83d\ude33<\/p>\n<h1 id=\"why-opensuse\">Why openSUSE <i class=\"fa-brands fa-suse\"><\/i>?<a class=\"zola-anchor\" href=\"#why-opensuse\" aria-label=\"Anchor link for: why-opensuse\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>openSUSE is a very underrated distribution. I don't care much about the controversies for why that is, people like to gossip including myself :P<\/p>\n<p>Anyway, I chose openSUSE because for many reasons but here are the major ones.<\/p>\n<h2 id=\"easier-to-contribute\">Easier to contribute<a class=\"zola-anchor\" href=\"#easier-to-contribute\" aria-label=\"Anchor link for: easier-to-contribute\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Unlike other distros that I tried, openSUSE seems to be open on encouraging users to contribute in various parts of the distribution from\nthe openSUSE Build Services, the openSUSE Wiki, and packaging.<\/p>\n<p>I learned mostly about packaging because it's that area that I am most interested in when I tried openSUSE. Firstyear taught me about\nthe RPM specification and RPM specfiles. As of writing, I managed to package at least 10 software, mostly related to Rust or Wayland such\nas <code>mdbook<\/code>, <code>swww<\/code>, and <code>xdg-desktop-hyprland<\/code>.<\/p>\n<h2 id=\"amazing-community\">Amazing community<a class=\"zola-anchor\" href=\"#amazing-community\" aria-label=\"Anchor link for: amazing-community\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>I met lots of talented and skilled individuals in openSUSE that I really just want to steal their brain and make theirs mine.<\/p>\n<p>There are a lot of people as well that are humorous and funny to a point I really like to lurk there sometimes.<\/p>\n<p>But again, that's because we have amazing moderators.<\/p>\n<h2 id=\"i-learned-a-lot\">I learned a lot<a class=\"zola-anchor\" href=\"#i-learned-a-lot\" aria-label=\"Anchor link for: i-learned-a-lot\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>When I joined openSUSE, I learned lives of different people there and met some fellow people who use different kind of\nOSes. I learned about their perspectives in the tech community. And I think being in openSUSE really opened my eyes\nthat there is much more than \"free\" and \"open-source software\". Various people have different reasons of using Linux.<\/p>\n<h2 id=\"would-i-still-use-opensuse-forever\">Would I still use openSUSE forever?<a class=\"zola-anchor\" href=\"#would-i-still-use-opensuse-forever\" aria-label=\"Anchor link for: would-i-still-use-opensuse-forever\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Depends. Maybe in the future my needs may become entirely different. I have been eyeing on reproducibility\nwhere I can predict my current setup is the same across different machines such as NixOS and other immutable\ndistributions such as openSUSE Aeon and Fedora Silverblue.<\/p>\n<p>But I won't forget about the openSUSE community \u263a\ufe0f<\/p>\n"},{"title":"Genetically Modified Organisms","published":"2023-05-29T00:00:00+00:00","updated":"2023-05-29T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/lecture\/sts1-genetically-modified-organisms\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/lecture\/sts1-genetically-modified-organisms\/","content":"<h1 id=\"natural-selection\">Natural Selection<a class=\"zola-anchor\" href=\"#natural-selection\" aria-label=\"Anchor link for: natural-selection\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Natural selection is a known concept in the field of biology and life sciences. It talks about\nhow the environment change the organisms living in it to adapt and thrive in that environment. Otherwise,\nthese organisms are forced to move to other environments (e.g. habitats and ecosystems) or become extinct.<\/p>\n<p>This concept was first recognized by Charles Darwin during his voyage to the Galapagos Islands\nand co-discovered by Alfred Russel Wallace who was exploring Malaysia, Singapore, Indonesia,\nwhich <em><strong>were<\/strong><\/em> known as the <em>East Indies<\/em>.<\/p>\n<h2 id=\"in-relation-to-evolution\">In relation to evolution<a class=\"zola-anchor\" href=\"#in-relation-to-evolution\" aria-label=\"Anchor link for: in-relation-to-evolution\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Natural selection is the actual driving force in <em>evolution<\/em>, where a new species or sub-species arises\nfrom the changes through various <em>adaptations<\/em>. Simply put, with enough time and luck, a species\nmay become another species if it wants to <em>adapt<\/em> in that environment. A new species may or may not\nbe able to breed with its ancestral species, and if it can, it is usually sterile or infertile e.g.\na cross between a donkey and a horse produces a sterile hinny or mule.<\/p>\n<h3 id=\"confusions-about-evolution\">Confusions about evolution<a class=\"zola-anchor\" href=\"#confusions-about-evolution\" aria-label=\"Anchor link for: confusions-about-evolution\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>There is a confusion caused by many traditional biologists about \"missing links\" and \"transitional forms\"\nin regards to evolution. The confusion is caused by the misinformation such as \"humans came from\nchimpanzees\" and whatnot. The truth is, every species is actually a transitional form. There is no\nactual specific point when it comes to evolution. It's always dynamic. Each of us may become an ancestor\nor a predecessor of some species we will never know. We can only define ourselves as \"closest relatives\"\nwith chimpanzees but no such thing as a \"common ancestor\", just the \"closest ancestor\".<\/p>\n<p>This is not the fault of scientists. It's just that scientific communication sometimes simplify concepts a\nbit that it may cause confusion.<\/p>\n<h3 id=\"evidence\">Evidence<a class=\"zola-anchor\" href=\"#evidence\" aria-label=\"Anchor link for: evidence\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Evolution is not that clear to see at first because our perception time is not the same as evolutionary\ntime. The effects of natural selection takes thousands to millions of years for it to be noticeable.<\/p>\n<p>The only way we can observe this is through <em>fossils<\/em>. Fossils are petrified remains of dead organisms\nthat can span even millions of years.<\/p>\n<p>Fortunately, we can observe natural selection in <em>microorganisms as they reproduce fast<\/em>. In the modern\nage, we can observe this by reading articles about antimicrobial resistance in some species of\nbacteria or even experimenting it inside the laboratory.<\/p>\n<h1 id=\"artificial-selection\">Artificial Selection<a class=\"zola-anchor\" href=\"#artificial-selection\" aria-label=\"Anchor link for: artificial-selection\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Artificial selection is one of the greatest evidence of natural selection. Except it's not caused by\nnature, but through careful selection of traits from us, human beings. We have practiced this concept\nwithout knowing it for thousands of years from domestication to agriculture. Dogs, cows, and corn\nare such examples of artificial selection. Through selective breeding, we achieved the desired traits\nwe want from these organisms. Another such good example would be the <em>Brassica oleracea<\/em> species because\npeople will not expect that cabbage, broccoli and cauliflower are actually the same species!<\/p>\n<p><img src=\"https:\/\/cdn.vox-cdn.com\/thumbor\/7Oq_1Wc8Uy6QocLEvHHSbhaCLKs=\/0x0:640x399\/720x0\/filters:focal(0x0:640x399):format(webp):no_upscale()\/cdn.vox-cdn.com\/uploads\/chorus_asset\/file\/3395076\/brassica-oleracea.0.jpg\" alt=\"brassica oleracea\" \/><\/p>\n<h1 id=\"genetically-modified-organisms\">Genetically Modified Organisms<a class=\"zola-anchor\" href=\"#genetically-modified-organisms\" aria-label=\"Anchor link for: genetically-modified-organisms\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>As we achieved the ability to modify and select genes, the field of <em>bioengineering<\/em> and <em>genetic\nengineering<\/em> has paved the way of accelerating our ability to quickly select the traits we want from\ndifferent organisms for food, raw materials, and medicine or drugs. These organisms are so-called\n<em>genetically modified organisms<\/em> or GMOs.<\/p>\n<p>Related links! Please watch them all. The last one is actually the best for me.<\/p>\n<ul>\n<li><a rel=\"external\" href=\"https:\/\/youtu.be\/lT3xvugz7SU\">Why do we have GMOs?<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/youtu.be\/7TmcXYp8xu4\">Are GMOs Good or Bad?<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/youtu.be\/wZ2TF8-PGQ4\">Pamela Ronald: The case of engineering our food<\/a><\/li>\n<\/ul>\n<h2 id=\"food-security-and-safety-and-agriculture\">Food Security and Safety, and Agriculture<a class=\"zola-anchor\" href=\"#food-security-and-safety-and-agriculture\" aria-label=\"Anchor link for: food-security-and-safety-and-agriculture\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>As the world population grows exponentially, there is also an increasing demand of food production\nand also an increase chance of a new disease affecting those that consume and those that are consumed.<\/p>\n<p>Genetically modified organisms with the power of genetic engineering can mitigate or even remove\nthose threats to food security and safety. Genetic engineers and geneticists can look for the gene\nthat increases food production or increases resilience against disease. Sometimes even add another\ntrait of that GMO to have a specific nutrient or nutrients to fight malnutrition in poverty-stricken\nregions. Some crops can be even modified to be resilient to the effects of climate change such as flood\nresilient rice or salt resilient fruit trees.<\/p>\n<h2 id=\"medicine\">Medicine<a class=\"zola-anchor\" href=\"#medicine\" aria-label=\"Anchor link for: medicine\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>GMOs can help us produce or increase the quality of our medicine. It may also help us find new ways\nor new kinds of medicine to produce. Insulin for example were already produced by genetically modified\nbacteria, specifically, <em>E. coli<\/em>.<\/p>\n<p>GMOs are more consistent and don't carry the same risks than traditional medicine because they can be\nlab produced, therefore, has more of a controlled setting. We can genetically modify organisms to be\nresilient or produce the drugs for us such as insulin, or even vitamins that are commonly deficient\nin young people.<\/p>\n<h1 id=\"review\">Review<a class=\"zola-anchor\" href=\"#review\" aria-label=\"Anchor link for: review\"\n  >\u00a7<\/a\n>\n<\/h1>\n<ol>\n<li>List 5 things that are the result or product of GMOs.<\/li>\n<li>Are GMOs bad or good? Explain.<\/li>\n<li>How does genetic engineering help us mitigate the effects of climate change?<\/li>\n<li>List down at least one species of plant that was saved from extinction\nthrough genetic engineering.<\/li>\n<\/ol>\n<h1 id=\"list-of-terms-and-definitions\">List of terms and definitions<a class=\"zola-anchor\" href=\"#list-of-terms-and-definitions\" aria-label=\"Anchor link for: list-of-terms-and-definitions\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Genetically Modified Organism (GMO): An organism whose genetic material has been altered using genetic engineering techniques. GMOs are created by introducing genes from one species into another to confer specific traits or characteristics.<\/p>\n<p>Genetic Engineering: The manipulation and alteration of an organism's genetic material to introduce or modify specific traits. It involves isolating, modifying, and reintroducing DNA sequences into an organism to produce desired characteristics.<\/p>\n<p>Transgene: A gene that has been transferred from one organism to another through genetic engineering. The transgene can be from the same or a different species and is typically used to confer specific traits or characteristics to the recipient organism.<\/p>\n<p>Recombinant DNA (rDNA): DNA molecules formed by combining DNA sequences from different sources or species. Recombinant DNA technology is a key tool in genetic engineering, allowing the creation of transgenic organisms.<\/p>\n<p>Gene Splicing: The process of cutting and recombining DNA sequences from different sources, typically performed in the laboratory to create new combinations of genes. Gene splicing is used to insert foreign genes into an organism's genome.<\/p>\n<p>Biotechnology: The application of biological and genetic engineering techniques to develop products and solutions that improve living organisms, industrial processes, and medical treatments. It encompasses a wide range of practices, including genetic engineering and the use of GMOs.<\/p>\n<p>Selective Breeding: The traditional method of breeding plants or animals with desirable traits to create offspring with those same traits. Selective breeding is not considered genetic engineering because it involves the selection of naturally occurring genetic variation rather than the introduction of foreign genes.<\/p>\n<p>Herbicide Resistance: The ability of a plant to withstand the application of specific herbicides without being damaged. Herbicide-resistant GMOs are created by introducing genes that produce enzymes or proteins that break down or deactivate the herbicide.<\/p>\n<p>Pest Resistance: The ability of a plant to resist damage caused by pests, such as insects, viruses, or fungi. Pest-resistant GMOs are created by introducing genes that produce toxins harmful to pests or genes that enhance the plant's own defense mechanisms.<\/p>\n<p>Gene Editing: A set of techniques used to modify an organism's genome by precisely altering its DNA sequence. Gene editing tools like CRISPR (Clustered Regularly Interspaced Short Palindromic Repeats) allow scientists to make targeted changes in an organism's genes without necessarily introducing foreign genes.<\/p>\n<p>Genome: The complete set of genetic material (DNA) of an organism, including all of its genes. The genome contains the instructions for building and maintaining an organism.<\/p>\n<p>Gene Transfer: The process of transferring genes from one organism to another. It can occur naturally through processes like sexual reproduction or artificially through genetic engineering techniques.<\/p>\n<p>Marker Gene: A gene introduced into an organism's genome during genetic engineering to serve as a selectable or observable marker. Marker genes are used to identify and track the presence of the desired transgene in the recipient organism.<\/p>\n<p>Antibiotic Resistance Marker: A common type of marker gene used in genetic engineering. It provides resistance to antibiotics, allowing researchers to selectively identify and cultivate cells or organisms that have successfully incorporated the desired transgene.<\/p>\n<p>Molecular Farming: The use of genetically modified plants or animals to produce valuable substances, such as pharmaceuticals, vaccines, or industrial enzymes. These organisms act as \"factories\" for the production of high-value compounds.<\/p>\n<p>Synthetic Biology: An interdisciplinary field that combines biology, engineering, and computer science to design and construct new biological parts, devices, and systems. It involves the creation of synthetic DNA sequences and the engineering of novel biological functions.<\/p>\n<p>Genetic Modification Techniques: Various methods used to introduce foreign genes or modify an organism's DNA. These techniques include gene splicing, gene editing, and RNA interference (RNAi), among others.<\/p>\n<p>Biofortification: The process of enhancing the nutritional content of food crops through genetic engineering. Biofortified crops are designed to contain higher levels of specific vitamins, minerals, or other beneficial compounds.<\/p>\n<p>Environmental Impact Assessment: A process to evaluate the potential environmental risks and benefits associated with the release of GMOs into the environment. It helps identify and minimize any potential adverse effects on ecosystems, biodiversity, or human health.<\/p>\n<p>Coexistence: The simultaneous cultivation of genetically modified and non-genetically modified crops or the raising of genetically modified and non-genetically modified organisms in close proximity. Coexistence measures aim to ensure that GMOs and conventional crops can coexist without significant cross-pollination or other unintended effects.<\/p>\n<p>Biosafety: The discipline concerned with ensuring the safe handling, transport, use, and disposal of GMOs. Biosafety measures and regulations are in place to prevent potential risks to human health, animal health, and the environment.<\/p>\n"},{"title":"How I use MicroOS Desktop","published":"2023-05-28T00:00:00+00:00","updated":"2023-05-28T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/13\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/13\/","content":"<h1 id=\"update-on-my-current-usage\">Update on my current usage<a class=\"zola-anchor\" href=\"#update-on-my-current-usage\" aria-label=\"Anchor link for: update-on-my-current-usage\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p><strong>I stopped using it<\/strong>. MicroOS has some of it's perks but the current state of the operating system is still in it's beta\/alpha state\nso some moving parts are inherently broken. It's probably because of the lack of contributors and interest from SUSE and openSUSE\nfor the desktop variant of MicroOS. As much as I want to become a contributor, I realize I lack the time to do so because\nof work and personal problems and issues I still have to fix a lot in real life. If you still want to know how I use it, continue reading.<\/p>\n<hr \/>\n<p>MicroOS Desktop is a <em>desktop variant<\/em> of the openSUSE's MicroOS for servers and containerized workflows. Please do note, although they are\nsimilar, they are separate products and have different goals.<\/p>\n<blockquote>\n<p>Issues in MicroOS for server should be issued over there and issues in MicroOS Desktop\nshould be on MicroOS Desktop.<\/p>\n<\/blockquote>\n<p>The goal of the desktop is as follows:<\/p>\n<ul>\n<li>immutability<\/li>\n<li>isolation of system and user software<\/li>\n<li>containerized workflows<\/li>\n<\/ul>\n<h2 id=\"immutability\">Immutability<a class=\"zola-anchor\" href=\"#immutability\" aria-label=\"Anchor link for: immutability\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Immutable desktops are nothing new. Windows and MacOS are immutable desktops since <em>you cannot\nchange the core part of the system<\/em> unless you have some permissions and workarounds to do it e.g.\nmodifying the system registry. For years, this was the standard of modern OSses including Android.<\/p>\n<p>Traditional desktop linux and nix systems are <em>mutable<\/em> which means that the user can modify\neach part of the core system. Although this advantage is also a disadvantage, nothing is perfect.<\/p>\n<h3 id=\"advantages-of-an-immutable-system\">Advantages of an immutable system<a class=\"zola-anchor\" href=\"#advantages-of-an-immutable-system\" aria-label=\"Anchor link for: advantages-of-an-immutable-system\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Being immutable is inherently an advantage of an immutable desktop system. It is hard to\nmodify the core part of the system and updates are \"atomic\" which means the whole system\nwill update as an immutable system.<\/p>\n<p>Users are encouraged to use workflows through sandboxing or containers. In this case, <strong>flatpaks<\/strong>,\n<strong>nix<\/strong>, <strong>distrobox<\/strong>, <strong>toolbx<\/strong>, <strong>docker<\/strong> and <strong>podman<\/strong>.<\/p>\n<p>For desktop software, it is advisable to use flatpaks. <em>Some users do use toolbx and distrobox for this<\/em>.<\/p>\n<p>For development environment, they are encouraged to use distrobox and toolbx. Others may prefer nix.<\/p>\n<h3 id=\"disadvantages\">Disadvantages<a class=\"zola-anchor\" href=\"#disadvantages\" aria-label=\"Anchor link for: disadvantages\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Being immutable <em><strong>may<\/strong><\/em> also be a disadvantage. It's very self-explanatory. You cannot modify\nyour system as much as you like to.<\/p>\n<h3 id=\"security\">Security<a class=\"zola-anchor\" href=\"#security\" aria-label=\"Anchor link for: security\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Immutable desktops increases security of the core system since it's not welcoming any modifications.\nSince the root file system is read-only, it's not easy to tamper the system and thus, users\ncan avoid any vulnerabilities <em><strong>unless the vulnerability is from the package and software installed\nfrom the root file system<\/strong><\/em>.<\/p>\n<h2 id=\"my-workflow\">My Workflow<a class=\"zola-anchor\" href=\"#my-workflow\" aria-label=\"Anchor link for: my-workflow\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>For software that I want to use e.g. Firefox, flatpaks are the way to go. Flatpaks are the best\nwhen it comes to these kind of distributions as they are self-contained and do not pollute\nthe host system with ridiculously brittle and large dependencies when installing through\nthe system's package manager.<\/p>\n<p>For developing and packaging software and also for learning, and note taking, I use distrobox.<\/p>\n<h3 id=\"how-i-use-distrobox\">How I use distrobox<a class=\"zola-anchor\" href=\"#how-i-use-distrobox\" aria-label=\"Anchor link for: how-i-use-distrobox\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>I created <code>mainbox<\/code> executable.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#!<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">\/usr\/bin\/bash<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">distrobox<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> enter<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">n<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> tumbleweed<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $<\/span><span style=\"color: light-dark(#076678, #83A598);\">@<\/span><\/span><\/code><\/pre>\n<p>This is for my development environment such as notetaking, learning a new language, or programming tasks.<\/p>\n<p>I also created <code>rootbox<\/code> executable.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"shellscript\"><span class=\"giallo-l\"><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">#!<\/span><span style=\"color: light-dark(#928374, #928374);font-style: italic;\">\/usr\/bin\/bash<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#B57614, #FABD2F);\">distrobox-enter<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-root<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> -<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">-name<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> opensuse-build-service<\/span><span style=\"color: light-dark(#076678, #83A598);\"> $<\/span><span style=\"color: light-dark(#076678, #83A598);\">@<\/span><\/span><\/code><\/pre>\n<p>This is for openSUSE Build Service related stuff since I am a volunteer packager there. I also set\nthe <code>--home<\/code> flag when creating this podman container. The <code>--home<\/code> flag helps you have a custom\n<code>$HOME<\/code> inside your container. It avoids clutter on your <em>actual home directory<\/em>.<\/p>\n<h1 id=\"conclusion\">Conclusion<a class=\"zola-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>For now, I am still new to MicroOS Desktop and I still experience some bugs here and there because\nI use the KDE Plasma variant of MicroOS which is known to be still in it's <strong>alpha<\/strong> stage. This\nmeans, it's not yet considered for daily use <em>even though some users are now using it<\/em>. To help\nimprove the experience, it's best to file bug reports and propose suggestions to the MicroOS\nPlasma Desktop maintainers and contributors. If you are privileged to have the free time to\ncontribute, consider offering your skills and services as well.<\/p>\n<h1 id=\"troubleshooting\">Troubleshooting<a class=\"zola-anchor\" href=\"#troubleshooting\" aria-label=\"Anchor link for: troubleshooting\"\n  >\u00a7<\/a\n>\n<\/h1>\n<h2 id=\"blurry-fonts-on-kde-plasma\">Blurry fonts on KDE Plasma<a class=\"zola-anchor\" href=\"#blurry-fonts-on-kde-plasma\" aria-label=\"Anchor link for: blurry-fonts-on-kde-plasma\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Install all the <code>xdg-desktop-portal<\/code> implementations especially gnome and gtk. Blurry fonts are usually affecting\ngtk apps and not qt apps.<\/p>\n<h1 id=\"issues\">Issues<a class=\"zola-anchor\" href=\"#issues\" aria-label=\"Anchor link for: issues\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>NVIDIA drivers don't load as fast causing some issues with the login manager. Workarounds is a force <code>systemctl restart display-manager.service<\/code>.\nI am not sure what's causing it as there are no logs. This does not happen on vanilla openSUSE TumbleWeed.<\/p>\n"},{"title":"Introduction to Epidemiology","published":"2023-05-27T00:00:00+00:00","updated":"2023-05-27T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/lecture\/mc1-epidemiology\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/lecture\/mc1-epidemiology\/","content":"<h1 id=\"epidemiology\">Epidemiology<a class=\"zola-anchor\" href=\"#epidemiology\" aria-label=\"Anchor link for: epidemiology\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>It is the study of <em>disease dynamics<\/em>. Epidemiology covers the topic of epidemics and pandemics, immunization,\nand <em>spillovers<\/em> (an event where pathogen's host jump over one species to another).<\/p>\n<p>It may be defined as the study of distribution of health and disease in <em>groups of people<\/em> as\ndescribed by \"Biostatistics and Epidemiology\" from Sylvia Wassertheil-Smoller and Jordan Smoller.<\/p>\n<h1 id=\"definition-of-disease\">Definition of Disease<a class=\"zola-anchor\" href=\"#definition-of-disease\" aria-label=\"Anchor link for: definition-of-disease\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>A <em>disease<\/em> are actually a combination of two words: dis, and ease. This means that a <em>disease<\/em> in its\ntrue meaning is discomfort or the feeling of uneasiness.<\/p>\n<p>Diseases exist because of many factors. This may include body's health in terms of nutrient intake, or the existence\nof pathogens that wreak havoc within their host's body. A disease may be obesity, <strong>a physical condition<\/strong>, or\npneumonia, an <strong>infection<\/strong>.<\/p>\n<p>In epidemiology, understanding the \"what\", the \"why\", and the \"how\" in diseases is helpful in health care planning,\nemergence of patterns, formation of hypothesis, and formulation standards in medical practice.<\/p>\n<h1 id=\"mortality-and-morbidity\">Mortality and Morbidity<a class=\"zola-anchor\" href=\"#mortality-and-morbidity\" aria-label=\"Anchor link for: mortality-and-morbidity\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>These two terms are sometimes confused with each other. But in epidemiology, there are some differences.<\/p>\n<blockquote>\n<p><em>Mortality is about the <strong>incidence<\/strong><\/em>. Incidence is the number of new cases at a specific period of time. Whereas,\nmorbidity is expressed as <em>incidence<\/em> or <em>prevalence<\/em>. Prevalence is the number of <em><strong>existing<\/strong><\/em> cases over a specific\nperiod of time, and thay may also include new cases as well.<\/p>\n<\/blockquote>\n<p>So if someone talks about <em>mortality rate<\/em>, they are talking about <em>incidence<\/em>.<\/p>\n<p>In reality, doing a survey or consensus for disease prevalence is easier because you will just need a sample of a population\nfor counting the cases of disease on that specific period of time. Incidence is hard because you will have to observe\na sample of <em>healthy<\/em> individuals until they manifest the disease.<\/p>\n<h1 id=\"epidemic-pandemic-and-endemic\">Epidemic, Pandemic, and Endemic<a class=\"zola-anchor\" href=\"#epidemic-pandemic-and-endemic\" aria-label=\"Anchor link for: epidemic-pandemic-and-endemic\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>An epidemic is a significant number of cases of a disease over a localized area in a period of time. A pandemic is just an\nepidemic but all over the globe. An endemic happens all over the world as well. There is a difference though. Both\npandemic and epidemic threatens the health of many people and the chance to recover from that disease or may even cause\nsignificant amount of deaths. Whereas, an endemic disease can happen over a lifetime with predictable number\nof infections. An endemic disease may evolve further into either an epidemic or a pandemic depending on the evolution\nof the pathogen that causes the disease.<\/p>\n<hr \/>\n<h1 id=\"infectious-diseases\">Infectious Diseases<a class=\"zola-anchor\" href=\"#infectious-diseases\" aria-label=\"Anchor link for: infectious-diseases\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Diseases caused by organisms such as bacteria, parasites, and viruses are called <em>infectious diseases<\/em> or <em>communicable diseases<\/em>.\nThese disease-causing organisms are also called <em><strong>pathogens<\/strong><\/em>. Our body has an internal environment suitable for\nmicrobial growth, thereby, making us prime targets for <em>infectious diseases<\/em>.<\/p>\n<h2 id=\"pathogens-or-infectious-agents\">Pathogens or Infectious Agents<a class=\"zola-anchor\" href=\"#pathogens-or-infectious-agents\" aria-label=\"Anchor link for: pathogens-or-infectious-agents\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>A pathogen is a disease-causing organism. Its goal is to invade, multiply, and overwhelm their host. The host may experience\nphysiological, behavioral, and even genetic changes which may lead to evident outside change or effects called symptoms. Some\npathogens do not exhibit symptoms for their hosts are so called <em>asymptomatic<\/em>. Pathogen types are of the following:<\/p>\n<ul>\n<li><a href=\"https:\/\/uncomfyhalomacro.pl\/lecture\/mc1-epidemiology\/#bacteria\">Bacteria<\/a><\/li>\n<li><a href=\"https:\/\/uncomfyhalomacro.pl\/lecture\/mc1-epidemiology\/#fungi\">Fungi<\/a><\/li>\n<li><a href=\"https:\/\/uncomfyhalomacro.pl\/lecture\/mc1-epidemiology\/#parasites\">Parasites<\/a><\/li>\n<li><a href=\"https:\/\/uncomfyhalomacro.pl\/lecture\/mc1-epidemiology\/#viruses\">Viruses<\/a><\/li>\n<\/ul>\n<h3 id=\"bacteria\">Bacteria<a class=\"zola-anchor\" href=\"#bacteria\" aria-label=\"Anchor link for: bacteria\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Bacteria (singular: bacterium) are microscopic pathogens that reproduce rapidly after entering the host.\nBacteria are usually harmless but when they multiply inside the body, they produce toxins that can cause\nillness. Not all bacteria are pathogenic. Some are essential within the human body such as <em>Lactobacillus\nreuteri<\/em> and even <em>Eschirichia coli<\/em>.<\/p>\n<h3 id=\"fungi\">Fungi<a class=\"zola-anchor\" href=\"#fungi\" aria-label=\"Anchor link for: fungi\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Fungal infections and diseases usually happen when the host's immune system is weakened e.g\nimmuno-supressed, immuno-compromised.<\/p>\n<p>Disease results when fungi accidentally penetrate host barriers or when immunologic defects or other\ndebilitating conditions exist that favor fungal entry and growth.<\/p>\n<h3 id=\"parasites\">Parasites<a class=\"zola-anchor\" href=\"#parasites\" aria-label=\"Anchor link for: parasites\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>A parasite is an organism that lives on or in a host organism and gets its food from or at the expense of\nits host. There are three main classes of parasites that can cause disease in humans: protozoa, helminths,\nand <em>ectoparasites<\/em>. The first two are considered to be <em>endoparasites<\/em> as they live inside their hosts.\n<em>Ectoparasites<\/em> live outside their hosts. Tapeworms are endoparasites; mosquitoes and fleas are\nectoparasites.<\/p>\n<h3 id=\"viruses\">Viruses<a class=\"zola-anchor\" href=\"#viruses\" aria-label=\"Anchor link for: viruses\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>A virus is an infectious particle that multiples only inside their host's cells. They are contagious and\ncan spread fast. Viruses themselves are not alive in a sense since they do not contain the necessary\nmachinery and characteristic for which we define life as \"alive\". The COVID-19 pandemic is caused\nby a coronavirus called as <strong>SARS-CoV-2<\/strong>.<\/p>\n<h2 id=\"mode-of-transmission\">Mode of Transmission<a class=\"zola-anchor\" href=\"#mode-of-transmission\" aria-label=\"Anchor link for: mode-of-transmission\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>There are many ways of how disease spreads.<\/p>\n<ul>\n<li><strong>Direct Contact<\/strong>. Pathogens spread through direct contact from an infected host e.g. kissing, sexual\nintercourse, coughing (as <strong>droplet transmission<\/strong>).<\/li>\n<li><strong>Indirect Contact<\/strong>.\n<ul>\n<li><strong>Fomites<\/strong>. Pathogens that live longer on surfaces can still infect new susceptible hosts e.g.\ndoor knobs, garbage cans, smartphone screens<\/li>\n<li><strong>Vectors<\/strong>. Some pathogens live inside other organisms that target their hosts as well e.g. mosquitoes\n, ticks and mites.<\/li>\n<li><strong>Airborne\/Aerosol transmission<\/strong>. Some infectious agents stay in the air (as aerosols) for long periods of time to infect new hosts.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr \/>\n<h3 id=\"disease-vectors\">Disease Vectors<a class=\"zola-anchor\" href=\"#disease-vectors\" aria-label=\"Anchor link for: disease-vectors\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>A disease <strong>vector<\/strong> or just <strong>vector<\/strong> is an organism that spreads disease by infecting the\nhost organism as a <a href=\"https:\/\/uncomfyhalomacro.pl\/lecture\/mc1-epidemiology\/#parasites\">parasite<\/a> or spreading the pathogen through physical contact by picking up\nsmall infectious agents.<\/p>\n<p>Diseases transmitted by vectors are called <strong>vector-borne<\/strong> diseases. Many of these vector-borne disease\nare <em><strong>zoonotic diseases<\/strong><\/em> which are diseases that can be transmitted directly or indirectly between\nanimals and humans.<\/p>\n<p>Vectors are classified based on how they spread disease. In reality, some of these modes of transmission\nare in combination, and not just one mode. For instance, a <a href=\"https:\/\/uncomfyhalomacro.pl\/lecture\/mc1-epidemiology\/#biological-vectors\">biological vector<\/a> may\nalso spread the disease just through <em>physical contact<\/em> which is what a\n<a href=\"https:\/\/uncomfyhalomacro.pl\/lecture\/mc1-epidemiology\/#mechanical-vectors\">mechanical vector<\/a> would do. There is a distinction but they are not really\nset in stone.<\/p>\n<p>The problem with vector-borne diseases is that their transmission modes can spread through vast\ndistances. Even humans can be considered vectors as was seen on how COVID-19 spread with our existing\ntechnological marvels for travel e.g. aviation, seafaring, land vehicles.<\/p>\n<h4 id=\"biological-vectors\">Biological Vectors<a class=\"zola-anchor\" href=\"#biological-vectors\" aria-label=\"Anchor link for: biological-vectors\"\n  >\u00a7<\/a\n>\n<\/h4>\n<p>Biological vectors are organisms carrying pathogens within their bodies where these pathogens reside\nand multiply. Mosquitoes, ticks and mammals infected with rabies are examples of biological vectors.<\/p>\n<h4 id=\"mechanical-vectors\">Mechanical Vectors<a class=\"zola-anchor\" href=\"#mechanical-vectors\" aria-label=\"Anchor link for: mechanical-vectors\"\n  >\u00a7<\/a\n>\n<\/h4>\n<p>These are vectors that spread disease through physical contact. Flies may spread infectious agents from\ntheir surroundings to unsuspecting hosts by salivating on food, shedding skin or touching the host.<\/p>\n<h3 id=\"portals-of-entry-and-exit\">Portals of Entry and Exit<a class=\"zola-anchor\" href=\"#portals-of-entry-and-exit\" aria-label=\"Anchor link for: portals-of-entry-and-exit\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>The portal of entry refers to the manner in which a pathogen enters a susceptible host. The portal of entry\nmust provide access to tissues in which the pathogen can multiply or a toxin can act. Often, infectious\nagents use the same portal to enter a new host that they used to exit the source host.<\/p>\n<hr \/>\n<h2 id=\"host-pathogen-cycle\">Host-Pathogen Cycle<a class=\"zola-anchor\" href=\"#host-pathogen-cycle\" aria-label=\"Anchor link for: host-pathogen-cycle\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>This cycle is a simplified description of how pathogens infect their host.<\/p>\n<h3 id=\"transmission\">Transmission<a class=\"zola-anchor\" href=\"#transmission\" aria-label=\"Anchor link for: transmission\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Pathogens can be transmitted from person to person through various routes, such as direct contact (touching, kissing, sexual contact),\nindirect contact (contaminated objects, water, food), or airborne transmission (through respiratory droplets).<\/p>\n<h3 id=\"colonization\">Colonization<a class=\"zola-anchor\" href=\"#colonization\" aria-label=\"Anchor link for: colonization\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Once a pathogen enters the host's body, it must attach to and colonize the host's tissues. Some pathogens can survive in the host's environment\nwithout causing disease, while others require specific conditions to colonize.<\/p>\n<h3 id=\"invasion\">Invasion<a class=\"zola-anchor\" href=\"#invasion\" aria-label=\"Anchor link for: invasion\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>After colonization, the pathogen can invade host cells and tissues, causing damage and triggering an immune response. Pathogens may produce toxins\nthat damage host tissues and organs or cause inflammation, leading to symptoms such as fever, pain, and swelling.<\/p>\n<h3 id=\"replication\">Replication<a class=\"zola-anchor\" href=\"#replication\" aria-label=\"Anchor link for: replication\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Pathogens can replicate inside host cells, producing more infectious particles that can spread to other parts of the body or be transmitted to other individuals. The host's immune system responds to the pathogen by producing antibodies and other immune\ncells to fight off the infection. The pathogen may evolve to evade the host's immune defenses, leading to chronic infections or recurring episodes of disease.<\/p>\n<h2 id=\"the-pathogen-disease-progression\">The Pathogen-Disease Progression<a class=\"zola-anchor\" href=\"#the-pathogen-disease-progression\" aria-label=\"Anchor link for: the-pathogen-disease-progression\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>This section explains what a pathogen does once it infects the host.<\/p>\n<h3 id=\"incubation-stage\">Incubation stage<a class=\"zola-anchor\" href=\"#incubation-stage\" aria-label=\"Anchor link for: incubation-stage\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>During this stage, the pathogen enters the host's body and begins to multiply. The host does not yet show any signs or symptoms\nof the disease. The length of the incubation period can vary depending on the type of pathogen and the host's immune system<\/p>\n<h3 id=\"prodromal-stage\">Prodromal stage<a class=\"zola-anchor\" href=\"#prodromal-stage\" aria-label=\"Anchor link for: prodromal-stage\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>During this stage, the host begins to experience mild symptoms, such as fatigue, headache, or fever. These symptoms are not yet\nspecific to the disease, but they may indicate that the host's immune system is starting to respond to the pathogen<\/p>\n<h3 id=\"acute-stage\">Acute stage<a class=\"zola-anchor\" href=\"#acute-stage\" aria-label=\"Anchor link for: acute-stage\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>During this stage, the disease reaches its full intensity and the host experiences the characteristic symptoms of the disease.\nThe pathogen has replicated and spread throughout the host's body, causing damage to tissues and organs. This is the stage when\nthe disease is most contagious and can spread to other individuals<\/p>\n<h3 id=\"convalescent-stage\">Convalescent stage<a class=\"zola-anchor\" href=\"#convalescent-stage\" aria-label=\"Anchor link for: convalescent-stage\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>During this stage, the host begins to recover from the disease. Symptoms gradually disappear, and the host's immune system fights\noff the remaining pathogen. In some cases, the pathogen may remain dormant in the host's body and cause a relapse of the disease at a later time.<\/p>\n<h1 id=\"some-factors-that-increase-chances-of-disease-spread\">Some Factors that Increase Chances of Disease Spread<a class=\"zola-anchor\" href=\"#some-factors-that-increase-chances-of-disease-spread\" aria-label=\"Anchor link for: some-factors-that-increase-chances-of-disease-spread\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Outside factors have an important role in increasing the chances of disease spread. These include the\nenvironment such as a hospital setting, or societal problems such as overpopulation. Here are the\nmajor factors that increase chances of disease spread.<\/p>\n<h2 id=\"antimicrobial-resistance\">Antimicrobial Resistance<a class=\"zola-anchor\" href=\"#antimicrobial-resistance\" aria-label=\"Anchor link for: antimicrobial-resistance\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>The dependence on antimicrobial drugs have increased drastically within a span of five decades since the\ninception of penecillin. This is a growing problem because microorganisms can adapt faster to these\ndrugs and become resistant to it. The concern for <em><strong>superbugs<\/strong><\/em> emerging from this day and age is a\nthreat to medical care and drug manufacturers.<\/p>\n<p>Mitigations exist by focusing on improving the host's immune system's response to infections rather than\nattacking pathogens through chemical warfare. Soaps and other productsfor various purposes are now required\nto not put antimicrobial components into their products as they may increase the chances of emerging\nantimicrobial resistant microorganisms.<\/p>\n<h2 id=\"overpopulation\">Overpopulation<a class=\"zola-anchor\" href=\"#overpopulation\" aria-label=\"Anchor link for: overpopulation\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>As the human population around the world is growing at an exponential pace, the chances of infecting\nthousands and millions of individuals from various pathogens have increased as well. Not only that,\nbut some pathogens have more time to evolve within subsets of populations and may become a threat\nin the future.<\/p>\n<h2 id=\"habitat-destruction\">Habitat Destruction<a class=\"zola-anchor\" href=\"#habitat-destruction\" aria-label=\"Anchor link for: habitat-destruction\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>As we keep on destroying the environment for more space, we are stepping closer to unknown diseases that\nwhere never known to infect humans.<\/p>\n<h2 id=\"climate-change\">Climate Change<a class=\"zola-anchor\" href=\"#climate-change\" aria-label=\"Anchor link for: climate-change\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Same as above, but happens globally. Climate change introduces changes as well on new vectors of diseases\nthat are normally seen in the wild. As we invade more and more and change the global biosphere, we are\nin for ourselves for a questionable future in health and emerging diseases.<\/p>\n<hr \/>\n<h1 id=\"review\">Review<a class=\"zola-anchor\" href=\"#review\" aria-label=\"Anchor link for: review\"\n  >\u00a7<\/a\n>\n<\/h1>\n<ol>\n<li>Cite an example for why it's important to remove antimicrobial components on skin products.<\/li>\n<li>Some bacteria are normally non-pathogenic. Explain how some of these bacteria become pathogenic\nthrough <em><strong>horizontal gene transfer<\/strong><\/em>.<\/li>\n<li>How do diseases spread? Cite an example for each mode of transmission.<\/li>\n<li>What is the study of disease dynamics?<\/li>\n<li>Why are vaccinations important? Why is acquired immunity not enough?<\/li>\n<li>Why are basic concepts of immunity flawed in our course? What is the reality about acquired immunity and vaccinations?<\/li>\n<\/ol>\n<h1 id=\"list-of-terms-and-definitions\">List of terms and definitions<a class=\"zola-anchor\" href=\"#list-of-terms-and-definitions\" aria-label=\"Anchor link for: list-of-terms-and-definitions\"\n  >\u00a7<\/a\n>\n<\/h1>\n<ul>\n<li><strong>epidemiology<\/strong>. a study of the distribution of health and disease in a population.<\/li>\n<li><strong>pandemic<\/strong>. a worldwide uncontrollable spread of a disease.<\/li>\n<li><strong>endemic<\/strong>. a disease that is not a threat but is consistently present.<\/li>\n<li><strong>epidemic<\/strong>. an uncontrollable spread of a disease in a particular region. it may evolve into a pandemic.<\/li>\n<li><strong>patient zero<\/strong>. the first contact of infection of a disease. may be known or unknown.<\/li>\n<li><strong>shedding<\/strong>. a shedding of infectious particles from the host to the outside environment. it increases chance\nof infecting new hosts.<\/li>\n<li><strong>reinfection<\/strong>. self-explanatory.<\/li>\n<li><strong>susceptible<\/strong>. healthy hosts that are yet to be infected.<\/li>\n<li><strong>infection<\/strong>. a host that is now invaded by pathogens.\n<ul>\n<li><strong>viral infection<\/strong>. caused by a virus.<\/li>\n<li><strong>fungal infection<\/strong>. caused by a fungus.<\/li>\n<li><strong>parasitic infection<\/strong>. usually refers to worms or large parasites.<\/li>\n<li><strong>bacterial infection<\/strong>. caused by bacteria.<\/li>\n<\/ul>\n<\/li>\n<li><strong>pathogen<\/strong>. a particle or organism that causes disease. <em>also called <strong>infectious agents<\/strong><\/em>.<\/li>\n<li><strong>antimicrobial resistance<\/strong>. microorganisms that are resistant to antimicrobial treatments or drugs.<\/li>\n<li><strong>superbug<\/strong>. a microorganism that is considered to be a threat because of its high resistance in various antimicrobial drugs.<\/li>\n<li><strong>\"flatten the curve\"<\/strong>. a phrase used by epidemiologists\nand healthcare professionals to describe a slow and\/or low rate of infection.<\/li>\n<li><strong>microbiota<\/strong>. refers to the microbial ecosystem within the human body.<\/li>\n<li><strong>COVID-19<\/strong>. the disease caused by the SARS-CoV-2 coronavirus.<\/li>\n<li><em><strong>Enterohemorrhagic Escherichia coli<\/strong><\/em>. a strain of <em>E. coli<\/em> that can cause internal bleeding in the gut.<\/li>\n<li><strong>AIDS<\/strong>. caused by the Human Immunodeficiency Virus or <strong>HIV<\/strong>.<\/li>\n<li><strong>strain<\/strong>. a species of a microorganism that may have different traits and characteristics than the others of the same species.<\/li>\n<li><strong>variant<\/strong>. not to be confused with strains. this focuses on the genetic code of the pathogen. variants may exhibit different physical properties called <strong>strains<\/strong>.<\/li>\n<li><strong>fomites<\/strong>. infectious agents that are attached to surfaces that may still infect hosts through physical\ncontact.<\/li>\n<li><strong>contamination<\/strong>. unintentional introduction of microorganisms of another species, strain, or variant in pure culture.<\/li>\n<li><strong>antiviral<\/strong>. drugs that help you fight against viral pathogens. can also be preventative e.g. vaccines<\/li>\n<li><strong>antibacterial<\/strong>. drugs that help you fight against bacterial pathogens.<\/li>\n<li><strong>antimycotic<\/strong>. drugs that help you fight against fungal pathogens.<\/li>\n<li><strong>chronic disease<\/strong>. diseases caused by host lifestyle e.g. obesity, heavy smoking<\/li>\n<li><strong>infectious disease<\/strong>. diseases caused by pathogens.<\/li>\n<li><strong>non-pathogenic<\/strong>. describes a microorganism that is not harmful.<\/li>\n<li><strong>disease<\/strong>. describes a disorder of the structure or function in a host. can be caused by lifestyle or pathogen infection.<\/li>\n<li><strong>symptoms<\/strong>. a visual manifestation of the disease e.g. coughing, rashes.<\/li>\n<li><strong>asymptomatic<\/strong>. no visible manifestation of an infection or disease from the host.<\/li>\n<li><strong>herd immunity<\/strong>. a large number of the population becomes immune to a disease acting as a barrier to prevent further infection.<\/li>\n<li><strong>vaccine<\/strong>. a substance that is used to give immunity. it may vary in formualation e.g. viral components,\nweakened live virus, fragments of antigens, or genetic material. comes from the French and Latin word\n\"vacca\" from the virus of cowpox which they call <em>vaccinia<\/em>.<\/li>\n<li><strong>novel pathogen<\/strong>. used to denote a pathogen that was never before seen or just have been observed in\nmedical literature e.g. <em>novel virus<\/em>, <em>novel bacteria<\/em>. The COVID-19 was caused by a novel coronavirus for example.<\/li>\n<li><strong>zoonosis<\/strong>. transfer of pathogens between host animal species e.g. birds to pigs to humans.<\/li>\n<li><strong>spillover<\/strong>. same as above. however, it describes more of an evolution of the disease to break host barriers infecting new kinds of hosts. also called as <strong>zoonotic spillover<\/strong>.<\/li>\n<li><strong>acquired immunity<\/strong>. immunity acquired after a recovery from an infection. reinfection is less likely.<\/li>\n<li><strong>droplets<\/strong>. pathogen-containing fluid droplets. usually aerosolized through coughing or sneezing.<\/li>\n<\/ul>\n"},{"title":"Time is a limited resource","published":"2023-05-21T00:00:00+00:00","updated":"2023-05-21T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/15\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/15\/","content":"<h1 id=\"disclaimer\">Disclaimer<a class=\"zola-anchor\" href=\"#disclaimer\" aria-label=\"Anchor link for: disclaimer\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>This topic is not encouraging you to be depressed. This topic is a realization I have while browsing\nmy phone's photo gallery and some memories during my childhood. If this is not for you and you\nneed help, please ask for help and not from me.<\/p>\n<h1 id=\"there-is-one-inevitable-thing\">There is one inevitable thing<a class=\"zola-anchor\" href=\"#there-is-one-inevitable-thing\" aria-label=\"Anchor link for: there-is-one-inevitable-thing\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Every day, we eat three (or more meals), take a bath, socialize with someone, play games,\nsolve problems, make a breakthrough, and then finally we sleep.<\/p>\n<p>These are very basic things to do, probably programmed in our biology for us to reproduce new offspring\nbecause staying alive is an instinct.<\/p>\n<p>We call ourselves sentient and intelligent beings who harnessed the power of science that is manifested\ninto what we call technology. However, we are not immune to the one thing we always forget or\nsubconsciously ignore until the day we experience our last breath - <em><strong>time<\/strong><\/em>.<\/p>\n<h1 id=\"we-all-know-what-time-is\">We all know what time is<a class=\"zola-anchor\" href=\"#we-all-know-what-time-is\" aria-label=\"Anchor link for: we-all-know-what-time-is\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>We just don't realize how scarce it is. I am talking about this because I am already 23 years old as of\nwriting this post. And I feel kind of depressed when I remind myself how fleeting life is. I think every\none of us has this kind of realization that we are not getting any younger at all. I think my biggest\nregret is realizing it too late maybe...<\/p>\n<h1 id=\"do-what-you-can-while-you-can\">Do what you can, while you can<a class=\"zola-anchor\" href=\"#do-what-you-can-while-you-can\" aria-label=\"Anchor link for: do-what-you-can-while-you-can\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Spreading some evidence of our existence is a beautiful, desperate and sad thing to do while living our lives. Be it\npictures, a vlog, a blog post like this one, or sharing memes on Facebook; we always try to at least cement some\nthings from ourselves.<\/p>\n<p>However, while we have our own opinions about social media, the truth is popular social media nowadays take advantage\nof the limited time we have and create a form of addiction. We know subconsciously how we are just a small insignificant speck\nwe are in the world or in the universe. Hence, why I abhor popular social media such as Facebook\nor Twitter. That is for another topic that I may not write since there are too many posts about it now.<\/p>\n<p>The point is, instead of focusing or chasing for clout or the next big post, I would like us to focus\non what matters, who matters, and why it matters.<\/p>\n<blockquote>\n<p>Not doing what you can, while you can hits hard once time is running out.<\/p>\n<\/blockquote>\n<h2 id=\"what-matters\">What matters<a class=\"zola-anchor\" href=\"#what-matters\" aria-label=\"Anchor link for: what-matters\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Hard work matters. Learning matters. You matter. One thing I noticed about people today or even myself\nis how forgetful we are for things that actually matter. If you want to learn something, learn it,\nbecause not learning it may turn into regret that you may not escape thinking.<\/p>\n<p>I dislike the idea of Nihilism or Hedonism because it's a self-destructive philosophy to just not care about\nthings (or someone). Even to yourself.<\/p>\n<p>As much as I like to ponder more of \"what matters\", it's up to you... But I believe, keeping your health in\ncheck and taking risks while working hard,  and learning hard to achieve your goals in life really matters.<\/p>\n<h2 id=\"who-matters\">Who matters<a class=\"zola-anchor\" href=\"#who-matters\" aria-label=\"Anchor link for: who-matters\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Value people. The problem with popular social media today is its effects on healthy social dynamics.\nA false ideal on what we expect between relationships with friends, family, and our partners is one thing.<\/p>\n<p>Assuming you are friends or you know much about an idol, a streamer, or an actress - <em>what we call \"parasocial\"\nrelationships<\/em> - is getting out of hand. We value the superficial instead of those who are honest, and real to\nus.<\/p>\n<p>We should value the people who were with us during our struggles, who hurt us for our own good and improvement\nand who love us despite of our flaws.<\/p>\n<blockquote>\n<p>Because saying \"I love you\" hurts more when it starts to flicker.<\/p>\n<\/blockquote>\n<h2 id=\"why-it-matters\">Why \"it\" matters<a class=\"zola-anchor\" href=\"#why-it-matters\" aria-label=\"Anchor link for: why-it-matters\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Because <strong>life is fleeting<\/strong> and we only have <strong>one life<\/strong>. It's a sad truth we really cannot avoid\nbecause the continuous chemical reactions to keep us alive is finite. Time is a very scarce resource, it's\nquite ironic that <em>time itself is infinite but scarce for us<\/em>.<\/p>\n<h1 id=\"what-you-should-do\">What you should do<a class=\"zola-anchor\" href=\"#what-you-should-do\" aria-label=\"Anchor link for: what-you-should-do\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Spread your knowledge, wisdom and time with those that matter. Regret only happens when you keep thinking\nabout the past like things you didn't do but wanted to do.<\/p>\n<p>Love yourself more and share that love to others. Learn more and share your knowledge and wisdom. Ignore\nhate if you can, and appreciate what's important. Value your time, and value your life. Stay away from\ntoxicity and avoid becoming the toxicity.<\/p>\n<h1 id=\"have-good-life\">Have good life<a class=\"zola-anchor\" href=\"#have-good-life\" aria-label=\"Anchor link for: have-good-life\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I hope your day and night is fabulous. \ud83d\ude0a<\/p>\n"},{"title":"Setting up Julia LSP for Helix","published":"2023-05-19T00:00:00+00:00","updated":"2023-05-19T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/14\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/14\/","content":"<p>The <a rel=\"external\" href=\"https:\/\/julialang.org\">Julia<\/a> programming language is a popular general programming language where the\ncommunity leans more on scientific computing. And like most programming languages, Julia code\ncan be written on most text editors such as IDEs.<\/p>\n<p>Most editors today contain a set of tools such as git integration, built-in terminal, and a\nfile picker and finder. Some editors that I tried are of the following:<\/p>\n<ul>\n<li><a rel=\"external\" href=\"https:\/\/code.visualstudio.com\/\">Visual Studio Code<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/www.vim.org\/\">Vim<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/neovim.io\/\">Neovim<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/www.gnu.org\/software\/emacs\/\">Emacs<\/a><\/li>\n<\/ul>\n<h1 id=\"setting-up-julia-lsp-for-helix\">Setting up Julia LSP for Helix<a class=\"zola-anchor\" href=\"#setting-up-julia-lsp-for-helix\" aria-label=\"Anchor link for: setting-up-julia-lsp-for-helix\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p><a rel=\"external\" href=\"https:\/\/helix-editor.com\/\">Helix<\/a> is a new editor I daily drive since a year ago. It follows a different style of\nediting than Vim\/Neovim. It's model and keymaps are influenced from <a rel=\"external\" href=\"http:\/\/kakoune.org\/\">Kakoune<\/a> which\nfollows a select-action-execute model unlike the usual Vim action-select-execute model. I've been\nliking it so far!<\/p>\n<p>As this post is about setting up LSP for <a rel=\"external\" href=\"https:\/\/helix-editor.com\/\">Helix<\/a>, setting up LSPs on other editors are\npretty straight-forward e.g. Julia plugin on VSCode.<\/p>\n<p>With helix, you have to write a simple configuration, specifically at <code>languages.toml<\/code>.<\/p>\n<h2 id=\"writing-the-julia-lsp-script-for-the-lsp\">Writing the Julia LSP script for the LSP<a class=\"zola-anchor\" href=\"#writing-the-julia-lsp-script-for-the-lsp\" aria-label=\"Anchor link for: writing-the-julia-lsp-script-for-the-lsp\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>As helix does not have the option to pass the value of the current working directory of the file or buffer\n(maybe I am wrong, do correct me though!) unlike neovim's <code>%:p:h<\/code>, our script is like so:<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"julia\"><span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">import<\/span><span> Pkg<\/span><\/span>\n<span class=\"giallo-l\"><span>project_path <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#9D0006, #FB4934);\"> let<\/span><\/span>\n<span class=\"giallo-l\"><span>    dirname<\/span><span>(<\/span><span>something<\/span><span>(<\/span><\/span>\n<span class=\"giallo-l\"><span>        Base<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>load_path_expand<\/span><span>(<\/span><span>(<\/span><\/span>\n<span class=\"giallo-l\"><span>            p <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span> get<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">ENV<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">JULIA_PROJECT<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> nothing<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span>            isnothing<\/span><span>(<\/span><span>p<\/span><span>)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> ?<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> nothing<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> :<\/span><span> isempty<\/span><span>(<\/span><span>p<\/span><span>)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> ?<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> nothing<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> :<\/span><span> p<\/span><\/span>\n<span class=\"giallo-l\"><span>        )<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span>        Base<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>current_project<\/span><span>(<\/span><span>pwd<\/span><span>(<\/span><span>)<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span>        Pkg<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>Types<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>Context<\/span><span>(<\/span><span>)<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>env<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>project_file<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span>        Base<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>active_project<\/span><span>(<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span>    )<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">end<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>ls_install_path <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span> joinpath<\/span><span>(<\/span><span>get<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">DEPOT_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 1<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> joinpath<\/span><span>(<\/span><span>homedir<\/span><span>(<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.julia<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">environments<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">helix-lsp<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span>pushfirst!<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">LOAD_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> ls_install_path<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">using<\/span><span> LanguageServer<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span>popfirst!<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">LOAD_PATH<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">;<\/span><\/span>\n<span class=\"giallo-l\"><span>depot_path <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span> get<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">ENV<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">JULIA_DEPOT_PATH<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span>symbol_server_path <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span> joinpath<\/span><span>(<\/span><span>homedir<\/span><span>(<\/span><span>)<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">.cache<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">helix<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">julia_lsp_symbol_server<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span>mkpath<\/span><span>(<\/span><span>symbol_server_path<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span>server <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span> LanguageServer<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>LanguageServerInstance<\/span><span>(<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">stdin<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> stdout<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> project_path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> depot_path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> nothing<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span> symbol_server_path<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><span>server<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>runlinter <\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">=<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span>run<\/span><span>(<\/span><span>server<\/span><span>)<\/span><\/span><\/code><\/pre>\n<p>To understand what it's doing, the main focus of this script is actually the <code>project_path<\/code> variable. We first\ncheck if there is a <code>JULIA_PROJECT<\/code> environmental variable, explicitly set by the user. <code>Base.load_path_expand<\/code>\nachieves this. If there is none or if it is empty e.g. empty string, return <code>nothing<\/code>.<\/p>\n<p>If the previous returns <code>nothing<\/code>, we use the <code>Base.current_project(pwd())<\/code>. And if it does not detect\na <code>Project.toml<\/code> file from the current directory, we will fallback to <code>Pkg.Types.Context().env.project_file<\/code>\nand <code>Base.active_project()<\/code>.<\/p>\n<p>The <code>project_path<\/code> variable is very important as this will help us check which project you are in and\nwhere to run the LSP.<\/p>\n<p>Julia's LSP is provided by <a rel=\"external\" href=\"https:\/\/github.com\/julia-vscode\/LanguageServer.jl\">LanguageServer.jl<\/a>. But\nI don't like installing it on the global environment, hence, we have the <code>ls_install_path<\/code> variable.\nThis <code>ls_install_path<\/code> variable assumes that you have installed the language server on one of the many <code>DEPOT_PATH<\/code>.\nHere, I assumed it has to be at <code>~\/.julia\/environments\/helix-lsp<\/code>. We need this variable because we need to\nadd that path to the <code>LOAD_PATH<\/code>. You can check what <code>LOAD_PATH<\/code> is in the Julia REPL. Basically, it's just an\narray of paths where we load our environment for <code>using<\/code> and <code>import<\/code> statements. By default, it has a path\nto the global environment. This is why I have to add the <code>popfirst!<\/code> function since I don't want to use that one.<\/p>\n<p><code>depot_path<\/code> and <code>symbol_server_path<\/code> are optional but I like to make sure that <code>JULIA_DEPOT_PATH<\/code> exists.<\/p>\n<p>Lastly, we then initialize the <code>server<\/code> by setting the <code>LanguageServerInstance<\/code> and setting the linter to <code>true<\/code>. We\nthen run the <code>run<\/code> function with the <code>server<\/code>.<\/p>\n<h2 id=\"adding-it-to-language-toml\">Adding it to <code>language.toml<\/code><a class=\"zola-anchor\" href=\"#adding-it-to-language-toml\" aria-label=\"Anchor link for: adding-it-to-language-toml\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Once we are done, we can finally either add it to a script file that can be executed within your <code>PATH<\/code> or just plain\nexecute it like <code>julia --project=@helix-lsp path\/to\/scriptfile.jl<\/code>.<\/p>\n<p>Here is a sample:<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"toml\"><span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">[[<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\">language<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">julia<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">scope<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">source.julia<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">injection-regex<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">julia<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">file-types<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">jl<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">roots<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Project.toml<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Manifest.toml<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">JuliaProject.toml<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">]<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">comment-token<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">#<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">language-server<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> command<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">julia<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> args<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> [<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">--project=@helix-lsp<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">--sysimage=\/home\/uncomfy\/.julia\/environments\/helix-lsp\/languageserver.so<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">--startup-file=no<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">--history-file=no<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">--quiet<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">--sysimage-native-code=yes<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">\/home\/uncomfy\/.local\/bin\/julia-lsp.jl<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#7C6F64, #A89984);\">    ]<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#076678, #83A598);\">indent<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> {<\/span><span style=\"color: light-dark(#076678, #83A598);\"> tab-width<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\"> 4<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">,<\/span><span style=\"color: light-dark(#076678, #83A598);\"> unit<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">    &quot;<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> }<\/span><\/span><\/code><\/pre>\n<p>It is up to you if you want to use PackageCompiler.jl to create a sysimage and make the LSP faster. Fortunately,\nyou don't really need it since version 1.9.0 is very fast now.<\/p>\n<h1 id=\"there-is-runserver-why-not-use-that\">There is <code>runserver<\/code>, why not use that?<a class=\"zola-anchor\" href=\"#there-is-runserver-why-not-use-that\" aria-label=\"Anchor link for: there-is-runserver-why-not-use-that\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>There are some gotchas with using <code>runserver<\/code>. If I can recall correctly, my issue was it cannot detect the correct paths\ninside <code>helix<\/code> and my script for neovim and kakoune is to detect where the file is located and if the location contains <code>Project.toml<\/code> or <code>Manifest.toml<\/code>\nand set it as the <code>env_path<\/code>. This can be seen with my <a rel=\"external\" href=\"https:\/\/github.com\/kak-lsp\/kak-lsp\">kak-lsp<\/a> julia config at line <a rel=\"external\" href=\"https:\/\/github.com\/kak-lsp\/kak-lsp\/blob\/52197dde1a1c5e997a3ad989a8dfdd8017056a3b\/kak-lsp.toml#L168-L170\">168-170<\/a>\non the default <code>kak-lsp.toml<\/code><\/p>\n<p>As you may noticed, it's not in the script we have discussed before this section. So I probably must have forgotten why\nI wrote that script only to end up that there is no way to check the path to the buffer or file. <strong>Therefore, I recommend to run helix within the root\nof your Julia project<\/strong>.<\/p>\n<p>Let me know if you are not experiencing any issues with <code>runserver<\/code> since someone suggested that it works\nperfectly fine now. See <a rel=\"external\" href=\"https:\/\/github.com\/helix-editor\/helix\/issues\/669#issuecomment-1207489723\">https:\/\/github.com\/helix-editor\/helix\/issues\/669#issuecomment-1207489723<\/a><\/p>\n"},{"title":"Juliaup is the next generation version manager for Julia","published":"2023-05-16T00:00:00+00:00","updated":"2023-05-16T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/11\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/11\/","content":"<p>The <a rel=\"external\" href=\"https:\/\/julialang.org\">Julia<\/a> programming language has gained more improvements over the years. The latest\nversion as of writing is 1.9.0 - one of the biggest improvements of Julia in the 1.x series. Hoping more to come!<\/p>\n<h1 id=\"what-is-juliaup\">What is Juliaup?<a class=\"zola-anchor\" href=\"#what-is-juliaup\" aria-label=\"Anchor link for: what-is-juliaup\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p><code>juliaup<\/code> is a version manager for Julia much like <code>pyenv<\/code> or <code>rbenv<\/code>. It's functionality closely aligns with <code>rustup<\/code>.<\/p>\n<p>If you want to know more, check out their github repository at <a rel=\"external\" href=\"https:\/\/github.com\/JuliaLang\/juliaup\">https:\/\/github.com\/JuliaLang\/juliaup<\/a>.<\/p>\n<h1 id=\"why-should-you-use-juliaup\">Why should you use Juliaup?<a class=\"zola-anchor\" href=\"#why-should-you-use-juliaup\" aria-label=\"Anchor link for: why-should-you-use-juliaup\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>The usual way of downloading release binaries at the official website is not really much of a hassle. However,\ndownloading different versions of Julia can take more time to browse around.<\/p>\n<p>There are two version managers for Julia: <a rel=\"external\" href=\"https:\/\/github.com\/johnnychen94\/jill.py\">jill.py<\/a> and <a rel=\"external\" href=\"https:\/\/github.com\/JuliaLang\/juliaup\">juliaup<\/a>.<\/p>\n<p>As you may have noticed, <code>jill.py<\/code> is a python script that installs Julia and <code>juliaup<\/code> is written in Rust. I cannot compare\ntheir differences as I never tried the former. I suggest you try either one of them.<\/p>\n<p>Installing a Julia release channel in <code>juliaup<\/code> is quite easy. To check available channels, you run <code>juliaup list<\/code>. To add a channel, say 1.5.0,\nyou run <code>juilaup add 1.5.1<\/code>. To make a channel the default, you run <code>juliaup default 1.5.0<\/code>.<\/p>\n<p>For me, you should use <code>juliaup<\/code> since it includes features such as the ability to run a version (as long as it is added)\nusing their own Julia caller called <code>julialauncher<\/code>. You can symlink or alias that as <code>julia<\/code>. For example, if you want to run version 1.6.0,\nyou can do so by running <code>julialauncher +1.6.0<\/code> or <code>julia +1.6.0<\/code>.<\/p>\n<p>There is plan in the future releases to make a duplicate launcher of <code>julialauncher<\/code> that is called <code>julia<\/code>. I do believe\nit will just add more confusion though. I just symlink it instead. But that is because <code>juliaup<\/code> has not been hosted\nyet on <a rel=\"external\" href=\"https:\/\/crates.io\">crates.io<\/a>. See issue <a rel=\"external\" href=\"https:\/\/github.com\/JuliaLang\/juliaup\/pull\/639\">#639<\/a>.<\/p>\n<h1 id=\"anything-to-improve\">Anything to improve?<a class=\"zola-anchor\" href=\"#anything-to-improve\" aria-label=\"Anchor link for: anything-to-improve\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I think a feature I want to have in <code>juliaup<\/code> is this one - <a rel=\"external\" href=\"https:\/\/github.com\/JuliaLang\/juliaup\/issues\/10\">https:\/\/github.com\/JuliaLang\/juliaup\/issues\/10<\/a>.\nI do think that the idea of having <code>juliaup.toml<\/code> in the root directory of a project is convenient. Rust does that with <code>rust-toolchain.toml<\/code>. But again,\nit is up to debate because there were some issues of maybe duplicating the functionality of <code>Project.toml<\/code> and <code>Manifest.toml<\/code> and selecting the version\ninside those two configuration files mitigates that issue rather than using <code>juliaup.toml<\/code>. The workaround for now is to use\nthe <code>JULIAUP_CHANNEL<\/code> environmental variable with <code>direnv<\/code> or whatever env \"manipulation\" tool you use.<\/p>\n<p>Again, if you want to explore <code>juliaup<\/code>, you can do so by checking first the repository at <a rel=\"external\" href=\"https:\/\/github.com\/JuliaLang\/juliaup\">https:\/\/github.com\/JuliaLang\/juliaup<\/a>.<\/p>\n<p>If you use <a rel=\"external\" href=\"https:\/\/get.opensuse.org\">openSUSE<\/a>, just run <code>sudo zypper in juliaup<\/code> and you are good to go.<\/p>\n"},{"title":"How should you choose a distro?","published":"2023-05-12T00:00:00+00:00","updated":"2023-05-12T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/12\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/12\/","content":"<p>Ever thought of what linux distribution to choose? You are not alone.<\/p>\n<p>Linux (or GNU\/Linux for the pedant \ud83d\ude1b) has at least hundreds of different existing distributions. This\ngives users many distributions to choose from and the freedom to use their distribution of choice. This\nincludes the popular distros such as Fedora, Ubuntu, openSUSE, and Linux Mint and the most obscure such\nas Carbs Linux, Clear Linux, and some Arch derivative you never heard of before.<\/p>\n<p>However, this can also be confusing to newcomers (or even old users) alike because your distro of choice\ncan really matter when it comes to community support, maintenance, and also the life of the distribution\nbefore it f itself out of existence. This means that choosing the wrong distribution can result to\nunintended consequences for you as a user for areas in e.g. security, community, and support.<\/p>\n<p>This <em><strong>nearly<\/strong><\/em> happened with <a rel=\"external\" href=\"https:\/\/getsol.us\/\">Solus<\/a> btw. The two posts summarizes what happened:<\/p>\n<ul>\n<li><a rel=\"external\" href=\"https:\/\/www.reddit.com\/r\/SolusProject\/comments\/ssps5j\/i_no_longer_feel_safe_using_solus\/\">https:\/\/www.reddit.com\/r\/SolusProject\/comments\/ssps5j\/i_no_longer_feel_safe_using_solus\/<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/getsol.us\/2023\/04\/18\/a-new-voyage\/\">A New Voyage - Solus Project<\/a><\/li>\n<\/ul>\n<p>Good thing it's back \ud83d\ude04. I don't use Solus though. But what can we learn from this btw as a user? And how\ndoes this affect our decision to choose a distribution? Is choosing a distribution really matter?<\/p>\n<p>Unfortunately, the short answer is <em><strong>yes<\/strong><\/em>. You can skip btw but if you want to read more I have some\nimportant points to take why this is so.<\/p>\n<h1 id=\"your-distribution-of-choice-really-matters\">Your distribution of choice really matters<a class=\"zola-anchor\" href=\"#your-distribution-of-choice-really-matters\" aria-label=\"Anchor link for: your-distribution-of-choice-really-matters\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>It's painfully obvious that your distro of choice really matters. There are many factors to consider\nwhen choosing a distro. Choosing the \"right\" distro for you is very subjective but here are the factors\nyou really need to consider:<\/p>\n<ul>\n<li><a href=\"https:\/\/uncomfyhalomacro.pl\/blog\/12\/#documentation-and-wiki\">Documentation and Wiki<\/a><\/li>\n<li><a href=\"https:\/\/uncomfyhalomacro.pl\/blog\/12\/#community\">Community<\/a><\/li>\n<li><a href=\"https:\/\/uncomfyhalomacro.pl\/blog\/12\/#software-availability\">Software Availability<\/a><\/li>\n<li><a href=\"https:\/\/uncomfyhalomacro.pl\/blog\/12\/#longevity\">Longevity<\/a><\/li>\n<\/ul>\n<h1 id=\"documentation-and-wiki\">Documentation and Wiki<a class=\"zola-anchor\" href=\"#documentation-and-wiki\" aria-label=\"Anchor link for: documentation-and-wiki\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Why is this first mentioned than the other sections? Because good documentation and a wiki can help both\nold and new users to hop over a distro. Badly written or no documentation at all can be a reason why\ncertain distros will never have any new users at all. Beginner-friendly distros are \"beginner friendly\"\nfor a reason. That's because they have good documentation on how to install, use, and maintain their\nsystem. Even hard-core \"do it yourself\" distros such as Arch or Gentoo are popular because they have\nan informative Wiki where anyone can contribute or improve existing information.<\/p>\n<p>A special mention for <a rel=\"external\" href=\"https:\/\/www.freebsd.org\/\">FreeBSD<\/a>, as it is one of my favorite non-linux\ndistribution with great <a rel=\"external\" href=\"https:\/\/docs.freebsd.org\/en\/\">documentation and manual<\/a>. Easy to understand and grasp.\nSadly, I really cannot daily drive it because some software work only on Linux. I do hope you try it out!<\/p>\n<h1 id=\"community\">Community<a class=\"zola-anchor\" href=\"#community\" aria-label=\"Anchor link for: community\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>What makes a Linux (or a BSD) distribution stay alive for years and years? What keeps it afloat? And what\nkeeps it thriving still in the future?<\/p>\n<p>It's actually the community behind your favorite distribution.<\/p>\n<p>Growing interest and usage of a distribution helps maintain motivation from both project contributors and\ncommunity members. However, incentives are actually needed to keep both the distribution and community thriving.\nThis is shown to be true to most <em>corporate<\/em> <strong>and<\/strong> <em>community<\/em> backed distributions such as Fedora (from RHEL),\nand openSUSE (from SUSE). With no incentives such as funding and through donations, it is really hard\nfor a community to stay alive, and again, this nearly happened to Solus.<\/p>\n<p>This is important as well in choosing your distribution because you are given the assurance to stick to that\ndistribution without worrying that it will someday become a dead project and a dead community.<\/p>\n<h1 id=\"software-availability\">Software Availability<a class=\"zola-anchor\" href=\"#software-availability\" aria-label=\"Anchor link for: software-availability\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>This is very self-explanatory really. Your distribution of choice may not have the software you use when you were\nin another distribution. This can be fixed by helping contribute to the distribution itself by volunteering to\npackage the software you usually use. I don't think there should be an issue about that but it is up to you\nif you have the time to do that. No one is forcing you to contribute. The idea of giving back should be encouraged\nthough.<\/p>\n<p>Fortunately, packaging formats such as <a rel=\"external\" href=\"https:\/\/flatpak.org\/\">flatpak<\/a> and <a rel=\"external\" href=\"https:\/\/snapcraft.io\">snap<\/a> bridge the\nissues with software availability. I definitely recommend flatpak over snaps though as flatpaks are <em>truly\nplatform-agnostic<\/em> unlike Canonical's snap \ud83e\udd2e. No to AppImage, I will write a blog about that soon.<\/p>\n<h1 id=\"longevity\">Longevity<a class=\"zola-anchor\" href=\"#longevity\" aria-label=\"Anchor link for: longevity\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>How long does a distribution last? New distributions are born nearly every year or so but the question remains. What\nkeeps a distribution's existence last for decades?<\/p>\n<p>The answer is very simple. Time and money. Unfortunately, free software is not actually free as you would like it to be.\nContributors and project maintainers alike need some form of incentive for them to keep a project alive. *They gotta eat\nand sleep too you know...<\/p>\n<p>Small time distributions rarely last a year or two before they become dead (insert another Arch-derivative meme here).\nThese kinds of distros rarely last because there are no incentives and additionally, they are usually hobby projects or\nprojects that only focus on a niche.<\/p>\n<p>Corporate-backed <strong>and<\/strong> community-backed distros are on the clear because they have the means and incentives to do so.\nIt is also why I always recommend distributions such as Fedora or openSUSE.<\/p>\n<h1 id=\"conclusion\">Conclusion<a class=\"zola-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Choosing a Linux distribution can be confusing. Sometimes joining the popular is the safest option to take. Other times, you\njust want to try obscure distros just to be different. To be honest, preference is preference. Whether you like pineapple\non pizza or not, it is up to you to choose a distro. However, ignoring the factors I mentioned to choose a distribution that\nyou want to use daily can affect your productivity and time. If you really want to try out a distribution and test it out,\nI suggest run it inside a container or virtual machine. Explore and hop around until the shoe fits \ud83d\ude00.<\/p>\n"},{"title":"Is Linux (as a desktop) normie friendly already?","published":"2023-04-27T00:00:00+00:00","updated":"2023-04-29T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/10\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/10\/","content":"<h1 id=\"disclaimer\">Disclaimer<a class=\"zola-anchor\" href=\"#disclaimer\" aria-label=\"Anchor link for: disclaimer\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I am not really a fan of fighting over which operating system people use, but I do hate\nArch elitists because most of them are morons.<\/p>\n<h1 id=\"my-introduction-to-linux\">My introduction to Linux<a class=\"zola-anchor\" href=\"#my-introduction-to-linux\" aria-label=\"Anchor link for: my-introduction-to-linux\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I became a linux user since the start of the COVID-19 pandemic because I need to have a working computer that\nworks with the slowest hardware which was a Lenovo IdeaPad with Intel i3 (two cores with SMTP) and 8GB RAM.\nI forgot the exact spec, but it was around there. But I think I am not like other first time users. Instead\nof going with Ubuntu as it is the most popular distro, I started with Debian stable. And yes, of course it has\noutdated packages which for me at that time was not relevant as I only need it for mundane tasks such as\nwriting documents and moving files around. After a few months, I distrohopped to Kubuntu, Xubuntu, Artix, Manjaro\nand on the New Year of 2021, I hopped to Arch and stayed there for 6 months. The reason I found myself in\nrolling release distros is that I want to have the latest bleeding edge software. However, the desktop\nexperience between different release models seems to be similar nor different. Because the fundamentals of a desktop\nis for it to be used as one with the most basic of software. However, I am not saying there are no flaws\nusing Linux as a desktop.<\/p>\n<h1 id=\"linux-as-a-desktop\">Linux as a desktop<a class=\"zola-anchor\" href=\"#linux-as-a-desktop\" aria-label=\"Anchor link for: linux-as-a-desktop\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Desktop Linux is not as popular. However, just because it's not as popular, it does not mean that it is not usable.\nDuring my first time using Debian and ignoring the fact that the installer menu is very dated, the desktop experience was alright and I have not experienced some funky\nthings except that the software there is always outdated in Debian stable. Given the simplicity of my use cases\nfor a desktop e.g. web browsing, writing documents, and moving files around, it seems using Linux as a desktop\nis not really a problem for me. But for those that want to use Photoshop, well tough luck, you are on your own\nas those proprietary software do not really support linux. But hey, if you have old hardware, Linux is your only\nchoice unless you want to try the BSDs.<\/p>\n<h2 id=\"okay-so-are-there-any-problems\">Okay, so are there any problems?<a class=\"zola-anchor\" href=\"#okay-so-are-there-any-problems\" aria-label=\"Anchor link for: okay-so-are-there-any-problems\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>No software is perfect nor any concept is ideal. Free and open source software is one and this affects desktop\nLinux adoption.<\/p>\n<h3 id=\"desktop-linux-is-dependent-on-the-desktop-environment\">Desktop Linux is dependent on the Desktop Environment<a class=\"zola-anchor\" href=\"#desktop-linux-is-dependent-on-the-desktop-environment\" aria-label=\"Anchor link for: desktop-linux-is-dependent-on-the-desktop-environment\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>I can't simply not emphasize this one.<\/p>\n<blockquote>\n<p>Your desktop environment in Linux can actually determine your overall\ndesktop Linux experience.<\/p>\n<\/blockquote>\n<p>A desktop environment in Linux is basically a set of desktop tools from related toolkits that create a full\ndesktop experience. Popular desktop environments include<\/p>\n<ul>\n<li>KDE Plasma. Based on the QT Toolkit.<\/li>\n<li>GNOME. Based on GTK Toolkit<\/li>\n<li>XFCE. Based on GTK as well.<\/li>\n<\/ul>\n<p>So why is this important? Because some users blame the distribution of Linux that they're using instead of\nthe desktop environment. And thus, they can be deceiving for newcomers because newcomers will think distro X is bad\nbecause distro Y has this, when they are actually just comparing GNOME over KDE Plasma.<\/p>\n<blockquote>\n<p>Having many choices is a double-edged sword, it's the same on desktop environments<\/p>\n<\/blockquote>\n<p>But it does not mean we should just keep it at that. We should educate newcomers that it's the desktop environment\nthey are looking and not the distribution. So instead of suggesting them to \"use Arch linux\" just for the superiority\ncomplex, suggest them KDE Plasma and tell them GNOME sucks because it does not have a system tray. *Pitch forks flying where?*<\/p>\n<p><strong>Another disclaimer<\/strong>: Just because I hate this part of GNOME, does not mean I hate GNOME as a whole. It's just a joke with added\nhint of <a rel=\"external\" href=\"https:\/\/linuxiac.com\/gnome-background-apps\">truth<\/a> \ud83d\ude1b<\/p>\n<p>So my take here is, use the desktop environment you are more familiar with and you find the most intuitive to use.<\/p>\n<h3 id=\"software-availability-can-be-brittle\">Software availability can be brittle<a class=\"zola-anchor\" href=\"#software-availability-can-be-brittle\" aria-label=\"Anchor link for: software-availability-can-be-brittle\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>One thing I like about Linux is the amount of software availability. Want an office suite? Use Libreoffice.\nWant an image editor? Use GIMP or Krita. And there is no end to it. I think this in my opinion is what makes\nLinux a good choice in using it as a desktop. However, although it's an advantage, remember that we are talking\nabout <em>free<\/em> software. And free software can be <em>brittle<\/em>.<\/p>\n<h4 id=\"the-problem-with-free-and-open-source-software\">The problem with free and open source software<a class=\"zola-anchor\" href=\"#the-problem-with-free-and-open-source-software\" aria-label=\"Anchor link for: the-problem-with-free-and-open-source-software\"\n  >\u00a7<\/a\n>\n<\/h4>\n<blockquote>\n<p>Freedom and free can be easily overly used and abused<\/p>\n<\/blockquote>\n<p>It can be. I appreciate the efforts that are put into these software. But I have my reasons for why being\nfree can be a problem.<\/p>\n<blockquote>\n<p>Software availability does not equate to software quality<\/p>\n<\/blockquote>\n<p>Yes. Just because it's available, it does not mean you get the quality you want like from proprietary software\nas well. Proprietary software can be low quality though. However, what I am saying is that, it is hard\nfor FOSS to achieve similar quality unless there are incentives.<\/p>\n<p>Money, is undoubtly, one of the driving force to keep FOSS alive through funding. I remembered reading\nan article stating that GNOME was close to dying because of the lack of funding.<\/p>\n<p>\"But you are a FOSS enthusiast right?\", I am and hear me out. I think the issue about being free\nis the fact that most people interpret <em><strong>free<\/strong><\/em> as in <em><strong>free beer<\/strong><\/em>. This means that people who\ncontribute and\/or maintain FOSS software does not need any incentive... but oh boy they do \ud83e\udd72. Lots of software\nare very slow to update, slow bug fixes which some can even span for a decade or two (yes that's true lmao), and\neven gets abandoned because people do not contribute and just selfishly demand the maintainers without thinking\nthat they made this software on their free time... And that free time is not compensated well enough <strong><em>and free\ntime is not free<\/em><\/strong> unless you are privileged enough. These factors lead to cause some open source maintainers\nto drop their project or become hostile to their users which promotes a toxic environment for both users and\nmaintainers. Overall, these issues affect the overall quality of the software, hence why people prefer PhotoShop\nover GIMP. Desktop environments are software as well so they are not excluded when it comes to these issues.\nThere are certain instances where a certain kind of desktop environment is very hostile to users.<\/p>\n<blockquote>\n<p>Free is <strong>not<\/strong> free beer<\/p>\n<\/blockquote>\n<p>Similar articles are listed below, <em>take it as a grain of salty salt<\/em>.<\/p>\n<ul>\n<li><a rel=\"external\" href=\"https:\/\/fy.blackhats.net.au\/blog\/2021-03-23-open-source-enshrines-the-wrong-privilege\/\">Open source enshrines the wrong privilege<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/www.infoworld.com\/article\/3570483\/open-source-has-a-people-problem.html\">Open source has a people problem<\/a><\/li>\n<\/ul>\n<p>\"But you just linked two?\", dude I am not your nanny, formulate your own opinion by doing research and thru observations.<\/p>\n<p>\"But this is Linux as a desktop?\" and they are related to desktop Linux adoption \ud83d\ude42.<\/p>\n<h1 id=\"adoption-of-desktop-linux-is-slow-because-reasons\">Adoption of desktop Linux is slow because reasons<a class=\"zola-anchor\" href=\"#adoption-of-desktop-linux-is-slow-because-reasons\" aria-label=\"Anchor link for: adoption-of-desktop-linux-is-slow-because-reasons\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Here is my take for why it is slow.<\/p>\n<p>Some people are tech-savvy enough to appreciate open source software and make Linux as their daily\ndriver and I kind of understand that. However, the reason the normies can't use Linux is that\nthe workflow, the setup, the software availability and the installation method for some software are\nunfamiliar to them.<\/p>\n<p>Additionally, desktop Linux is more centered around seasoned developers and enthusiasts rather than\nthe common people. And most people buy computers with pre-installed operating systems <em>which of course is <strong>Windows<\/strong> or <strong>MacOS<\/strong><\/em> given that\nLinux has a very small marketshare (around 1-2%). Those operating systems were designed\n<em>for those people<\/em> and it is no surprise that desktop Linux will stay as obscure for another\ndecade or so <em>unless they use the Steam Deck<\/em>.<\/p>\n<h2 id=\"proprietary-and-non-linux-software\">Proprietary and non-Linux software<a class=\"zola-anchor\" href=\"#proprietary-and-non-linux-software\" aria-label=\"Anchor link for: proprietary-and-non-linux-software\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>There is also an issue with using Windows software. Most of them are proprietary.\nAs most software for normies are targetted mostly for the two most popular operating systems,\nWindows and MacOS, some users have to go to various workarounds just to get their favorite software\nto work e.g. running through an emulation layer or through Wine or Proton.<\/p>\n<p>This can be a bit annoying for those that do not want to learn those things as they want things to get\ndone asap.<\/p>\n<p>In my honest opinion though, this is not the fault of Linux. It's more of like \"We don't want to include\nLinux builds for this X software because we generate less money there\" so it's a bit understandable\nbecause capitalism. *cough cough*<\/p>\n<h1 id=\"is-it-now-normie-friendly-then\">Is it now normie friendly then?<a class=\"zola-anchor\" href=\"#is-it-now-normie-friendly-then\" aria-label=\"Anchor link for: is-it-now-normie-friendly-then\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>That kind of depends. Even the most desktop user friendly Linux distributions are not completely normie\nfriendly, starting from the installer to a fully installed setup. But I have to say that\nit kind of is. Linux has come so far from being a developer and an enthusiast only operating system\nto somewhat close to general user desktop operating system.<\/p>\n<p>I think it's kind of fortunate that there are an increasing number of enthusiasts and volunteers to\ncreate (or fork) Linux distributions and design them in a way that even those with little to no\ntechnical knowledge can install Linux. One good example is Linux Mint, Ubuntu, and Fedora and some\nArch forks such as EndeavourOS and ArchCraft. However, the issue also arises <em>during<\/em> desktop usage\nwhere users complain about installing drivers, codecs, and other stuff that requires at least\nsome technical know-how to fix\/install\/debug them. So much for an out-of-the-box experience.<\/p>\n<p>Hence, I am not going to say it's fully normie friendly but there is evidence of progress. This is\nmy honest opinion that desktop Linux requires a lot of patience and workarounds just to make it\nwork sometimes.<\/p>\n<p>For instance, I have to install the flatpak software for my girlfriend\nsince it's the fastest way to get codecs built-in to the software e.g. Firefox. My girlfriend is\nnot a developer nor a programmer nor a tech enthusiast. Thus, I have to make her openSUSE\ninstallation as sane for her as much as possible.<\/p>\n<h1 id=\"fyi\">FYI<a class=\"zola-anchor\" href=\"#fyi\" aria-label=\"Anchor link for: fyi\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Actually, <em>I don't use a desktop environment as much as I used to<\/em>, I always often use a tiling window manager such as\nSwayWM, RiverWM, and Hyprland. For me, it can be considered a desktop linux experience (so you can only blame yourself for having bad configuration or setup).\nHowever, these are for enthusiast power-users that like to configure everything down to the source code (such as DWM) and our topic\nis about desktop Linux for the normies so it's irrelevant.<\/p>\n"},{"title":"I switched to Hyprland","published":"2023-04-25T00:00:00+00:00","updated":"2023-04-25T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/9\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/9\/","content":"<h1 id=\"disclaimer\">Disclaimer<a class=\"zola-anchor\" href=\"#disclaimer\" aria-label=\"Anchor link for: disclaimer\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I really do not care what window manager or desktop environment you are using.\nFor me, it is stupid to start flame wars when it comes to things like these\nincluding editors and browsers. Because what the hell are you doing with life\nif you focus your energy on something so childish and unproductive?<\/p>\n<p><em>Use whatever fits for you, don't let others dictate what you use. Life is short<\/em> \ud83d\ude04<\/p>\n<h1 id=\"so-yeah-window-managers-go-brrr\">So yeah - window managers go brrr...<a class=\"zola-anchor\" href=\"#so-yeah-window-managers-go-brrr\" aria-label=\"Anchor link for: so-yeah-window-managers-go-brrr\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I am a fan of using window managers especially those that have tiling and\nworkspace functionality. I experienced using many tiling window managers such\nas i3wm, swaywm, xmonad, and leftwm. And I <em>used to<\/em> daily drive <a rel=\"external\" href=\"https:\/\/github.com\/riverwm\/river\">riverwm<\/a>,\na week before the time I am writing this.\nFor me, my motivations in using a window manager are the following criteria:<\/p>\n<ul>\n<li><strong>Sane configuration<\/strong>. I really dislike a configuration that requires you to\nlearn a programming language. I am looking at you XMonad.<\/li>\n<li><strong>Community Support<\/strong>. If there are many users, then it's probably a good\nwindow manager.<\/li>\n<li><strong>WiKi<\/strong>. What I Know Is.<\/li>\n<li><strong>Extensibility<\/strong><\/li>\n<li><strong>Multi-Monitor<\/strong> support and mirroring.<\/li>\n<li><strong>Dynamic tiling<\/strong> with tabs support.<\/li>\n<li><strong>Wayland<\/strong>. Because it's the trend now on major distributions.<\/li>\n<\/ul>\n<p>Below are the window managers\/compositors that I listed to be potential for\nmy daily drive usage.<\/p>\n<h2 id=\"i3\">i3<a class=\"zola-anchor\" href=\"#i3\" aria-label=\"Anchor link for: i3\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>It fits most of the the criteria <em><strong>except<\/strong><\/em> the part where it's\nnot Wayland and it does not have dynamic tiling by default (yes, you can use\na plugin for that but no... too much hassle).<\/p>\n<p><a rel=\"external\" href=\"https:\/\/wayland.freedesktop.org\">Wayland<\/a> is now the trend for\n<em>major distributions<\/em> such as openSUSE, Fedora, and Ubuntu. I really do not care\nmuch about the politics but the Xorg Foundation seems to be focused now on the\ndevelopment of Wayland as they claim that X11 and X server is technological\nburden that they don't want to maintain anymore as claimed by them.<\/p>\n<blockquote>\n<p>Wayland is a replacement for the X11 window system protocol and architecture\nwith the aim to be easier to develop, extend, and maintain<\/p>\n<\/blockquote>\n<p>So no for i3. \ud83d\ude25<\/p>\n<h2 id=\"sway\">Sway<a class=\"zola-anchor\" href=\"#sway\" aria-label=\"Anchor link for: sway\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Wayland? Check. Dynamic tiling? No, but I don't want to install a plugin to add\ndynamic tiling.<\/p>\n<p>\"But that's just one thing?\". I do agree, however, Sway and other wlroots-based\nWayland compositors do not have proper multi-monitor support, especially the\npart where <em>I can't mirror my output<\/em> to an external display. It's a wlroots issue\nand I really can't blame the Wayland and Wlroots developers since they are\ndoing this in their free time even with tools such as wlr-randr and kanshi.<\/p>\n<h2 id=\"river\">River<a class=\"zola-anchor\" href=\"#river\" aria-label=\"Anchor link for: river\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>This was my daily driver and been using it since early February 2022. It's a\ndynamic tiling compositor with extensible layouts through the river-protocols\nspecifically <code>river-layout-v3<\/code>, therefore, you can make your own layout generator in\nany language. Notable layout generators that I have tried other than the default\n<code>rivertile<\/code> are <code>rivercarro<\/code> and <code>stacktile<\/code>. But as river is also a wlroots-based\nWayland compositor, I have the same issues that I have with sway on output mirroring.<\/p>\n<h1 id=\"now-why-hyprland\">Now why Hyprland?<a class=\"zola-anchor\" href=\"#now-why-hyprland\" aria-label=\"Anchor link for: now-why-hyprland\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>As much as I love <a href=\"https:\/\/uncomfyhalomacro.pl\/blog\/9\/#river\">river<\/a>, I have to use an external monitor (smart TVs and projector)\nevery weekdays for lectures because I am an instructor for a private university\nin the field of chemistry, and biology and some humanities-related subjects. This led me\nto use <a rel=\"external\" href=\"https:\/\/github.com\/leftwm\/leftwm\">LeftWM<\/a> as my dynamic tiler written in Rust.<\/p>\n<p>But as it is not Wayland, I have to look for an alternative which has good external monitor\nsupport with output mirroring. LeftWM is great, but I can't remain maintaining two\ndotfiles...<\/p>\n<p>So yes, I noticed <a rel=\"external\" href=\"https:\/\/hyprland.org\">Hyprland<\/a> from one of my friends who also uses Wayland.\nIt was still beta at that time and I have heard many bugs so I was not really into it\nuntil someone packaged it in openSUSE Build Service and submitted it the openSUSE Wayland project\nand openSUSE Factory project. That led me to try it and package <code>xdg-desktop-portal-hyprland<\/code>\nin my own openSUSE Build Service project and install Hyprland.<\/p>\n<h2 id=\"features\">Features<a class=\"zola-anchor\" href=\"#features\" aria-label=\"Anchor link for: features\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Hyprland has the following features (maybe I miss some of them but whatever):<\/p>\n<ul>\n<li>IPC support<\/li>\n<li>Dynamic tiling by default<\/li>\n<li>Hyprland protocols<\/li>\n<li>Portals<\/li>\n<li>Global Shortcuts<\/li>\n<\/ul>\n<p>Because Hyprland has IPC support, this means users can create their own way to communicate\nand control the compositor. I rarely use this feature even in Sway because I just use usually\nwhat it brings on the table by default. It's also dynamic tiling and supports two kinds of layouts:<\/p>\n<ul>\n<li>Dwindle<\/li>\n<li>Master (and stack)<\/li>\n<\/ul>\n<p>I love the Dwindle layout since it's easy to rearrange the windows around to my fav master layout.<\/p>\n<p>Hyprland also has an extension protocol for Wayland which is designed to be used with Hyprland itself.\nThis protocol was made so that it can be used with its fork of the Portal implementation for\nwlroots based compositors, known as <code>xdg-desktop-portal-hyprland<\/code>. This fork addresses the following:<\/p>\n<ol>\n<li>Screen selection - it now supports window selections now as well. This means, you can now specify\nwhich client\/window you want to show on the screen.<\/li>\n<li>Global shortcuts - it now supports global shortcuts which is an extension of the Wayland protocol\nwhich uses Portals.<\/li>\n<\/ol>\n<p>I have not experienced global shortcuts in KDE Plasma on X11 before so I really do not know\nwhat to say about it. But people are hyping on it so I guess that functionality is a good thing.<\/p>\n<h2 id=\"my-decision\">My decision<a class=\"zola-anchor\" href=\"#my-decision\" aria-label=\"Anchor link for: my-decision\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>I switched to Hyprland for the following things<\/p>\n<ul>\n<li><strong>Good monitor support<\/strong>. I want to emphasize how I have trouble using <code>wlr-randr<\/code> and <code>kanshi<\/code> only\nto see an open issue on wlroots regarding mirror output support.<\/li>\n<li><strong>Dynamic tiling<\/strong> by default.<\/li>\n<li><strong>Portals<\/strong>. The fork is great \u263a\ufe0f. I can finally share a specific window if I wanted to now.<\/li>\n<\/ul>\n<p>Additionally, the eye-candy. I have not customized for a long time now for river. Ricing was a tedious\ntask and usually a waste of time that's why. But with Hyprland, I think that fire has somewhat lit up\nagain. Although, my current configuration for Hyprland is simple, at least I know that I can easily\nrice it up if I wanted to (round-corners look nice btw!). So yes, here is my setup with <a rel=\"external\" href=\"https:\/\/elkowar.github.io\/eww\/eww.html\">eww<\/a>\nas my bar \ud83d\ude01<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/9\/.\/hyprland-fastfetch.webp\" alt=\"screenshot of hyprland setup\" \/><\/p>\n"},{"title":"Why am I still using Firefox?","published":"2023-04-22T00:00:00+00:00","updated":"2023-04-22T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/8\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/8\/","content":"<h1 id=\"well\">Well...<a class=\"zola-anchor\" href=\"#well\" aria-label=\"Anchor link for: well\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Ever since I got first into Linux (<em>insert random distrohopping moments<\/em>),\nI became a full-time Firefox user. The first reason was, it was usually\nshipped by default. The other reasons are more like it became of a personal\nbelief rather than \"it's better!\" or \"chromium sucks!\".<\/p>\n<p>The major reasons I use Firefox can be put into these subcategories:<\/p>\n<ul>\n<li>Advocacy (?)<\/li>\n<li>Variety<\/li>\n<li>Security (?)<\/li>\n<li>Wayland<\/li>\n<\/ul>\n<blockquote>\n<p>But where is the brief history of Firefox?<\/p>\n<\/blockquote>\n<p>No :P, everyone knows it's just Netscape reskinned.<\/p>\n<h2 id=\"advocacy\">Advocacy (?)<a class=\"zola-anchor\" href=\"#advocacy\" aria-label=\"Anchor link for: advocacy\"\n  >\u00a7<\/a\n>\n<\/h2>\n<blockquote>\n<p>Why the question mark?<\/p>\n<\/blockquote>\n<p>The original mission of Firefox was bringing freedom to the web and they still <em>probably<\/em> do. And I hope it stays that way\neven after all the funny controversies Mozilla made. *<em>coughs in censorship and blog posts<\/em>*\n<img style=\"display:inline;width:1rem;max-width:100%\" src=\"https:\/\/media.tenor.com\/aAvdb_SJZNUAAAAd\/doge-doge-shake.gif\" width=20px \/>.<\/p>\n<h2 id=\"variety\">Variety<a class=\"zola-anchor\" href=\"#variety\" aria-label=\"Anchor link for: variety\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>I do believe that diversity on the web manifests competition and creativity between competing\nsolutions. And that advocacy about diversity is one thing that keeps me using the browser. All in all,\nI don't think that Firefox lacks any vital features that would make it inferior than Chromium-based\nbrowsers as of the time of writing. I think it's more of a reputation from the past e.g. buggy and slow\nthat might have been the reason why user adoption of this browser was getting less and less over the\nyears. Some people claim it received a little more users though but the trend seems to be saying otherwise:<\/p>\n<ul>\n<li><a rel=\"external\" href=\"https:\/\/www.wired.com\/story\/firefox-mozilla-2022\/\">Is Firefox OK?<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/news.itsfoss.com\/firefox-decline\/\">Firefox Lost Almost 50 million users: Here's Why It is Concerning<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/www.techradar.com\/news\/firefox-is-great-so-why-has-it-lost-almost-50-million-users\">Firefox is great, so why has it lost almost 50 million users?<\/a><\/li>\n<\/ul>\n<p>and so forth...<\/p>\n<p>However, the losing of users are mostly caused by <em>Mozilla's<\/em> decisions over the years and I do think it's their\nfault for giving their browser an identity crisis plus controversial blog posts they posted that were really concerning\nfor some users.<\/p>\n<blockquote>\n<p>But standards?<\/p>\n<\/blockquote>\n<p>Standards your mom<\/p>\n<p><img src=\"https:\/\/imgs.xkcd.com\/comics\/standards.png\" alt=\"xckd 927 meme\" \/><\/p>\n<h2 id=\"security\">Security (?)<a class=\"zola-anchor\" href=\"#security\" aria-label=\"Anchor link for: security\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>I am no security expert but I believe both Chromium browser and Firefox has their own security issues. I just put it\nhere to let people know security is not a fixed solution, they are just layers of annoyances (like an onion) against any threat actor\nthat any user might not know they will come across. Nothing is fully secure.<\/p>\n<p>So far, I have not experienced any hacks within my go-to web browser, Firefox \ud83d\ude42.<\/p>\n<h2 id=\"wayland\">Wayland<a class=\"zola-anchor\" href=\"#wayland\" aria-label=\"Anchor link for: wayland\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>With Wayland adoption increasing in every major linux distro, Firefox with native Wayland support enabled, never have failed me when I am using it\non a Wayland compositor be it GNOME, RiverWM, or SwayWM. Chromium-based browsers are weird on Wayland even with\nthat ozone flag thingy enabled \ud83d\ude05<\/p>\n<h1 id=\"it-is-not-popular-as-popular-as-chromium-based-browsers-there-is-brave-too-why-are-you-still-using-it\">&gt; It is not popular as popular as Chromium-based browsers. There is Brave too, why are you still using it?<a class=\"zola-anchor\" href=\"#it-is-not-popular-as-popular-as-chromium-based-browsers-there-is-brave-too-why-are-you-still-using-it\" aria-label=\"Anchor link for: it-is-not-popular-as-popular-as-chromium-based-browsers-there-is-brave-too-why-are-you-still-using-it\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Uh, ever heard of the word 'variety' and 'choices'? Also Brave is still Chromium under the hood with added\nBinance crypto and their own ads.<\/p>\n<p>And just because the browser is not as popular anymore, it does not mean it won't work with my daily\nstuff. Like, I have been using this browser for 2 years now and I only see minor hiccups but it never\nfailed me.<\/p>\n"},{"title":"Understanding the Immune System","published":"2023-04-15T00:00:00+00:00","updated":"2023-04-15T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/lecture\/mc1-immune-system\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/lecture\/mc1-immune-system\/","content":"<p>The <strong>immune system<\/strong> is a host defense system and comprises many biological\nstructures ranging from white blood cells to entire organs.<\/p>\n<p>The function of the immune system is to protect the host against foreign invaders\ncalled <em>pathogens<\/em>. Pathogens can be anything from a virus, to a bacterium, and even\na multicellular parasite including cancer cells.<\/p>\n<h1 id=\"layered-immunity\">Layered Immunity<a class=\"zola-anchor\" href=\"#layered-immunity\" aria-label=\"Anchor link for: layered-immunity\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>There are two subsystems of the immune system:<\/p>\n<ul>\n<li><a href=\"https:\/\/uncomfyhalomacro.pl\/lecture\/mc1-immune-system\/#innate-immune-system\">innate immune system<\/a><\/li>\n<li><a href=\"https:\/\/uncomfyhalomacro.pl\/lecture\/mc1-immune-system\/#adaptive-immune-system\">adaptive immune system<\/a><\/li>\n<\/ul>\n<p>These subsystems provide a <em>layer of defenses<\/em> against pathogens that keep our body\nlessen the chances of infection or further damage if otherwise.<\/p>\n<h2 id=\"cells-involved-in-the-immune-system\">Cells involved in the immune system<a class=\"zola-anchor\" href=\"#cells-involved-in-the-immune-system\" aria-label=\"Anchor link for: cells-involved-in-the-immune-system\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>The cells involved in the immune system are called <em>leukocytes<\/em> or \"white blood cells\".\nSome of these cells are developed in the bone marrow, whereas others are further developed in\nthe lymphatic system, hence, a subset of leukocytes are called <em>lymphocytes<\/em>. To destroy pathogens,\nleukocytes perform phagocytosis, thereby calling some of them as <em>phagocytes<\/em>.<\/p>\n<h2 id=\"innate-immune-system\">Innate Immune System<a class=\"zola-anchor\" href=\"#innate-immune-system\" aria-label=\"Anchor link for: innate-immune-system\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>The innate immune system usually begins with the physical barriers that prevents\npathogens from entering the body. These includes our own skin barrier, mucus\nmembranes and the acidity of the stomach. Cells involved in the innate immune system\nare of the following:<\/p>\n<ul>\n<li>Eosinophil<\/li>\n<li>Basophil<\/li>\n<li>Neutrophil<\/li>\n<li>Monocyte<\/li>\n<li>Mast Cell<\/li>\n<li>Macrophage<\/li>\n<li>Dendritic Cell<\/li>\n<li>Natural killer cells<\/li>\n<\/ul>\n<p>This <a rel=\"external\" href=\"https:\/\/bio.libretexts.org\/Bookshelves\/Human_Biology\/Human_Biology_(Wakim_and_Grewal)\/20%3A_Immune_System\/20.4%3A_Innate_Immune_System\">link<\/a> contains descriptions for each of these cells.<\/p>\n<h3 id=\"inflammation-and-fever\">Inflammation and Fever<a class=\"zola-anchor\" href=\"#inflammation-and-fever\" aria-label=\"Anchor link for: inflammation-and-fever\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Inflammation is the part of the response of the immune system, also called <em>inflammatory response<\/em>. The purpose of this is\nto increase blood flow to the damaged site through vasodilation. Inflammation\nis triggered by either of the two substances: <strong>histamine<\/strong>, and <strong>cytokine<\/strong>. These substances\nare released by the phagocytic cells.<\/p>\n<p>Fever is the most misunderstood immune response. But it is believed that a body temperature that is higher than normal discourages pathogen reproduction.\nA normal temperature can vary from person to person, but it is usually around 98.6 \u00b0F (37 \u00b0C). A fever is not a disease. It is usually a sign that your body is trying to fight an illness or infection.<\/p>\n<p>Infections cause most fevers. You get a fever because your body is trying to kill the virus or bacteria that caused the infection. Most of those bacteria and viruses do well when your body is at your normal temperature. But if\nyou have a fever, it is harder for them to survive. Fever also activates your body's immune system.<\/p>\n<h2 id=\"adaptive-immune-system\">Adaptive Immune System<a class=\"zola-anchor\" href=\"#adaptive-immune-system\" aria-label=\"Anchor link for: adaptive-immune-system\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>The adaptive immune system specializes on stopping or killing pathogens using specific\nmethods of attack. The difference between innate and adaptive immunity is the fact that\nthe latter is <em>specific<\/em>. This means that the cells involved for this pathogen differs\nfor another pathogen. Cells involved in adaptive immunity are many but these are\nthe most notable in literature: B cells and T cells (both are lymphocytes).<\/p>\n<h3 id=\"b-lymphocyte\">B Lymphocyte<a class=\"zola-anchor\" href=\"#b-lymphocyte\" aria-label=\"Anchor link for: b-lymphocyte\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>B lymphocytes are cells in the adaptive immune system that specializes in\nthe production of <strong>antibodies<\/strong>. Antibodies is a chemical substance (usually Y-shaped in structure)\nthat acts as a \"plug\" or \"missile\" to kill or stop a pathogen in its tracks e.g. stopping\nmetabolic functions or perforation of the pathogen's outer membrane.<\/p>\n<h3 id=\"t-lymphocyte\">T Lymphocyte<a class=\"zola-anchor\" href=\"#t-lymphocyte\" aria-label=\"Anchor link for: t-lymphocyte\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>T lymphocytes are cells in the adaptive immune system that are specialized to kill\na specific pathogen. Each T lymphocyte are unique from each other and finding the <em>right<\/em>\nT lymphocyte may take longer during the symptomatic phase of the infection. While these\ncells also kill and engulf pathogens, they also revive macrophages and natural killer cells\nto kill pathogens again.<\/p>\n<h3 id=\"memory-cells\">\"Memory\" Cells<a class=\"zola-anchor\" href=\"#memory-cells\" aria-label=\"Anchor link for: memory-cells\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>After the immune system finally finishes off the last remaining invader, the remnant T and B cells\nbecome \"memory\" cells. \"Memory\" cells are so called because they are used to \"remember\"\nwhat to do when such a pathogen that was encountered before invades again. This reduces the risk\nof damage and prevents most reinfections of which we all know as <em><strong>immunity<\/strong><\/em> or <em><strong>acquired immunity<\/strong><\/em>.<\/p>\n<h1 id=\"other-purpose-of-the-immune-system\">Other purpose of the immune system<a class=\"zola-anchor\" href=\"#other-purpose-of-the-immune-system\" aria-label=\"Anchor link for: other-purpose-of-the-immune-system\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>The immune system has another role to prevent bodily damage. This one is to prevent\nour own cells to become tumors or cancer cells or kill them before they overwhelm our body.\nThis is what we call as <em><strong>immune surveillance<\/strong><\/em>.<\/p>\n<h1 id=\"self-and-non-self\">Self and Non-Self<a class=\"zola-anchor\" href=\"#self-and-non-self\" aria-label=\"Anchor link for: self-and-non-self\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>The body has the ability to identify which cells are \"self\" and which are \"non-self\". In biological and medical\nterms, cells use <em>antigens<\/em> to identify \"self\" and \"non-self\". Antigens are chemical markers on a cell's surface e.g.\npathogens. Our immune system use these chemical markers to detect foreign cells in the body and destroy them.<\/p>\n<h2 id=\"allergies\">Allergies<a class=\"zola-anchor\" href=\"#allergies\" aria-label=\"Anchor link for: allergies\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Sometimes our body overexaggerates immune responses. Pollen, dust, and other types of mostly harmless substances,\nour body just destroyes them no problem. But other's immune systems are overzealous when trying to remove these\n<em>allergens<\/em>. Hence, allergies exist as a \"bug\" of our immune system.<\/p>\n<h1 id=\"further-reading\">Further Reading<a class=\"zola-anchor\" href=\"#further-reading\" aria-label=\"Anchor link for: further-reading\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>Read the following. Don't skip. Most of the exam is based on this blog and the links below.<\/p>\n<ul>\n<li><a rel=\"external\" href=\"https:\/\/bio.libretexts.org\/Bookshelves\/Human_Biology\/Human_Biology_(Wakim_and_Grewal)\/20%3A_Immune_System\/20.4%3A_Innate_Immune_System\">Libretexts Chapter 20.4 - Immune System<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/www.khanacademy.org\/test-prep\/mcat\/organ-systems\/the-immune-system\/v\/types-of-immune-responses-innate-and-adaptive-humoral-vs-cell-mediated\">Khan Academy Types of Immune Responses<\/a><\/li>\n<\/ul>\n<h1 id=\"review\">Review<a class=\"zola-anchor\" href=\"#review\" aria-label=\"Anchor link for: review\"\n  >\u00a7<\/a\n>\n<\/h1>\n<ol>\n<li>What is an allergy?<\/li>\n<li>What will be the first response of your body when it's stung by a bee?<\/li>\n<li>Find out the cells that release histamines.<\/li>\n<li>What is a cytokine?<\/li>\n<li>Research about the complement system.<\/li>\n<li>Describe all pathogen types.<\/li>\n<\/ol>\n"},{"title":"Technologies I will learn in 2023","published":"2023-01-03T00:00:00+00:00","updated":"2023-01-03T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/7\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/7\/","content":"<h2 id=\"what-i-did-in-2022\">What I did in 2022<a class=\"zola-anchor\" href=\"#what-i-did-in-2022\" aria-label=\"Anchor link for: what-i-did-in-2022\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>2022 was a fine year. Only issue was I am still adjusting with the new environment\nnow that I was finally done with my undergrad and recently working as a university\ninstructor for chemistry, biology and some humanities-related subjects.<\/p>\n<p>I have fun writing RPM specfiles for packaging software in openSUSE and also\nlearning the importance of community in Free and Open Source Software.<\/p>\n<p>Languages I am fond of writing are Lua, Julia, and Rust. I did learn a bit of SCSS and\nSASS while also learning how to write the Tera templating engine for Zola.<\/p>\n<p>Although, my only issue was the time contraints I have with work and personal life\nthat I haven't really done any huge projects with those technologies. I really\nwanted to write a GUI client for mastodon in Rust with iced-rs but because\nof the lack of knowledge of the mastodon API and Rust itself, I never really got into it.<\/p>\n<h2 id=\"list-of-technologies-i-want-to-learn\">List of technologies I want to learn<a class=\"zola-anchor\" href=\"#list-of-technologies-i-want-to-learn\" aria-label=\"Anchor link for: list-of-technologies-i-want-to-learn\"\n  >\u00a7<\/a\n>\n<\/h2>\n<ul>\n<li><a rel=\"external\" href=\"https:\/\/www.erlang.org\">Erlang<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/www.crystal-lang.org\">Crystal<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/kanidm.com\/\">Kanidm<\/a><\/li>\n<li><a rel=\"external\" href=\"https:\/\/www.nushell.sh\/\">Nushell<\/a><\/li>\n<\/ul>\n<p>I will write what I learned so far each Saturday since that's the only day that I am free, unfortunately. \ud83d\ude14<\/p>\n"},{"title":"Julia x Zellij","published":"2022-12-19T00:00:00+00:00","updated":"2022-12-19T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/6\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/6\/","content":"<h2 id=\"multiplexing-workflows\">Multiplexing workflows<a class=\"zola-anchor\" href=\"#multiplexing-workflows\" aria-label=\"Anchor link for: multiplexing-workflows\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>A <em>multiplexer<\/em> is a program that multiplex a screen into several splits usually separated\nwith their own purpose and function. In this post, the multiplexers we are talking about is\nfor the terminal.<\/p>\n<p>There are many multiplexing programs that exist today such as screen, tmux, and <a rel=\"external\" href=\"https:\/\/zellij.dev\">zellij<\/a>.\nThey serve similar purposes in that each split, pane, tab or whatever they call it can specific\nprograms to your liking e.g. running htop, editing a file, listing passwords. Other multiplexing\ncapabilities maybe is already built-in with your terminal emulator e.g. <a rel=\"external\" href=\"https:\/\/sw.kovidgoyal.net\/kitty\/\">kitty<\/a> and <a rel=\"external\" href=\"https:\/\/wezfurlong.org\/wezterm\/\">wezterm<\/a>\nare known to have such features.<\/p>\n<p>So how does a multiplexing workflow help you improve your <a rel=\"external\" href=\"https:\/\/julialang.org\">Julia<\/a> package development?<\/p>\n<h2 id=\"what-is-zellij\">What is <a rel=\"external\" href=\"https:\/\/zellij.dev\">Zellij<\/a>?<a class=\"zola-anchor\" href=\"#what-is-zellij\" aria-label=\"Anchor link for: what-is-zellij\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p><strong>Zellij<\/strong> is one of the popular rust cli tools that exist today - a multiplexer with batteries included and\nsoon to have plugins support. I am writing this blog with the help of zellij using a layout\nthat runs zola. It's a simple layout you can use as you can see below.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"kdl\"><span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">layout<\/span><span> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  pane<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> split_direction<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">vertical<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">    pane<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> command<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">helix<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">    pane<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> split_direction<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">horizontal<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      zola<\/span><span> {<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> args<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">check<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span>; }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      zola<\/span><span> {<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> args<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">build<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span>; }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      zola<\/span><span> {<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> args<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">serve<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span>; }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      pane<\/span><span> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">      \tname<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">free-terminal<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span>      }<\/span><\/span>\n<span class=\"giallo-l\"><span>    }<\/span><\/span>\n<span class=\"giallo-l\"><span>  }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  pane<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> size<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">1<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> borderless<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#CC241D, #CC241D);\">true<\/span><span> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">    plugin<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> location<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">zellij:compact-bar<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span>  }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  pane_template<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> name<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">zola<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">    command<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">zola<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">    start_suspended<\/span><span style=\"color: light-dark(#CC241D, #CC241D);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span>  }<\/span><\/span>\n<span class=\"giallo-l\"><span>}<\/span><\/span><\/code><\/pre><h2 id=\"julia-x-zellij\">Julia x Zellij<a class=\"zola-anchor\" href=\"#julia-x-zellij\" aria-label=\"Anchor link for: julia-x-zellij\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>As you can see from the example layout from the previous section, you can finally get an idea\nof how to integrate <code>julia<\/code> with <code>zellij<\/code>.<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"kdl\"><span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">layout<\/span><span> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  pane<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> split_direction<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">vertical<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \tpane<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> command<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">helix<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \tpane<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> split_direction<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">horizontal<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \t\tpane<\/span><span> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \t\t\tname<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">julia-repl<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \t\t\tcommand<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">julia<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \t\t\targs<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">--startup-file=no<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">--project=.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span> <\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \t\t\tstart_suspended<\/span><span style=\"color: light-dark(#CC241D, #CC241D);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span>  \t\t}<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \t\tpane<\/span><span> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \t\t\tname<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">julia-test<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \t\t\tcommand<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">julia<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \t\t\targs<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">--startup-file=no<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">--project=.<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">-e<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">using Pkg; Pkg.instantiate(); Pkg.test()<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \t\t\tstart_suspended<\/span><span style=\"color: light-dark(#CC241D, #CC241D);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span>  \t\t}<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \t\tpane<\/span><span> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \t\t\tname<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\"> &quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">free-terminal<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \t\t\tfocus<\/span><span style=\"color: light-dark(#CC241D, #CC241D);\"> true<\/span><\/span>\n<span class=\"giallo-l\"><span>  \t\t}<\/span><\/span>\n<span class=\"giallo-l\"><span>  \t}<\/span><\/span>\n<span class=\"giallo-l\"><span>  }<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  pane<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> size<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">1<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> borderless<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#CC241D, #CC241D);\">true<\/span><span> {<\/span><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#427B58, #8EC07C);\">  \tplugin<\/span><span style=\"color: light-dark(#B57614, #FABD2F);\"> location<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">=<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">zellij:compact-bar<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><span>  }<\/span><\/span>\n<span class=\"giallo-l\"><span>}<\/span><\/span><\/code><\/pre>\n<p>This results with the layout below:<\/p>\n<p><img src=\"https:\/\/uncomfyhalomacro.pl\/blog\/6\/.\/blog-6-julia-template-zellij.png.webp\" alt=\"zellij-julia-layout-template\" \/><\/p>\n<ul>\n<li>Left contains your editor<\/li>\n<li>Right contains the following:\n<ul>\n<li>Julia REPL<\/li>\n<li>Julia Pkg.test() command<\/li>\n<li>Terminal<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>This layout makes it easy for you to test and rerun commands for your Julia package development.<\/p>\n<h2 id=\"now-what\">Now what?<a class=\"zola-anchor\" href=\"#now-what\" aria-label=\"Anchor link for: now-what\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>This may not be your workflow but for those who are interested in using <a rel=\"external\" href=\"https:\/\/zellij.dev\">zellij<\/a> may find it a good\nidea to integrate this workflow for their next Julia project. Thanks for reading this short post.<\/p>\n"},{"title":"Writing my own tree-sitter grammar","published":"2022-12-14T00:00:00+00:00","updated":"2023-04-02T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/5\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/5\/","content":"<p><a rel=\"external\" href=\"https:\/\/github.com\/tree-sitter\">Tree-sitter<\/a> is an incremental parsing system that allows developers to add syntax highlighting and tree-sitter regex search for easy navigation.<\/p>\n<p>The project is heavily used among popular editors such as <a rel=\"external\" href=\"https:\/\/github.com\/neovim\/neovim\"><strong>neovim<\/strong><\/a>, and <a rel=\"external\" href=\"https:\/\/helix-editor.com\/\"><strong>helix<\/strong><\/a>.<\/p>\n<h2 id=\"the-issue\">The issue<a class=\"zola-anchor\" href=\"#the-issue\" aria-label=\"Anchor link for: the-issue\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>As a volunteer packager for openSUSE, I read rpm specfiles to add, update, and\/or modify a package. It was fine with neovim at first but\nI use <strong>helix<\/strong> now as my main editor for modifying specfiles and for doing some changes.<\/p>\n<p>A comparison between <a rel=\"external\" href=\"https:\/\/helix-editor.com\/\">helix<\/a> <em>right<\/em> and <a rel=\"external\" href=\"https:\/\/github.com\/neovim\/neovim\">neovim<\/a> <em>left<\/em>:<\/p>\n<img src=\".\/blog-5-helix-vs-neovim.png.webp\" alt=\"comparing helix and neovim syntax highlighting of rpm\" \/>\n<p>As you can see from the image above, helix does not have a syntax highlighter for rpm. Neovim and Vim do but they do not use tree-sitter for\nthe highlighting of code. I am no expert of how neovim and vim do that without tree-sitter but I can link you to a <a rel=\"external\" href=\"https:\/\/www.cs.cornell.edu\/courses\/cs6120\/2019fa\/blog\/vim-syntax-highlighting\/\">blog<\/a> which summarizes\nhow it works by implementing syntax highlighting for Bril.<\/p>\n<h3 id=\"this-poses-a-problem\">This poses a problem<a class=\"zola-anchor\" href=\"#this-poses-a-problem\" aria-label=\"Anchor link for: this-poses-a-problem\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Well... for me, not sure for other people. The role of syntax highlighting is to allow us to see each part of the syntax\ndifferently e.g. function, module, variable, etcetera. This increases readability and the time to recognize parts of code\nis lessened to an extent. Although, it is not a big deal in most cases because RPM specfiles are usually less than 200 lines,\nit gets too complicated for packaging software that have different needs and limitations e.g. julia, and rust. Check out the specfiles for <a rel=\"external\" href=\"https:\/\/build.opensuse.org\/package\/view_file\/science\/julia\/julia.spec?expand=1\">julia<\/a>\nand <a rel=\"external\" href=\"https:\/\/build.opensuse.org\/package\/view_file\/devel:languages:rust\/rust1.65\/rust1.65.spec?expand=1\">rust<\/a> and you will see what I mean.<\/p>\n<h2 id=\"solution\">Solution<a class=\"zola-anchor\" href=\"#solution\" aria-label=\"Anchor link for: solution\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Again, I mainly use helix now as my main editor. And helix does not have the same syntax highlighting functionality like vim's or neovim's.\nIt uses <a rel=\"external\" href=\"https:\/\/github.com\/tree-sitter\">tree-sitter<\/a> to do the syntax highlighting. Therefore, I have taken the initiative to write\nan RPM grammar for tree-sitter to solve my problems reading specfiles. For now the project is an\nempty repository - <a rel=\"external\" href=\"https:\/\/codeberg.org\/uncomfyhalomacro\/tree-sitter-rpm\">https:\/\/codeberg.org\/uncomfyhalomacro\/tree-sitter-rpm<\/a>.<\/p>\n<p>I will update later in the future blogs on the progress of this. It's my first time writing a grammar for tree-sitter after all. \ud83d\ude01<\/p>\n<!-- Links -->\n"},{"title":"My experience with Julia","published":"2022-12-12T00:00:00+00:00","updated":"2022-12-12T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/4\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/4\/","content":"<p><em>Julia code that renders a Julia logo glyph which can only work perfectly with\n<a rel=\"external\" href=\"https:\/\/github.com\/cormullion\/juliamono\">JuliaMono<\/a>.<\/em> Thanks <strong>cormullion<\/strong>! JuliaMono looks amazing!<\/p>\n<pre class=\"giallo\" style=\"color-scheme: light dark; color: light-dark(#3C3836, #EBDBB2); background-color: light-dark(#F9F5D7, #1D2021);\"><code data-lang=\"julia\"><span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span style=\"color: light-dark(#9D0006, #FB4934);\">using<\/span><span> REPL<\/span><\/span>\n<span class=\"giallo-l\"><span>REPL<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>REPLCompletions<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\">.<\/span><span>latex_symbols<\/span><span>[<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">\\\\<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">julialogo<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>]<\/span><span style=\"color: light-dark(#427B58, #8EC07C);\"> =<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\"> &quot;<\/span><span style=\"color: light-dark(#8F3F71, #D3869B);\">\\ue800<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><\/span>\n<span class=\"giallo-l\"><\/span>\n<span class=\"giallo-l\"><span>println<\/span><span>(<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span style=\"color: light-dark(#79740E, #B8BB26);\">Welcome to \ue800<\/span><span style=\"color: light-dark(#7C6F64, #A89984);\">&quot;<\/span><span>)<\/span><\/span>\n<span class=\"giallo-l\"><\/span><\/code><\/pre>\n<p>For nearly 2 years, I have used <a rel=\"external\" href=\"https:\/\/julialang.org\">Julia<\/a> as my main hobby language of choice.\nI am not an expert nor a magician of this language but it really is a fun language\nto play with.<\/p>\n<p>As a past Python user, Julia gave me a new perspective of languages I didn't know\nsince highschool. Features such as multiple dispatch, abstract types and composite\ntypes, I recently learned it in this language. I know there are a lot of blogs about\nJulia so how is this post any different? Let's dive in.<\/p>\n<h2 id=\"community\">Community<a class=\"zola-anchor\" href=\"#community\" aria-label=\"Anchor link for: community\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>As a person with no formal CS knowledge nor any in-depth understanding of CS theories at\nall, I am surprised that the Julia community welcomes any people from different backgrounds.<\/p>\n<p>I was very shy at first, but I was readily welcomed and with such a warm welcome,\nI was very enthusiastic to learn more about the language during my free time.<\/p>\n<p>Thanks to <strong>aru<\/strong>, the Discord admin\/dictator of Humans of Julia, I became a Community Lead\/Moderator\nthere. Mark, Tom Kwong, Scott Jones, Ricardo Rosa, Franku, Aazare and Aaron where very active during the early days of\nHoJ. Unfortunately, due to work and personal stuff, most of these people are not as active\nas before. I do hope the energy to do so comes back but alas, I as well succumbed to that because of the same reason.\nNonetheless, there are other Julia communities too, and the one I lurk the most is\nin <a rel=\"external\" href=\"https:\/\/julialang.zulipchat.com\">Julia Zulip<\/a>.<\/p>\n<h2 id=\"so-much-to-learn\">So much to learn<a class=\"zola-anchor\" href=\"#so-much-to-learn\" aria-label=\"Anchor link for: so-much-to-learn\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Every now and then when I lurk both in HoJ or in Julia Zulip, I met a lot of people who are more knowledgeable than me.\nClemapfel, also known as Clementine, was very helpful in the ask-for-help channels in HoJ. Clemapfel is\nthe author of <a rel=\"external\" href=\"https:\/\/github.com\/Clemapfel\/jluna\">jluna<\/a>, a Julia-C++ wrapper. There is another\nperson too that I noticed that are actually so helpful, Yuuhi. I know there are others but every time\nI lurk, these are the two people I usually notice.<\/p>\n<p>These people gave me more motivation to learn more about Julia even as to poke around the internals.\nBut my lack of C knowledge is the only thing that is holding me back. But I am not discouraged.\nI can learn Julia without knowing those and those gaps of knowledge, I can just ask around people the\nwhy's, what's, and how's of the language.<\/p>\n<h2 id=\"an-ambitious-project\">An ambitious project<a class=\"zola-anchor\" href=\"#an-ambitious-project\" aria-label=\"Anchor link for: an-ambitious-project\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>I really want to learn Julia, that's why I plan to contribute as much as I can for the community and\nthe language even if it's just small issues on GitHub<sup class=\"footnote-reference\" id=\"fr-github-1\"><a href=\"#fn-github\">1<\/a><\/sup> or just helping newcomers in HoJ.<\/p>\n<p>I also as much as possible increase Julia's visibility on my favorite distribution, openSUSE, by\nbecoming a packager for <a rel=\"external\" href=\"https:\/\/github.com\/JuliaLang\/juliaup\">Juliaup<\/a>.<\/p>\n<p>But one thing I still lack is a project I can call my own and proudly say I learned Julia\nthe best way possible - and that's  where <a href=\"https:\/\/uncomfyhalomacro.pl\/blog\/4\/sbol3\">SBOL3.jl<\/a> comes in.<\/p>\n<p>I have not started anything yet on the project but I plan to do it around the March 2023. If you want to\nknow what SBOL is you can go to <a rel=\"external\" href=\"https:\/\/sbolstandard.org\/\">https:\/\/sbolstandard.org\/<\/a><\/p>\n<p>So far, there is nothing much I can say here since there is nothing significant progress on the project yet.<\/p>\n<h2 id=\"planning-to-join-a-gsoc-jsoc-to-improve-my-julia\">Planning to join a GSoC\/JSoC to improve my Julia<a class=\"zola-anchor\" href=\"#planning-to-join-a-gsoc-jsoc-to-improve-my-julia\" aria-label=\"Anchor link for: planning-to-join-a-gsoc-jsoc-to-improve-my-julia\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>I am planning to join GSoC\/JSoC next year as a student. But the only issue is I get easily intimidated because\nI am not very bright and smart nor I have the necessary knowledge to tackle the projects.<\/p>\n<p>But a friend of mine, <a rel=\"external\" href=\"https:\/\/fy.blackhats.net.au\/blog\/html\/pages\/about.html\">William<\/a> encouraged me to join\neven if I lacked some of the necessary knowledge because mentors exist for a reason. So yes, I decided\nto join GSoC\/JSoC even if I don't have a very good base because I want to learn and I want to learn more.<\/p>\n<p>Thanks again Firstyear for encouraging me and teaching me a lot of things in openSUSE \ud83e\udd70<\/p>\n<h2 id=\"conclusion\">Conclusion<a class=\"zola-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Now to end this in a positive note, I am really glad that I discovered this language. But it's not actually\nthe language that hooked me in, it was the helpful and knowledgeable people around me\nthat taught me a lot about being in a community and being a contributor. And that being passionate\nmeans there is so much more to learn and to love.<\/p>\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn-github\">\n<p>I mainly use <a rel=\"external\" href=\"https:\/\/codeberg.org\">codeberg<\/a> now but I still use my github account to contribute and star some projects. <a href=\"#fr-github-1\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section>\n"},{"title":"My experience with Zola","published":"2022-12-10T00:00:00+00:00","updated":"2022-12-10T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/3\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/3\/","content":"<p>There are many static site generators out there and we all know the most popular is <a rel=\"external\" href=\"https:\/\/gohugo.io\">Hugo<\/a>.\nThis static site generator is written in <a rel=\"external\" href=\"https:\/\/go.dev\/\">Go<\/a>, one of the most popular programming languages\nthat is used to write popular technologies such as <a rel=\"external\" href=\"https:\/\/www.docker.com\/\">Docker<\/a> and <a rel=\"external\" href=\"https:\/\/gitea.io\">Gitea<\/a>.<\/p>\n<p>During my exploration of using a static site generator, I was planning to use <a rel=\"external\" href=\"https:\/\/franklinjl.org\/\">Franklin.jl<\/a>\nfrom the <a rel=\"external\" href=\"https:\/\/julialang.org\">Julia<\/a> programming language. Although the idea was to use that, I never really got the motivation\naround that time to build my website since personal life got so busy.<\/p>\n<h2 id=\"discovering-zola\">Discovering <a rel=\"external\" href=\"https:\/\/getzola.org\">Zola<\/a><a class=\"zola-anchor\" href=\"#discovering-zola\" aria-label=\"Anchor link for: discovering-zola\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>As a Rust enthusiast, I was finding myself looking around using tools that are written in <a rel=\"external\" href=\"https:\/\/rust-lang.org\">Rust<\/a>.\nWe all know about the memes such as \"Blazingly fast! \ud83d\ude80\" on most popular Rust repositories but\nmy discovery of Zola, admittedly, is because of well... Rust. <em>I have completely forgotten about\nFranklin.jl at that time<\/em>, around October 2022 because the community I was in were Rust enthusiasts.<\/p>\n<p>Like <a rel=\"external\" href=\"https:\/\/gohugo.io\">Hugo<\/a>, <a rel=\"external\" href=\"https:\/\/getzola.org\">Zola<\/a> is also a static site generator but written in <a rel=\"external\" href=\"https:\/\/rust-lang.org\">Rust<\/a>. It uses the\n<a rel=\"external\" href=\"https:\/\/github.com\/Keats\/tera\">Tera<\/a> templating engine which is inspired by Jinja2 and Django template language. As I am also familiar with Django,\nalbeit out of practice and no longer using it, I am still familiar with the Jinja2 and Django template language.<\/p>\n<p>I have not used <a rel=\"external\" href=\"https:\/\/gohugo.io\">Hugo<\/a> so I cannot really tell what features it has compared to <a rel=\"external\" href=\"https:\/\/getzola.org\">Zola<\/a>. Zola has various features\nincluding a configuration file <code>config.toml<\/code> where you can configure if you want to generate a ToC. And of course, it\nsupports reading your static folder which you can put your assets and everything you want in there.<\/p>\n<h2 id=\"the-appeal\">The appeal<a class=\"zola-anchor\" href=\"#the-appeal\" aria-label=\"Anchor link for: the-appeal\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>The number one appeal that I think what made me use <a rel=\"external\" href=\"https:\/\/getzola.org\">Zola<\/a> are <strong>templates<\/strong>. With the usage of the <a rel=\"external\" href=\"https:\/\/github.com\/Keats\/tera\">Tera<\/a>\ntemplate language, you can reuse html files as ... guess what ... <em>templates<\/em>. This encourage code reuse and\nadding some macros so you can modify your existing templates with another and extending it as you please. As you may all\nknow, my site is built with <a rel=\"external\" href=\"https:\/\/getzola.org\">Zola<\/a> and I haven't even used its full power yet because I am still understanding\nhow this all works and all including extending and creating Tera macros. Yet, so little features used, and I already\nbuilt a website of my own. This made me happy and stick to it.<\/p>\n<h2 id=\"conclusion\">Conclusion<a class=\"zola-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p><a rel=\"external\" href=\"https:\/\/getzola.org\">Zola<\/a> pretty well made it easy for me to write my own website and simplify my way of writing one with the <a rel=\"external\" href=\"https:\/\/github.com\/Keats\/tera\">Tera<\/a>\ntemplating engine. So far, the tool is good to me and I have not experienced any hiccups yet.<\/p>\n<h2 id=\"minor-issues\">Minor issues<a class=\"zola-anchor\" href=\"#minor-issues\" aria-label=\"Anchor link for: minor-issues\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>The only issue that I really <strong>dislike<\/strong> about Zola is the <em>lack of documentation<\/em>, which to me discourages new users to use it.\nIt took me 2 hours to understand how to use the templating engine and what classes and ids should I use for the SASS\/CSS files\nby inspecting the generated site using Firefox's Inspect tool and also reading code from custom themes from other users.<\/p>\n"},{"title":"My experience in Mastodon and Federation","published":"2022-12-08T00:00:00+00:00","updated":"2023-04-02T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/2\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/2\/","content":"<p>In this blog post, I will discuss why I found myself falling in love in federated social networking than the mainstream social media websites such as birdsite and zucksite.<\/p>\n<h2 id=\"the-issue\">The issue<a class=\"zola-anchor\" href=\"#the-issue\" aria-label=\"Anchor link for: the-issue\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>For a long time, I must admit that I am no stranger to be in the internet like everyone else. I usually just scroll and scroll. But there is one thing that bugs me all the time\nwhen I was in birdsite or zucksite: the <em>algorithm<\/em>. Most folks call this the <em>algorithm<\/em> so let's just stick to that for now.<\/p>\n<p>So we already know what this <em>algorithm<\/em> does to most of us right? Posts that have a significant number of follows, reposts and likes are more likely to be seen than others which means\nengagements feel more unnatural and is designed to increase chances for the user to feel the surge of dopamine and thus, it's why <em>social media addiction<\/em> is quite prevalent in this age.<\/p>\n<p>And that's not the only problem. For example, if a misinformation has more likes, reposts and follows than those that are factual, scientically-backed and peer-reviewed information, then a lot of people usually\nagree on the former than the latter posing so many problems in the scientific communication and bringing factual information. This is evident during the COVID-19 pandemic and we all know what happened so let's stop there.<\/p>\n<p>Mainstream social media for a long time is still vulnerable to political propagandas, health quacks, and scientific misinformation that it already became a headache to various experts on how to mitigate this problem.\nAlso, we users are victims to those problems and I doubt that will go away anytime soon.<\/p>\n<p><em>But what about privacy?<\/em><sup class=\"footnote-reference\" id=\"fr-peevacy-1\"><a href=\"#fn-peevacy\">1<\/a><\/sup> That's another issue that's been repeated over from other blog posts of other people so we all know the gist here. I do value privacy, but the only issue with these is I have families, friends, and colleagues that use zucksite and birdsite.\nTherefore, I really cannot leave this sites. As much as I want to convince them, they cannot just jump ship because they are used to it because these sites make people lazy after all. The only solution is to\nlessen the amount of info you can give to these sites but I do think I already gave them enough that they can profile me since my accounts are as old as me. lol<\/p>\n<h2 id=\"fresh-air\">Fresh air<a class=\"zola-anchor\" href=\"#fresh-air\" aria-label=\"Anchor link for: fresh-air\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>I noticed mastodon after I was looking for privacy alternatives around the <em>summer<\/em><sup class=\"footnote-reference\" id=\"fr-summer-1\"><a href=\"#fn-summer\">2<\/a><\/sup> of 2021. If I can remember correctly, I joined\n<a rel=\"external\" href=\"https:\/\/types.pl\">types.pl<\/a> around the time when I explored around. I saw an acquaintance of mine joined so I was interested so I joined as well.<\/p>\n<p>What I noticed was, it was actually so dead. I apologize for those that are offended but it was. <em>Keyword: <strong>was<\/strong><\/em> \ud83d\ude09. While exploring the new site, I was also on birdsite.\nBirdsite for a long time has started to show its signs of becoming a cesspool of garbage and tar. Thankfully, my follows and followers are just those people\nI know. But like I said, it showed signs of becoming a cesspool of garbage. Let me correct myself, it was for a long time a cesspool of hate.<\/p>\n<p>Misinformation, racism, antivaxx, there are too many to count, I actually lessened my activity on birdsite and just read blogs from people instead. I waited for the day until <strong>Space Karen<\/strong><sup class=\"footnote-reference\" id=\"fr-spacekaren-1\"><a href=\"#fn-spacekaren\">3<\/a><\/sup>\ngot baited to buy it. And that's when I finally jumped over.<\/p>\n<p>Mastodon and others that interact with ActivityPub e.g. Misskey, have similarities with the mainstream social media. But there are differences:<\/p>\n<ul>\n<li>Federated instances<\/li>\n<li>No algorithm<\/li>\n<li>Hashtags<\/li>\n<\/ul>\n<h3 id=\"federated-instances\">Federated instances<a class=\"zola-anchor\" href=\"#federated-instances\" aria-label=\"Anchor link for: federated-instances\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>Unline most mainstream social media, federated social networks such as mastodon is not owned by a single <em>usually corporate<\/em> entity. They are from community of volunteers or from a single person\nof whom hosts those federated instances using their own money and resources. That's why if you have the money, please do donate to your instances. They are usually doing it for free.<\/p>\n<p>Because they are not owned by a single entity, there is also a concept of <em>defederation<\/em> where instances are blocked from at least one instance because of disagreements or abuse. This means that\nany crappy instance that are defederated are more likely to become isolated from other instances and die. In birdsite, you cannot do that and thus, some piece of garabage will slip through your home feed sooner or later\neven after you block some toxic people. It does not mean that it's true to most instances, it kind of depends on your instance admin and owner so if your admin does not\ndo anything after all the abuse, you can just hop over on another instance.<\/p>\n<h3 id=\"no-algorithms-and-hashtags\">No algorithms and Hashtags<a class=\"zola-anchor\" href=\"#no-algorithms-and-hashtags\" aria-label=\"Anchor link for: no-algorithms-and-hashtags\"\n  >\u00a7<\/a\n>\n<\/h3>\n<p>No algorithms, it's self-explanatory. Because of this, federated social networks feel very unusual for those that migrated from birdsite and zucksite.\nUsers are encouraged to <strong>boost<\/strong> to gain visibility. And also, the use of <strong>hashtags<\/strong> is recommended so they can follow a topic they want. And it is etiquette to add <em>Content Warnings<\/em>\nfor your posts and captions for your photos for those that have visual and hearing impairment.<\/p>\n<h2 id=\"conclusion\">Conclusion<a class=\"zola-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>It is really <em><strong>a breath of fresh air<\/strong><\/em>. I do not have to fear of replying to people because of the number of followers that they have or engagements nor do I have to care\nanymore about repost and likes counts. Because federated social networks encourage users to discuss, and talk rather than focusing their energy on needless clout.<\/p>\n<p>Thus, I think I will stay in Mastodon for quite a long time \ud83d\ude04<\/p>\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn-peevacy\">\n<p>Privacy is relative. <em>As long as you are on the internet, you are <strong>not completely private<\/strong><\/em>. Limit the information you give to the sites you are in \ud83d\ude42 <a href=\"#fr-peevacy-1\">\u21a9<\/a><\/p>\n<\/li>\n<li id=\"fn-summer\">\n<p>Philippines don't have summers, we are a <strong>tropical country<\/strong>. lol <a href=\"#fr-summer-1\">\u21a9<\/a><\/p>\n<\/li>\n<li id=\"fn-spacekaren\">\n<p>Ooooh mars! and that guy that fixed traffic <a href=\"#fr-spacekaren-1\">\u21a9<\/a><\/p>\n<\/li>\n<\/ol>\n<\/section>\n"},{"title":"A new fresh blog site","published":"2022-12-04T00:00:00+00:00","updated":"2023-04-02T00:00:00+00:00","author":{"name":"\n            Soc Virnyl Estela\n          "},"link":{"@attributes":{"rel":"alternate","type":"text\/html","href":"https:\/\/uncomfyhalomacro.pl\/blog\/1\/"}},"id":"https:\/\/uncomfyhalomacro.pl\/blog\/1\/","content":"<h1 id=\"reason\">Reason<a class=\"zola-anchor\" href=\"#reason\" aria-label=\"Anchor link for: reason\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>So last year, I decided to write and create a blog site because I thought I can start writing my thoughts during my free time. It's probably now in the wayback machine \ud83e\udd37.\n<a rel=\"external\" href=\"https:\/\/github.com\/ejmg\/zerm\">zerm<\/a> was my fav zola themes but well, I really kind of wanted to make my own theme.<\/p>\n<h2 id=\"what-i-learned\">What I learned<a class=\"zola-anchor\" href=\"#what-i-learned\" aria-label=\"Anchor link for: what-i-learned\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>I thought it was easy, and actually while writing this, it's never in its final form yet. I have to learn the Tera syntax and templating engine just to understand\nhow to create themes for zola. Pretty sure there were some breaks here and there. It's fun but damn, it took me a lot of braincells and internet searches just to get\nwhat I want.<\/p>\n<h2 id=\"conclusion\">Conclusion<a class=\"zola-anchor\" href=\"#conclusion\" aria-label=\"Anchor link for: conclusion\"\n  >\u00a7<\/a\n>\n<\/h2>\n<p>Since this is just a short blog post, I will just end it here. It's just me giving my reason for writing a new blog site with a new theme I created.\nIf you want to take a look at the source code of the theme, you can find it in <a rel=\"external\" href=\"https:\/\/codeberg.org\/uncomfyhalomacro\/jera\">https:\/\/codeberg.org\/uncomfyhalomacro\/jera<\/a>.<\/p>\n<h1 id=\"update\">Update<a class=\"zola-anchor\" href=\"#update\" aria-label=\"Anchor link for: update\"\n  >\u00a7<\/a\n>\n<\/h1>\n<p>I finally fixed a lot of things with the new zola theme template jera! I will add more features slowly for the time being. I think I am liking it's simplicity! I am no web developer\nnor a web designer but I am glad I fixed a lot of things like floating and dynamic TOC. More updates soon.<\/p>\n"}]}