<?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>DEV Community: connor miller</title>
    <description>The latest articles on DEV Community by connor miller (@connorthemiller).</description>
    <link>https://dev.to/connorthemiller</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%2F318708%2F1f7f7e70-4e2f-42a7-9763-f6695c36f64b.jpg</url>
      <title>DEV Community: connor miller</title>
      <link>https://dev.to/connorthemiller</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/connorthemiller"/>
    <language>en</language>
    <item>
      <title>An Attempt to Make a Tiny Social Site for Stoners</title>
      <dc:creator>connor miller</dc:creator>
      <pubDate>Sat, 24 Dec 2022 16:56:24 +0000</pubDate>
      <link>https://dev.to/connorthemiller/an-attempt-to-make-a-tiny-social-site-for-stoners-4fg</link>
      <guid>https://dev.to/connorthemiller/an-attempt-to-make-a-tiny-social-site-for-stoners-4fg</guid>
      <description>&lt;p&gt;&lt;em&gt;As I continue to work on my code projects, I started to keep notes alongside my work so I can talk through problems and identify when it is time to walk away from the computer. This is not a tutorial, but instead a peek into my thought process as I educate myself.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We are going to make a tiny social media site for stoners using Svelte and Firebase. Here are some baseline ideas: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authentication.&lt;/strong&gt; I want people to be able to sign in through Twitter, but i may get more users if authentication is as anonymous as possible, especially with a throwaway app like this one. So, as much as I want to get fancy, let’s use e-mail link authentication (passwordless).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Behavior.&lt;/strong&gt;  I like the idea of seeing an anonymized heatmap of where people are stoned. This requires asking for location data which I am not too familiar with. Maybe there is a way to do this even more simply. We also could have people just log timestamps as to when they are high, and it would be like a Downdetector type thing showing times of day people are stoned.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now that I write this, it is entirely possible to make this with something like a Google Sheet. How would we render the heatmap information in real time, though? &lt;/p&gt;

&lt;p&gt;So, the most valuable information we can get is time and anonymized location. &lt;/p&gt;

&lt;h2&gt;
  
  
  Data Structure
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Users&lt;/li&gt;
&lt;li&gt;Sessions

&lt;ul&gt;
&lt;li&gt;Session Location&lt;/li&gt;
&lt;li&gt;Session Time&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Test on AppSheet
&lt;/h2&gt;

&lt;p&gt;This feels like something I can potentially prototype in &lt;a href="https://about.appsheet.com/home/"&gt;Google Appsheet&lt;/a&gt;. Let’s try that first. &lt;/p&gt;

&lt;p&gt;What’s funny is that right now I know more about Svelte and Firebase than I do AppSheet. I’m not sure if I have as much control as I’d like considering how much AI magic is being used. I cannot guarantee that I am going to get the output I want. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C9dt38Y_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wfi2c6l1d0p09l2zig3t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C9dt38Y_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wfi2c6l1d0p09l2zig3t.png" alt="A screenshot of the Google AppSheet UI." width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ok, this definitely does not look like what we want. &lt;/p&gt;

&lt;p&gt;Let’s just go back to Svelte. I think we know enough of what we want to do. However, I think I should definitely watch some videos of people using AppSheet to see what kind of social apps I can make. &lt;/p&gt;

&lt;p&gt;[ ... ]&lt;/p&gt;

&lt;p&gt;Hours later and I still find myself in AppSheet because it intrigues me and I feel like I should be able to make what I’m imagining here. I know I would probably make more progress if I switched to Svelte but I have the luxury of spending time to familiarize myself with AppSheet.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--19kGyZBx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/28l4q5dvphvinq9651ml.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--19kGyZBx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/28l4q5dvphvinq9651ml.png" alt="Another screenshot of the Google AppSheet UI." width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is looking a little bit better. &lt;/p&gt;

&lt;p&gt;Unfortunately, it looks like this is optimized for individual use. I don’t think it’s the best for doing the social things that I’m hoping to accomplish. Unless I’m missing something. &lt;/p&gt;

&lt;p&gt;We are yak shaving at this point so I think it’s finally time to pivot to Svelte. &lt;/p&gt;

&lt;h2&gt;
  
  
  Svelte
&lt;/h2&gt;

&lt;p&gt;My worry about Svelte is UI, but I guess I can worry about that later. We are definitely equipped enough to build front end first, which is what I think I’m going to do. Once we have that dummy app up and running, I think it will be a better time to apply Firebase to the backend. So, let’s focus primarily on frontend &lt;strong&gt;first&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;This video inspired me to get started today:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/gUYBFDPZ5qk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;[ ... ]&lt;/p&gt;

&lt;p&gt;Initial frontend is looking good. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2QB2p8wO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tpsxv4y03svzfk2dr2y4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2QB2p8wO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tpsxv4y03svzfk2dr2y4.png" alt="A screenshot of my site, a work in progress. There is no CSS styling, though there are users and posts." width="456" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Location may have to come later, but it will look something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/maps/documentation/geocoding/?csw=1#ReverseGeocoding"&gt;Google Maps Platform Documentation | Geocoding API | Google Developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[ ... ]&lt;/p&gt;

&lt;p&gt;Alright, now we are jumping into &lt;a href="https://firebase.google.com/docs/auth/web/email-link-auth"&gt;passwordless sign in&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J6NiQZsE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v509q36r2j3hjin8br7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J6NiQZsE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v509q36r2j3hjin8br7v.png" alt='A screenshot of an error message: "Invalid Link Domain".' width="489" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the error I’ve been stuck on for a couple hours. Can’t figure it out. This may be the time to gut the things that don’t work and to consider a different way for folks to log in. &lt;/p&gt;

&lt;p&gt;[ ... ]&lt;/p&gt;

&lt;p&gt;The good news is that &lt;a href="https://firebase.google.com/docs/auth/web/anonymous-auth"&gt;anonymous login&lt;/a&gt; works, but this does not offer the functionality I am looking for.&lt;/p&gt;

&lt;p&gt;[ ... ]&lt;/p&gt;

&lt;p&gt;Anonymous login is working well enough, the thing I want to do to end today is to get Firestore up and running. &lt;/p&gt;

&lt;p&gt;[ ... ]&lt;/p&gt;

&lt;p&gt;We have Firestore functionality! I am on a roll. I think this is enough for today, as I will have to eat dinner soon. &lt;/p&gt;

&lt;p&gt;For shits and giggles let’s try to deploy. &lt;/p&gt;

&lt;p&gt;LATER&lt;/p&gt;

&lt;p&gt;Deploying turned out to be a shit show, spent two hours running around trying to figure that out. It looks like the main problem is that my app has server-side-rendering (SSR) which means I need to host some Firebase Cloud Functions in order for my app to run. This sounds involved so I’m going to wait to do this another time. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/jthegedus/svelte-adapter-firebase"&gt;https://github.com/jthegedus/svelte-adapter-firebase&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This github provides what I think is the most likely solution to my problem. &lt;/p&gt;

&lt;p&gt;LATER&lt;/p&gt;

&lt;p&gt;Came home after smoking weed and drinking wine and solved the deploy issue immediately. Lmao, we have a silly little prototype up and running. &lt;/p&gt;

&lt;p&gt;[ ... ]&lt;/p&gt;

&lt;p&gt;And now it doesn’t work again. &lt;/p&gt;

&lt;p&gt;LATER&lt;/p&gt;

&lt;p&gt;Fixed it. Basically I had to disable SSR for the compile, allowing me to upload a static site. I implemented the svelte &lt;a href="https://kit.svelte.dev/docs/adapters"&gt;static site adapter&lt;/a&gt; and wrote a snippet of code in the +layout.js file of my routes. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eWDWqVmB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6i984y1wetomcau5oubj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eWDWqVmB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6i984y1wetomcau5oubj.png" alt="Setting pre-render to true." width="325" height="92"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zQNNh8mi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zxxpoc1mpxowsk7jasgi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zQNNh8mi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zxxpoc1mpxowsk7jasgi.png" alt="Using the svelte static adapter." width="575" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I will also need to read this: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://joyofcode.xyz/sveltekit-environment-variables"&gt;Using Environment Variables With SvelteKit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TO DO: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ]  Give users the ability to delete their own posts.&lt;/li&gt;
&lt;li&gt;[ ]  Create functionality to only be able to post three times every hour.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;12/22/22&lt;/p&gt;

&lt;p&gt;We finally added the custom url, which was bugging because the instructions from Firebase are out of date (or simply just different for Namecheap?). Once I started writing “@” in the “Host” field on Namecheap instead of the typed out url, the connection went through. How am I supposed to know this? I say this as I clearly remember the few other times I’ve tried to use a custom URL and have experienced the same problem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uv2VuvrR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qhbiwtk11zlq67uleik4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uv2VuvrR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qhbiwtk11zlq67uleik4.png" alt="Screenshot of completed project." width="518" height="941"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Sy3XSre4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1ub1l2qvls9wttffvfq7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Sy3XSre4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1ub1l2qvls9wttffvfq7.png" alt="Screenshot of completed project." width="449" height="982"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd share the final result, but this project is neither secure nor scalable. I learned a lot, and while I will probably be sharing this silly little toy with my friends, I think I need to tighten the security and make sure I'm not paying out the ass for services like the Google Maps Geocoding. &lt;/p&gt;

</description>
      <category>svelte</category>
      <category>firebase</category>
      <category>beginners</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>An Attempt to Make a Journal App with Svelte and Firebase</title>
      <dc:creator>connor miller</dc:creator>
      <pubDate>Sat, 24 Dec 2022 16:05:24 +0000</pubDate>
      <link>https://dev.to/connorthemiller/notes-an-attempt-to-make-a-journal-app-with-svelte-and-firebase-3o4p</link>
      <guid>https://dev.to/connorthemiller/notes-an-attempt-to-make-a-journal-app-with-svelte-and-firebase-3o4p</guid>
      <description>&lt;p&gt;&lt;em&gt;As I continue to work on my code projects, I started to keep notes alongside my work so I can talk through problems and identify when it is time to walk away from the computer. This is not a tutorial, but instead a peek into my thought process as I educate myself.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I write my journals and to-do lists in a very specific way in Evernote. It would be cool to use this opportunity to learn Svelte. &lt;/p&gt;

&lt;p&gt;12/12/22&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F3oelynfddz2tnj47mhgb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F3oelynfddz2tnj47mhgb.png" alt="A simple frontend design for a journal app in its first draft."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a first stab at what I want the front end to look like, but I realize I need an editable carousel of cards in order for this to function how I want it to.&lt;/p&gt;

&lt;p&gt;Right now I am having trouble making the connection between Svelte and Firebase. I think next time I need to get an example (I know I can probably find some on &lt;a href="https://glitch.com/" rel="noopener noreferrer"&gt;Glitch&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;[ ... ]&lt;/p&gt;

&lt;p&gt;Next thing I need to do is figure out how to set up authentication, which I think will be a little bit easier now that I know where the bits and bobs go. &lt;/p&gt;

&lt;p&gt;To Do: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Set up authentication&lt;/li&gt;
&lt;li&gt;[ ] Submit blog posts to Firestore properly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;12/13/22&lt;/p&gt;

&lt;p&gt;MORNING&lt;/p&gt;

&lt;p&gt;Helpful Firebase auth video w/ Svelte that I should look at tonight. &lt;iframe width="710" height="399" src="https://www.youtube.com/embed/PXf0t6Id7i0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Right now I am looking at YouTube videos that will help me when I revisit this project later in the evening. &lt;/p&gt;

&lt;p&gt;Though I would like to get creative with Logins, for now I will just be using email and password because it is standard. &lt;/p&gt;

&lt;p&gt;Here are the weeds that I was expecting, and the thing I need to be careful about before going to work - setting up the hierarchies of my components so that I can use Firebase when needed. Where should I put my Firebase config file? How can I make sure it is not redundant? Worried about breaking something. &lt;/p&gt;

&lt;p&gt;It looks like I will import what I need from the Firebase.js file using the import functions that look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userDoc&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Firebase&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;//tweak as needed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Figuring out all these routes will take some troubleshooting that I currently don’t have time for, so I’ll save this for the evening. &lt;/p&gt;

&lt;p&gt;To Do: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Consolidate Journal.svelte so that the Firebase config information is moved to a more global location where both Journal.svelte and Login.svelte can access it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AFTERNOON&lt;/p&gt;

&lt;p&gt;I have pieced together some code that logs in with a username and password, and it posts to the Firestore database. This is great, and a miracle it was done in my current state. I currently can’t log out, nor can I create new accounts. This isn’t too pressing to me, as long as we have me, the main user, to build out the rest of the functionality of this project. And that, is the journal UI. &lt;/p&gt;

&lt;p&gt;[ ... ]&lt;/p&gt;

&lt;p&gt;Okay, so it got way too complicated and I had to start from scratch, and now I am so confused and nothing seems to be working the way I need it to. So! Time for a break. I think in order to get the information that I need, I NEED to block out an hour or so just to follow this tutorial: &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/PXf0t6Id7i0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;I think where I am getting tripped up is that I am trying to keep my code tidy and modular and the files aren’t communicating with each other very well from component to component. There is probably some syntax or something I’m missing since I don’t really know how files relate to each other, or it’s just convoluted. I think following the tutorial tomorrow might help at least a little bit. &lt;/p&gt;

&lt;p&gt;12/14/22&lt;/p&gt;

&lt;p&gt;EARLY MORNING&lt;/p&gt;

&lt;p&gt;Holy shit it’s 2am and I found the error - I had capitalized “Svelte” in “.svelte” when I shouldn’t have. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fdvhrbjepr4c8500azp9b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fdvhrbjepr4c8500azp9b.png" alt="A screenshot of my .svelte files."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And now I have successfully logged in because I put the code in the right order, lmao.&lt;/p&gt;

&lt;p&gt;And now we have assembled it in such a way that we can log in and out of my account! Success success and it’s only 3am! &lt;/p&gt;

&lt;p&gt;I think this needs to be a place to stop since we have achieved our win. This is something for another time, but I think we can refine it further if we learn about stores. &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/rszZ7TYTbR0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;AFTERNOON&lt;/p&gt;

&lt;p&gt;Trying to figure out the simplest way to move forward. It would be cool to have a WYSIWYG editor but I may just stick with a textarea now just to keep things simple. We can always refine and add complexity later. &lt;/p&gt;

&lt;p&gt;[ ... ]&lt;/p&gt;

&lt;p&gt;Success! We can write to the database, no problem. Now on puzzling how I want to read my previous entries. I can visualize it in my mind, but I am not sure what the easiest solution would be. &lt;/p&gt;

&lt;p&gt;[ ... ]&lt;/p&gt;

&lt;p&gt;Okay, we are getting there! We can see our old entries, though they stay on the screen even after you log out. It’s now a matter of figuring out stores and states, which I think may be beyond my purview for today. &lt;/p&gt;

&lt;p&gt;This blog post has been turning out to be useful: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.logrocket.com/building-crud-application-svelte-firebase/#adding-crud-functionality" rel="noopener noreferrer"&gt;Building a CRUD application using Svelte and Firebase - LogRocket Blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;12/15/22&lt;/p&gt;

&lt;p&gt;Self-educating on stores before I try to mess with them too much. &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/TIFuMRJT89A"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This video is actually really helpful and gives me a clearer idea of how I am going to use stores to handle user sessions in my project. Basically the components will need to react to when the user is logged in. &lt;/p&gt;

&lt;p&gt;12/16/22&lt;/p&gt;

&lt;p&gt;MORNING &lt;/p&gt;

&lt;p&gt;Things are getting a little bit hairy as the app becomes more complex. My current problem is properly using stores - my data is doubling, I’m not rendering things to the DOM properly and I am losing steam on troubleshooting this. &lt;/p&gt;

&lt;p&gt;In the interest of completing something, or at least operating within my wheelhouse, I am not thinking in “simplify” mode. That is, how can I create a workable product with the things I know how to build and troubleshoot, without introducing the complexity of stores. &lt;/p&gt;

&lt;p&gt;[ ... ]&lt;/p&gt;

&lt;p&gt;We have success! Using stores, I am now able to reactively update my posts and things in the app. When I post a submission, the page updates since the store is updated. This is a huge win! I think we are in the tidying mode, since core functionality exits. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fa88mxct48d22r4g979k0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fa88mxct48d22r4g979k0.png" alt="Source code showing usage of Svelte stores."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The major thing on my mind now is a delete function, specifically for my own peace of mind especially as I am in development. Ugh, let’s write some to do’s: &lt;/p&gt;

&lt;p&gt;TO DO: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[x]  Delete old posts&lt;/li&gt;
&lt;li&gt;[x]  Order posts by submission time and date&lt;/li&gt;
&lt;li&gt;[x]  Show submission timestamp&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;12/17/22&lt;/p&gt;

&lt;p&gt;A reasonable thing to fix this evening is to figure out how to get new posts to display and behave properly. Right now if I put a new submission, it comes up as undefined, and  if I try to delete it, it gets jammed. Let’s take a look! &lt;/p&gt;

&lt;p&gt;[ ... ]&lt;/p&gt;

&lt;p&gt;Yay, we fixed it! It works! We had to write some redundant code, but I think I can live with it. &lt;/p&gt;

&lt;p&gt;[ ... ]&lt;/p&gt;

&lt;p&gt;Alright, we are half an hour in and I have successfully added timestamps, and we are beginning to figure out how to order and sort them. It’s a bit messy, but I know how to make queries that are ordered by timestamp. Right now, similar to the problem above, there are just some machinations that aren’t displaying the data in the order I want. JS management problem. &lt;/p&gt;

&lt;p&gt;[ ... ]&lt;/p&gt;

&lt;p&gt;Alright, we sorted out that problem (the problem was redundant code), which we can probably consolidate at another time. I think we got a surprising amount of work done in 40 minutes. &lt;/p&gt;

&lt;p&gt;12/19/22&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fib09t67kybssoscri0nk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fib09t67kybssoscri0nk.png" alt="The complete project, a simple journaling app."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ok this project feels done. Next one I am going to try is to make a &lt;a href="https://dev.to/connorthemiller/an-attempt-to-make-a-tiny-social-site-for-stoners-4fg"&gt;tiny social networking site for cannabis&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>firebase</category>
      <category>svelte</category>
      <category>beginners</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Another Attempt to Make a 2D VTuber</title>
      <dc:creator>connor miller</dc:creator>
      <pubDate>Tue, 04 Oct 2022 17:41:14 +0000</pubDate>
      <link>https://dev.to/connorthemiller/2d-vtuber-attempt-002-135j</link>
      <guid>https://dev.to/connorthemiller/2d-vtuber-attempt-002-135j</guid>
      <description>&lt;p&gt;In my &lt;a href="https://dev.to/connorthemiller/my-first-2d-vtuber-rig-1l6f"&gt;last post&lt;/a&gt; I assembled my first 2D vtuber. Inspired by how well it turned out, I decided to immediately try again with a couple upgrades: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eyes.&lt;/strong&gt; This rig will have pupils that look around. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hair.&lt;/strong&gt; My last rig was essentially bald. This one will have flowing hair that I will configure with hair physics. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mouth.&lt;/strong&gt; The mouth will be broken up into different parts so that we can have more sophisticated speech movements. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, I simplified the stack from last time, mainly just eliminating GIMP from the process. I read that Procreate can sometimes format .psd files in a way that Live2D doesn't like, but I have not experienced this yet (I think). &lt;/p&gt;

&lt;h2&gt;
  
  
  Software
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Procreate for iPad ($10)&lt;/li&gt;
&lt;li&gt;Live2D Cubmism (Free 42 day Trial, $15/mo after)&lt;/li&gt;
&lt;li&gt;Vtube Studio Pro on Steam, iPhone (Free Trial Version, Pro Version $20)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Drawing in Procreate
&lt;/h2&gt;

&lt;p&gt;My goal was to make a vtuber that would be easy to rig down the line, so I prioritized the design for functionality rather than beauty. Instead of wasting time trying to figure out how to draw anime eyes and perfect hair, I drew the simplest versions I could. Now that I had a stronger understanding of what each part needed to look like in order for me to animate it properly,I could separate all the layers in a way that would save time in Live2D later. &lt;/p&gt;

&lt;p&gt;This time around, I made sure to separate individual parts as much as possible: left and right eyeballs kept separate, irises kept separate, front and back hair pieces kept separate. I learned that the more parts you have isolated, the easier it is to manipulate them in Live2D. &lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.youtube.com/shorts/l0MrEvHohOI" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--kd6uLXM---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.ytimg.com/vi/l0MrEvHohOI/hq2.jpg%3Fsqp%3D-oaymwEoCOADEOgC8quKqQMcGADwAQH4Ac4FgAKmB4oCDAgAEAEYZCBkKGQwDw%3D%3D%26rs%3DAOn4CLBupoRLFcDCcmieC9IO7Uw7g0EqKA" height="360" class="m-0" width="480"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.youtube.com/shorts/l0MrEvHohOI" rel="noopener noreferrer" class="c-link"&gt;
          Time Lapse of Drawing Vtuber Rig 002 in Procreate - YouTube
        &lt;/a&gt;
      &lt;/h2&gt;
        
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--P0myW4ZC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.youtube.com/s/desktop/3587622d/img/favicon.ico" width="16" height="16"&gt;
        youtube.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Rigging in Live2D
&lt;/h2&gt;

&lt;p&gt;After the vtuber assets were drawn, it was time to rig them in Live2D. There are three main steps: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Assign parts to the right folders. &lt;/li&gt;
&lt;li&gt;Create meshes. &lt;/li&gt;
&lt;li&gt;Set parameters for how each part will move. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a major oversimplification, but this is how my brain is understanding the process so far. In my next couple vtubers, I imagine my learned rigging process will get more particular. &lt;/p&gt;

&lt;p&gt;Unfortunately, certain layers on my vtuber (cheeks, eye shine) went missing during rigging. After some quick Googling, I determined that I lose those parts because 1) I didn't mesh them properly and/or 2) they were lost when I made the texture atlas. I sincerely don't know what happened, but next time I am going to try and manually mesh parts to see if it makes any kind of difference. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4v4saJP3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mldkxw7gq62rbbk6fx0t.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4v4saJP3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mldkxw7gq62rbbk6fx0t.jpg" alt="Comparision between Procreate and Live2D Cubism" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am learning that the rigging process is definitely the most tedious bit. There is a lot of assigning layers to body parts, then carefully tweaking their movements with "parameters" in Live2D, which are essentially keyframes. &lt;/p&gt;

&lt;p&gt;This time, I put a little more elbow grease into designing the mouth. The mouth was divided up into lips, teeth, and tongue, with each one moving independently for maximum control. I googled "Mouth Rigging for Vtubers" and found this helpful resource from &lt;a href="https://www.youtube.com/channel/UCrlV1Iy0clxpfBADND4ONIQ"&gt;vtuber Kira Omori&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F7ySKchE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1mjinhroki7bett66ccm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F7ySKchE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1mjinhroki7bett66ccm.png" alt="Mouth Rigging Guide - Kira Omori" width="627" height="690"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using this as a guide, I marked the parameters for about half of these mouth forms. I could have gotten more in-depth and intricate, but again it was incredibly tedious and I think I will have more patience next time. &lt;/p&gt;

&lt;p&gt;Hair physics was also a new addition, and its implementation was relatively simple. I just chose the layers that I wanted to have their own physics, meaning they would bounce or sway when the character moved. I used the tutorial below to figure out my hair physics. &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Rh5DE1c4DCk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;p&gt;I now understand the 2D vtuber creation process better, which will allow me to plan out my time more effectively in the creation of more vtubers. I now have a couple characters in procreate that I'm drawing - my next creations will hopefully look a little bit cooler than vtuber 002, but now I know what goes into properly separating layers and what they should ideally do in Live2D cubism. &lt;/p&gt;

&lt;p&gt;There are many 2D vtubers that move so well that they look like they are 3D models. I'm going to watch more tutorials to see how to get this desired effect. I am most impressed by the work of Kira Omori, who I referenced above. Their vtuber creations look very clean, professional, and 3D (despite them being 2D in actuality. Achieving this level of refinement will definitely take practice and patience. &lt;/p&gt;

&lt;p&gt;Here is a demo of the final working rig: &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/a3pKE1_SDFw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>vtuber</category>
      <category>live2d</category>
      <category>procreate</category>
      <category>stream</category>
    </item>
    <item>
      <title>An Attempt to Make a 2D VTuber Rig</title>
      <dc:creator>connor miller</dc:creator>
      <pubDate>Tue, 13 Sep 2022 22:11:12 +0000</pubDate>
      <link>https://dev.to/connorthemiller/my-first-2d-vtuber-rig-1l6f</link>
      <guid>https://dev.to/connorthemiller/my-first-2d-vtuber-rig-1l6f</guid>
      <description>&lt;p&gt;This past weekend I wanted to see how quickly I could make a &lt;a href="https://en.wikipedia.org/wiki/VTuber"&gt;vtuber&lt;/a&gt; from scratch. "Vtuber" is short for "Virtual YouTuber", however most vtubers I watch nowadays are on Twitch or TikTok. You may have seen some of them around the internet, like &lt;a href="https://www.youtube.com/c/girldm"&gt;girldm&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Here's a short clip of the end result: &lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1569797061729730562-351" src="https://platform.twitter.com/embed/Tweet.html?id=1569797061729730562"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1569797061729730562-351');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1569797061729730562&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  Software:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Procreate for iPad ($10)&lt;/li&gt;
&lt;li&gt;Live2D Cubmism (Free 42 day Trial, $15/mo after)&lt;/li&gt;
&lt;li&gt;Prpr Live (Free)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First, I drew my character concept in Procreate. I really like the "Hellboy" comics, so I drew basically fanart of the character. I intentionally didn't add a lot of clothing or lots of hair so that I would have lets parts to animate later down the line. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jkqOEBk5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bztmxyyf1jfs8uc3pxo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jkqOEBk5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bztmxyyf1jfs8uc3pxo.jpg" alt="Character concept." width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;
Character concept



&lt;p&gt;Next, I needed to make the official character model. This would be the one that I would eventually use in my rigging software. I didn't know exactly what I was doing, but I knew that for animation later I would have do divide all of the different parts of the character into different layers using a photo editor. Granted, I &lt;em&gt;could&lt;/em&gt; do this completely in Procreate, but it felt way more natural to me to separate most of the parts on my desktop computer. &lt;/p&gt;

&lt;p&gt;So, I watched a &lt;a href="https://www.youtube.com/watch?v=y7AIL_0ybLw"&gt;YouTube video&lt;/a&gt; on what parts I needed to sketch out and separate, and made a sketch 2.0. You can see the time lapse of the drawing below. &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1569800388517429249-949" src="https://platform.twitter.com/embed/Tweet.html?id=1569800388517429249"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1569800388517429249-949');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1569800388517429249&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pKXqL2ls--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o2d7lqbixf55vdduml7h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pKXqL2ls--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o2d7lqbixf55vdduml7h.jpg" alt="Model and Procreate layers" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;
Model and Procreate layers.



&lt;p&gt;Next, I exported the file as a .psd and opened this with GIMP. The model was basically all drawn, but I needed to copy and edit the layers so that the things that I drew symmetrically in Procreate so that each individual part had its own layer. This mean duplicating the layers, deleting respective halves of things. In the future, I think I will do a better job at this. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FAVRLYvd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z6ber8056nwjujisrz7h.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FAVRLYvd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z6ber8056nwjujisrz7h.JPG" alt="GIMP edit." width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;
GIMP edit



&lt;p&gt;I exported the file as .psd again, and now I was ready to rig! I dutifully followed this &lt;a href="https://www.youtube.com/watch?v=kU7csuuEozA"&gt;8 part YouTube series&lt;/a&gt; on how to do just that, and I highly recommend giving it a look. &lt;/p&gt;

&lt;p&gt;I used Live2D Cubism to rig my model, per the recommendation of the YouTube tutorial I was following. The main obstacle here was time and patience. For each part of your character model, you had to name and assign folders and layers and hierarchies. The first half of my Live2D work was making sure everything was assigned to the right folder, then I assigned Warp Deformers and Rotators, which are basically the puppet strings for controlling your rig. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d_e4sklq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ii3w77axnxct5vcnl5cr.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d_e4sklq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ii3w77axnxct5vcnl5cr.JPG" alt="Live2D rigging" width="800" height="593"&gt;&lt;/a&gt;&lt;/p&gt;
Live 2D rigging



&lt;p&gt;In this step, I realized that I should have separated a lot more of my layers, specifically the individual eyes and eyebrows. Further, mouth animation requires the mouth to be divided in 4+ parts so that it can mimic the many different shapes of human speech. I concluded that I would learn the nuances of mouth rigging another day, and for the time being I just wanted to get a quick-and-dirty vtuber up and running. &lt;/p&gt;

&lt;p&gt;After assigning all the deformers, I had to go into each part of my vtuber's model and define how the model would change in response to facial input. Another way to say this is that I was assigning keyframes, so that my rig could transition expressions and movements from point A to point B. This was also tedious and time consuming. I broke up the work over 2-3 days. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l8hIFGcT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2yz6x5jqej6zi8rqjgsa.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l8hIFGcT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2yz6x5jqej6zi8rqjgsa.JPG" alt="Rigging parameters" width="724" height="745"&gt;&lt;/a&gt;&lt;/p&gt;
Rigging parameters



&lt;p&gt;I took some shortcuts in the interest of time (skipping hair physics, pupil movement, clothing physics, or nuanced mouth movement). I was impatient, which I think is my preferred learning mode for a first stab at a project. When I do this again, I'll have a better idea of what needs more time and attention, and I can plan accordingly. &lt;/p&gt;

&lt;p&gt;I exported the Live2D model into the compatible format for our preview software, Prpr Live, which is a free download on steam. This software takes input from your camera to move the parts of your vtuber. It tracks your face and body movement, then finds those parts and parameters you assign in Live2D to make the character move. And viola - a fully functionally vtuber, ready to take the internet by storm. &lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I think a week is a reasonable amount of time for me to try and make another vtuber from beginning to end. &lt;/li&gt;
&lt;li&gt;Each step is tedious. I recommend breaking up each step by program and taking breaks between each software change. &lt;/li&gt;
&lt;li&gt;I need to dedicate time specifically for learning how to rig mouths in a way that is efficient and responsive. &lt;/li&gt;
&lt;li&gt;Making a vtuber is fun! And I am happy that I am trying to get a handle on it more. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How to Make a 3D VTuber Avatar From Scratch, Part 0: Considerations &lt;a href="https://www.youtube.com/watch?v=y5FfJ4btBN8"&gt;https://www.youtube.com/watch?v=y5FfJ4btBN8&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;How to Make a 2D Vtuber Model &lt;a href="https://www.youtube.com/watch?v=y7AIL_0ybLw"&gt;https://www.youtube.com/watch?v=y7AIL_0ybLw&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live2D Full Guide and Tutorial [ Part 1/8 - Setting Up The Essentials ] 【VTuber/Artist】&lt;a href="https://www.youtube.com/watch?v=kU7csuuEozA"&gt;https://www.youtube.com/watch?v=kU7csuuEozA&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>vtuber</category>
      <category>procreate</category>
      <category>live2d</category>
      <category>prprlive</category>
    </item>
    <item>
      <title>An Attempt to Make US Congressional Trading Cards</title>
      <dc:creator>connor miller</dc:creator>
      <pubDate>Sun, 05 Jun 2022 21:54:16 +0000</pubDate>
      <link>https://dev.to/connorthemiller/weekend-project-us-congressional-trading-cards-in-progress-1ncm</link>
      <guid>https://dev.to/connorthemiller/weekend-project-us-congressional-trading-cards-in-progress-1ncm</guid>
      <description>&lt;p&gt;Ahoy! My name is Connor and I am a hobby programmer that likes to embark on "code as craft" projects. I do this as a way to gain practical knowledge, and to continuously teach myself new things about programming. &lt;/p&gt;

&lt;p&gt;This weekend I started a project in which I tried to make US Congressional Trading Cards - that is, "Yu-Gi-Oh" style cards that contain legislators rather than monsters. And let's be honest - sometimes it's hard to tell the difference. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v7TgyNNE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lozmuhldd2r4vtc7ygq9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v7TgyNNE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lozmuhldd2r4vtc7ygq9.jpg" alt="This is a Yu-Gi-Oh card." width="800" height="1159"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding Congressional data
&lt;/h2&gt;

&lt;p&gt;First step was to find Congressional data. I went to Kaggle and found &lt;a href="https://www.kaggle.com/datasets/rishidamarla/us-legislators-data-senators-and-representatives"&gt;this spreadsheet&lt;/a&gt;, which was a rather small dataset that didn't even include legislator party information. Rather, it was a directory of links to other information sources. &lt;/p&gt;

&lt;p&gt;Next, I went to the &lt;a href="https://projects.propublica.org/api-docs/congress-api/"&gt;ProPublica Congress API&lt;/a&gt;, which contains up-to-date information on United States legislators. I got an API key and did some test pulls in &lt;a href="https://retool.com/"&gt;Retool&lt;/a&gt; which proved to be successful and more of what I was looking for. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2Y0PquO3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l59monhj1ch0bnb0swsw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2Y0PquO3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l59monhj1ch0bnb0swsw.png" alt="ProPublica data." width="800" height="801"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The ProPublica dataset contained a lot of useful information, like names, party affiliation, birthday and more, but it did not have profile photo URLs. Fortunately, I saw that each senator had a &lt;code&gt;google_entity_id&lt;/code&gt; which I quickly learned was for the &lt;a href="https://developers.google.com/knowledge-graph"&gt;Google Knowledge Graph API&lt;/a&gt;. I enabled this service, and was able to use the &lt;code&gt;entity_id&lt;/code&gt; to pull images for each senator from Google Knowledge Graph. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UKccRlTA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oojntuzx6co87l4n28fc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UKccRlTA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oojntuzx6co87l4n28fc.png" alt="Photos populating in Retool prototype." width="800" height="765"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Frontend Design
&lt;/h2&gt;

&lt;p&gt;Now that I had most of the data I needed, it was time to work on the front-end. I used &lt;a href="https://www.figma.com/"&gt;Figma&lt;/a&gt; to design Yu-Gi-Oh card templates, and copied the CSS to assemble the cards in &lt;a href="https://glitch.com/"&gt;Glitch&lt;/a&gt;, an online IDE for students. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6nP87fBa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wffcm9kitdmbym46tkov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6nP87fBa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wffcm9kitdmbym46tkov.png" alt="Design in Figma" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ir5ZPS0V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jqhzlvefcqex4up1drbq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ir5ZPS0V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jqhzlvefcqex4up1drbq.png" alt="Transferred to Glitch" width="800" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Current Problems: Bringing It All Together
&lt;/h2&gt;

&lt;p&gt;I initially tried pulling the data from ProPublica by writing my own API GET requests using NodeJS. Four hours later, it was clear that I didn't know what I was doing, and I wasn't able to get usable data to populate the client. There were two main issues: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;I have trouble getting data out of nested callback functions.&lt;/strong&gt; This is something I have always struggled with in my hobby code projects. I know that learning more about Javascript Promises might help, but I felt like there might be easier solutions than working with NodeJS to get the data. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The data was delivered as a Buffer, which I didn't know how to convert properly&lt;/strong&gt;. I don't really know what a Buffer data type is, and despite a lot of Googling, I was not able to convert the data into usable JSON. I troubleshooted this for the greater part of an afternoon before I decided to cut my losses and try something else. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ideally, I would love to just make the requests to the API directly from the client using &lt;code&gt;fetch&lt;/code&gt;, but to my knowledge this would expose my API Keys, which would be bad. &lt;/p&gt;

&lt;p&gt;I took a nap, and when I woke thought this might be a good opportunity to use &lt;a href="https://firebase.google.com/"&gt;Google Firebase&lt;/a&gt; to solve my back-end woes. I instantiated Firebase in my project, then realized that I would need to get the ProPublica data into Google Firestore in order to use it, or I would need to construct a helper function that allowed me to request data from ProPublica through Firebase. If I remember correctly, Firebase allows me to securely make requests to my databases through the client, but it has been so long since I've used Firebase that I will need to re-educate myself on how it works. &lt;/p&gt;

&lt;p&gt;That's where I am at as of today, 6/5/22. I know where to pull my data from, but I'm not sure exactly how to access it within my app. Further, I am going to need to figure out how to dynamically render that data on the front end. Using vanilla JS to do this sounds tedious - in previous projects I've used VueJS for this kind of thing, but again I will need to re-educate myself on how to use that framework. &lt;/p&gt;

&lt;p&gt;When I revisit this project, I think the most important thing for me to focus on is how to get a single senator's data onto the trading card template. First, I'll noodle around with Firsebase to see if I can make those API calls with helper functions and send them to my app. Then I'll spend some experimenting with the easiest way to render that data on the card template. &lt;/p&gt;

&lt;p&gt;You can check out the app so far here: &lt;br&gt;
Code: &lt;a href="https://glitch.com/edit/#!/congressional-trading-cards"&gt;https://glitch.com/edit/#!/congressional-trading-cards&lt;/a&gt;&lt;br&gt;
Preview: &lt;a href="https://congressional-trading-cards.glitch.me/"&gt;https://congressional-trading-cards.glitch.me/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Three Questions to Ask Yourself When Running an Online Community</title>
      <dc:creator>connor miller</dc:creator>
      <pubDate>Wed, 25 May 2022 17:12:28 +0000</pubDate>
      <link>https://dev.to/connorthemiller/three-questions-to-ask-yourself-when-running-an-online-community-4cak</link>
      <guid>https://dev.to/connorthemiller/three-questions-to-ask-yourself-when-running-an-online-community-4cak</guid>
      <description>&lt;p&gt;Ahoy! My name is Connor and I manage a community of communities - that is, I work with over 5k admins who manage online spaces with member counts ranging from 500 to 800k. Every week they come to me with questions like "What are the best practices for running online communities?"&lt;/p&gt;

&lt;p&gt;Here are the three questions I ask that helps clarify next steps for growing and enriching your online community. &lt;/p&gt;

&lt;h2&gt;
  
  
  What is the value that your community offers?
&lt;/h2&gt;

&lt;p&gt;Every community provides value to its members, which is likely why the community was founded in the first place. Identifying the specific value that your community provides helps clarify what events, resources, and opportunities you may want to pursue. &lt;/p&gt;

&lt;p&gt;Some example value that online communities offer: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hanging Out&lt;/strong&gt;. These social communities draw people in to find likeminded friends. A community like this may optimize for mixer events or gaming, as folks come to these communities for casual networking. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Professional Development&lt;/strong&gt;. These communities unite industry professionals with amateurs. If you work in a specific industry (e.g. tech, design, boating), odds are that you experience problems that select few people understand. A community like this may offer portfolio/resume reviews, AMA panels, and skills workshops. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Common Interest/Hobby&lt;/strong&gt;. These communities are enthusiastic fans of a particular thing (e.g. Anime, Legos, Gardening). These folks likely want to be immersed in content regarding their favorite pastime, or they are looking for other superfans to discuss the intricacies of their hobby. A community like this may offer show-and-tell opportunities, watch-together events, and co-make sessions. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have a community where members are confused as to why they are there, consider dropping a survey asking "When you first joined this community, what were you expecting?" Sometimes this will reveal that the value of your server was not (for example) finding friends, but instead finding deals on consoles. If the majority of people joining your server are looking for a specific thing, you will certainly want to adapt, adjust, and double down on whatever that specific thing is. &lt;/p&gt;

&lt;h2&gt;
  
  
  What is the reason someone would return to your community?
&lt;/h2&gt;

&lt;p&gt;"Retention" is a measure of how many people join a community and end up staying there. One rule of thumb you can use is to ask yourself "How many newcomers return to my community within a week or so?". If you have a community surrounding a popular topic (e.g. Houseplants), but none of the members contribute or talk to each other, it would be hard to convince a newcomer to return. &lt;/p&gt;

&lt;p&gt;I find that having regular events with your community, no matter how small, shows a newcomer that the community is alive, maintained, and engaged. For example, imagine the Houseplants community hosting a monthly "Help My Plants are Dying" workshop, both experts and amateurs will return to learn, give advice, or be entertained. &lt;/p&gt;

&lt;p&gt;In my own server, I host a weekly Crossword Hour where we collectively work on a crossword together. Attendance grows from month to month as members of my community see that this is a predictable and regular occurrence that people enjoy. Folks are more likely to engage with us when they expect us to show up at certain times. &lt;/p&gt;

&lt;p&gt;Whether your events are weekly, monthly, or quarterly, establishing a regular, consistent, and predictable rhythm of &lt;em&gt;stuff to do&lt;/em&gt; will give newcomers a reason to return. I like to think of events as the &lt;em&gt;pulse&lt;/em&gt; of any online community - it shows people that the interactions are alive and well. &lt;/p&gt;

&lt;h2&gt;
  
  
  What are you building together?
&lt;/h2&gt;

&lt;p&gt;One of my favorite online experiences was &lt;a href="https://en.wikipedia.org/wiki/Twitch_Plays_Pok%C3%A9mon"&gt;Twitch Plays Pokémon&lt;/a&gt; in 2014, where 80k viewers watched and played a single game of Pokemon Red together. Once complete, the event was heavily documented and became a kind of lore for the people who witnessed it. The event created an &lt;em&gt;artifact&lt;/em&gt; of the collective experience - the thousands of people that played together contributed to the story.&lt;/p&gt;

&lt;p&gt;This example may be "very online" and hard to understand, so I'll offer another example: one event that I host with my online communities is a "Draw Together" event. Here, we use &lt;a href="https://magmastudio.io/"&gt;Magma Studio&lt;/a&gt; to draw on a blank canvas together. It gets chaotic very quickly (imagine simultaneously working on a Photoshop file with ten other people) and the results are often a bit... avant garde. But, the creations themselves are &lt;em&gt;artifacts&lt;/em&gt;, that convey the message "Hey, here is proof that we spent time together, and what a good time it was." &lt;/p&gt;

&lt;p&gt;These artifacts serve as souvenirs that remind folks of the time they spent with their community. Often, community managers have a difficult time measuring the "success" of their online communities. For myself, I measure success through the creation of artifacts like certificates, paintings, and leaderboards. When considering artifacts, try to think of the easiest way to attach a memory of a great event to a tangible (ish) souvenir. &lt;/p&gt;




&lt;p&gt;Hopefully this helps you develop some actionable strategies for increasing member count or engagement in your online community - again, these are far from &lt;em&gt;all&lt;/em&gt; the questions you can ask yourself, but they are some of the most common that I recommend as I coach folks through community maintenance.&lt;/p&gt;

</description>
      <category>community</category>
      <category>discord</category>
      <category>startup</category>
      <category>management</category>
    </item>
  </channel>
</rss>
