<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: アッシャー</title>
    <description>The latest articles on Forem by アッシャー (@ashercarneiro).</description>
    <link>https://forem.com/ashercarneiro</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F517162%2F791679d3-06b8-45f7-9359-807793781390.png</url>
      <title>Forem: アッシャー</title>
      <link>https://forem.com/ashercarneiro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ashercarneiro"/>
    <language>en</language>
    <item>
      <title>how i built a remote linux dev environment [homelab series p1]</title>
      <dc:creator>アッシャー</dc:creator>
      <pubDate>Wed, 22 Oct 2025 10:03:24 +0000</pubDate>
      <link>https://forem.com/ashercarneiro/how-i-built-a-remote-linux-dev-environment-homelab-series-p1-114f</link>
      <guid>https://forem.com/ashercarneiro/how-i-built-a-remote-linux-dev-environment-homelab-series-p1-114f</guid>
      <description>&lt;p&gt;hi long time no see! well windows has been my go-to since i first got into software dev. it’s familiar, easy to set up, and plays nice with most tools out of the box. but as time went on, i started realizing something — while &lt;em&gt;windows&lt;/em&gt; is &lt;em&gt;simple&lt;/em&gt; and &lt;em&gt;intuitive&lt;/em&gt; on the surface, it’s not always the best experience for developers who constantly experiment with new languages, frameworks, and environments.&lt;/p&gt;

&lt;p&gt;let’s be honest — installing dependencies or switching between different versions of the same language on windows can be… well, a nightmare. you install python 3.11, and suddenly python 3.9 forgets it ever existed. or node just decides to break npm because it felt like it. dependency hell, my old enemy.&lt;/p&gt;

&lt;p&gt;so one day, someone tells me, “you should try linux — it’s way smoother for programming.”, linux? streamlined? that’s like saying “rust installs instantly.” but hey, i was curious. and i already had a humble debian homeserver sitting in a corner running QEMU/KVM VMs, so i thought: why not make a dedicated dev VM?&lt;/p&gt;

&lt;h3&gt;
  
  
  the experiment begins
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExdXpvNzNpdnF5azVnMzhpOTJ2bGtiZmhmYjNsOXJjd2ZrbDJvcnkweSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FjTNG3RF6EwbkpD4LZx%2Fgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExdXpvNzNpdnF5azVnMzhpOTJ2bGtiZmhmYjNsOXJjd2ZrbDJvcnkweSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FjTNG3RF6EwbkpD4LZx%2Fgiphy.gif" width="480" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;so i spun up a clean &lt;strong&gt;debian 13&lt;/strong&gt; KVM on my homeserver. nothing fancy — just a couple gigs (4G) of RAM, a few cores, and bridged networking so it could sit on my local network like any other device.&lt;/p&gt;

&lt;p&gt;then came the setup part. i ran the usual &lt;code&gt;apt update &amp;amp;&amp;amp; apt upgrade&lt;/code&gt;, installed VS Code Server on the VM, and got it up and running. now, from my windows machine, i opened VS Code, grabbed the &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh" rel="noopener noreferrer"&gt;Remote SSH extension&lt;/a&gt;, and entered my VM’s IP, username, and password.&lt;/p&gt;

&lt;p&gt;and just like that, voila! — i was inside my linux dev environment from the comfort of my windows desktop.&lt;/p&gt;

&lt;h3&gt;
  
  
  living the hybrid life
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia3.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExNGNodDI3NW9jeDkyN29neWN6eWtiZmprMjJ4empxOTA3Njhpb3E0YiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FMPEsqNexs3HZDPdnTF%2Fgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia3.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExNGNodDI3NW9jeDkyN29neWN6eWtiZmprMjJ4empxOTA3Njhpb3E0YiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FMPEsqNexs3HZDPdnTF%2Fgiphy.gif" width="480" height="269"&gt;&lt;/a&gt;&lt;br&gt;
once connected, i could do everything &lt;strong&gt;right from VS Code&lt;/strong&gt; — open terminals, install dependencies, clone repos, manage packages, all inside the editor. and it just worked.&lt;/p&gt;

&lt;p&gt;i needed python 3.12 for a project but still wanted to keep 3.10 around without any issues? easy. &lt;code&gt;pyenv install 3.12 &amp;amp;&amp;amp; pyenv global 3.12&lt;/code&gt; — no drama, no weird path errors, no fighting the system registry.&lt;/p&gt;

&lt;p&gt;node? same story. &lt;code&gt;nvm install 20&lt;/code&gt; and move on with your day lol.&lt;/p&gt;

&lt;p&gt;what blew my mind was how natural the whole workflow felt. even though everything was running remotely on linux, VS Code made it feel completely native. i could use the integrated bash terminal directly in my editor, with all the linux tools i love.&lt;/p&gt;

&lt;h3&gt;
  
  
  the perks i didn’t expect
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zero clutter&lt;/strong&gt;: my windows machine stays clean — no conflicting SDKs or global installs. everything lives on the VM.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consistency&lt;/strong&gt;: no matter what i break (and i will break things), i can just snapshot or rebuild the VM in minutes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;: since it’s running on my homeserver, i don’t have to worry about slowing down my main system while running builds or containers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Accessibility&lt;/strong&gt;: i can ssh into the same environment from any computer, anywhere. same setup, same tools, same configs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  some small tweaks
&lt;/h3&gt;

&lt;p&gt;to make things smoother, i added a static IP to the VM so i don’t have to guess it every time, and set up SSH keys so i can connect password-free. i also installed zsh and oh-my-zsh (because why not make it look cool?) and configured version managers like pyenv, nvm, and asdf for different languages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;basically, i ended up with a self-contained, zero-hassle dev machine that feels like an extension of my workflow rather than a constant battle.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  final thoughts
&lt;/h3&gt;

&lt;p&gt;with this setup, i get the stability and power of linux while still keeping my familiar windows desktop for everything else. it’s the best of both worlds.&lt;/p&gt;

&lt;p&gt;so if you’ve been struggling with dependency chaos or just want a clean, reproducible coding environment, seriously — give this a try. set up a debian VM, connect it with VS Code’s Remote SSH, and watch how your workflow transforms or even better write up some terraform workflows for aws and watch them scale beautifully idk.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia0.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExOWkybHpsMG1pd2FibWpqaWNjMDFpNm00eThhc2d6c2NjNTEzc3lmZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FRu9sjtZ09XOEg%2Fgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia0.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExOWkybHpsMG1pd2FibWpqaWNjMDFpNm00eThhc2d6c2NjNTEzc3lmZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FRu9sjtZ09XOEg%2Fgiphy.gif" width="318" height="178"&gt;&lt;/a&gt;&lt;br&gt;
turns out, linux can be streamlined pretty well i should add, bye.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>selfhosted</category>
      <category>debian</category>
    </item>
    <item>
      <title>well... thinkpads are awesome</title>
      <dc:creator>アッシャー</dc:creator>
      <pubDate>Sat, 21 Dec 2024 19:43:00 +0000</pubDate>
      <link>https://forem.com/ashercarneiro/well-thinkpads-are-awesome-392e</link>
      <guid>https://forem.com/ashercarneiro/well-thinkpads-are-awesome-392e</guid>
      <description>&lt;p&gt;Alright, let’s talk about ThinkPads. These solid laptops are just ridiculously good for what they cost. If you want something reliable, affordable, and kinda versatile, ThinkPads are the way to go. Let’s dig into why they’re still super good, with a bit of history and my own experience with my beloved T460.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Quick History Lesson
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frkpvqbmjeozlc2zgarjb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frkpvqbmjeozlc2zgarjb.png" alt="700" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These laptop's hit the scene in 1992, thanks to IBM Thinkpad 700. They became super popular for being &lt;strong&gt;tough, professional-looking&lt;/strong&gt;, and having those &lt;strong&gt;amazing keyboards&lt;/strong&gt; everyone loves(referring to the classic ones). &lt;/p&gt;

&lt;p&gt;Fast forward to 2005, Lenovo took over the ThinkPad line from IBM and released the &lt;a href="https://www.reddit.com/r/thinkpad/comments/zwo9bw/thinkpad_x41_my_favourite_model_ever_still_quite/?utm_source=share&amp;amp;utm_medium=web3x&amp;amp;utm_name=web3xcss&amp;amp;utm_term=1&amp;amp;utm_content=share_button" rel="noopener noreferrer"&gt;X41&lt;/a&gt;. A lot of people were worried it wouldn’t be the same, but Lenovo stuck to the ThinkPad vibe—durable, practical, and no-nonsense—while adding their own upgrades over time which have made various current generation models &lt;strong&gt;hardly distinguishable from consumer-grade machines&lt;/strong&gt; and current ThinkPads have focused less-and-less on their upgradability/reparability factor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wn3eqjowokli25u2h9w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wn3eqjowokli25u2h9w.png" alt="FW" width="617" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another brand named &lt;a href="https://frame.work/" rel="noopener noreferrer"&gt;Framework&lt;/a&gt; are actually doing great progress towards a greener future with their although slightly costly yet perfectly modern, medium to high-end laptops that have iFixit score of literal 10/10, almost as if these new frameworks are advancing and carrying forward the original ThinkPad legacy. &lt;/p&gt;

&lt;h3&gt;
  
  
  Cheap &amp;amp; Reliable
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F82yojfcnfn2uy6s2k2n4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F82yojfcnfn2uy6s2k2n4.png" alt="R" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s honestly crazy that in 2024 you can grab a &lt;u&gt;working ThinkPad&lt;/u&gt; for as less as 50 dollors although it won't be the newest, shinest thinkpad ever yet it'll be yours to tinker with.&lt;/p&gt;

&lt;p&gt;These laptops are solid—like, &lt;br&gt;
"&lt;u&gt;you can toss it in your bag without stressing&lt;/u&gt;" solid. They’re perfect if you’re a student, need a backup computer, or just like messing around with tech and linux/development stuff in general.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Keyboards and Battery Life
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcuz99kv77r8mzc5eo4mj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcuz99kv77r8mzc5eo4mj.png" alt="LGR" width="686" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ThinkPad keyboards? just plain amazing.&lt;/strong&gt; Typing on one feels so good, whether you’re writing essays, coding, or idk writing an angry reddit rant about some SAAS product you didn't like, and the &lt;u&gt;battery life holds up&lt;/u&gt;, especially with lightweight operating systems like &lt;a href="https://antixlinux.com/" rel="noopener noreferrer"&gt;AntiXLinux&lt;/a&gt;. Sure, you’ll need to do a bit of research to pick the right model, but once you do, you’re set and as per the people at &lt;a href="https://www.reddit.com/r/thinkpad/" rel="noopener noreferrer"&gt;r/thinkpad&lt;/a&gt;, the &lt;a href="https://www.reddit.com/r/thinkpad/comments/1edab75/ok_i_understand_the_t480_hype_now/?utm_source=share&amp;amp;utm_medium=web3x&amp;amp;utm_name=web3xcss&amp;amp;utm_term=1&amp;amp;utm_content=share_button" rel="noopener noreferrer"&gt;T480&lt;/a&gt; has a great price/performance ratio.&lt;/p&gt;

&lt;h3&gt;
  
  
  My ThinkPad Story
&lt;/h3&gt;

&lt;p&gt;I got my first ThinkPad, &lt;strong&gt;T460&lt;/strong&gt; about a year and a half ago. I started by dual-booting Linux Mint with Windows 10 so I could mess around with both but eventually, I ran out of space so I swapped out the SSD for a 512GB one. That’s the beauty of ThinkPads, cause &lt;u&gt;they’re like super upgradable&lt;/u&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0pyd49g5542xs5zx69pf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0pyd49g5542xs5zx69pf.png" alt="Q" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Right now, I’m using my ThinkPad for school/ work, and retro gaming on weekends to play UT1, CS 1.6, Halo CE, Quake 2 and other classics.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbbon41mx1fab65gx008v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbbon41mx1fab65gx008v.png" alt="H" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Over on Linux, I’ve been learning kinda a-lot about linux tools and workflows. I've recently got into &lt;strong&gt;window managers&lt;/strong&gt;, &lt;a href="https://github.com/baskerville/bspwm" rel="noopener noreferrer"&gt;bspwm&lt;/a&gt; was my first one and I'm thinking of moving towards a Arch+Hyprland setup in future. Setting it up was way easier than I thought, and I got inspired by a YouTuber named jvscholz, who’s all about minimalism and productivity.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Can You Do With a ThinkPad?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhfmdcqp830xqu51xl3ou.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhfmdcqp830xqu51xl3ou.png" alt="S" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.level1techs.com/t/ghetto-thinkpad-home-server/139674" rel="noopener noreferrer"&gt;Servers&lt;/a&gt;: Perfect for running Linux projects.&lt;/p&gt;

&lt;p&gt;Daily Drivers: Reliable and tough for everyday use.&lt;/p&gt;

&lt;p&gt;Learning Linux: Awesome for experimenting with different distros or trying out cool setups like bspwm.&lt;/p&gt;

&lt;p&gt;For Kids: If you want to give your kid a solid intro to computing, an older rugged ThinkPad is a great option.&lt;/p&gt;

&lt;h3&gt;
  
  
  Built to Take a Beating
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;ThinkPads are made to last.&lt;/u&gt;&lt;/strong&gt; Even older models can still handle a lot. When I first got mine, I loved how carefree I could be with it. I’m not saying I’d throw it around or sum, but it’s nice not having to worry so much.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Linux Rocks on a ThinkPad
&lt;/h3&gt;

&lt;p&gt;If you’re into Linux or want to learn, ThinkPads are basically perfect. &lt;/p&gt;

&lt;p&gt;They’re compatible with almost every distro you name it from the most niche distros to the popular ones, and the community around ThinkPads is stronger then it has ever been, also check out &lt;a href="https://www.reddit.com/r/Thinkpad/" rel="noopener noreferrer"&gt;r/thinkpad&lt;/a&gt;, &lt;a href="https://www.reddit.com/r/ThinkCat/" rel="noopener noreferrer"&gt;r/thinkcat&lt;/a&gt; while you're at it. &lt;/p&gt;

&lt;p&gt;I’ve learned so much using Mint, there’s something really satisfying about customizing your window manager setup and making it your own.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8c8g2xel74thykoix0da.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8c8g2xel74thykoix0da.png" alt="T" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ThinkPads aren’t just laptops, they’re a experience if you may!&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Whether you need a tough everyday machine, a linux experiment box, or even a retro gaming rig, these laptops are all for it, plus they're cheap, durable, and super flexible. If you’ve been &lt;strong&gt;thinking&lt;/strong&gt; about getting one, just do it. &lt;/p&gt;

</description>
      <category>linux</category>
      <category>development</category>
      <category>learning</category>
      <category>discuss</category>
    </item>
    <item>
      <title>i made a quick blog cover generator</title>
      <dc:creator>アッシャー</dc:creator>
      <pubDate>Tue, 02 Jul 2024 11:48:48 +0000</pubDate>
      <link>https://forem.com/ashercarneiro/i-made-a-quick-blog-cover-generator-2gfb</link>
      <guid>https://forem.com/ashercarneiro/i-made-a-quick-blog-cover-generator-2gfb</guid>
      <description>&lt;ul&gt;
&lt;li&gt;so i love the minimalism and bright colors, combine those and you get simple covers like these, i made this is canva at first..&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz4k1bba2p3euq07xydho.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz4k1bba2p3euq07xydho.png" alt="1" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm83444809q89ep1rnnmv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm83444809q89ep1rnnmv.png" alt="2" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;this is kinda perfect for me right now, yet I as any other developer thought "is automating this an option??"🤓&lt;/li&gt;
&lt;li&gt;so my plan here was simple, to make these simple little covers without manual labor, in the first rendition of this i even wanted to add some stickers related to any tags i provided and then display them in bottom right corner, but decided against it cause i got bored trying to handle the subproblems that came with automating sticker download from the internet, yet more on this later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;before we start look at this cool monkey i found:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FIo0Pnkp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExcGdjcDg0bjF3anBtcndmMGN4Z2ZzcW5wazV0N3ozNzlsbDBmeW1xbCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/BBkKEBJkmFbTG/giphy.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FIo0Pnkp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExcGdjcDg0bjF3anBtcndmMGN4Z2ZzcW5wazV0N3ozNzlsbDBmeW1xbCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/BBkKEBJkmFbTG/giphy.webp" alt="3" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;so i put out for dimensions of &lt;code&gt;1600x800&lt;/code&gt; in my mind, which is generally used by most blog sites.&lt;/li&gt;
&lt;li&gt;initially i set out to make it a &lt;code&gt;cli only&lt;/code&gt; thing, yet decided against it, so if in future i want some new changes without making this again.&lt;/li&gt;
&lt;li&gt;ohhh yes one cool "app" thing this has is, it will automatically translate your sub-title to japanese giving you that &lt;em&gt;aesthetic&lt;/em&gt; yet clean look in the cover.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  how it works:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;it uses &lt;code&gt;tkinter&lt;/code&gt; as it's GUI library duhh&lt;/li&gt;
&lt;li&gt;the "fun" part is the image generation and the automatic translation yk, for this it uses &lt;code&gt;PIL&lt;/code&gt; or &lt;code&gt;Python Imaging Library&lt;/code&gt; more specifically &lt;code&gt;Image, ImageDraw, ImageFont&lt;/code&gt; modules.&lt;/li&gt;
&lt;li&gt;for translation part of that subtitle it was a bit tricky, yet it found a package named &lt;code&gt;googletrans&lt;/code&gt; which works flawlessly.&lt;/li&gt;
&lt;li&gt;it uses two fonts, one called &lt;code&gt;opensans-light&lt;/code&gt; for title, and other called &lt;code&gt;notosansjp&lt;/code&gt; for japanese subtitle.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;now as i told before, i wanted it to work with emoji's yet it didn't cause i had tons of these things called an:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pCq-sOUC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExaGRmajg2ZHB2dTEzbDFrbWttZjhleHByZjIzdWYzbjhhbTlkajB3MSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/bi6RQ5x3tqoSI/giphy.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pCq-sOUC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExaGRmajg2ZHB2dTEzbDFrbWttZjhleHByZjIzdWYzbjhhbTlkajB3MSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/bi6RQ5x3tqoSI/giphy.webp" alt="4" width="450" height="327"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ill later try getting this text generation and emojis working cause i made this project long time ago and kinda yk forgot..🤦‍♂️&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;yet so, this was a great &lt;code&gt;side-side&lt;/code&gt; project, made me focus on python after a long time again.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  code:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#actually works version

import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageDraw, ImageFont
from googletrans import Translator

def translate_to_japanese(text):
    translator = Translator()
    result = translator.translate(text, src='en', dest='ja')
    return result.text

def create_blog_cover(title, subtitle):
    # Image settings
    width, height = 1600, 840
    background_color = "#fffb29"
    font_path = "./fonts/OpenSans-Light.ttf"  # Replace with the path to your font
    font_jp = "./fonts/NotoSansJP-VariableFont_wght.ttf"  # Replace with the path to your Japanese font
    font_size_title = 140  # Increased font size for title
    font_size_subtitle = 80  # Increased font size for subtitle
    vertical_margin = 40

    # Create image with background color
    img = Image.new("RGBA", (width, height), background_color)
    draw = ImageDraw.Draw(img)

    # Load fonts
    title_font = ImageFont.truetype(font_path, font_size_title)
    subtitle_font = ImageFont.truetype(font_jp, font_size_subtitle)

    # Get English and Japanese subtitles
    translated_subtitle = translate_to_japanese(subtitle)

    # Get text bounding boxes
    title_bbox = draw.textbbox((0, 0), title, font=title_font)
    subtitle_bbox = draw.textbbox((0, 0), translated_subtitle, font=subtitle_font)

    # Extract width and height from bounding boxes
    title_width = title_bbox[2] - title_bbox[0]
    title_height = title_bbox[3] - title_bbox[1]
    subtitle_width = subtitle_bbox[2] - subtitle_bbox[0]
    subtitle_height = subtitle_bbox[3] - subtitle_bbox[1]

    # Calculate text positions
    title_x = (width - title_width) / 2
    title_y = (height - title_height - subtitle_height - 20 - vertical_margin) / 2  # Center vertically
    subtitle_x = (width - subtitle_width) / 2
    subtitle_y = title_y + title_height + 20 + vertical_margin

    # Draw text on image
    draw.text((title_x, title_y), title, font=title_font, fill="black")
    draw.text((subtitle_x, subtitle_y), translated_subtitle, font=subtitle_font, fill="black")

    # Save image
    output_path = f"./output/{title.replace(' ', '_')}_cover.png"
    img.save(output_path, "PNG")
    print(f"Cover image saved as {output_path}")

def generate_cover():
    title = title_entry.get()
    subtitle = subtitle_entry.get()
    create_blog_cover(title, subtitle)
    messagebox.showinfo("Cover Generated", "Cover image generated successfully!")

# Create a Tkinter window
root = tk.Tk()
root.title("Blog Cover Generator")

# Title label and entry
title_label = tk.Label(root, text="Enter the title:")
title_label.pack()
title_entry = tk.Entry(root, width=50)
title_entry.pack()

# Subtitle label and entry
subtitle_label = tk.Label(root, text="Enter the subtitle:")
subtitle_label.pack()
subtitle_entry = tk.Entry(root, width=50)
subtitle_entry.pack()

# Generate button
generate_button = tk.Button(root, text="Generate Cover", command=generate_cover)
generate_button.pack()

# Run the Tkinter main loop
root.mainloop()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;make sure to have &lt;code&gt;/fonts&lt;/code&gt; [add both fonts .ttf files previously mentioned] and &lt;code&gt;/output&lt;/code&gt; in your root dir something like:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root-dir:
   --app.py
   --/output
   --/fonts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  yooo bye have a great day i guess 🤠
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsk2mf9l9ms0wzfdh1am7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsk2mf9l9ms0wzfdh1am7.png" alt="5" width="500" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>blog</category>
      <category>beginners</category>
    </item>
    <item>
      <title>An Introduction✨</title>
      <dc:creator>アッシャー</dc:creator>
      <pubDate>Sun, 05 Mar 2023 14:07:00 +0000</pubDate>
      <link>https://forem.com/ashercarneiro/an-introduction-3ne4</link>
      <guid>https://forem.com/ashercarneiro/an-introduction-3ne4</guid>
      <description>&lt;p&gt;Hello there Random People, Welcome to my blog thing.&lt;/p&gt;

&lt;p&gt;Well, I will be posting randomly over here when I get some inspiration or just a weird tingling for tech... here I'll strive to deliver content that's straight on point, humorous, and informative.&lt;/p&gt;

&lt;p&gt;Whether you're a seasoned techie or just getting started in the tech world, I hope you'll find something here that sparks your interest and expands your knowledge.&lt;/p&gt;

&lt;h3&gt;
  
  
  bye for now👋
&lt;/h3&gt;

</description>
      <category>intro</category>
      <category>firstpost</category>
      <category>newhere</category>
    </item>
  </channel>
</rss>
