<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: はるはる Haruharu</title>
    <description>The latest articles on Forem by はるはる Haruharu (@sharu2920).</description>
    <link>https://forem.com/sharu2920</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%2F1634777%2F3e199fdf-f074-4d30-96c5-b87d573b6dbc.jpeg</url>
      <title>Forem: はるはる Haruharu</title>
      <link>https://forem.com/sharu2920</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/sharu2920"/>
    <language>en</language>
    <item>
      <title>Smile is the Best "Gym Clothes": Lessons in Digital Well-being from a GitHub-Born "Exercise Coach"</title>
      <dc:creator>はるはる Haruharu</dc:creator>
      <pubDate>Tue, 05 May 2026 08:28:47 +0000</pubDate>
      <link>https://forem.com/sharu2920/smile-is-the-best-gym-clothes-lessons-in-digital-well-being-from-a-github-born-exercise-coach-1cm8</link>
      <guid>https://forem.com/sharu2920/smile-is-the-best-gym-clothes-lessons-in-digital-well-being-from-a-github-born-exercise-coach-1cm8</guid>
      <description>&lt;p&gt;What comes to mind when you think of GitHub? Probably cold code reviews, rigid error checks, and the endless pursuit of efficiency.&lt;/p&gt;

&lt;p&gt;But in the heart of the repository &lt;code&gt;htvoffcial&lt;/code&gt;, there’s a discussion space called &lt;strong&gt;"Haru-Haru's Oasis"&lt;/strong&gt; (はるはるの憩) that’s defying the "dry" stereotype of software development. It's home to a unique AI persona: &lt;strong&gt;"Exercise Coach" (Taiso-no-Oniisan).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Born from Google's &lt;strong&gt;Gemma&lt;/strong&gt; LLM, this AI transforms daily dev logs and casual chats into energetic "exercise commentary." In a world obsessed with complexity and delivery speed, this project offers a refreshing take on how we can regain "mental flexibility" through technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Ultimate Mental Hack: "Smile as Infrastructure"
&lt;/h2&gt;

&lt;p&gt;When starting a new project, we often obsess over the "perfect stack" or the best hardware. But the Exercise Coach argues that the most important piece of equipment is internal.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"A smile is the best set of gym clothes. Put it on and dive into your day with energy!"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Drawing inspiration from the &lt;strong&gt;Quokka&lt;/strong&gt;—often called the world's happiest animal—the AI reminds us that a little bit of "niccoli" (grinning) is a powerful tool for survival in the high-pressure world of debugging and deadlines. Whether it's surviving a heavy exam season or a complex refactor, maintaining the capacity to enjoy a simple snack or a beautiful sunset is what makes a developer truly "resilient."&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Embellishing Failure: "Infiltration" vs. "Hydrophilic"
&lt;/h3&gt;

&lt;p&gt;The beauty of this community isn't technical perfection; it's the ability to celebrate mistakes. When users post typos from their chemistry or history notes, the Coach reacts with humor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chemistry Typos:&lt;/strong&gt; When a user confuses "Hydrophilic" with "Infiltration," the Coach quips, &lt;em&gt;"I just want all the colloids to get along!"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encouraging Growth:&lt;/strong&gt; While playful, the Coach can be a strict mentor: &lt;em&gt;"Don't rush, but make sure you're actually studying!"&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By turning bugs and blunders into "cultural artifacts," the community lowers the barrier to participation and fosters a safe space for young developers to grow.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Tech Behind the Warmth: Gemma, Azure, and Synchronized Lyrics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pipeline:&lt;/strong&gt; &lt;strong&gt;GitHub Actions&lt;/strong&gt; と &lt;strong&gt;ffmpeg&lt;/strong&gt; を組み合わせ、音声を &lt;strong&gt;HLSストリーミング&lt;/strong&gt; 形式へ自動変換しています。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
  実際のパイプラインでの実装コードを見る
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# mp3応答をOpus高効率高音質に圧縮&lt;/span&gt;
ffmpeg &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; latest.mp3 &lt;span class="nt"&gt;-c&lt;/span&gt;:a libopus &lt;span class="nt"&gt;-b&lt;/span&gt;:a 48k &lt;span class="nt"&gt;-ac&lt;/span&gt; 1 &lt;span class="nt"&gt;-vbr&lt;/span&gt; on latest.opus
&lt;span class="nb"&gt;rm &lt;/span&gt;latest.mp3 

&lt;span class="c"&gt;# 3. ffmpeg で HLS (m3u8) に変換&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; docs/stream
ffmpeg &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; latest.opus &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-codec&lt;/span&gt;:a aac &lt;span class="nt"&gt;-b&lt;/span&gt;:a 128k &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-f&lt;/span&gt; hls &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-hls_time&lt;/span&gt; 10 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-hls_list_size&lt;/span&gt; 0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-hls_segment_filename&lt;/span&gt; &lt;span class="s2"&gt;"docs/stream/data%03d.ts"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  docs/stream/playlist.m3u8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;/p&gt;

&lt;p&gt;Under the hood, this "warm" personality is powered by a robust and modern tech stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Brain:&lt;/strong&gt; &lt;strong&gt;Gemma&lt;/strong&gt; (via Cloudflare Workers AI) handles the persona's logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice:&lt;/strong&gt; &lt;strong&gt;Azure AI Speech&lt;/strong&gt; (&lt;code&gt;ja-JP-KeitaNeural&lt;/code&gt;) gives the AI its human-like "body temperature."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pipeline:&lt;/strong&gt; &lt;strong&gt;GitHub Actions&lt;/strong&gt; and &lt;strong&gt;ffmpeg&lt;/strong&gt; automate the conversion of speech into &lt;strong&gt;HLS streaming&lt;/strong&gt; formats.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The "Karaoke" Innovation:&lt;/strong&gt;&lt;br&gt;
One of the most impressive technical feats is the "Synchronized Lyrics" style frontend. The developer leveraged a unique insight: &lt;strong&gt;TTS (Text-to-Speech) voices have lower temporal jitter than humans.&lt;/strong&gt; This makes speech rhythm highly predictable. By precisely estimating the playback time for each sentence, they implemented a system where text highlights in perfect sync with the audio using &lt;code&gt;hls.js&lt;/code&gt; and &lt;code&gt;Plyr&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;It’s a beautiful example of using technical constraints to create a superior UX.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. The Philosophy of "Balance" (HERO 2001 and Junk Food)
&lt;/h3&gt;

&lt;p&gt;Sustainable creativity requires a lack of stoicism. The logs are filled with "unfiltered" human life: watching classic 2001 dramas, eating &lt;em&gt;Imo-kenpi&lt;/em&gt; (sweet potato sticks), or taking a secret nap when the rain feels just right.&lt;/p&gt;

&lt;p&gt;The Coach's philosophy is simple: &lt;strong&gt;"Healthy eating plus the occasional junk food—that balance is the true 'artistic performance' of life."&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Summary: Take it Step by Step
&lt;/h3&gt;

&lt;p&gt;In our digital lives, we are often told to "move fast and break things." The Exercise Coach suggests a different rhythm: &lt;strong&gt;"Move mindfully and stretch things."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whether you are battling a "packet jam" near Akihabara station or struggling to finish a video project, remember the Coach's favorite mantra: "Step by step, just like exercising. Effort always pays off!"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How would an "Exercise Coach" narrate your commit history today?&lt;/strong&gt; Maybe it's time to put on your "best gym clothes" (a smile), take a deep breath, and dive back into the code—one stretch at a time.&lt;/p&gt;



&lt;p&gt;&lt;em&gt;Check out the project here:&lt;/em&gt; &lt;a href="https://conversations.harutv.me/" rel="noopener noreferrer"&gt;https://conversations.harutv.me/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://conversations.harutv.me/global" rel="noopener noreferrer"&gt;https://conversations.harutv.me/global&lt;/a&gt;&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
&lt;strong&gt;Note:&lt;/strong&gt; このプロジェクトはGoogleのGemmaを用いた実験的なAI personaであり、医学的なアドバイスを提供するものではありません。日々の開発をちょっと楽しくするための「デジタル・ウェルビーイング」の試みとしてお楽しみください。&lt;br&gt;

&lt;/div&gt;


</description>
      <category>life</category>
      <category>productivity</category>
      <category>japanese</category>
      <category>gemma</category>
    </item>
    <item>
      <title>Introducing the Random Number Generator Function Maker for JavaScript!</title>
      <dc:creator>はるはる Haruharu</dc:creator>
      <pubDate>Sat, 29 Jun 2024 04:45:34 +0000</pubDate>
      <link>https://forem.com/sharu2920/introducing-the-random-number-generator-function-maker-for-javascript-4hmf</link>
      <guid>https://forem.com/sharu2920/introducing-the-random-number-generator-function-maker-for-javascript-4hmf</guid>
      <description>&lt;h1&gt;
  
  
  Coding Made Easy: Introducing the Random Number Generator Function Maker for JavaScript!
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You can use it here!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://randommathjavascript.calc.haruharutv.jp/" rel="noopener noreferrer"&gt;https://randommathjavascript.calc.haruharutv.jp/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Technologies Used
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* HTML
* CSS
* JAVASCRIPT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Image of the screen
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzdipqu6ce6k2hkmp3vpl.png" alt="image.png" width="779" height="436"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Use
&lt;/h2&gt;

&lt;p&gt;It's very simple. Just open the site, enter the minimum and maximum values, and press the generate button to easily create a random number!&lt;/p&gt;

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

&lt;p&gt;You can reference this code in the same way you would use a variable to generate a random number within the specified range!&lt;/p&gt;

&lt;h3&gt;
  
  
  Try It Out
&lt;/h3&gt;

&lt;p&gt;Let's do a quick experiment using the code we mentioned earlier to write some JavaScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your one-time code is &amp;lt;strong id="random"&amp;gt;&amp;lt;/strong&amp;gt;
&amp;lt;script&amp;gt;
document.getElementById("random").innerHTML=Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;You can see that it works well when you run the code like this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Please bookmark it and use it anytime!
&lt;/h3&gt;

&lt;p&gt;We support engineers every day!&lt;/p&gt;

&lt;p&gt;If you find this helpful, please give it a like!&lt;/p&gt;

&lt;p&gt;While UUIDs are generally used for management, if you need to use random numbers, please give it a try! It's easy with just a single line of code! (Although UUIDs can also be easily generated in languages like GAS or server-side languages)&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>random</category>
      <category>webdev</category>
    </item>
    <item>
      <title>For those who want to create a site to dynamically display GAS data using Ajax</title>
      <dc:creator>はるはる Haruharu</dc:creator>
      <pubDate>Thu, 27 Jun 2024 09:36:45 +0000</pubDate>
      <link>https://forem.com/sharu2920/for-those-who-want-to-create-a-site-to-dynamically-display-gas-data-using-ajax-4b1g</link>
      <guid>https://forem.com/sharu2920/for-those-who-want-to-create-a-site-to-dynamically-display-gas-data-using-ajax-4b1g</guid>
      <description>&lt;p&gt;As the title suggests, this information is for those of you who are planning to create such a site and register it with search engines, or for those of you who are using Ajax to retrieve and display data, but are having trouble getting the content to be visible in the search engine's Webmaster Tools.&lt;/p&gt;

&lt;p&gt;I hope this information will be helpful to those of you who are in the process of gathering information!&lt;/p&gt;

&lt;h1&gt;
  
  
  What is the cause?
&lt;/h1&gt;

&lt;p&gt;Depending on the response format, GAS often uses&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="nx"&gt;ContentService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createTextOutput&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I think this is used frequently.&lt;br&gt;
Let's say you use this with Ajax(); to retrieve and display content, escaping it, and creating a site. In that case, when using the Search Console, you may see&lt;/p&gt;

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

&lt;p&gt;and&lt;/p&gt;

&lt;h3&gt;
  
  
  Are you being blocked by robots.txt?
&lt;/h3&gt;

&lt;p&gt;In conclusion, it is possible that creating a site that directly displays GAS data using Ajax for the purpose of registering with search engines is not recommended.&lt;br&gt;
In other words, the only solution may be to ensure that it is not affected by robots.txt, but I would like to refrain from writing about that method here.&lt;/p&gt;

&lt;p&gt;In other words, that's the specification.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why don't you tell us the solution even though you know the cause?
&lt;/h3&gt;

&lt;p&gt;That's because it hasn't been officially confirmed. If we can't confirm the meaning of robots.txt, it could lead to a major disaster. It's just speculation, but it might be to deal with the possibility of important information being crawled due to a user's inadvertent script settings, considering the domain that manages many scripts (script.google.com). From that perspective, if it's on a per-script basis, it may also be up to each site operator's judgment...&lt;/p&gt;

&lt;h3&gt;
  
  
  Since it's not good to say random things in this kind of article, please read the conclusion.
&lt;/h3&gt;

&lt;p&gt;That was the knowledge article.&lt;/p&gt;

&lt;p&gt;Personally, until the significance of this robots.txt is disclosed officially,&lt;/p&gt;

&lt;h3&gt;
  
  
  I think it's better to refrain from creating it for this purpose.
&lt;/h3&gt;

&lt;p&gt;Even if you do create it,&lt;br&gt;
I think it's good to use it for sites that don't need to be visible to search engines (such as a database search screen) because it is visible to people in the normal browser.&lt;/p&gt;

&lt;p&gt;If there is official information or other information about this, please let me know in the comments.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>gas</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
