<?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: nabettu</title>
    <description>The latest articles on DEV Community by nabettu (@nabettu).</description>
    <link>https://dev.to/nabettu</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%2F43753%2F96fdc0c2-e0cc-46bf-a3e1-b2e94042a235.jpg</url>
      <title>DEV Community: nabettu</title>
      <link>https://dev.to/nabettu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nabettu"/>
    <language>en</language>
    <item>
      <title>Cost-effective architecture: Using Firestore in Next.js APIs on Cloudflare Pages &amp; Workers.</title>
      <dc:creator>nabettu</dc:creator>
      <pubDate>Tue, 18 Mar 2025 07:05:46 +0000</pubDate>
      <link>https://dev.to/nabettu/cost-effective-architecture-using-firestore-in-nextjs-apis-on-cloudflare-pages-workers-5hh1</link>
      <guid>https://dev.to/nabettu/cost-effective-architecture-using-firestore-in-nextjs-apis-on-cloudflare-pages-workers-5hh1</guid>
      <description>&lt;p&gt;Hello, I’m &lt;a href="https://x.com/pancat_dev" rel="noopener noreferrer"&gt;watanabe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Recently, the rising costs of hosting Next.js applications on Vercel have prompted many to seek alternative solutions. &lt;/p&gt;

&lt;p&gt;While converting applications to static site SPAs is one approach, it introduces challenges such as setting individual OGP images and managing APIs.&lt;/p&gt;

&lt;p&gt;Using Firebase App Hosting or Cloud Run is another alternative, but these services can become costly as access increases, posing challenges for those on a budget.&lt;/p&gt;

&lt;p&gt;This has led to growing interest in hosting Next.js applications using Cloudflare Pages and Workers. However, a significant challenge arises: the Firebase Admin SDK relies on Node.js’s internal libraries, which are unavailable in Edge runtime environments like Cloudflare Workers or Vercel Edge Functions. This limitation hinders the use of Firebase services in such environments.&lt;/p&gt;

&lt;p&gt;Addressing this issue could enable the use of Firebase’s comprehensive services, such as Authentication and Firestore, without incurring substantial hosting fees.&lt;/p&gt;

&lt;p&gt;※It’s worth noting that while Firestore costs can escalate with high read volumes, implementing caching strategies via APIs can mitigate these expenses. However, utilizing Firestore through APIs necessitates REST API access.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges of Firebase Authentication in Edge Runtime Environments
&lt;/h2&gt;

&lt;p&gt;Firebase Authentication is a robust tool for implementing user authentication. However, the official Firebase Admin SDK heavily depends on Node.js’s internal libraries, which aren’t available in Edge runtime environments like Cloudflare Workers or Vercel Edge Functions. This necessitates alternative solutions for using Firebase Authentication in such environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Edge-Compatible Authentication Library: next-firebase-auth-edge
&lt;/h2&gt;

&lt;p&gt;To address this challenge, next-firebase-auth-edge has been developed. This library leverages the Web Crypto API to handle the creation and verification of custom ID tokens, enabling Firebase Authentication in Edge runtimes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/awinogrodzki/next-firebase-auth-edge" rel="noopener noreferrer"&gt;https://github.com/awinogrodzki/next-firebase-auth-edge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compatibility with Latest Next.js Features: Supports functionalities like App Router and Server Components.&lt;/li&gt;
&lt;li&gt;Zero Bundle Size: Avoids adding extra JavaScript code to the client bundle by handling all processes server-side.&lt;/li&gt;
&lt;li&gt;Minimal Configuration: Eliminates the need for custom API routes or modifications to next.config.js; everything is managed through middleware.&lt;/li&gt;
&lt;li&gt;Security: Utilizes the jose library for JWT verification, with user cookies signed using rotating keys to prevent cryptographic attacks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For detailed setup instructions and usage examples, refer to the official documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Utilizing Firestore in Edge Runtime Environments
&lt;/h2&gt;

&lt;p&gt;While solutions like next-firebase-auth-edge exist for Firebase Authentication, there was a lack of suitable libraries for Firestore in Edge environments. To bridge this gap, I developed firebase-rest-firestore. This REST API client facilitates Firestore operations in Edge runtimes and offers the following features:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nabettu/firebase-rest-firestore" rel="noopener noreferrer"&gt;https://github.com/nabettu/firebase-rest-firestore&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edge Runtime Compatibility: Operates in environments where the Firebase Admin SDK is unavailable.&lt;/li&gt;
&lt;li&gt;Comprehensive CRUD Support: Supports creation, reading, updating, and deletion of documents.&lt;/li&gt;
&lt;li&gt;TypeScript Support: Provides type definitions for seamless development.&lt;/li&gt;
&lt;li&gt;Token Caching for Performance: Implements token caching to enhance performance.&lt;/li&gt;
&lt;li&gt;Intuitive API: Offers a straightforward interface, mirroring the Firebase Admin SDK’s design.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Usage Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;createFirestoreClient&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="s2"&gt;firebase-rest-firestore&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Create a client with your configuration&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;firestore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createFirestoreClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;projectId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;your-project-id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;privateKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;your-private-key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;clientEmail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;your-client-email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Create a document with an auto-generated ID&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gameRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;firestore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;games&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;gameRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The Legend of Zelda&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;genre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Action-adventure&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;releaseYear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1986&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Read the document&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;gameRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;data&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// Update the document&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;gameRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;releaseYear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1987&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more information, visit the firebase-rest-firestore GitHub repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Overcoming the limitations of Firebase services in Edge runtime environments is crucial for cost-effective and efficient application development. By leveraging libraries like next-firebase-auth-edge and firebase-rest-firestore, developers can implement authentication and database operations in Edge environments, optimizing both performance and costs.&lt;/p&gt;

&lt;p&gt;If you found this information helpful, consider starring the firebase-rest-firestore GitHub repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nabettu/firebase-rest-firestore" rel="noopener noreferrer"&gt;https://github.com/nabettu/firebase-rest-firestore&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>cloudflare</category>
      <category>firebase</category>
      <category>firestore</category>
    </item>
    <item>
      <title> "array-contains-any" &amp; "IN query" now on Firebase Firestore! Sample codes and demo.</title>
      <dc:creator>nabettu</dc:creator>
      <pubDate>Wed, 30 Oct 2019 03:37:36 +0000</pubDate>
      <link>https://dev.to/nabettu/array-contains-any-was-created-in-firebase-firestore-so-i-will-explain-it-with-a-sample-site-4g9</link>
      <guid>https://dev.to/nabettu/array-contains-any-was-created-in-firebase-firestore-so-i-will-explain-it-with-a-sample-site-4g9</guid>
      <description>&lt;p&gt;The convenient query &lt;strong&gt;array-contains-any&lt;/strong&gt; &amp;amp; &lt;strong&gt;IN query&lt;/strong&gt; has finally entered the JS SDK, so I tried using it!&lt;/p&gt;

&lt;p&gt;Since it has just entered the SDK, there is no shadow or shape in the official document yet (as of 10/30/2019)&lt;/p&gt;

&lt;h1&gt;
  
  
  What is array-contains-any
&lt;/h1&gt;

&lt;p&gt;Until now, if you specified "array-contains" for "where", you could search for a document &lt;strong&gt;with a specific value in array&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The actual code looks like this, and you can search for documents with "tech" in the array field in the blogs collection.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;firebase&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firestore&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blogs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;array-contains&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tech&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;array-contains-any is an evolution of it. You can search for documents where the array contains one of the specific values.&lt;/p&gt;

&lt;p&gt;The actual code looks like this, and you can search for &lt;strong&gt;documents that contain either "tech" or "game" in the array field&lt;/strong&gt; in the blogs collection. &lt;/p&gt;

&lt;p&gt;Basically the same as array-contains, but you can pass an array as the third argument of where.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;firebase&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firestore&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blogs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;array-contains-any&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tech&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;game&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And if any of this array is in, it will hit the search.&lt;/p&gt;

&lt;p&gt;Now you can make a query that can describe an OR condition. Therefore, I think that the range that can be searched with Firestore alone will expand.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is IN Query
&lt;/h1&gt;

&lt;p&gt;The usage is as follows!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;firebase&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firestore&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blogs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;in&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tweet&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;podcast&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;A query that hits if it exactly matches either tweet or podcast in the type field.&lt;/p&gt;

&lt;p&gt;You can now OR search for specific fields like array-contains-any! (Since it is an exact match, free string search is not possible yet)&lt;/p&gt;

&lt;p&gt;Example of use) In a fold that contains a fixed type as described above, you can search for "when it matches a tweet or podcast".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is a query that executes the data corresponding to "==" in all the arrays and summarizes the results.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Created a sample site
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://firestore-sandbox.netlify.com"&gt;https://firestore-sandbox.netlify.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here you can execute both Array Contains and Array Contains Any on the sample data.&lt;/p&gt;

&lt;p&gt;Click here for the repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nabettu/firestore-sandbox"&gt;https://github.com/nabettu/firestore-sandbox&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;The conditions that can be used so far are the same as array-contains, but the range of search can be made without using Algolia, so it seems to be useful!&lt;/p&gt;

&lt;p&gt;that's all!&lt;/p&gt;

</description>
      <category>firebase</category>
      <category>firestore</category>
    </item>
    <item>
      <title>How to write technical articles to be read? Summarized the points when writing technical articles.</title>
      <dc:creator>nabettu</dc:creator>
      <pubDate>Tue, 18 Dec 2018 02:39:55 +0000</pubDate>
      <link>https://dev.to/nabettu/how-to-write-technical-articles-to-be-read-i-summarized-the-points-when-writing-technical-articles-19ln</link>
      <guid>https://dev.to/nabettu/how-to-write-technical-articles-to-be-read-i-summarized-the-points-when-writing-technical-articles-19ln</guid>
      <description>&lt;p&gt;Everyone, are you writing technical articles? This time I will write about &lt;strong&gt;writing the technical article itself&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Should I write technical articles?
&lt;/h1&gt;

&lt;p&gt;Even if you are not an engineer &lt;strong&gt;"Information dissemination" is important&lt;/strong&gt;. It might not be a freelance, but also leads to work from there. &lt;strong&gt;It would be better to write rather than write&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Of course, if you write for the purpose of taking work, you should write it because it is a fine sales activity. Dialing up-to-date information and so on will be branding.&lt;/p&gt;

&lt;p&gt;For those who do not, it is a good idea to keep as much logs as possible, such as contents that are troubled by errors. After 3 months you will get the same error and you will read it. Lol&lt;/p&gt;

&lt;p&gt;However it is subtle to write until impossible. Let's take a relaxation level so as not to reduce the time to write the code.&lt;/p&gt;

&lt;h1&gt;
  
  
  I would like to be read if it writes anyway
&lt;/h1&gt;

&lt;p&gt;First, we classified what kind of technical articles are. For the translation article as well, the contents themselves are not the following feelings.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trend article&lt;/li&gt;
&lt;li&gt;Summarize the troubles&lt;/li&gt;
&lt;li&gt;Article summarizing what you studied&lt;/li&gt;
&lt;li&gt;Introduces what you were making as a case &lt;/li&gt;
&lt;li&gt;Article to write about what people asked&lt;/li&gt;
&lt;li&gt;Poem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each, I will write important points to be read.&lt;/p&gt;

&lt;h1&gt;
  
  
  Trend article
&lt;/h1&gt;

&lt;p&gt;Anyway trend articles &lt;strong&gt;Speed ​​is important&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Let's quickly post articles within 3 days that people in the neighborhood say, "Oh, new library is out" or what it is.&lt;/p&gt;

&lt;p&gt;And it is quite important that the trend article is concise. Because people are central to want to know the summary to the last.&lt;/p&gt;

&lt;p&gt;Therefore, if you can write content like "I understand it," you can say "Oh ~ React hooks, perfectly understood" and share it.&lt;/p&gt;

&lt;p&gt;It might not be a blog after all. Sometimes it is good on Twitter or Youtube.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summarize the troubles
&lt;/h1&gt;

&lt;p&gt;Anyway the error log is important!&lt;/p&gt;

&lt;p&gt;Let's put the most important wording that comes out with &lt;strong&gt;error message on the title if possible&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is to make it possible for people who got on that error to arrive. In other words, do not expect it to be read immediately after writing.&lt;/p&gt;

&lt;p&gt;After that, since it is necessary to hit on google, minimum SEO is important!&lt;br&gt;
If lose the rank to "Zero answer question at stackoverflow" were too pitiful to look at. lol&lt;/p&gt;

&lt;p&gt;Even if it's not an error, let's make it a title that seems to be googling, such as "foo is not work".&lt;/p&gt;

&lt;p&gt;However, if you write an article with a niche error wording, it feels okay.&lt;/p&gt;

&lt;p&gt;You will thank my past past when you forgot.&lt;/p&gt;
&lt;h2&gt;
  
  
  Article summarizing what you studied
&lt;/h2&gt;

&lt;p&gt;This is important &lt;strong&gt;comprehensiveness&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Even if you write comparative articles, it is important to write reference articles carefully and to be written comprehensively even if it is long.&lt;/p&gt;

&lt;p&gt;"With this and this, which one is the fastest in the end ..."? I want to avoid such things as getting departed.&lt;/p&gt;

&lt;p&gt;Also, this is also important SEO because it will not be read unless it is displayed in the first page on google.&lt;/p&gt;
&lt;h2&gt;
  
  
  Introduces what you were making as a case
&lt;/h2&gt;

&lt;p&gt;Tightly &lt;strong&gt;Writing to be advertising&lt;/strong&gt; is important!&lt;/p&gt;

&lt;p&gt;If a person does not come to the thing which it made after all, it means meaningless to put it.&lt;/p&gt;

&lt;p&gt;The ideal is to become "product launch" → "How do you make this service here?" → "Wow ~ commentary articles have a certain share and share".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Only articles that I just want to advertise are noise&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Article to write about what people asked
&lt;/h2&gt;

&lt;p&gt;When dropping the content asked by someone into an article. It is appreciated by shouting out the URL of the article even if asked by the same person twice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It is important whether the person heard is content that is satisfactory&lt;/strong&gt;. Would it be better if a person asked about the content checks it?&lt;/p&gt;

&lt;p&gt;After that, &lt;strong&gt;Being asked is surely demanded&lt;/strong&gt; Since it is an article, if you have such an opportunity, you'd better write it carefully in the article.&lt;/p&gt;
&lt;h1&gt;
  
  
  Poem
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Emotional content is important&lt;/strong&gt;. Let's open the emotion as much as possible. If you have emotional content, then you do not need anything. &lt;/p&gt;

&lt;p&gt;It will be read more naked. That's the internet.&lt;/p&gt;
&lt;h1&gt;
  
  
  Important points when writing entirely
&lt;/h1&gt;
&lt;h1&gt;
  
  
  The title is important
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;It is important to incorporate the technical content you used or something to be subtracted&lt;/strong&gt;. I want to make it not longer than 30 characters or the like (it was not such a limit that letters cut by google search)&lt;/p&gt;
&lt;h2&gt;
  
  
  Let me know the date you wrote the article
&lt;/h2&gt;

&lt;p&gt;Personal blogs may forget to display dates in the first place. You have trouble later when you write old articles as old as they are old.&lt;/p&gt;
&lt;h2&gt;
  
  
  Write down the operating environment etc. as much as possible
&lt;/h2&gt;

&lt;p&gt;And I will post version information as much as possible. It is best if the reproduction environment with codepen.&lt;/p&gt;
&lt;h1&gt;
  
  
  Should I write even if it is short?
&lt;/h1&gt;

&lt;p&gt;No matter how short it is better to write than not write.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error Wording

In the third line of foo.js, bar

I fixed it after writing this line.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Even just three lines are worth it!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It may help someone in trouble with the same error.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even if information gets old and subtle, it is google's job not to go out of that article, so &lt;strong&gt;you do not have to worry about it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If anything I can afford to write, let's write. It will never be negative.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Let's be aware that there are points to be read by writing articles&lt;/li&gt;
&lt;li&gt;Well, most articles are not read in the first place, so do not mind even if you do not read it&lt;/li&gt;
&lt;li&gt;It's better to write as carefully as possible, but let's get out of time as soon as possible&lt;/li&gt;
&lt;li&gt;The location may be changed depending on what kind of output you want to do&lt;/li&gt;
&lt;li&gt;Let's write virtues anyway afterwards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;I wrote something like this, but it is great just by sending out first!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you can afford to write a variety of easy-to-read articles! &lt;strong&gt;Anyway, if there are 3 lines at first, okay! ! !&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;that's all.&lt;/p&gt;

&lt;p&gt;This article is a translation of &lt;a href="https://blog.nabettu.com/entry/about-techentry"&gt;https://blog.nabettu.com/entry/about-techentry&lt;/a&gt;&lt;/p&gt;

</description>
      <category>writing</category>
    </item>
    <item>
      <title>個人開発のモチベーションが続かない、作り終わらない。原因と対策を考えてみた。</title>
      <dc:creator>nabettu</dc:creator>
      <pubDate>Tue, 18 Dec 2018 02:03:11 +0000</pubDate>
      <link>https://dev.to/nabettu/-20lm</link>
      <guid>https://dev.to/nabettu/-20lm</guid>
      <description>&lt;p&gt;&lt;a href="https://twitter.com/Neko_Inu_/status/1063308508718755840"&gt;運営者ギルド&lt;/a&gt;という、個人や少人数チームでWebサービスやアプリを作っている人のSlackチームがありまして、そこで &lt;a href="https://twitter.com/furuta_app"&gt;furuta&lt;/a&gt; さんや&lt;a href="https://twitter.com/naichilab"&gt;naichi&lt;/a&gt; さんとチャットしていて、個人サービスを作っていて「モチベーションが続かない」「いつの間にか辛くなってくる」という&lt;strong&gt;個人開発あるある&lt;/strong&gt;について話していました。&lt;/p&gt;

&lt;p&gt;個人開発は&lt;strong&gt;「自分の作りたいもの」&lt;/strong&gt;を&lt;strong&gt;「自分の使いたい技術」&lt;/strong&gt;で&lt;strong&gt;「自分の好き」&lt;/strong&gt;に作れる&lt;strong&gt;最高の舞台&lt;/strong&gt;です。クリエイターならやらない手はないでしょう。&lt;/p&gt;

&lt;p&gt;しかし、何も考えずにいざ足を踏み入れてみると、思ったよりも険しい道だと気づくのです。&lt;/p&gt;

&lt;p&gt;仕事でもなく「自分が作りたくて作っていた」はずなのに、いつの間にかどこかに逃げ出してしまうモチベーション。何ヶ月経っても作り終わらない現代のサグラダ・ファミリア。仕事がバタついて1週間面倒見ていなかっただけで「え、なにこのクソコード」と毒づいてしまうほど荒れ果てたmasterブランチ。あのころ目指していた「一発当てて平日昼間から温かいこたつでレディボーデンを頬張っている自分の姿」はどこへやら。&lt;/p&gt;

&lt;p&gt;そんな目も当てられない状況、私にもありました。振り返ってみて&lt;strong&gt;「どうしてこうなった。」&lt;/strong&gt;とならないために、原因と対策を考えてみたのでみなさんのご参考になればと思います。&lt;/p&gt;

&lt;h1&gt;
  
  
  構想がでかすぎて作りきれない
&lt;/h1&gt;

&lt;p&gt;まずこれ。&lt;/p&gt;

&lt;p&gt;「すっげーいいアイディア思いついた！！！」ってテンション上がって「どうせなら高いレンタルサーバー借りよう」とか（そもそも借りるのは公開直前でいい）言い出してて気づいていない落とし穴。&lt;/p&gt;

&lt;p&gt;スケールがデカイのはいいことですが、本当にそれは&lt;strong&gt;自分ひとりで作りきれるサイズ感&lt;/strong&gt;でしょうか。&lt;/p&gt;

&lt;h2&gt;
  
  
  1ヶ月で作りきれるものにしよう
&lt;/h2&gt;

&lt;p&gt;職業プログラマなら、なんとなく自分の工数計算できるはず。&lt;/p&gt;

&lt;p&gt;１ヶ月空いてる時間すべてつぎ込んでも作れないようなものなら、考え直したほうがいい。ほぼ確実にガウディる。&lt;/p&gt;

&lt;h2&gt;
  
  
  削るところは削ってまずはMVPを出す
&lt;/h2&gt;

&lt;p&gt;作れる人はいいんだけど、そうじゃない人は１ヶ月で作りきれるMVPをまずは考えてみよう。&lt;/p&gt;

&lt;p&gt;例えばTwitterみたいなサービスを作るとするなら、ログインもマイページもフォロー機能も一旦置いておいて、投稿画面とその一覧画面だけを作ってどんな感じになるかを見てみよう。&lt;/p&gt;

&lt;p&gt;ログインして、マイページで自己紹介文を編集して、ユーザー画像を変更できるように画像アップロード機能を作って・・・とかやってるうちに大概&lt;strong&gt;モチベーションはどっか行きます&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;ひとまずそのサービスで一番コアになる部分を分かるように作りましょ！&lt;/p&gt;

&lt;h2&gt;
  
  
  公開できる部分に切って、そこだけ作ってユーザーテストする
&lt;/h2&gt;

&lt;p&gt;そんな感じでMVPが出来たら、知り合いに見せてみましょう。&lt;/p&gt;

&lt;p&gt;TOPページの説明は無いから自分でざっくり説明してから投稿画面を触ってもらいましょう。&lt;/p&gt;

&lt;p&gt;「よくわかんないね。ｈａｈａｈａ」とか「これってtwitterと何が違うの？」とか言われて落ち込むかもしれません。&lt;/p&gt;

&lt;p&gt;でも「あ〜これ、こういう使い方もできるね」「逆に&lt;a href="https://nyaaan.haramishio.xyz/"&gt;にゃーんしか呟けないようにしたら&lt;/a&gt;？」とか意見がもらえるかも。&lt;/p&gt;

&lt;p&gt;モチベーションが逃げちゃわないように、少しづつでもいいのでそういったプラスな声を聞いて歩みを止めないようにしましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  作る時間をしっかりとれるように計画しよう
&lt;/h2&gt;

&lt;p&gt;あとは進めていくウチに中だるみするのを防ぐために「一人開発合宿！」とか叫びながら「ビジネスホテルにPCだけ持って一泊する」みたいなのをやってみてもいいかも。&lt;/p&gt;

&lt;p&gt;とにかく時間を確保しないことには進捗は生まれないので、&lt;strong&gt;上司に媚びを売るための会社の忘年会なんか行ってる場合じゃない&lt;/strong&gt;んですよ！&lt;/p&gt;

&lt;h1&gt;
  
  
  技術的にしんどい
&lt;/h1&gt;

&lt;p&gt;次は作ってみたら思ったより難しくって「ProgateとRailsチュートリアルを終わらせた俺に作れないものなど無いはずなのに。。。」みたいな気持ちが生まれてしまうやつ。&lt;/p&gt;

&lt;p&gt;ここに書いてあることを頭にいれて、心が折れるのを未然に防ぎましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  未経験な技術はできるだけ使わない、使っても1つだけにしよう
&lt;/h2&gt;

&lt;p&gt;基本的に全部未経験みたいなのでやろうとするのは個人開発アンチパターンです。よっぽど作りたいものじゃないと作りきれません。&lt;/p&gt;

&lt;p&gt;ここは的を絞って、ちょっと背伸びすれば作れるレベルのものにして、壮大な構想は後にとっておきましょう。「千里の道も一歩」からです。&lt;/p&gt;

&lt;h2&gt;
  
  
  技術習得と、新規開発はできるだけ分離しよう
&lt;/h2&gt;

&lt;p&gt;それでも結局、自分の作れる範囲のものなんて作っても仕方がない・大したものが作れないとなってしまったら、&lt;strong&gt;技術習得と、新規開発はできるだけ分離&lt;/strong&gt;しましょう。&lt;/p&gt;

&lt;p&gt;これは、「習得をマイルストーンにしてないと、開発していて新しい技術を習得している過程では、開発が全く進んでないように見えて心が病んでしまう」のを未然に防ぐためです。&lt;/p&gt;

&lt;p&gt;習得していく技術については、別途技術習得チェックリストを作って、開発のtodoと別で積み上がっていくのが見えるようにしておくといいと思います。&lt;/p&gt;

&lt;p&gt;また「技術習得のために作っている」というパターンならあまり心配ないですが。作れなくとも技術を習得できれば目標は達成ですから。&lt;/p&gt;

&lt;h2&gt;
  
  
  汚いコードでも、まずは動くものを作ってからリファクタリングしよう
&lt;/h2&gt;

&lt;p&gt;「完璧を目指すよりまず終わらせろ　Done is better than perfect.」&lt;/p&gt;

&lt;p&gt;ってやつですね。ひとまず動くものを書きましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  動的な部分も静的なもので一旦作る
&lt;/h2&gt;

&lt;p&gt;ひとまず後から入るであろう数字とか、まずは決め打ちで書いてしまって後から直しましょう。&lt;/p&gt;

&lt;p&gt;細部にこだわるより一旦全体を通して使えるものにするのが先です！&lt;/p&gt;

&lt;p&gt;デザインを別で作ってるなら、その部分はもう画像貼って終わりにして、後からコードにおこすとかもいいですね。&lt;/p&gt;

&lt;h2&gt;
  
  
  一旦PCだけ対応 、iOSだけ対応とかにする
&lt;/h2&gt;

&lt;p&gt;レスポンシブ対応とかはまだまだ先でいいですよ。&lt;/p&gt;

&lt;p&gt;このご時世一旦スマホで見れるものを作ったったらええんや！&lt;/p&gt;

&lt;h2&gt;
  
  
  CSS一切書かないでコアな部分だけ先に作る
&lt;/h2&gt;

&lt;p&gt;「CSS書くの辛いマン」の人手を上げて〜&lt;/p&gt;

&lt;p&gt;一旦bootstrapとかCSSフレームワークを突っ込んだだけにしておいて、あとから書きましょ。ね？&lt;/p&gt;

&lt;h2&gt;
  
  
  外注する
&lt;/h2&gt;

&lt;p&gt;絶対作ってやるぞ！って場合にはもう自分が苦手な部分は外注してみましょう。&lt;/p&gt;

&lt;p&gt;あとは例えば&lt;a href="https://quiz-maker.site/"&gt;クイズを誰でも作れるサービス&lt;/a&gt;みたいな、CGMを作る場合なんかはコンテンツを外注してみて、１０問でも人が作ったデータが入ってるとそれっぽい感じになります。&lt;/p&gt;

&lt;h1&gt;
  
  
  作ってる間に似たようなサービスが先に出てきた
&lt;/h1&gt;

&lt;p&gt;これもあるある。個人だろうが仕事だろうがあるんですよね。&lt;/p&gt;

&lt;p&gt;Webサービスなんてだいたい「掲示板」ですから。カキコしたら一緒ですよ。&lt;/p&gt;

&lt;h2&gt;
  
  
  同じ事を考える人はたくさんいるので、気にしない
&lt;/h2&gt;

&lt;p&gt;「Google は18番目の検索エンジン」&lt;/p&gt;

&lt;p&gt;今日はこれだけ覚えて帰ってください。&lt;/p&gt;

&lt;p&gt;Webサービスなんていう狭い枠組みで考えてたらそりゃあ被りますよｗ&lt;/p&gt;

&lt;h2&gt;
  
  
  それでも全く同じサービスにはならない
&lt;/h2&gt;

&lt;p&gt;機能は似ていても、思想まで一致するってことはないんじゃないかと思います。&lt;/p&gt;

&lt;p&gt;facebookもTwitterも結局なんか書き込んでタイムラインにするだけなのに、いつの間にかこんなに違う。&lt;/p&gt;

&lt;p&gt;思想が違うと方向性も変わってくるので、しっかり自分の考えを固めて振り返ってみるといいと思います。&lt;/p&gt;

&lt;h1&gt;
  
  
  チームでやっていて、他のメンバーが動かない or 自分の負担が大きい
&lt;/h1&gt;

&lt;p&gt;これは個人じゃない場合なんですが、人によってモチベーションもかけられる時間もコストもリスクも変わっちゃうんですよね。&lt;/p&gt;

&lt;h2&gt;
  
  
  チームを小さくする
&lt;/h2&gt;

&lt;p&gt;まぁ煩わしいなと思ったらさっさと解散しましょう。時間の無駄です。またなんか思いついたときに集まればいいじゃないですか。&lt;/p&gt;

&lt;p&gt;もし続けたいメンバーがいたら、そのときにある資産を誰が持ち帰るかだけもめないようにしましょう。&lt;/p&gt;

&lt;h1&gt;
  
  
  作ったけど誰にも使われなくて悲しい
&lt;/h1&gt;

&lt;p&gt;これは今度作りきった後なんだけど、色々頑張って作ったものの使われないのは悲しい。&lt;/p&gt;

&lt;p&gt;でも一つのものを作り切るってすごいことですから、思い入れがあるなら今までの努力を無駄にしないようにもうちょっとだけ頑張ってみましょうよ。&lt;/p&gt;

&lt;h2&gt;
  
  
  自分でとにかく使う
&lt;/h2&gt;

&lt;p&gt;まずは「自分が欲しくて作った」んじゃないですかね？使ってみて、少しでもいいところがあったらまた友達に見せてみたりしてもいいですし、色々使ってみてると「あ、こんな使いかたできるかも」とか「横展開してこういうのできそう」とか思いついたりもします。&lt;/p&gt;

&lt;p&gt;あのtwitterトレンドにぽこぽこ出てくる&lt;a href="http://appli-maker.jp/"&gt;アプリ☆メーカー&lt;/a&gt;も、最初は流行るまで何ヶ月もひたすら自分たちでコンテンツを作り続けたらしいですよ。&lt;/p&gt;

&lt;h2&gt;
  
  
  自分が欲しい部分をとにかく作る
&lt;/h2&gt;

&lt;p&gt;使いまくっていると今度は「コレも欲しい」「あれも欲しい」となってくるはず。&lt;/p&gt;

&lt;p&gt;自分がファーストユーザーになれないサービスなんて作っても全然面白くないですから、自分のための機能どんどん作っちゃいましょうｗ&lt;/p&gt;

&lt;p&gt;最悪自分のための最高のサービスになってもいいじゃないですか。&lt;/p&gt;

&lt;h1&gt;
  
  
  他の開発者と交流する
&lt;/h1&gt;

&lt;p&gt;（11/25追記）&lt;/p&gt;

&lt;p&gt;Twitterでwebサービスを作ろうとしている人と交流するってのもいいかもしれません。&lt;br&gt;
&lt;strong&gt;駆け出しエンジニアと繋がりたい&lt;/strong&gt;人たくさんいますし、同じようにwebサービス作りたい方を探してお互いに意見出し合うとかもいいですね。&lt;/p&gt;

&lt;p&gt;また、冒頭で出てきた&lt;a href="https://twitter.com/Neko_Inu_/status/1063308508718755840"&gt;運営者ギルド&lt;/a&gt;は個人レベルでwebサービスを作っている、作ろうとしている人達のコミュニティなので&lt;br&gt;
そこで他の個人サービス運営はどうやってるのかなーとのぞいてみたり、意見をもらってもいいかもしれません。&lt;/p&gt;

&lt;p&gt;有料ですが&lt;a href="https://camp-fire.jp/projects/view/74574"&gt;入江開発室&lt;/a&gt;というのもそんな感じのコミュニティみたいです。&lt;/p&gt;

&lt;h1&gt;
  
  
  まとめ
&lt;/h1&gt;

&lt;p&gt;こんな感じで私の考える、個人サービスのモチベーション問題を未然に防ぐ・発生してもどうにかするための方法を書いてみました。&lt;/p&gt;

&lt;p&gt;個人で作れるものの範囲が年々大きくなっていくWeb業界ですが、華々しくデビューを飾るサービスの裏にはたくさんの折れた心達があります。&lt;/p&gt;

&lt;p&gt;モチベーションとか関係なく作れちゃう人はいいんですが「Webサービス作ってみたい！」って人は挑戦する前に少し心がけてもらって、心を折らずに作りきって欲しいと思います！&lt;/p&gt;

&lt;p&gt;終わり&lt;/p&gt;

</description>
      <category>solodev</category>
      <category>japanese</category>
    </item>
  </channel>
</rss>
