<?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: Cris Mihalache</title>
    <description>The latest articles on DEV Community by Cris Mihalache (@f3rno64).</description>
    <link>https://dev.to/f3rno64</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%2F1083924%2F1c6fe943-7dc6-4447-9d8d-12e8723aa5f2.jpg</url>
      <title>DEV Community: Cris Mihalache</title>
      <link>https://dev.to/f3rno64</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/f3rno64"/>
    <language>en</language>
    <item>
      <title>Using Chat GPT To Generate Datasets 🤖</title>
      <dc:creator>Cris Mihalache</dc:creator>
      <pubDate>Wed, 21 Feb 2024 22:11:15 +0000</pubDate>
      <link>https://dev.to/f3rno64/using-chat-gpt-to-generate-datasets-99n</link>
      <guid>https://dev.to/f3rno64/using-chat-gpt-to-generate-datasets-99n</guid>
      <description>&lt;p&gt;Recently I used &lt;a href="https://chat.openai.com/"&gt;&lt;strong&gt;Chat GPT&lt;/strong&gt;&lt;/a&gt; to generate mock data in JSON format.&lt;/p&gt;

&lt;p&gt;This is extremely powerful, as you can describe what real data looks like in your prompt, and &lt;a href="https://chat.openai.com/"&gt;Chat GPT&lt;/a&gt; will generate data with realistic content in fields like descriptions, titles, tags, etc.&lt;/p&gt;

&lt;p&gt;This is a sample of the data &lt;a href="https://chat.openai.com"&gt;&lt;strong&gt;Chat GPT&lt;/strong&gt;&lt;/a&gt; generated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Implementing OAuth2 for user authentication&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@feature&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@security&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-02-22T03:11:03&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;end&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-02-22T06:36:18&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice how the description, tags, and duration are all realistic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;To build the documentation website for &lt;a href="https://github.com/f3rno64/track-time-cli"&gt;&lt;strong&gt;&lt;code&gt;track-time-cli&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;, I needed a database with mock data to have realistic command output in the documentation content.&lt;/p&gt;

&lt;p&gt;To get &lt;a href="https://chat.openai.com"&gt;&lt;strong&gt;Chat GPT&lt;/strong&gt;&lt;/a&gt; to generate them for me, I used the following prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Generate 5 time sheet entries with realistic software development tasks as descriptions. Use the following schema:

        {
          "id": 1,
          "description": "writing documentation",
          "tags": [
            "@feature",
            "@docs"
          ],
          "start": "2024-02-21T18:26:45",
          "end": "2024-02-21T19:33:08"
        }

The entries should be sequential in time, of varying durations (between 5 minutes and 5 hours), and have realistic descriptions that fit the software development time sheet theme.

The output should be in JSON, an array of time sheet entries conforming to the provided schema example.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that I specified the &lt;strong&gt;number of entries&lt;/strong&gt; (&lt;em&gt;5&lt;/em&gt;) and the &lt;strong&gt;type of activity&lt;/strong&gt; (&lt;em&gt;realistic software development tasks&lt;/em&gt;) that should be mentioned in the description.&lt;/p&gt;

&lt;p&gt;I defined the output schema by providing an example of a correctly formatted time sheet entry. I also specified that they should be sequential in time and have realistic durations as would be expected for the defined &lt;strong&gt;type of activity&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Result
&lt;/h3&gt;

&lt;p&gt;This was the output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Refactoring user interface code&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@feature&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@frontend&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-02-21T18:26:45&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;end&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-02-21T22:39:32&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Optimizing database queries for report generation&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@performance&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@database&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-02-21T22:39:32&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;end&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-02-22T03:11:03&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Implementing OAuth2 for user authentication&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@feature&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@security&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-02-22T03:11:03&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;end&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-02-22T06:36:18&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Weekly team sync-up meeting&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@meeting&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@communication&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-02-22T06:36:18&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;end&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-02-22T10:16:24&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Adding localization support for new languages&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@feature&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@i18n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-02-22T10:16:24&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;end&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-02-22T11:50:10&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After running this prompt a few times to generate 16 entries, I placed them all in an array within a mock JSON database. The output of running &lt;a href="https://github.com/f3rno64/track-time-cli"&gt;&lt;strong&gt;&lt;code&gt;track-time-cli&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;'s &lt;code&gt;list&lt;/code&gt; command was the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; 23:50 ▶ 97% ▶ xia ▶ f3rno64 ▶ .track-time-cli ▶  main ▶ ✎ ▶ 2? ▶ $ ▶ tt l
* Showing sheets since 2/21/2024, 12:00:00 AM [yesterday]

- Sheet main (16 entries) [1:10:19:16]
    (1)   [9:28:26]  yesterday       -&amp;gt;  14 hours ago    Writing API documentation                           @feature @docs
    (2)   [16:51]    14 hours ago    -&amp;gt;  14 hours ago    Implementing user authentication module             @feature @backend
    (3)   [50:01]    14 hours ago    -&amp;gt;  13 hours ago    Designing database schema for new features          @design @database
    (4)   [2:04:11]  13 hours ago    -&amp;gt;  11 hours ago    Improving responsive design for mobile devices      @feature @frontend
    (5)   [2:29:48]  11 hours ago    -&amp;gt;  9 hours ago     Conducting user experience research                 @research @ux
    (6)   [1:42:30]  9 hours ago     -&amp;gt;  7 hours ago     Implementing caching for improved performance       @performance @backend
    (7)   [9:08]     7 hours ago     -&amp;gt;  7 hours ago     Weekly team retrospective meeting                   @meeting @team
    (8)   [39:52]    7 hours ago     -&amp;gt;  6 hours ago     Refining search algorithm                           @algorithm @backend
    (9)   [2:13:23]  6 hours ago     -&amp;gt;  4 hours ago     Reviewing and merging pull requests                 @review @version-control
    (10)  [1:08:12]  4 hours ago     -&amp;gt;  3 hours ago     Developing new feature for customer analytics       @feature @analytics
    (11)  [2:27:32]  3 hours ago     -&amp;gt;  21 minutes ago  Solving compatibility issues in cross-platform app  @bugfix @mobile
    (12)  [3:14:14]  21 minutes ago  -&amp;gt;  in 3 hours      Organizing backlog and prioritizing tasks           @planning @management
    (13)  [3:07:36]  in 3 hours      -&amp;gt;  in 6 hours      Upgrading server infrastructure                     @maintenance @devops
    (14)  [1:41:17]  in 6 hours      -&amp;gt;  in 8 hours      Creating automated tests for new API endpoints      @testing @automation
    (15)  [2:02:29]  in 8 hours      -&amp;gt;  in 10 hours     Troubleshooting server downtime issues              @maintenance @devops
    (16)  [43:46]    in 10 hours     -&amp;gt;  in 10 hours     Designing user interface for the upcoming module    @design @frontend

* 0 Sheets not shown. use --all to show
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;Clearly &lt;a href="https://chat.openai.com"&gt;&lt;strong&gt;Chat GPT&lt;/strong&gt;&lt;/a&gt; is a great tool for generating realistic datasets.&lt;/p&gt;

&lt;p&gt;Try it out the next time you need some mock data with realistic textual content! 🚀&lt;/p&gt;

</description>
      <category>programming</category>
      <category>chatgpt</category>
      <category>ai</category>
    </item>
    <item>
      <title>time-speak: A Node.JS Library For Parsing Dates and Durations 🚀🕒</title>
      <dc:creator>Cris Mihalache</dc:creator>
      <pubDate>Mon, 15 Jan 2024 17:53:51 +0000</pubDate>
      <link>https://dev.to/f3rno64/time-speak-a-nodejs-library-for-parsing-dates-and-durations-16dm</link>
      <guid>https://dev.to/f3rno64/time-speak-a-nodejs-library-for-parsing-dates-and-durations-16dm</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Get time-speak here on npm&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While working on &lt;a href="https://dev.to/f3rno64/a-powerful-nodejs-cli-time-tracker-1fb0"&gt;&lt;strong&gt;track-time-cli&lt;/strong&gt;&lt;/a&gt;, I encountered the need for a library to parse dates and intervals, so natural language could be used to specify time sheet entry start &amp;amp; end dates. For example, &lt;code&gt;tt in --at 'three hours ago' some task&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I went ahead and wrote a tiny library for this, &lt;a href="https://www.npmjs.com/package/time-speak"&gt;&lt;strong&gt;time-speak&lt;/strong&gt;&lt;/a&gt;. It is nearly dependency-free, with just one requirement of &lt;a href="https://www.npmjs.com/package/numbers-from-words"&gt;&lt;strong&gt;numbers-from-words&lt;/strong&gt;&lt;/a&gt;, another zero-dependency library of mine for parsing numbers from words (i.e. &lt;code&gt;parse('twenty three')&lt;/code&gt;).&lt;/p&gt;




&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;To use, install it with &lt;code&gt;npm i --save time-speak&lt;/code&gt; and import the parse method with either &lt;code&gt;import { parse } from 'time-speak'&lt;/code&gt; or &lt;code&gt;import parse from 'time-speak'&lt;/code&gt;, then just pass the parse method your input string.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href="https://www.npmjs.com/package/numbers-from-words"&gt;&lt;strong&gt;numbers-from-words&lt;/strong&gt;&lt;/a&gt;, number words are supported in the input, so all of the following are valid inputs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"2 days and three hours ago"&lt;/li&gt;
&lt;li&gt;"in five weeks"&lt;/li&gt;
&lt;li&gt;"3 minutes ago"&lt;/li&gt;
&lt;li&gt;"24 hours"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inputs specifying a date in the future (starting with "in") are parsed as such, while inputs ending in "ago" are parsed as dates in the past, relative to the present moment. Such inputs to parse return Date objects.&lt;/p&gt;

&lt;p&gt;Inputs without the "in" prefix or "ago" suffix are parsed as durations, and the return value is the duration length in milliseconds, a number.&lt;/p&gt;

&lt;p&gt;Here is an example taken from the docs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;parse&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;time-speak&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pastDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2 days and 4 hours ago&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pastDateWithNumberWords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;two days and four hours ago&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;futureDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;in 4 hours&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;durationMS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;6 months&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;pastDateWithNumberWords&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// 2023-12-19T13:02:39.768Z&lt;/span&gt;
  &lt;span class="nx"&gt;pastDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                   &lt;span class="c1"&gt;// 2023-12-19T13:02:39.768Z&lt;/span&gt;
  &lt;span class="nx"&gt;futureDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;// 2023-12-21T21:02:39.768Z&lt;/span&gt;
  &lt;span class="nx"&gt;durationMS&lt;/span&gt;                  &lt;span class="c1"&gt;// 15552000000&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;That's it! Go ahead and start hacking!&lt;/p&gt;

&lt;p&gt;Links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/f3rno64/time-speak"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/time-speak"&gt;NPM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>node</category>
      <category>programming</category>
    </item>
    <item>
      <title>A Powerful Node.JS CLI Time Tracker ⏱️🚀</title>
      <dc:creator>Cris Mihalache</dc:creator>
      <pubDate>Sun, 24 Dec 2023 19:52:57 +0000</pubDate>
      <link>https://dev.to/f3rno64/a-powerful-nodejs-cli-time-tracker-1fb0</link>
      <guid>https://dev.to/f3rno64/a-powerful-nodejs-cli-time-tracker-1fb0</guid>
      <description>&lt;p&gt;After using Ruby's &lt;a href="https://github.com/samg/timetrap" rel="noopener noreferrer"&gt;&lt;strong&gt;timetrap&lt;/strong&gt;&lt;/a&gt; (sadly no longer maintained) for many years, I realized there was no equivalent in the Node.JS ecosystem, so I decided to build one.&lt;/p&gt;

&lt;p&gt;Introducing &lt;a href="https://github.com/f3rno64/track-time-cli" rel="noopener noreferrer"&gt;&lt;strong&gt;track-time-cli&lt;/strong&gt;&lt;/a&gt;, a utility for keeping track of the time you spend on your projects and (eventually) viewing useful metrics and statistics on your performance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuswwmgkuktuclg9xl1y0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuswwmgkuktuclg9xl1y0.png" alt="Output of  raw `'tt l -c'` endraw "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is a Node.JS CLI app written in &lt;strong&gt;TypeScript&lt;/strong&gt; supporting natural language input for task start/end times (i.e., &lt;em&gt;1 hour ago&lt;/em&gt; or &lt;em&gt;twelve minutes ago&lt;/em&gt;.)&lt;/p&gt;

&lt;p&gt;Most commands offer arguments for altering the display of durations in natural language (i.e., &lt;code&gt;33:00&lt;/code&gt; as &lt;code&gt;33 minutes&lt;/code&gt;) or times as relative (i.e., &lt;code&gt;12/24/2023, 6:51:39 PM&lt;/code&gt; as &lt;code&gt;26 minutes ago&lt;/code&gt;.)&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Install it with &lt;code&gt;npm i -g track-time-cli&lt;/code&gt;; the entry point/command is &lt;strong&gt;tt&lt;/strong&gt;, and by default, when called with no arguments, it shows the currently active timesheet entry.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;All data is stored in &lt;code&gt;~/.track-time-cli/db.json&lt;/code&gt;, a folder that you can turn into a git repository for backing up your data as the number of entries grows.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Run &lt;code&gt;tt --help&lt;/code&gt; to view the list of supported commands:&lt;/p&gt;

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

track-time-cli now

Display all active time sheet entries

Commands:
  track-time-cli in &amp;lt;description..&amp;gt;    Check in to a time sheet     [aliases: i]
  track-time-cli now                   Display all active time sheet entries
                                                                       [default]
  track-time-cli out                   Check out of the currently active time
                                       sheet entry                  [aliases: o]
  track-time-cli week [sheets..]       Display a summary of activity for the
                                       past week                    [aliases: w]
  track-time-cli list [sheets..]       List all time sheet entries  [aliases: l]
  track-time-cli edit [description..]  View, modify, or delete a time sheet
                                       entry                        [aliases: e]
  track-time-cli today [sheets..]      Display a summary of activity for today
                                                                    [aliases: t]
  track-time-cli sheet [name]          Switch to or delete a sheet by name
                                                                    [aliases: s]
  track-time-cli sheets                List all sheets             [aliases: ss]
  track-time-cli resume                Resume the last active entry [aliases: r]
  track-time-cli yesterday [sheets..]  Display a summary of activity for
                                       yesterday                    [aliases: y]
  track-time-cli breakdown [sheets..]  Display total durations per day for one
                                       or more sheets               [aliases: b]

Options:
      --version   Show version number                                  [boolean]
  -h, --humanize  Print the total duration in human-readable format    [boolean]
      --help      Show help                                            [boolean]

Examples:
  tt in --at "20 minutes ago" fixing a bug  Check in at a custom time
  tt out --at "5 minutes ago"               Check out at a custom time
  tt list --today --all                     View all entries from today
  tt b                                      Show a breakdown of your activity
  tt today --all                            View activity for the current day


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

&lt;/div&gt;




&lt;h3&gt;
  
  
  A Note on Command Aliases
&lt;/h3&gt;

&lt;p&gt;Almost all commands have short aliases, which I will use exclusively in this post. For example, &lt;code&gt;tt yesterday&lt;/code&gt; is the same as &lt;code&gt;tt y&lt;/code&gt;. Check the output of &lt;code&gt;tt --help&lt;/code&gt; for information on available aliases.&lt;/p&gt;




&lt;h2&gt;
  
  
  Timesheets 📚
&lt;/h2&gt;

&lt;p&gt;A task in &lt;strong&gt;track-time-cli&lt;/strong&gt; is known as a &lt;em&gt;timesheet entry&lt;/em&gt; and belongs to a timesheet. Timesheets can represent any group or category of tasks but are primarily meant to represent individual projects.&lt;/p&gt;

&lt;p&gt;To view the list of timesheets, run &lt;code&gt;tt sheets&lt;/code&gt; or the shorter &lt;code&gt;tt ss&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8kcimucb1ntgemr7eh4h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8kcimucb1ntgemr7eh4h.png" alt="Output of running  raw `'tt ss'` endraw "&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Managing Timesheets
&lt;/h3&gt;

&lt;p&gt;To create a new timesheet, or switch to an existing one, run &lt;code&gt;tt s [name]&lt;/code&gt;. Running &lt;code&gt;tt s&lt;/code&gt; with no name will display the currently active timesheet.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When the DB is initialized, a timesheet named &lt;strong&gt;main&lt;/strong&gt; is created and set as active by default.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To delete a timesheet, run &lt;code&gt;tt s --delete [timesheet name]&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Tracking Tasks ⏱️
&lt;/h3&gt;

&lt;p&gt;To &lt;strong&gt;start&lt;/strong&gt;, or &lt;strong&gt;check in to&lt;/strong&gt; a timesheet entry, run &lt;code&gt;tt in [description]&lt;/code&gt;. If you started working earlier and forgot to check in, you can do so retroactively with the &lt;code&gt;--at&lt;/code&gt; argument, i.e., &lt;code&gt;tt in --at '10 minutes ago' developing feature X&lt;/code&gt; would create a timesheet entry that started 10 minutes ago with a description of &lt;em&gt;developing feature X&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you want to start a new entry with the same description as the previous one, &lt;code&gt;tt resume&lt;/code&gt; (or &lt;code&gt;tt r&lt;/code&gt;) exists, which will check in with the same description as the most recently active entry on the sheet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Similarly, to &lt;strong&gt;end&lt;/strong&gt; or &lt;strong&gt;check out of&lt;/strong&gt; a task, run &lt;code&gt;tt out&lt;/code&gt; optionally, providing the &lt;code&gt;--at&lt;/code&gt; argument (i.e., &lt;code&gt;tt out --at '5 minutes ago&lt;/code&gt;) if you stopped working and forgot to check out of your time sheet.&lt;/p&gt;

&lt;h4&gt;
  
  
  All of the following are valid &lt;strong&gt;in/out&lt;/strong&gt; time inputs:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;'19 minutes ago'&lt;/li&gt;
&lt;li&gt;'forty five minutes ago'&lt;/li&gt;
&lt;li&gt;'1 hour and 20 minutes ago'&lt;/li&gt;
&lt;li&gt;'1 day, three hours, and 2 minutes ago'&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Viewing Tasks 📃
&lt;/h3&gt;

&lt;p&gt;To view historical and active tasks, there is the &lt;strong&gt;list&lt;/strong&gt; command, &lt;code&gt;tt l&lt;/code&gt;, which will print out a list of tasks. It is fairly powerful; here is the output of &lt;code&gt;tt l --help&lt;/code&gt;:&lt;/p&gt;

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

track-time-cli list [sheets..]

List all time sheet entries

Options:
      --version          Show version number                           [boolean]
  -r, --ago, --relative  Print dates as relative time (e.g. 5 minutes ago)
                                                                       [boolean]
  -h, --humanize         Print the total duration in human-readable format
                                                                       [boolean]
  -s, --since            Only list entries since the specified date     [string]
  -t, --today            Show results for today                        [boolean]
      --all-sheets       Show results for all sheets                   [boolean]
  -a, --all              Show all sheet entries                        [boolean]
  -y, --yesterday        Show results from yesterday                   [boolean]
  -c, --concise          Exclude start and end dates from output, showing
                         duration only                                 [boolean]
      --help             Show help                                     [boolean]
      --sheets           Show results for the specified sheets
  [array] [choices: "track-time-cli", "cst", "personal", "time-speak", "coding",
    "gaming", "blog", "node-ts-lib-template", "track-time-cli-ui", "to-numbers"]


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

&lt;/div&gt;

&lt;p&gt;It defaults to showing data from the last 24 hours, a setting which can be modified with the &lt;code&gt;--since&lt;/code&gt; argument. For example, for my own &lt;code&gt;track-time-cli&lt;/code&gt; timesheet, running &lt;code&gt;tt l track-time-cli --since '7 days ago'&lt;/code&gt; results in the following output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2hz4v6sana36y6415d9w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2hz4v6sana36y6415d9w.png" alt="Output of running  raw `tt l track-time-cli --since '7 days ago'` endraw "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The list command supports many options for formatting the output, such as displaying durations in natural language or times/dates as relative. For example, the output of &lt;code&gt;tt l --all-sheets --since '2 days ago' -r -h&lt;/code&gt; for me is:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F93daz54xepdqpkldma65.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F93daz54xepdqpkldma65.png" alt="Output of running  raw `tt l --all-sheets --since '2 days ago' -r -h` endraw "&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  Convenience Commands
&lt;/h4&gt;

&lt;p&gt;There are three commands to list specific spans of time, which I think one would often use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;tt today&lt;/strong&gt; (&lt;code&gt;tt t&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tt yesterday&lt;/strong&gt; (&lt;code&gt;tt y&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tt week&lt;/strong&gt; (&lt;code&gt;tt w&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Their output and arguments are similar to &lt;strong&gt;tt l&lt;/strong&gt;; here is the output of &lt;code&gt;tt week -t -h&lt;/code&gt; for me:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rkqhy9htpa3zoeqgi0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rkqhy9htpa3zoeqgi0e.png" alt="Output of  raw `'tt week -t -h'` endraw "&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Future Plans 🚀
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;breakdown&lt;/strong&gt; command currently shows the total time spent per hour of the day or per weekday for entries sourced from multiple time sheets.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;WIP&lt;/strong&gt; and will be improved in the future; the plan is to use the stored data to tell when you are most productive and view other useful derivative data.&lt;/p&gt;

&lt;p&gt;I haven't covered every feature in this post, so feel free to check it out yourself!&lt;/p&gt;

&lt;p&gt;For more information, check out the &lt;a href="https://github.com/f3rno64/track-time-cli/blob/main/README.md" rel="noopener noreferrer"&gt;&lt;strong&gt;README.md&lt;/strong&gt;&lt;/a&gt; and the &lt;a href="https://github.com/f3rno64/track-time-cli" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub repo itself&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Any feedback, comments, or suggestions would be more than welcome!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Happy holidays, everyone! 🎅🎄&lt;/p&gt;

</description>
      <category>node</category>
      <category>typescript</category>
      <category>productivity</category>
      <category>javascript</category>
    </item>
    <item>
      <title>A Tiny JS Library For Parsing Numbers From Words</title>
      <dc:creator>Cris Mihalache</dc:creator>
      <pubDate>Sat, 23 Dec 2023 00:47:46 +0000</pubDate>
      <link>https://dev.to/f3rno64/a-tiny-js-library-for-parsing-numbers-from-words-31fg</link>
      <guid>https://dev.to/f3rno64/a-tiny-js-library-for-parsing-numbers-from-words-31fg</guid>
      <description>&lt;p&gt;After encountering the need to parse numbers written out as strings with multiple words for a project (i.e., &lt;em&gt;"twenty-two days ago" as opposed to "22 days ago")&lt;/em&gt;, I went ahead and developed a tiny, zero-dependency library that does exactly that.&lt;/p&gt;

&lt;p&gt;I've christened it &lt;a href="https://github.com/f3rno64/numbers-from-words"&gt;numbers-from-words&lt;/a&gt;, and will be using it in my &lt;a href="https://github.com/f3rno64/track-time-cli"&gt;time tracker project&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here is a short snippet showing a few input types:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;parse&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;numbers-from-words&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;valueA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;twenty&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;valueB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;one hundred and twenty three&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;valueC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;one thousand, two hundred and thirty four&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;valueA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// 20&lt;/span&gt;
    &lt;span class="nx"&gt;valueB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// 123&lt;/span&gt;
    &lt;span class="nx"&gt;valueC&lt;/span&gt;   &lt;span class="c1"&gt;// 1234&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parsing is relatively simple, and the logic can be found &lt;a href="https://github.com/f3rno64/numbers-from-words/blob/main/src/parse.ts"&gt;here&lt;/a&gt;. In short, it supports any valid written representation of a number, which is usually a quantity followed by a magnitude (i.e. &lt;strong&gt;"two months"&lt;/strong&gt; or &lt;strong&gt;"twenty five years"&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Commas dividing the string for more complex written numbers are also supported, such as &lt;strong&gt;"twenty-five, one hundred, and three thousand"&lt;/strong&gt; (parsed to &lt;code&gt;3125&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;It categorizes number words into &lt;code&gt;Numbers&lt;/code&gt;, &lt;code&gt;Teens&lt;/code&gt;, &lt;code&gt;Multiples&lt;/code&gt;, and &lt;code&gt;Magnitudes&lt;/code&gt;. These are the available (and therefore supported) values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;Numbers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Zero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;One&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="nx"&gt;Two&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Three&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Four&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Five&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Six&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Seven&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Eight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Nine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;Teens&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Ten&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Eleven&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Twelve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Thirteen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Fourteen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Fifteen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Sixteen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Seventeen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Eighteen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Nineteen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;Multiples&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Twenty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Thirty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Forty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Fifty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Sixty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Seventy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Eighty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Ninety&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;Magnitudes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Hundred&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Thousand&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Million&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Billion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Trillion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000000000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Quadrillion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000000000000000&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;For more information, check out the &lt;a href="https://github.com/f3rno64/numbers-from-words/blob/main/README.md"&gt;&lt;strong&gt;README.md&lt;/strong&gt;&lt;/a&gt; and the &lt;a href="https://github.com/f3rno64/numbers-from-words"&gt;&lt;strong&gt;GitHub repo itself&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>node</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>A Modern Node.JS TypeScript Lib Template</title>
      <dc:creator>Cris Mihalache</dc:creator>
      <pubDate>Thu, 21 Dec 2023 22:21:22 +0000</pubDate>
      <link>https://dev.to/f3rno64/a-modern-nodejs-typescript-lib-template-3ghm</link>
      <guid>https://dev.to/f3rno64/a-modern-nodejs-typescript-lib-template-3ghm</guid>
      <description>&lt;p&gt;Today, I put together a template repo for new &lt;strong&gt;Node.JS&lt;/strong&gt; projects written in TypeScript that uses a standard set of utilities such as &lt;strong&gt;TypeDoc&lt;/strong&gt;, &lt;strong&gt;mocha&lt;/strong&gt;, &lt;strong&gt;nyc&lt;/strong&gt;, &lt;strong&gt;ESLint&lt;/strong&gt;, and more.&lt;/p&gt;

&lt;p&gt;It provides a strict configuration and is fairly opinionated, but I think it results in less time spent writing boilerplate code and serves as a clean base to build upon.&lt;/p&gt;

&lt;p&gt;I wrote a &lt;a href="https://f3rno64.hashnode.dev/a-modern-nodejs-typescript-lib-template"&gt;blog post about it&lt;/a&gt;, and would love any feedback, comments, or suggestions.&lt;/p&gt;

&lt;p&gt;The repo is here: &lt;a href="https://github.com/f3rno64/node-ts-lib-template"&gt;f3rno64/node-ts-lib-template&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>node</category>
      <category>mocha</category>
      <category>template</category>
    </item>
  </channel>
</rss>
