<?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: ちぇん</title>
    <description>The latest articles on DEV Community by ちぇん (@yuno_miyako).</description>
    <link>https://dev.to/yuno_miyako</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%2F169992%2Fa0226ff5-48b9-424b-9d75-b6213de67434.jpg</url>
      <title>DEV Community: ちぇん</title>
      <link>https://dev.to/yuno_miyako</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yuno_miyako"/>
    <language>en</language>
    <item>
      <title>I made a battle game for Wordle</title>
      <dc:creator>ちぇん</dc:creator>
      <pubDate>Thu, 03 Mar 2022 12:52:36 +0000</pubDate>
      <link>https://dev.to/yuno_miyako/i-made-a-battle-game-for-wordle-5bg2</link>
      <guid>https://dev.to/yuno_miyako/i-made-a-battle-game-for-wordle-5bg2</guid>
      <description>&lt;p&gt;&lt;a href="https://english.yunomy.com/wordle/rooms"&gt;here&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;How do you think of it?&lt;/p&gt;

</description>
      <category>service</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Full Stack Engineer Career Path</title>
      <dc:creator>ちぇん</dc:creator>
      <pubDate>Mon, 04 Oct 2021 00:18:57 +0000</pubDate>
      <link>https://dev.to/yuno_miyako/full-stack-engineer-career-path-4bgh</link>
      <guid>https://dev.to/yuno_miyako/full-stack-engineer-career-path-4bgh</guid>
      <description>&lt;p&gt;Tell me your career path&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Don’t develop API by yourself. Leave it to Hasura completely.</title>
      <dc:creator>ちぇん</dc:creator>
      <pubDate>Sat, 11 Sep 2021 01:30:52 +0000</pubDate>
      <link>https://dev.to/yuno_miyako/don-t-develop-api-by-yourself-leave-it-to-hasura-completely-i</link>
      <guid>https://dev.to/yuno_miyako/don-t-develop-api-by-yourself-leave-it-to-hasura-completely-i</guid>
      <description>&lt;h1&gt;
  
  
  What I want to tell you about
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;the effectiveness of Hasura

&lt;ul&gt;
&lt;li&gt;Effect of reducing development man-hours&lt;/li&gt;
&lt;li&gt;High flexibility&lt;/li&gt;
&lt;li&gt;Secure&lt;/li&gt;
&lt;/ul&gt;


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

&lt;h1&gt;
  
  
  Challenge of "reduction of development man-hours"
&lt;/h1&gt;

&lt;p&gt;Due to the recent shortage of engineers and rising unit prices, there is a problem that sufficient development man-hours cannot be secured.  I think every company is taking various measures to reduce the development man-hours.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilization of new technology&lt;/li&gt;
&lt;li&gt;Use of familiar technology&lt;/li&gt;
&lt;li&gt;Process review&lt;/li&gt;
&lt;li&gt;Thorough automation&lt;/li&gt;
&lt;li&gt;Review of scope&lt;/li&gt;
&lt;li&gt;Stop excessive quality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;etc.  This time, I propose that there is a possibility that the development man-hours can be reduced by "utilizing new technology" at the top.&lt;/p&gt;

&lt;h1&gt;
  
  
  Suppose you decide to make an app like this
&lt;/h1&gt;

&lt;p&gt;Let's say you decide to make an app like this.&lt;br&gt;
 A simple online whiteboard tool that needs to have the following features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can write on sticky notes&lt;/li&gt;
&lt;li&gt;You can move sticky notes&lt;/li&gt;
&lt;li&gt;Sticky note color will be user-specific&lt;/li&gt;
&lt;li&gt;You can erase sticky notes (only sticky notes you made)&lt;/li&gt;
&lt;li&gt;You can share the position and contents of sticky notes in real time.&lt;/li&gt;
&lt;li&gt;You can switch boards&lt;/li&gt;
&lt;li&gt;You can log in with Cognito&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tOy5LuBq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/57491032-22db-8dcc-ed23-c7067e85a851.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tOy5LuBq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/57491032-22db-8dcc-ed23-c7067e85a851.gif" alt="Slide 4.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The development required for the backend is as follows
&lt;/h1&gt;

&lt;p&gt;In order to develop the above functions, the back end needs to be developed as follows.&lt;/p&gt;

&lt;h4&gt;
  
  
  DB
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Table design (Board, Note 2 tables)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  API
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Get a list of sticky notes linked to the board (deliver the latest value with websocket)&lt;/li&gt;
&lt;li&gt;Add sticky note (Create by linking with Cognito user ID)&lt;/li&gt;
&lt;li&gt;Update sticky note text and position&lt;/li&gt;
&lt;li&gt;Delete sticky notes (so that an error occurs except for the ones you created)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  infrastructure
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Deploy to Fargate / ECS&lt;/li&gt;
&lt;li&gt;Cognito cooperation&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  How much man-hours do you estimate?
&lt;/h1&gt;

&lt;p&gt;If you simply implement it and make something that works, saying "backend only + no testing required", how long would you estimate?&lt;/p&gt;

&lt;p&gt;① 1 hour&lt;br&gt;
 ② 1 day&lt;br&gt;
 ③ 1 week&lt;br&gt;
 ④ 1 month&lt;/p&gt;

&lt;h1&gt;
  
  
  Hasura can do it in an hour
&lt;/h1&gt;

&lt;p&gt;In fact, when I developed the backend for the above app, it took only &lt;strong&gt;1 hour&lt;/strong&gt; to complete.&lt;br&gt;
 The reason whyI was able to reduce such dramatic man-hours is because I used Hasura.&lt;br&gt;
 Introducing four functions.&lt;/p&gt;

&lt;h2&gt;
  
  
  ① API automatic generation
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KIxmP8-L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/fb435474-da6a-4d27-b594-11290c31bbbb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KIxmP8-L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/fb435474-da6a-4d27-b594-11290c31bbbb.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hasura automatically generates GraphQL API from table definition.&lt;br&gt;
 Query methods that allow flexible search, Create, Update, Delete, etc. are also automatically generated, and simple but sufficient CRUD can be done.&lt;/p&gt;

&lt;h2&gt;
  
  
  ② Cognito cooperation
&lt;/h2&gt;

&lt;p&gt;Hasura provides a webhook and JWT authentication method.&lt;br&gt;
 Easily implement JWT authentication with AWS Cognito.  Of course, it can also be linked with Auth0 and firebase authentication.&lt;/p&gt;

&lt;h2&gt;
  
  
  ③ Access control
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b8o5scTn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/287cff44-98ef-e135-0442-e0d8d5a317a4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b8o5scTn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/287cff44-98ef-e135-0442-e0d8d5a317a4.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can control the methods that can be executed for each Role of the API executor.&lt;br&gt;
 Access control can be described by referring to the user ID and group ID in JWT, and restrictions such as "Delete is possible only when CreatedBy matches the user ID" can be applied.&lt;/p&gt;

&lt;h2&gt;
  
  
  ④ Subscription
&lt;/h2&gt;

&lt;p&gt;Subscription is a Websocket-based real-time query that automatically delivers the latest values ​​when the monitored resource is updated.&lt;br&gt;
 The interface is the same as Query, so it's very easy to use.&lt;/p&gt;

&lt;h1&gt;
  
  
  These functions greatly reduce development man-hours
&lt;/h1&gt;

&lt;p&gt;This is the only work actually done in this development&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DB creation&lt;/li&gt;
&lt;li&gt;Cognito cooperation&lt;/li&gt;
&lt;li&gt;Access control settings&lt;/li&gt;
&lt;li&gt;Deploy to ECS using Copilot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you get used to these, you can complete them in about an hour.  Therefore, if it is a simple CRUD API, a significant reduction in development man-hours can be expected.&lt;/p&gt;

&lt;h1&gt;
  
  
  Concerns about Hasura
&lt;/h1&gt;

&lt;p&gt;After reading the above, some people may have the following concerns.&lt;/p&gt;

&lt;p&gt;① Where do you write the business logic?&lt;br&gt;
 ② I don't want to use GraphQL on the front end.  REST is good.&lt;br&gt;
 ③ What will happen to the development environment such as version control?&lt;/p&gt;

&lt;p&gt;Correspondence will be described for each.&lt;/p&gt;

&lt;h2&gt;
  
  
  ① Where to write business logic
&lt;/h2&gt;

&lt;p&gt;Hasura offers two options: Actions and Remote Schema.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6RM4XuXU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/db23e664-308c-5a50-5e75-54bad578f8c6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6RM4XuXU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/db23e664-308c-5a50-5e75-54bad578f8c6.png" alt="image.png"&gt;&lt;/a&gt;&lt;br&gt;
 As shown in the image above, Actions uses Websocket to pass through the process to another HTTP endpoint.  You can write custom logic by preparing a web server or Lambda that processes custom logic.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SuOkLhXz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/f160b489-5424-75bd-7d8a-f1e1f6724b6d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SuOkLhXz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/f160b489-5424-75bd-7d8a-f1e1f6724b6d.png" alt="image.png"&gt;&lt;/a&gt;&lt;br&gt;
 Remote Schema creates a completely different GraphQL server by yourself and combines Hasura with the schema.  You can build a GraphQL server that processes business logic with Apollo etc. and combine it with Hasura without any unnaturalness.&lt;/p&gt;

&lt;h2&gt;
  
  
  ② I don't want to use GraphQL at the frontend
&lt;/h2&gt;

&lt;p&gt;Hasura has a function to register a query and make it a REST API&lt;br&gt;
 Backend can be developed with GraphQL, front with REST&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z1Nxxq9w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/f24eaab0-5458-d15d-c570-%2520c5a93af84f9e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z1Nxxq9w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/f24eaab0-5458-d15d-c570-%2520c5a93af84f9e.png" alt="Screenshot 2021-09-11 7.58.09.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ③ What will happen to the development environment?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wm4944oM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/0b8cfcb8-6c30-195d-ffb5-597f393bfa5a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wm4944oM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/0b8cfcb8-6c30-195d-ffb5-597f393bfa5a.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since all Hasura metadata (access control, etc.) is stored in the DB, developers should look at the DB in the same development environment.&lt;br&gt;
 Hasura will be placed in ECS and will have ELB IP restrictions so that only developers can access the console.&lt;br&gt;
 Since the metadata can be exported, it can be managed on Github / can be applied to the production environment.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion: Hasura is worth considering for practical use
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N5LslJKB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/9a325fdf-9cf3-3069-eaeb-0ed3e308ef43.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N5LslJKB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234396/9a325fdf-9cf3-3069-eaeb-0ed3e308ef43.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hasura is, in a nutshell, a "SQL client that can be called from the front"&lt;br&gt;
 In fact, Hasura uses an internal implementation to model the GraphQL tree structure and convert it to SQL.&lt;br&gt;
 In short, this is equivalent to skipping the old backend.&lt;br&gt;
 If you leave simple CRUD to Hasura, it will be possible to significantly reduce development man-hours.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I’ve created an OSS library that makes it easy to create real-time web apps</title>
      <dc:creator>ちぇん</dc:creator>
      <pubDate>Wed, 08 Sep 2021 13:22:14 +0000</pubDate>
      <link>https://dev.to/yuno_miyako/i-made-an-oss-library-that-makes-it-easy-to-create-real-time-web-apps-4795</link>
      <guid>https://dev.to/yuno_miyako/i-made-an-oss-library-that-makes-it-easy-to-create-real-time-web-apps-4795</guid>
      <description>&lt;h1&gt;
  
  
  I have developed an OSS
&lt;/h1&gt;

&lt;p&gt;I have developed a OSS library called &lt;a href="https://kitaharamugiro.github.io/Realtimely/" rel="noopener noreferrer"&gt;Realtimely&lt;/a&gt; that makes it easy to introduce fun &lt;strong&gt;real-time elements into React apps&lt;/strong&gt;.&lt;br&gt;
Realtimely uses GraphQL and communicate with AWS Cloud by websocket. Programmers who use this library can implement a websocket-based real-time experience by simply using the &lt;strong&gt;hooks function provided by Realtimely&lt;/strong&gt; without being aware of complicated technology.&lt;br&gt;
For example, you can implement a feature of sharing the position of the mouse cursor like the gif below with about 10 lines of code.&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%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F234396%2F2a9d3a51-e6ea-9428-1dca-8eec057239ad.gif" 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%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F234396%2F2a9d3a51-e6ea-9428-1dca-8eec057239ad.gif" alt="realtime-cursor.gif"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&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;useRealtimeCursor&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;realtimely&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onMouseMove&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;renderCursors&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRealtimeCursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;onMouseMove&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onMouseMove&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;renderCursors&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&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;I made a &lt;a href="https://d2vfno2gco8009.cloudfront.net/" rel="noopener noreferrer"&gt;demo page&lt;/a&gt;, so please feel free to try it.&lt;/p&gt;

&lt;h1&gt;
  
  
  From launch to release
&lt;/h1&gt;

&lt;p&gt;Now, from here, I would like to write in chronological order how we actually planned and released it.&lt;/p&gt;

&lt;p&gt;Number of developers : 1 person&lt;br&gt;
Production days : 18 days&lt;br&gt;
Costs : AWS Free Tier &lt;br&gt;
Time spent in a day : 1 hour on weekdays 3 hours on holidays&lt;/p&gt;
&lt;h2&gt;
  
  
  8/19 (0th day from the start) Plan
&lt;/h2&gt;

&lt;p&gt;The decisions made on the first day are as follows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use Case&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;→ Image of when to use this library&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product image&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;→ Image of how programmers use this library&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;→ What will be used to achieve this?&lt;/li&gt;
&lt;li&gt;This time, I wanted to make it as low-code and scalable as possible (to make things easier).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identify and schedule necessary tasks&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;List what I have to do&lt;/li&gt;
&lt;li&gt;Estimate how long it will take&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This time, I considered the use case with a fairly product-out idea, but I think that it is ideal to actually do it by the following procedure.&lt;br&gt;
① Think about issues that are in trouble in actual development&lt;br&gt;
② Find out if someone has already realized it&lt;br&gt;
③ If it has been realized, consider whether it is really convenient or if there is another product image that is easier to use.&lt;/p&gt;

&lt;p&gt;Anyone can publish OSS, but even if you create and publish something that has already been realized or is not based on  troublesome, there is a risk that you will end up with a product that interferes with everyone's search.&lt;/p&gt;
&lt;h2&gt;
  
  
  8/20 (1st day from the start) Investigation
&lt;/h2&gt;

&lt;p&gt;I searched for a library that could do what I wanted to do, read the documentation, and tried it out.&lt;br&gt;
The library was a REST-based library for creating "high-performance real-time apps."&lt;br&gt;
Since the purpose was high performance, it turned out that state management using cache etc is included in the function and it is too much, and that developers must develop the back-end from full scratch and it is not easy to use. &lt;br&gt;
So I corrected the product direction, such as sharpening my product image so that Realtimely could be used easily.&lt;/p&gt;

&lt;p&gt;Also, although the direction is different, &lt;strong&gt;there are many things that can be referred to because the realization is similar&lt;/strong&gt;. I also looked at the HTTP response and used it as a reference for what kind of data structure looks good for my product.&lt;/p&gt;
&lt;h2&gt;
  
  
  8/21 - 8/26 (6th day from the start) First iteration
&lt;/h2&gt;

&lt;p&gt;We implemented the sprint goal of "sharing cursor movement in real time" in the first 7 days.&lt;/p&gt;
&lt;h3&gt;
  
  
  Touch AWS AppSync
&lt;/h3&gt;

&lt;p&gt;AppSync is a managed service for GraphQL servers. There is a function to automatically generate GraphQL schema and resolver by connecting with DynamoDB table.&lt;br&gt;
This time, I'd like to &lt;strong&gt;enjoy low code&lt;/strong&gt;, so I decided to use AppSync.&lt;/p&gt;

&lt;p&gt;There are no-code and low-code systems, but they have their limit or service characteristic. AppSync is no exception to this example, and there was a need to &lt;strong&gt;design while taking care of the features of AppSync&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Design
&lt;/h3&gt;

&lt;p&gt;I wrote down the API required to implement "move the cursor in real time", and examined whether it could be realized. This area was a form of thinking about "what you want to achieve" and "what you can do with AppSync".&lt;/p&gt;
&lt;h3&gt;
  
  
  DB Design
&lt;/h3&gt;

&lt;p&gt;DynamoDB is a scalable NoSQL database with a key-value store. DynamoDB has HashKey and SortKey keys, and we design the DB so that these combinations are unique. RealtimeCursor has the following schema.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;HashKey&lt;/th&gt;
&lt;th&gt;SortKey&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;URL#{URL}&lt;/td&gt;
&lt;td&gt;UserId#{UserId}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The {URL} and {UserId} will contain the actual values. The mouse cursor position (X,Y) and user information will be stored as Attributes for these keys. &lt;/p&gt;
&lt;h3&gt;
  
  
  Fast Implementation
&lt;/h3&gt;

&lt;p&gt;The first and foremost thing I do in implementation is to focus on &lt;strong&gt;speed&lt;/strong&gt;.&lt;br&gt;
I don't care how dirty it is, as long as it does what I want it to do.&lt;br&gt;
The reason for this is that I believe that the most efficient way to create a clean design is to write everything and then scrap and build.&lt;br&gt;
I don't know what can be made common from the start.&lt;/p&gt;
&lt;h3&gt;
  
  
  Refactoring
&lt;/h3&gt;

&lt;p&gt;When I was able to achieve what I wanted with roughly dirty code, I refactored it.&lt;br&gt;
If it's a web service, you may decide to release something that works without refactoring first.&lt;br&gt;
In this case, we had to redesign it with careful consideration of the responsibilities and interface, because it had to be easy to use as an OSS library.&lt;/p&gt;
&lt;h2&gt;
  
  
  8/27-8/30 (Day 11 from start) Second iteration
&lt;/h2&gt;

&lt;p&gt;This is the second iteration of the sprint goal: "Implement visualization of user actions" (e.g., when a user presses a button, other people can see it, or when a user enters text, it can be seen on other people's screens).&lt;/p&gt;

&lt;p&gt;The development went smoothly because the code base was refactored and I knew roughly what I could do with AppSync.&lt;/p&gt;
&lt;h2&gt;
  
  
  8/31 (12th day after the start) Create a demo page
&lt;/h2&gt;

&lt;p&gt;I deployed the Next.js project that I used for development by using Serverless Framework. I could deploy it to AWS in 5 minutes.&lt;br&gt;
&lt;a href="https://d2vfno2gco8009.cloudfront.net/" rel="noopener noreferrer"&gt;Demo page&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  9/1-9/4 (Day 16 of development) Creating documentation
&lt;/h2&gt;

&lt;p&gt;I used a documents framework called docusaurus to create the documentation. docusaurus is maintained by facebook and is very well done product.&lt;/p&gt;

&lt;p&gt;First, I listed what I was going to write in a big list, and then I started to write.&lt;/p&gt;
&lt;h3&gt;
  
  
  Think about what I'm going to write.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[x]  Introduction&lt;/li&gt;
&lt;li&gt;[x]  Getting Started

&lt;ul&gt;
&lt;li&gt;[x]  Installation&lt;/li&gt;
&lt;li&gt;[x]  Demo&lt;/li&gt;
&lt;li&gt;[x]  Realtime Cursor&lt;/li&gt;
&lt;li&gt;[x]  Realtime User Presence&lt;/li&gt;
&lt;li&gt;[x]  Realtime User Action&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x]  API Guides

&lt;ul&gt;
&lt;li&gt;[x]  useXXX&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x]  How it works

&lt;ul&gt;
&lt;li&gt;[x]  Architecture&lt;/li&gt;
&lt;li&gt;[x] Self hosted Backend&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x]  RoadMap&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Write documents
&lt;/h3&gt;

&lt;p&gt;This is the hardest part. This was the hardest part.&lt;/p&gt;
&lt;h3&gt;
  
  
  Making it in English
&lt;/h3&gt;

&lt;p&gt;Since docusaurus has the i18n feature, I made the document in English(Original is Japanese).&lt;br&gt;
Basically, I just let google translate translate it and reviewed it briefly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Deploy to Github Pages
&lt;/h3&gt;

&lt;p&gt;This was also a feature in docusaurus, so it was easy to do.&lt;/p&gt;
&lt;h3&gt;
  
  
  Other tasks
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Create a logo.
&lt;/h4&gt;

&lt;p&gt;I used a logo generator.&lt;/p&gt;
&lt;h4&gt;
  
  
  Create a donation window.
&lt;/h4&gt;

&lt;p&gt;I also created a donation window using &lt;a href="https://ko-fi.com/realtimely" rel="noopener noreferrer"&gt;ko-fi&lt;/a&gt;.&lt;br&gt;
It connects to Stripe and allows you to &lt;strong&gt;donate by credit card&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  9/5-6 (18 days after development) npm public
&lt;/h2&gt;

&lt;p&gt;It's time to publish. For details on how to publish to npm, please refer to &lt;a href="https://blog.logrocket.com/the-complete-guide-to-publishing-a-react-package-to-npm/" rel="noopener noreferrer"&gt;another article&lt;/a&gt;. This time, I'll write roughly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Create an npm account
&lt;/h3&gt;

&lt;p&gt;Create an account at &lt;a href="https://www.npmjs.com/" rel="noopener noreferrer"&gt;https://www.npmjs.com/&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Compile TypeScript into a .js file.
&lt;/h3&gt;

&lt;p&gt;Write tsconfig.json and then&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tsc -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  yarn publish
&lt;/h3&gt;

&lt;p&gt;You will be asked to login to npm, just enter your email and password.&lt;/p&gt;

&lt;h3&gt;
  
  
  publish
&lt;/h3&gt;

&lt;p&gt;I could publish really easily.&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/realtimely" rel="noopener noreferrer"&gt;After publishing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've used the npm library for so long that I felt guilty about stepping into the ring with my dirty feet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Debugging
&lt;/h3&gt;

&lt;p&gt;I installed realtimely in a different repository and tried to use it, but it gave me an error and wouldn't work...&lt;br&gt;
I used a day for debugging.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Library dependencies&lt;/li&gt;
&lt;li&gt;Error in loading CSS&lt;/li&gt;
&lt;li&gt;Dependent library error&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The future
&lt;/h2&gt;

&lt;p&gt;Since I prioritized the speed of release, the library is not production-ready at this point. I hope that you will use it only at the PoC level to see what it is like to add real-time elements to your application.&lt;/p&gt;

&lt;p&gt;From now on, I'll be working on solving issues to make it production-ready and developing more user-friendly features. Please watch over us with warm eyes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kitaharamugiro.github.io/Realtimely/" rel="noopener noreferrer"&gt;Document&lt;/a&gt;&lt;br&gt;
&lt;a href="https://d2vfno2gco8009.cloudfront.net/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>react</category>
      <category>programming</category>
    </item>
    <item>
      <title>A collection of patterns when developing APIs with AWS Lambda</title>
      <dc:creator>ちぇん</dc:creator>
      <pubDate>Sun, 29 Nov 2020 12:47:47 +0000</pubDate>
      <link>https://dev.to/yuno_miyako/a-collection-of-patterns-when-developing-apis-with-aws-lambda-1a4n</link>
      <guid>https://dev.to/yuno_miyako/a-collection-of-patterns-when-developing-apis-with-aws-lambda-1a4n</guid>
      <description>&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;When developing API with AWS Lambda, the following 4 patterns can be considered. Each has its advantages and disadvantages, so I think you will choose based on your requirements and member skill sets.&lt;/p&gt;

&lt;h3&gt;
  
  
  ① Functions (separate source) pattern
&lt;/h3&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%2Fi%2Fum7wx8h7vro5hvko4nxi.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%2Fi%2Fum7wx8h7vro5hvko4nxi.png" alt="functions pattern"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ② Functions (same source) pattern
&lt;/h3&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%2Fi%2Flas34v3gdyn5rmk5l3vg.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%2Fi%2Flas34v3gdyn5rmk5l3vg.png" alt="functions pattern2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ③ Web Framework pattern
&lt;/h3&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%2Fi%2Fy8xx9lpc3jjpyhe1tqq5.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%2Fi%2Fy8xx9lpc3jjpyhe1tqq5.png" alt="proxy integration pattern"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ④ GraphQL pattern
&lt;/h3&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%2Fi%2Ff6l9hwnez3r6tvj84ywv.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%2Fi%2Ff6l9hwnez3r6tvj84ywv.png" alt="graphql pattern"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Background
&lt;/h1&gt;

&lt;h2&gt;
  
  
  API development with AWS Lambda
&lt;/h2&gt;

&lt;p&gt;It is possible to develop serverless API by combining AWS Lambda and API Gateway. By building without a server, you can obtain scalability and cost optimization without any hassle, and you can significantly reduce the operation cost because you do not need to monitor life and death.&lt;/p&gt;

&lt;h2&gt;
  
  
  Development patterns are not organized
&lt;/h2&gt;

&lt;p&gt;Although serverless API development has many advantages, there are various development patterns and there is no consistent method. For example, Lambda can be deployed by manually uploading a zip, using a deployment support tool such as SAM / Serverlesss Framework, or using the online editor Cloud9. In some cases, the directories are separated for each function, and in other cases, the source code is shared and only the entry point is switched. Furthermore, it can be created not only with REST but also with GraphQL. I couldn't find a document that organized these patterns properly, so I decided to summarize them this time.&lt;/p&gt;

&lt;h1&gt;
  
  
  Lambda API development pattern
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ① Functions (separate source) pattern
&lt;/h2&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%2Fi%2F08er8r9you8hg3pqbx93.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%2Fi%2F08er8r9you8hg3pqbx93.png" alt="functions pattern"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Characteristic
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No resources or source files are shared between Lambda&lt;/li&gt;
&lt;li&gt;Lambda function resources are created as many as the number of API paths&lt;/li&gt;
&lt;li&gt;If there is common logic, put it in Layer&lt;/li&gt;
&lt;li&gt;This pattern will be used when developing with Cloud9&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  merit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Very loosely coupled because there are no dependencies between Lambda. Therefore, you can easily add or modify APIs.&lt;/li&gt;
&lt;li&gt;Since resources are separated, Cloudwatch logs are output for each function, making error logs very easy to follow.&lt;/li&gt;
&lt;li&gt;Since resources are separated for each function, it is possible to create a secure configuration because detailed policies can be set.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Demerit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Even if you put the common logic in the layer, you still have trouble with layer version control. Even if you update the layer, the already deployed Lambda functions refer to the old layer, so you have to redeploy all the Lambda functions once.&lt;/li&gt;
&lt;li&gt;The logic placed in the layer does not complement the editor, which reduces development efficiency.&lt;/li&gt;
&lt;li&gt;When using a deployment support tool such as SAM / Serverless Framework, the configuration file (template.yaml / serverless.yaml) tends to be complicated. If you need to pass environment variables to all resources, that alone will increase the number of lines in the config file.&lt;/li&gt;
&lt;li&gt;While fine-grained policy settings for each function are beneficial, they are difficult to manage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ② Functions (same source) pattern
&lt;/h2&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%2Fi%2F5k916edbcdfh8du5n90t.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%2Fi%2F5k916edbcdfh8du5n90t.png" alt="functions pattern2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Characteristic
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The same source file is used, but resources are separated because the Lambda function is created by switching the entry point (file name / function name) of each Lambda.&lt;/li&gt;
&lt;li&gt;Lambda function resources are created as many as the number of API paths&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  merit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Common logic can be reused without using Layer&lt;/li&gt;
&lt;li&gt;Since resources are separated, Cloudwatch logs are output for each function, making error logs very easy to follow.&lt;/li&gt;
&lt;li&gt;Since resources are separated for each function, you can fine-tune the policy and create a secure configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Demerit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Since the source file is shared by each Lambda, it is necessary to consider the range of influence when adding or modifying the API.&lt;/li&gt;
&lt;li&gt;When using a deployment support tool such as SAM / Serverless Framework, the configuration file (template.yaml / serverless.yaml) tends to be complicated. If you need to pass environment variables to all resources, that alone will increase the number of lines in the config file.&lt;/li&gt;
&lt;li&gt;While fine-grained policy settings for each function are beneficial, they are difficult to manage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ③ Web Framework pattern
&lt;/h2&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%2Fi%2Fveoi1wmeax9jfscck37c.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%2Fi%2Fveoi1wmeax9jfscck37c.png" alt="proxy integration pattern"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Characteristic
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;API Gateway passes the received request to Lambda as it is, and the web framework on Lambda performs routing etc.&lt;/li&gt;
&lt;li&gt;API Gateway is an integration with proxy resources. (The path variable will look like / {proxy +})&lt;/li&gt;
&lt;li&gt;You need to use a library that connects the interface between Lambda and Web Framework (eg aws-serverless-express, challice, Serverless Framework Plugin, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  merit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;If you have knowledge of Web Framework, you can develop without knowledge of Lambda.&lt;/li&gt;
&lt;li&gt;It's just wrapping the web framework in a library, which makes it very easy when you need to move from serverless to EC2 or on-premises.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Demerit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Can only be used with web frameworks that support libraries&lt;/li&gt;
&lt;li&gt;It will be a structure that tends to be a monolith&lt;/li&gt;
&lt;li&gt;The size of the deployment package will increase. However, this can be solved by putting the dependent packages on the layer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ④ GraphQL pattern
&lt;/h2&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%2Fi%2Fdenvt1i9h1ax4d0eyxw0.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%2Fi%2Fdenvt1i9h1ax4d0eyxw0.png" alt="graphql pattern"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Characteristic
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;a href="https://www.apollographql.com/docs/apollo-server/deployment/lambda/" rel="noopener noreferrer"&gt;Apollo Server on Lambda&lt;/a&gt; to put the GraphQL server on Lambda.&lt;/li&gt;
&lt;li&gt;GraphQL server looks at the body of the request and handles the query&lt;/li&gt;
&lt;li&gt;API Gateway will be a single endpoint of / graphql&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  merit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You can benefit from GraphQL (query flexibility, agility, performance improvements, PlayGround, automatic type information generation etc ...)&lt;/li&gt;
&lt;li&gt;There is room for adding endpoints to API Gateway, so it can coexist with REST.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Demerit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Learning costs are higher because knowledge is less pervasive than REST. I think it is necessary to choose carefully because it will lead to education costs and transfer costs.&lt;/li&gt;
&lt;li&gt;Receives the disadvantages of GraphQL (use of the library is almost mandatory on the client side, etc.)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Finally, I would like to compare and summarize each pattern item by item.&lt;/p&gt;

&lt;h2&gt;
  
  
  No need to consider the range of influence
&lt;/h2&gt;

&lt;p&gt;Since the functions pattern (source code separation) separates both resources and sources, there are no dependencies, and functions can be added or modified without considering the range of influence. I think that there is a big advantage when developing with multiple members. Other patterns share the source code, so you need to consider a certain extent of influence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detailed policy management
&lt;/h2&gt;

&lt;p&gt;If you have a need to set a policy for each Lambda function, you need to select the functions pattern. This is a security advantage, but it is also a disadvantage that makes management difficult.&lt;br&gt;
In the case of GraphQL pattern, REST API can be added as needed, so if you really need this, you can cut it out and create Lambda and set the policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use of common logic
&lt;/h2&gt;

&lt;p&gt;If you can share the source code, you can use common logic, but not with the functions pattern (source code separation). You can use common logic with Layer, but I don't think it's a good option given the lack of completion and the cumbersome version control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Easy to install
&lt;/h2&gt;

&lt;p&gt;The functions pattern can be started immediately by using the SAM / Serverless Framework, but the other patterns are a little less easy to install because they require the settings of libraries and plugins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrate to server
&lt;/h2&gt;

&lt;p&gt;If there is a possibility of moving from serverless to EC2 / on-premise from the viewpoint of performance, it is desirable to have a configuration that can quickly remove resources. WebFramework patterns and GraphQL patterns can be moved to on-premise immediately by peeling off the wrapped library.&lt;/p&gt;

&lt;h2&gt;
  
  
  Low learning cost
&lt;/h2&gt;

&lt;p&gt;Web Framework patterns that can be developed without being aware of Lambda will be more competitive in terms of learning costs. GraphQL is currently the most costly option to learn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ease of development
&lt;/h2&gt;

&lt;p&gt;The functions pattern (source code separation) is difficult to develop because common logic is difficult to use. WebFramework patterns and GraphQL patterns can benefit from the framework and can be developed without any problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ease of tracking error logs
&lt;/h2&gt;

&lt;p&gt;When you want to follow the error log after deployment, the functions pattern in which CloudWatch is divided for each resource makes it easy to follow the error log.&lt;/p&gt;

&lt;h2&gt;
  
  
  Easy to deploy
&lt;/h2&gt;

&lt;p&gt;The bottleneck of the functions pattern is that the SAM / Serverless Framework configuration file tends to be complicated. WebFramework patterns are grouped into proxies and GraphQL patterns are grouped into a single endpoint, so configuration files can be kept simple.&lt;/p&gt;

&lt;h1&gt;
  
  
  Finally
&lt;/h1&gt;

&lt;p&gt;How was that?&lt;br&gt;
The content of this article is basically an experience-based description, so it may not be comprehensive.&lt;br&gt;
We would love to hear your opinions and reflect them in the content.&lt;br&gt;
I would be very happy if you could comment on a story like "I developed this pattern, but it was good here, it was inconvenient here."&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>aws</category>
      <category>api</category>
      <category>lambda</category>
    </item>
    <item>
      <title>The strongest architecture to adopt in a startup.</title>
      <dc:creator>ちぇん</dc:creator>
      <pubDate>Wed, 28 Oct 2020 17:27:40 +0000</pubDate>
      <link>https://dev.to/yuno_miyako/the-strongest-architecture-to-adopt-in-a-startup-40c1</link>
      <guid>https://dev.to/yuno_miyako/the-strongest-architecture-to-adopt-in-a-startup-40c1</guid>
      <description>&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&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%2Fi%2Fclfq9dgqydj3jbznzru5.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%2Fi%2Fclfq9dgqydj3jbznzru5.png" alt="aws (1)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ServerlessFramework is great&lt;/li&gt;
&lt;li&gt;S3 hosting + CloudFront for the front end and Lambda@Edge for the SSR&lt;/li&gt;
&lt;li&gt;Don't use RDS but DynamoDB as a database.&lt;/li&gt;
&lt;li&gt;API is basically GraphQL, and you can easily add REST if you need it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  There is no absolute right answer to the architecture.
&lt;/h1&gt;

&lt;p&gt;There is no absolute right answer for architecture.&lt;br&gt;
This is because different products and phases have different requirements, and it is necessary to consider the appropriate architecture for them.&lt;/p&gt;

&lt;p&gt;For example, the Tokyo Stock Exchange's high-speed trading system, which was recently closed for a day due to a failure, is an architecture that is fully allocated to stability and reliability requirements, distributing the load across 400 servers and localizing the impact of the failure by dividing the network.&lt;br&gt;
Growth companies such as AWS have high scalability requirements and adopt a microservices architecture so that they can deploy new services without impacting the current application to keep innovating.&lt;/p&gt;

&lt;p&gt;So let's consider what requirements are more important for  startups.&lt;br&gt;
Here is a ranking of the reasons why startups fail.&lt;/p&gt;

&lt;p&gt;No. 1: there was no market need.&lt;br&gt;
No. 2: Depletion of funds&lt;br&gt;
No. 3: Inappropriate team composition&lt;br&gt;
No. 4: Lost to the competition.&lt;br&gt;
No. 5: Hard-to-use product&lt;/p&gt;

&lt;p&gt;These are not all problems that can be solved by architecture, but you can see what requirements are needed.&lt;/p&gt;

&lt;p&gt;No. 1: → Agility to change the specifications to meet customer feedback.&lt;br&gt;
No. 2:  → Cost optimization&lt;br&gt;
No. 3:  → Small team structure with as few specialists as possible&lt;br&gt;
No. 4:  → Increasing the speed of development to overtake the competition&lt;br&gt;
No. 5:  → Agility to increase the improvement cycle&lt;/p&gt;

&lt;p&gt;We hypothesize that the requirements for startups are &lt;strong&gt;agility, cost optimization, small team, and speed of development&lt;/strong&gt;.&lt;br&gt;
We have examined the technical elements in this regard.&lt;/p&gt;

&lt;h1&gt;
  
  
  Technology Components
&lt;/h1&gt;

&lt;p&gt;I've discussed how startups should adopt technology elements that excel in &lt;strong&gt;agility, cost optimization, small team, and speed of development&lt;/strong&gt;.&lt;br&gt;
I'm going to introduce the technology components that I think are superior in this regard.&lt;br&gt;
I will explain in three stages: "front end", "database" and "back end (API)".&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Framework
&lt;/h3&gt;

&lt;p&gt;There are three major front-end frameworks: React, Vue, and Angular.&lt;br&gt;
In terms of "development speed" and "agility," I think typing in TypeScript is a must. The reason is that you can benefit from the completion and improve development efficiency by knowing what data to pass, and you can check for errors at compile time when you change the code due to specification changes.&lt;br&gt;
In terms of compatibility with TypeScript, I think React is superior to the other two frameworks, and I think React should be adopted as a front-end framework.&lt;br&gt;
Also, from the point of view of "speed of development" and "small team", I would recommend using Next.js rather than using bare React. This is because with Next.js, you can do things that are necessary but troublesome to implement with No Config. Specifically, routing and SSR (for SEO and SNS OGP).&lt;br&gt;
From the above, Next.js (TypeScript) is recommended as a front-end framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to deploy the front end
&lt;/h2&gt;

&lt;p&gt;The first places that come to mind for Next.js deployment are vercel, Netlify and Heroku.&lt;br&gt;
These are good options because they are very easy to deploy and basically free to use.&lt;br&gt;
However, there are always some functional limitations to the free quota, so if you're looking to scale, you'll want to build on AWS if possible.&lt;br&gt;
With S3 hosting + CloudFront, you can use AWS free quota, and even if the free quota runs out, it's almost free (0.025 USD/GB for S3, 0.114 USD/10TB for CloudFront).&lt;br&gt;
If you become a paid account for services such as vercel, you will have to pay a fixed cost, but with this configuration of AWS, it will be an on-demand billing, so we recommend S3 hosting + CloudFront in terms of "cost optimization".&lt;br&gt;
By the way, since the free quota of vercel is also almost like unlimited, if you do not assume extreme scale, vercel is also totally good option.&lt;br&gt;
I think that using a server such as EC2 or ECS as the deployment destination of the front end is out of the question from the point of view of "development speed" and "cost optimization".&lt;/p&gt;

&lt;p&gt;Next.js SSR is done with &lt;a href="mailto:Lambda@Edge"&gt;Lambda@Edge&lt;/a&gt;.&lt;br&gt;
Deploying this configuration is easy with ServerlessFramework with No Config.&lt;br&gt;
&lt;a href="https://github.com/serverless-nextjs/serverless-next.js" rel="noopener noreferrer"&gt;https://github.com/serverless-nextjs/serverless-next.js&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Database
&lt;/h2&gt;

&lt;h3&gt;
  
  
  RDS vs DynamoDB
&lt;/h3&gt;

&lt;p&gt;In conclusion, I recommend you to choose DynamoDB without question.&lt;br&gt;
To be more precise, RDS has to be used for complex data structures and access patterns, but in the initial phase, it is better to use DynamoDB and if it becomes complex, consider using RDS together.&lt;br&gt;
From the point of view of cost optimization, Dynamo has a on-Demand option, while RDS charges by instance start-up time. Also, RDS+Lambda requires you to install RDS Proxy. There is also Aurora Serverless, but its cold start is critical.&lt;br&gt;
Also, RDB has a dependency between tables, which makes it difficult to discard tables and causes migration and remaking of SQL.&lt;br&gt;
In terms of development speed, Dynamo does not require management of database and is compatible with GraphQL, making it possible to increase development efficiency.&lt;/p&gt;

&lt;h3&gt;
  
  
  Designing DynamoDB
&lt;/h3&gt;

&lt;p&gt;DynamoDB is recommended, but if you design DynamoDB like an RDB, you will get stuck, because DynamoDB doesn't allow joins, so you need to design your tables so that joins are not necessary.&lt;br&gt;
RDB and NoSQL have completely different table design practices, so be sure to apply the initial learning curve here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backend(API)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  REST vs GraphQL
&lt;/h3&gt;

&lt;p&gt;We recommend GraphQL for agility, small team, and speed of development.&lt;br&gt;
GraphQL transfers responsibility from the back end to the front end. It increases agility by not having to modify the API every time the UI is changed.&lt;br&gt;
Also, if you write a REST API in Lambda, you will have to create as many Lambdas as there are endpoints (although there are ways not to do so), but GraphQL is a single endpoint, so you can keep it "small".&lt;br&gt;
GraphQL is very easy to handle when using it from the front end, and although this is an experience, I feel that the front end development speed is higher than REST.&lt;/p&gt;

&lt;p&gt;However, there are certain usecase for which REST is better suited. For example, file uploads require a little bit of work when using GraphQL. You can use REST endpoints in conjunction with an API Gateway in the same domain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployment
&lt;/h3&gt;

&lt;p&gt;Deploying the API Gateway + Lambda(GraphQL) + Lambda(REST) + DynamoDB configuration is easy with ServerlessFramework.&lt;br&gt;
You can find templates for each language on &lt;a href="https://github.com/serverless/examples" rel="noopener noreferrer"&gt;here&lt;/a&gt; and try deploying it all the way through. You'll be surprised at how easy it is.&lt;br&gt;
By the way, I use &lt;a href="https://github.com/serverless/serverless-graphql" rel="noopener noreferrer"&gt;here&lt;/a&gt; after customizing it to make it easier to use.&lt;/p&gt;

&lt;h3&gt;
  
  
  About Certification Authorization
&lt;/h3&gt;

&lt;p&gt;We use Cognito for authentication and authorization to implement login functions. If you are conscious of development speed, it may be faster to implement it yourself, but it's better to use a managed service because of the security implications.&lt;br&gt;
This can also be added with ServerlessFramework.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Form.
&lt;/h2&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%2Fi%2Flx5nvgwgnqoyknb0vvbm.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%2Fi%2Flx5nvgwgnqoyknb0vvbm.png" alt="aws (1)"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;In summary, the architecture is as shown in the above figure.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using ServerlessFramework&lt;/li&gt;
&lt;li&gt;S3 hosting + CloudFront for the front end and Lambda@Edge for the SSR&lt;/li&gt;
&lt;li&gt;The database is DynamoDB, not RDS.&lt;/li&gt;
&lt;li&gt;The API is basically GraphQL, you can easily add REST if needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope this will be helpful to those involved in startups.&lt;br&gt;
Thank you.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>aws</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Building "Neumorphism" iOS app</title>
      <dc:creator>ちぇん</dc:creator>
      <pubDate>Thu, 02 Jul 2020 11:30:42 +0000</pubDate>
      <link>https://dev.to/yuno_miyako/building-neumorphism-ios-app-2h15</link>
      <guid>https://dev.to/yuno_miyako/building-neumorphism-ios-app-2h15</guid>
      <description>&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%2Fwebdesign-trends.net%2Fwp%2Fwp-content%2Fuploads%2F2020%2F05%2FFreebie-Neumorphic-UX-UI-Elements-1024x768.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%2Fwebdesign-trends.net%2Fwp%2Fwp-content%2Fuploads%2F2020%2F05%2FFreebie-Neumorphic-UX-UI-Elements-1024x768.png" alt="ニューモフィズム"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What is Neumorphism
&lt;/h1&gt;

&lt;p&gt;Neumorphism is a style of design in which elements are pushed out or recessed in of the background.&lt;br&gt;
It's starting to become popular in early 2020.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cool 🥺&lt;/strong&gt;.&lt;br&gt;
I fell in love with it at first sight and decided to make some apps with Neumorphism design. &lt;br&gt;
This is DDD (Design-Driven Development) (there is no such word).&lt;/p&gt;

&lt;p&gt;I will create an AI recording app for talking in your sleep.&lt;br&gt;
It's an app that records only sleep talks by applying voice recognition to sounds while you are sleeping.&lt;/p&gt;

&lt;h1&gt;
  
  
  Creating Neumorphism icon
&lt;/h1&gt;

&lt;p&gt;In order to learn how to design Neumorphism, I'm going to start by building an app icon using Keynote.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Decide on a base color
&lt;/h2&gt;

&lt;p&gt;I decided the base color to #C4D2E9.&lt;br&gt;
Dye the background color with the base color.&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%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F234396%2F7912ecb5-984e-fe6d-d3bf-b22511604afe.jpeg" 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%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F234396%2F7912ecb5-984e-fe6d-d3bf-b22511604afe.jpeg" alt="アイコン作成イメージ.001.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Determine the color of the two shadows.
&lt;/h2&gt;

&lt;p&gt;Change the brightness of the base color to determine the "light shadow" and "dark shadow".&lt;/p&gt;

&lt;p&gt;light shadow: #ECF0F7&lt;br&gt;
dark shadow: #0E1624&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Place an object
&lt;/h2&gt;

&lt;p&gt;Place the object you want to push out (or make a dent in).&lt;br&gt;
In my case, I made it a balloon, like sleep talk.&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%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F234396%2Fd2b78495-0378-fd68-9aa4-fd72a98f28d1.jpeg" 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%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F234396%2Fd2b78495-0378-fd68-9aa4-fd72a98f28d1.jpeg" alt="アイコン作成イメージ.002.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Create an object with a dark shadow in the lower right corner
&lt;/h2&gt;

&lt;p&gt;Erase the border and cast the dark shadow (#0E1624) that we decided on earlier in the lower right corner.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F234396%2F87b6e62c-52f3-c78f-63bb-21594b78bb53.jpeg" 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%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F234396%2F87b6e62c-52f3-c78f-63bb-21594b78bb53.jpeg" alt="アイコン作成イメージ.003.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Create an object with a bright shadow in the upper left corner
&lt;/h2&gt;

&lt;p&gt;Similarly, erase the border and cast the bright shadow (#0E1624) you just decided on in the upper left corner.&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%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F234396%2F67bb1efa-00bd-3093-7eeb-c149fd5e2029.jpeg" 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%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F234396%2F67bb1efa-00bd-3093-7eeb-c149fd5e2029.jpeg" alt="アイコン作成イメージ.004.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Stack the two objects
&lt;/h2&gt;

&lt;p&gt;The two objects you made in steps 5 and 6 are stacked exactly on top of each other.&lt;br&gt;
And then, oh my... I see...&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%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F234396%2Fa621c9f3-8cfd-67c5-6cdf-1711c236af79.jpeg" 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%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F234396%2Fa621c9f3-8cfd-67c5-6cdf-1711c236af79.jpeg" alt="アイコン作成イメージ.005.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Final touches to complete the icon.
&lt;/h2&gt;

&lt;p&gt;I just put ZZZ on top, but this completes the icon.&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%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F234396%2F7d3bb9a5-6556-b7e4-7375-c61a53ed108f.jpeg" 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%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F234396%2F7d3bb9a5-6556-b7e4-7375-c61a53ed108f.jpeg" alt="アイコン作成イメージ.006.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Building Neumorphism app in Swift
&lt;/h1&gt;

&lt;p&gt;Now that the icons are ready, everyone is waiting for you to implement the Neumorphism in Swift. Let's go!&lt;/p&gt;

&lt;p&gt;Immediately I searched "Swift Neumorphism github".&lt;br&gt;
And I found it! The library of our great predecessors!&lt;br&gt;
&lt;a href="https://github.com/hirokimu/EMTNeumorphicView" rel="noopener noreferrer"&gt;https://github.com/hirokimu/EMTNeumorphicView&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's the best library for Neumorphism UIView.&lt;br&gt;
Huh? Why not implement it full scratch? I do not.&lt;/p&gt;

&lt;h1&gt;
  
  
  Recording Screen
&lt;/h1&gt;

&lt;p&gt;I used EMTNeumorphicView to create buttons.&lt;br&gt;
The concave buttons are cute.&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%2Fi%2Ff7s6y0phokmdcbjhvei5.jpeg" 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%2Fi%2Ff7s6y0phokmdcbjhvei5.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Playback Screen
&lt;/h1&gt;

&lt;p&gt;It applies voice recognition to the recorded voice and displays only the sound that looks like a sleep mumble with the result of voice recognition.&lt;br&gt;
It's not too noisy even if it's a list.&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%2Fi%2F3akljrnu5nup0thcl6r4.jpeg" 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%2Fi%2F3akljrnu5nup0thcl6r4.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Source Code Release.
&lt;/h1&gt;

&lt;p&gt;I'm not doing anything technically interesting, so I'll just publish the source code this time...&lt;br&gt;
Code reviewers welcome! 🙇️&lt;br&gt;
&lt;a href="https://github.com/KitaharaMugiro/NegotoRecorder" rel="noopener noreferrer"&gt;https://github.com/KitaharaMugiro/NegotoRecorder&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  "AI SleepTalk Recorder" is now available on the AppStore!
&lt;/h1&gt;

&lt;p&gt;I also released it to the AppStore.&lt;br&gt;
It's only 2$. Nothing is free. I'm planning to upgrade.&lt;br&gt;
&lt;a href="https://apps.apple.com/us/app/id1521147935" rel="noopener noreferrer"&gt;https://apps.apple.com/us/app/id1521147935&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
      <category>neumorphism</category>
    </item>
    <item>
      <title>Increase your development success rate with a Lean start-up</title>
      <dc:creator>ちぇん</dc:creator>
      <pubDate>Thu, 21 May 2020 11:17:09 +0000</pubDate>
      <link>https://dev.to/yuno_miyako/increase-your-development-success-rate-with-a-lean-start-up-40ol</link>
      <guid>https://dev.to/yuno_miyako/increase-your-development-success-rate-with-a-lean-start-up-40ol</guid>
      <description>&lt;h1&gt;
  
  
  personal development that fails.
&lt;/h1&gt;

&lt;p&gt;I've made a number of products in the past as a personal development hobby.&lt;br&gt;
I wanted a lot of users, and hoped to monetize them eventually, but unfortunately, they were only used by a small number of people for a short time, and we couldn't envision the future.&lt;br&gt;
We tend to do things in personal development like "I had a good idea, so I just started making it" or "I just made it without a customer". I think it's a common mistake to end up with no one using your idea or customer because you didn't pack it in the first place.&lt;br&gt;
That's fine in terms of developing a hobby or improving your skills, but if you have a desire to turn it into a business, you may need to rethink it.&lt;br&gt;
If you're attacking an area that no one else sees as an issue, or if your solution isn't attractive enough for users to pay for, you're not going to be able to retain users, much less monetize them.&lt;br&gt;
One of the methodologies for increasing the success rate of a product is the &lt;strong&gt;Lean Startup&lt;/strong&gt;.&lt;br&gt;
I would like to enumerate the things you should do before actually developing it with reference to it.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is Lean Startup?
&lt;/h1&gt;

&lt;p&gt;Lean means "waste-free and efficient," and Lean Startup is a methodology for eliminating the &lt;strong&gt;waste&lt;/strong&gt; of time, effort, resources, and passion that comes with developing products and services that are worthless to customers in the minds of business owners. It is characterized by a minimum cost and a short cycle to find out the needs of the user by repeatedly testing the hypothesis.&lt;/p&gt;

&lt;h1&gt;
  
  
  What should you do before you develop a product?
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1, Find a customer.
&lt;/h2&gt;

&lt;p&gt;If the customer doesn't exist first, the service won't be used. Start by finding your customers. You need to find out where your customers are.&lt;br&gt;
Decide on your target customer segment and make sure you can &lt;em&gt;actually&lt;/em&gt; contact people in that segment, even if it's just a few people.&lt;/p&gt;

&lt;h2&gt;
  
  
  2, Find out what the customer has to do (JOB)
&lt;/h2&gt;

&lt;p&gt;The customer has something &lt;strong&gt;to do&lt;/strong&gt; (JOB)&lt;strong&gt;. That's why needs arise because we are in need of something or want something.&lt;br&gt;
Since the customer's needs are mostly in a non-verbal state, you need to explore them &lt;em&gt;through interviews&lt;/em&gt;.&lt;br&gt;
It's straightforward: "Is there anything you want? or "Will this solution I have in mind help you? If you ask, "What do you need?", you may not be able to properly understand your needs.&lt;br&gt;
So the interview starts with understanding the client's **JOB&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What are the challenges?&lt;/li&gt;
&lt;li&gt;Does the issue matter? Why do you think that?&lt;/li&gt;
&lt;li&gt;How much opportunity loss, increased costs, stress, etc. are caused by it?&lt;/li&gt;
&lt;li&gt;What solutions are you currently using to meet those challenges?&lt;/li&gt;
&lt;li&gt;Is the solution appropriate? What other options do you have?&lt;/li&gt;
&lt;li&gt;What is the satisfaction level of each solution? Hear more about the good and the bad.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By asking questions like the above, you can see what your customers need to do, what challenges they have, and what solutions they are currently using.&lt;br&gt;
This is where we come up with solutions to solve the customer's problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  3, Do a problem-solving fit
&lt;/h2&gt;

&lt;p&gt;Even if you come up with a solution that solves a customer's problem, it is only a hypothesis as to whether it can actually solve the problem.&lt;br&gt;
If it doesn't make the user want to actually pay to use it, then it's likely not solving the problem.&lt;br&gt;
When you make an &lt;strong&gt;offer&lt;/strong&gt; to a customer, you decide if they will agree to it or not.&lt;br&gt;
The offer will be presented in &lt;strong&gt;three parts&lt;/strong&gt;. First, a &lt;strong&gt;one word proposition&lt;/strong&gt; of what the user is looking for, then a &lt;strong&gt;demo&lt;/strong&gt; of mocks, videos, etc. that actually move the customer's journey forward, and finally a &lt;strong&gt;price model&lt;/strong&gt;.&lt;br&gt;
Repeat the offer presentation with user interviews to determine the actual &lt;strong&gt;MVP&lt;/strong&gt; to be made.&lt;/p&gt;

&lt;h2&gt;
  
  
  4, Draw a business model
&lt;/h2&gt;

&lt;p&gt;After deciding on the direction of the service to be developed, we will draw a business model.&lt;br&gt;
There's a framework called Lean Canvas.&lt;/p&gt;

&lt;p&gt;The Lean Canvas fills in the following nine items to get an overall picture of your business model.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Subject.&lt;/li&gt;
&lt;li&gt;Customer segment
3、Unique value proposition&lt;/li&gt;
&lt;li&gt;Solutions&lt;/li&gt;
&lt;li&gt;Channel (how to approach the target)&lt;/li&gt;
&lt;li&gt;Revenue stream&lt;/li&gt;
&lt;li&gt;Cost structure&lt;/li&gt;
&lt;li&gt;Key Indicators&lt;/li&gt;
&lt;li&gt;Overwhelming superiority.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  5. Actual production (product market fit)
&lt;/h1&gt;

&lt;p&gt;Now that we've gotten this far, let's finally start developing the service!&lt;br&gt;
This development phase is called &lt;strong&gt;Product Market Fit&lt;/strong&gt;.&lt;br&gt;
The purpose is the phase** of demonstrating whether a "service that customers are willing to pay for" actually produces money.&lt;br&gt;
However, it is not always the case that if you don't actually generate money here, it is a failure. Some business models convert advertising costs and user-generated content into monetary value, which can only happen if you have a certain number of users.&lt;br&gt;
Therefore, it is acceptable to use other alternative indicators. You can see if your service is sticking with your customers by, for example, conversion rates from landing pages to membership signups and user retention rates.&lt;/p&gt;

&lt;p&gt;You don't need &lt;strong&gt;a lot of users&lt;/strong&gt; to validate your business model. Therefore, there is no need for extensive publicity. When a new machine is installed in a factory, it is not suddenly put into full operation. Initially, we do a few tests and when we find that it works, we gradually increase the production volume.&lt;br&gt;
Apparently, Facebook initially launched only at Harvard University instead of going global. By limiting the scope of their launch, they focused on improving the product and added more universities to use it one by one.&lt;br&gt;
In this way, once we have confirmed the reproducibility of the product's market fit phase, we can expand our services in this way.&lt;/p&gt;

&lt;h1&gt;
  
  
  Finally.
&lt;/h1&gt;

&lt;p&gt;I used to innocently think that if you create something interesting, you will get buzz and be a big success, so when I came across this Lean Startup methodology, it really opened my eyes.&lt;br&gt;
Currently, I'm personally working with one designer and two engineers on a service for travelers &lt;a href="https://travel-thru.online/upload?lang=en"&gt;"Travel Through"&lt;/a&gt;, and I'm reflecting on the fact that I created the product at a stage where the business model and customer development were rather lax.&lt;br&gt;
From now on, I would like to turn around, find the issues of the customers, and recreate the business model from scratch.&lt;br&gt;
Let's do some fun personal development for reference!&lt;/p&gt;

</description>
      <category>agile</category>
      <category>lean</category>
      <category>develop</category>
    </item>
    <item>
      <title>A team with long experience in waterfall  experienced agile development.</title>
      <dc:creator>ちぇん</dc:creator>
      <pubDate>Sun, 05 Apr 2020 00:35:54 +0000</pubDate>
      <link>https://dev.to/yuno_miyako/a-team-with-long-experience-in-waterfall-experienced-agile-development-5659</link>
      <guid>https://dev.to/yuno_miyako/a-team-with-long-experience-in-waterfall-experienced-agile-development-5659</guid>
      <description>&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;I works as a consultant and coached a team with long experience in waterfall to develop a product by agile. I lectured some agile practices and I asked what they thought about them.&lt;/p&gt;

&lt;h1&gt;
  
  
  Practices which I lectured
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Sprint&lt;/li&gt;
&lt;li&gt;Task management with Kanban&lt;/li&gt;
&lt;li&gt;Test Driven Development&lt;/li&gt;
&lt;li&gt;Pair Programming&lt;/li&gt;
&lt;li&gt;Refactoring&lt;/li&gt;
&lt;li&gt;Estimation by story points&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Impressions of introducing Sprint
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;In the first sprint, we only focused on the most valuable feature so we designed it and coded it immediately. I thought it was good that the span of PLAN to DO was short. Because in the watarfall case we cannot DO(coding) until we PLAN(design) everything and this is too slow to verify that the product is really valuable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Impressions of introducing Task management with Kanban
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Task size was smaller than we do in the watarfall and I was glad I could concentrate on the small task. I didn't need to see other modules or functions.&lt;/li&gt;
&lt;li&gt;I could see who do what, so I didn't need to worry about progress.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Impressions of introducing Test Driven Development
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It was very interesting to develop product gradually.&lt;/li&gt;
&lt;li&gt;Test driven development seems to be incompatible when test specifications and test reports are requested as deliverables&lt;/li&gt;
&lt;li&gt;I think it's very interesting that the test behaves like a specification, so I'd like to actively incorporate it if I can get the customer's understanding.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Impressions of introducing Pair Programming
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Troubles are solved immediately and it is easy to do (less time spent worrying alone)&lt;/li&gt;
&lt;li&gt;I spend more time thinking or doing research than coding, so I thought pair programming does not decrease productivity.&lt;/li&gt;
&lt;li&gt;It seems to be incompatible with man-month calculation.&lt;/li&gt;
&lt;li&gt;There is no atmosphere of coding with people(normally alone) in the current position, so introduction of pair programming seems to have psychological obstacles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Impressions of introducing Refactoring
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The end of production means the end of the project in watarfall, so there's not much motivation for refactoring.&lt;/li&gt;
&lt;li&gt;Code doesn't have to be pretty. If it move, OK!&lt;/li&gt;
&lt;li&gt;But I know I should code cleanly.&lt;/li&gt;
&lt;li&gt;Because specification of product can change every weeks in agile development, it's important to keep the code base so that changes can be accepted.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Impressions of introducing Estimation by story points
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Accuracy was higher than estimated by feeling&lt;/li&gt;
&lt;li&gt;I was able to experience that the accuracy improved with each sprint&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Waterfall development is vulnerable to change, and programmers at the site are aware of it.&lt;br&gt;
The importance of doing things like "I don't know what the user wants. Let's make a hypothesis and receive feedback to grow the product" is increasing in this age.&lt;br&gt;
In doing so, the above agile practices may be helpful.&lt;/p&gt;

&lt;h1&gt;
  
  
  I want your comment.
&lt;/h1&gt;

&lt;p&gt;I am Japanese and in Japan almost all of development is waterfall.&lt;br&gt;
I work as a consultant to change their mind, skill, or company system to move to agile from waterfall.&lt;br&gt;
I want to know about your country case. &lt;/p&gt;

</description>
      <category>agile</category>
    </item>
    <item>
      <title>Why don't we take in DDD to interview coding test.</title>
      <dc:creator>ちぇん</dc:creator>
      <pubDate>Fri, 03 Jan 2020 20:29:55 +0000</pubDate>
      <link>https://dev.to/yuno_miyako/why-don-t-we-take-in-ddd-to-interview-coding-test-475i</link>
      <guid>https://dev.to/yuno_miyako/why-don-t-we-take-in-ddd-to-interview-coding-test-475i</guid>
      <description>&lt;p&gt;I always feels the code of interview tests is not readable.&lt;br&gt;
The shorten variable names, all logic packed in one method, etc. They are forbidden in real life coding but is it really okay in interview?&lt;/p&gt;

&lt;p&gt;Watch example from leetcode.&lt;br&gt;
&lt;a href="https://leetcode.com/problems/longest-substring-without-repeating-characters/"&gt;https://leetcode.com/problems/longest-substring-without-repeating-characters/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The question is like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Given a string, find the length of the longest substring without repeating characters.

Example 1:

Input: "abcabcbb"
Output: 3 
Explanation: The answer is "abc", with the length of 3. 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And the example answer is like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lengthOfLongestSubstring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;str_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;max_length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;str_list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;str_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;str_list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;str_list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
        &lt;span class="n"&gt;str_list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    
        &lt;span class="n"&gt;max_length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str_list&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;max_length&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Yeah, it's a short method and not difficult to understand but not perfect.&lt;br&gt;
If you take in DDD and Value Object, it can be more readable.&lt;br&gt;
Like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Character&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;same&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SubString&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Character&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Character&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
        &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;popUntil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Character&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;popped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;popped&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;same&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
            &lt;span class="n"&gt;popped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Character&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lengthOfLongestSubstring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;subString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SubString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;maxLength&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
            &lt;span class="n"&gt;character&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Character&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;subString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;character&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
                &lt;span class="n"&gt;subString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;popUntil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;character&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;subString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;character&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;maxLength&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maxLength&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;maxLength&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;wow it got longer than previous one.&lt;br&gt;
However it's easier to understand the coder thought, is it?&lt;br&gt;
Yeah, I know that time is limited in interview but I think the most important thing is to convey your thinking process to people, then try to take in DDD and you can express your thought more easily.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Three layers of productivity and my recommends</title>
      <dc:creator>ちぇん</dc:creator>
      <pubDate>Mon, 11 Nov 2019 21:15:58 +0000</pubDate>
      <link>https://dev.to/yuno_miyako/three-layers-of-productivity-and-my-recommends-19d7</link>
      <guid>https://dev.to/yuno_miyako/three-layers-of-productivity-and-my-recommends-19d7</guid>
      <description>&lt;p&gt;I think there are three layers in the productivity.&lt;/p&gt;

&lt;p&gt;The first one is personal productivity, the second one is team productivity, and the last layer is the architecture(or organization) productivity.&lt;/p&gt;

&lt;h1&gt;
  
  
  Personal Productivity
&lt;/h1&gt;

&lt;p&gt;My recommends for boosting &lt;strong&gt;personal productivity&lt;/strong&gt; in coding are TDD, knowing data structure and algorithm, and design pattern.&lt;br&gt;
TDD stands for Test Driven Development and it improve my code and speed.&lt;br&gt;
Knowing data structure, especially hash map, reduce my time for problem resolution.&lt;br&gt;
And design pattern is applicable through any platform or any framework. Listener pattern can be used in mobile development, web development, and simple application anywhere.&lt;/p&gt;

&lt;h1&gt;
  
  
  Team Productivity
&lt;/h1&gt;

&lt;p&gt;Agile or Scrum is for boosting team productivity.&lt;br&gt;
Kanban board is super useful for task management.&lt;br&gt;
Retrospective makes us look back our process and improve it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Architecture Productivity
&lt;/h1&gt;

&lt;p&gt;Micro Service is the best architecture for big products.&lt;br&gt;
Many team can work in autonomous with freedom and responsibility.&lt;br&gt;
Each team can use any technology and any programming language for the specific problem they want to solve.&lt;br&gt;
They can innovate small.&lt;br&gt;
It also reduce communication overhead.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What is the most import factor to be a high salary engineer?</title>
      <dc:creator>ちぇん</dc:creator>
      <pubDate>Sat, 12 Oct 2019 19:19:42 +0000</pubDate>
      <link>https://dev.to/yuno_miyako/what-is-the-most-import-factor-to-be-a-high-salary-engineer-3lm2</link>
      <guid>https://dev.to/yuno_miyako/what-is-the-most-import-factor-to-be-a-high-salary-engineer-3lm2</guid>
      <description>&lt;p&gt;Good portfolio to show on job interviews?&lt;br&gt;
Broad knowledge of data structure and algorithm?&lt;br&gt;
Job Experience? What kind of job experience is needed?&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
  </channel>
</rss>
