<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.0">Jekyll</generator><link href="https://github.com/blog/feed.xml" rel="self" type="application/atom+xml" /><link href="https://github.com/blog/" rel="alternate" type="text/html" /><updated>2026-11-04T15:11:53+00:00</updated><id>https://github.com/blog/feed.xml</id><title type="html">expr-1782</title><subtitle>expr-1782のブログです。
今後はnoteではなく、こちらで記事を書いていこうと思います。</subtitle><author><name>expr-1782</name></author><entry><title type="html">日比谷駅　発車メロディ(日比谷線のみ)</title><link href="https://github.com/blog/%E9%89%84%E9%81%93/%E6%97%A5%E6%AF%94%E8%B0%B7%E9%A7%85%E7%99%BA%E8%BB%8A%E3%83%A1%E3%83%AD%E3%83%87%E3%82%A3/" rel="alternate" type="text/html" title="日比谷駅　発車メロディ(日比谷線のみ)" /><published>2026-11-04T08:30:00+00:00</published><updated>2026-11-04T08:30:00+00:00</updated><id>https://github.com/blog/%E9%89%84%E9%81%93/%E6%97%A5%E6%AF%94%E8%B0%B7%E9%A7%85%E7%99%BA%E8%BB%8A%E3%83%A1%E3%83%AD%E3%83%87%E3%82%A3</id><content type="html" xml:base="https://github.com/blog/%E9%89%84%E9%81%93/%E6%97%A5%E6%AF%94%E8%B0%B7%E9%A7%85%E7%99%BA%E8%BB%8A%E3%83%A1%E3%83%AD%E3%83%87%E3%82%A3/">&lt;p class=&quot;notice--info&quot;&gt;&lt;strong&gt;千代田線は収録環境が悪く、公開できていません。ご了承ください。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;日比谷線 日比谷駅の旧発車メロディを収録したので公開します。
新発車メロディは今後公開予定です。&lt;/p&gt;
&lt;h2 id=&quot;旧発車メロディ&quot;&gt;旧発車メロディ&lt;/h2&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/wDg3DIxwem0?si=sgGNUk9d9bIzVRu4&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;</content><author><name>expr-1782</name></author><category term="鉄道" /><summary type="html">千代田線は収録環境が悪く、公開できていません。ご了承ください。</summary></entry><entry><title type="html">不親切なログイン画面の意味</title><link href="https://github.com/blog/it/%E4%B8%8D%E8%A6%AA%E5%88%87%E3%81%AA%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E7%94%BB%E9%9D%A2%E3%81%AE%E6%84%8F%E5%91%B3/" rel="alternate" type="text/html" title="不親切なログイン画面の意味" /><published>2026-11-04T05:30:00+00:00</published><updated>2026-11-04T05:30:00+00:00</updated><id>https://github.com/blog/it/%E4%B8%8D%E8%A6%AA%E5%88%87%E3%81%AA%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E7%94%BB%E9%9D%A2%E3%81%AE%E6%84%8F%E5%91%B3</id><content type="html" xml:base="https://github.com/blog/it/%E4%B8%8D%E8%A6%AA%E5%88%87%E3%81%AA%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E7%94%BB%E9%9D%A2%E3%81%AE%E6%84%8F%E5%91%B3/">&lt;h2 id=&quot;ログイン画面でこんなことはありませんか&quot;&gt;ログイン画面で、こんなことはありませんか？&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/blog/assets/images/ログイン.png&quot; alt=&quot;ログイン画面&quot; /&gt;
これ、地味に不便ですよね。でもこれは、ユーザーを守るための仕組みなんです。&lt;/p&gt;
&lt;h2 id=&quot;なぜこの画面なのか&quot;&gt;なぜこの画面なのか&lt;/h2&gt;
&lt;p&gt;なぜかというと、フィッシング詐欺や迷惑メールなどから守るためです。&lt;/p&gt;

&lt;p&gt;「メールアドレスとパスワードどちらが違うか」を正確に教えると、
悪質な業者にとって、ログイン画面は、「そのメールアドレスで登録されたアカウントが存在するかどうか確認するためのサイト」になってしまいます。&lt;/p&gt;

&lt;p&gt;このような目的でログイン画面を使わせないため、あえてぼかしているのです。&lt;/p&gt;
&lt;h2 id=&quot;裏のログを解析して除くことはできる&quot;&gt;裏のログを解析して除くことはできる？&lt;/h2&gt;
&lt;p&gt;これも不可能です。先ほど紹介した対策を施しているサイトの大半は、「成功」「失敗」の2パターンのログしか出力しません。
&lt;img src=&quot;/blog/assets/images/ログイン2.png&quot; alt=&quot;サーバーからのログについて&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;おわりに&quot;&gt;おわりに&lt;/h2&gt;
&lt;p&gt;曖昧なログイン画面は、地味だけど優秀な対策ということがわかりましたね。それではこの記事は以上です。&lt;/p&gt;</content><author><name>expr-1782</name></author><category term="IT" /><category term="セキュリティ" /><summary type="html">ログイン画面で、こんなことはありませんか？ これ、地味に不便ですよね。でもこれは、ユーザーを守るための仕組みなんです。 なぜこの画面なのか なぜかというと、フィッシング詐欺や迷惑メールなどから守るためです。</summary></entry><entry><title type="html">独自の、RSSリーダーを作ってみた</title><link href="https://github.com/blog/%E9%96%8B%E7%99%BA/%E7%8B%AC%E8%87%AA%E3%81%AE-RSS%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F-copy/" rel="alternate" type="text/html" title="独自の、RSSリーダーを作ってみた" /><published>2026-11-02T06:00:00+00:00</published><updated>2026-11-02T06:00:00+00:00</updated><id>https://github.com/blog/%E9%96%8B%E7%99%BA/%E7%8B%AC%E8%87%AA%E3%81%AE%E3%80%81RSS%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%20copy</id><content type="html" xml:base="https://github.com/blog/%E9%96%8B%E7%99%BA/%E7%8B%AC%E8%87%AA%E3%81%AE-RSS%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F-copy/">&lt;p class=&quot;notice--info&quot;&gt;&lt;strong&gt;※この記事はnoteからの移行となります。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;今回は、「RSSリーダー + α」のWebアプリを大きく作り変えて、ほぼ完成形になったので、その紹介とこだわりポイントについて書いてみようと思います。&lt;/p&gt;

&lt;h2 id=&quot;どんなアプリを作ったの&quot;&gt;どんなアプリを作ったの？&lt;/h2&gt;

&lt;p&gt;一言で言うと、&lt;strong&gt;「個人情報をサーバーに預けず、ブラウザだけで完結する軽量RSSリーダー」&lt;/strong&gt;です。&lt;/p&gt;

&lt;p&gt;シンプルにニュースやブログをチェックできるだけでなく、ヘッダーに現在の天気情報がちょこんと表示される機能を＋αとして搭載しています。&lt;/p&gt;

&lt;h3 id=&quot;主な特徴&quot;&gt;主な特徴&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;完全ローカル完結（Local-First）&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;アカウント登録や外部サーバーへのデータ保存は一切なし。&lt;/li&gt;
      &lt;li&gt;フィード情報や設定はすべて自分のブラウザ（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;localStorage&lt;/code&gt;）に安全に保存されます。&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;BYOK（Bring Your Own Key）方式&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;天気データなどの外部API利用には、ユーザー自身が取得したAPIキーを入力する仕組みを採用。&lt;/li&gt;
      &lt;li&gt;サーバー維持費ゼロ・セキュリティリスクゼロを実現しています。&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;スマホアプリ風の洗練されたUI&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Tailwind CSSとFlowbiteを使用しています。&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;なぜ作ったのか開発の背景&quot;&gt;なぜ作ったのか？（開発の背景）&lt;/h2&gt;

&lt;p&gt;既存のRSSリーダーは高機能で便利な反面、以下の点が少し気になっていました。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;アカウント管理の手間&lt;/li&gt;
  &lt;li&gt;サーバー側に自分の閲覧傾向などのデータが残るプライバシー上の懸念&lt;/li&gt;
  &lt;li&gt;有料プランはできるだけ避けたい人がいること&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;そこで、「データも権限もすべてユーザー自身が所有し、無駄な中継サーバーを挟まない仕組みにすれば、一生無料で安全に使い続けられるのでは？」と考え、JavaScript（Vanilla JS）とTailwind CSS（初期はMaterializeで開発）で一から構築しました。&lt;/p&gt;

&lt;h2 id=&quot;こだわりのポイント&quot;&gt;こだわりのポイント&lt;/h2&gt;

&lt;h3 id=&quot;ユーザー主導のアプリであること&quot;&gt;ユーザー主導のアプリであること&lt;/h3&gt;
&lt;p&gt;天気情報の取得にはOpenWeatherMapのAPIを利用していますが、アプリ側で共有のキーを持たず、ユーザーに自身のキーを入れてもらう構成にしました。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;メリット&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;運営コストを抑えられる&lt;/li&gt;
      &lt;li&gt;APIキーへの不正アクセスの心配がほぼ不要&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;デメリット&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;最初の登録に少し手間がある（後ほど解説）&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;天候によって表情を変えるui&quot;&gt;天候によって表情を変えるUI&lt;/h3&gt;
&lt;p&gt;天気の詳細モーダルは、その時の天候（晴れ・夜・雨・雪など）に合わせて背景のテーマカラーが動的に変化します。RSSチェックのついでに、少しワクワクするような体験を目指しました。&lt;/p&gt;

&lt;p&gt;天気の都市は、世界各地の主要都市（日本だと東京や大阪、名古屋、札幌など、アメリカだとクパティーノやニューヨークなど、シンガポール、モスクワ、パリなど）に対応しています。&lt;/p&gt;

&lt;h2 id=&quot;大変だった点&quot;&gt;大変だった点&lt;/h2&gt;

&lt;h3 id=&quot;基礎を一度作り変えた&quot;&gt;基礎を一度作り変えた&lt;/h3&gt;
&lt;p&gt;ここが開発中で最も大変なポイントでした……！&lt;/p&gt;

&lt;p&gt;最初は Materialize CSS を使って構築していたのですが、作っていくうちにデザインの拡張性やカスタマイズ性に限界を感じ、Tailwind CSS + Flowbite への移行を決断。&lt;/p&gt;

&lt;p&gt;コードを一度バラバラにして作り直す作業となり、生成AI（AIアシスタント）と共にコードの移行を進めたものの、途中でAIが想定外の書き換えをしたりハルシネーションを起こしたりと悪戦苦闘。それでも粘り強くデバッグを重ね、なんとか理想の完成形まで持ち込むことができました！&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;openweathermapの無料apiキー取得方法&quot;&gt;OpenWeatherMapの無料APIキー取得方法&lt;/h2&gt;

&lt;p&gt;このRSSリーダーの天気表示機能を使うには、OpenWeatherMap（無料）のAPIキーが必要です。数分で簡単に取得できるので、以下の手順でお試しください。&lt;/p&gt;

&lt;h3 id=&quot;step-1-無料アカウントを作成する&quot;&gt;Step 1: 無料アカウントを作成する&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;OpenWeatherMap 公式サイトにアクセスします。&lt;/li&gt;
  &lt;li&gt;以下の項目を入力してアカウントを作成します。
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Username:&lt;/strong&gt; ユーザー名（英数字）&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Email:&lt;/strong&gt; メールアドレス&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Password:&lt;/strong&gt; パスワード&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;いくつかあるチェックボックスすべてにチェックを入れます。&lt;/li&gt;
  &lt;li&gt;「Create Account」ボタンをクリックします。&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;step-2-メール認証を完了させる&quot;&gt;Step 2: メール認証を完了させる&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;登録したメールアドレス宛に OpenWeatherMap から確認メールが届きます。&lt;/li&gt;
  &lt;li&gt;メール内の &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Verify your email&lt;/code&gt; ボタン（または認証リンク）をクリックして認証を完了させます。&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;step-3-apiキーを取得コピーする&quot;&gt;Step 3: APIキーを取得・コピーする&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;ログイン後、画面右上のユーザー名をクリックし、メニューから &lt;strong&gt;「My API keys」&lt;/strong&gt; を選択します。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;「Key」&lt;/strong&gt; の欄に長めのアルファベットと数字の文字列（例: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a1b2c3d4e5...&lt;/code&gt;）が表示されているので、これをコピーします。&lt;/li&gt;
&lt;/ol&gt;

&lt;p class=&quot;notice&quot;&gt;※自分で新しいキーを発行したい場合は、右側の &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Create key&lt;/code&gt; から新しい名前をつけて生成することもできます。&lt;/p&gt;

&lt;h3 id=&quot;step-4-rssリーダーアプリに入力する&quot;&gt;Step 4: RSSリーダーアプリに入力する&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;サイドバーから、&lt;strong&gt;設定 &amp;gt; 天気設定&lt;/strong&gt; にアクセスします。&lt;/li&gt;
  &lt;li&gt;コピーしたAPIキーを「API Key」入力欄に貼り付けて「保存する」を押します。&lt;/li&gt;
  &lt;li&gt;お好みで地域名（例: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Tokyo&lt;/code&gt; や &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Osaka&lt;/code&gt;）を設定すれば、ヘッダーに現在の天気が自動で表示されます！&lt;/li&gt;
&lt;/ol&gt;

&lt;p class=&quot;notice--warning&quot;&gt;&lt;strong&gt;注意：&lt;/strong&gt; アカウントを作成したばかりの初期キーは、登録直後だと &lt;strong&gt;キー無効（401エラー）&lt;/strong&gt; になることがあります。有効化されるまで20分ほどかかる場合があるため、うまく表示されない場合は少し時間をおいてから再度お試しください。&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;まとめと今後の展望&quot;&gt;まとめと今後の展望&lt;/h2&gt;

&lt;p&gt;今回のアプリは一般公開しています。「サーバーに頼らずブラウザの力で自律して動かす」という設計思想（Local-First）の快適さを改めて実感しました。&lt;/p&gt;</content><author><name>expr-1782</name></author><category term="開発" /><category term="JavaScript" /><category term="TailwindCSS" /><category term="個人開発" /><category term="Local-First" /><summary type="html">※この記事はnoteからの移行となります。</summary></entry></feed>