<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>It on Xainome Blog</title>
    <link>https://xainome-blog.pages.dev/categories/it/</link>
    <description>Recent content in It on Xainome Blog</description>
    <generator>Hugo</generator>
    <language>ja-JP</language>
    <lastBuildDate>Wed, 10 Dec 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://xainome-blog.pages.dev/categories/it/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>【フィッシング(phishing)詐欺をGoogleのクイズで学ぶ】｜IT × 英語力アップ／IELTS対策</title>
      <link>https://xainome-blog.pages.dev/posts/2025/12/phishing-google-study/</link>
      <pubDate>Wed, 10 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2025/12/phishing-google-study/</guid>
      <description>&lt;h2 id=&#34;english_practice&#34;&gt;English_Practice&lt;/h2&gt;
&lt;p&gt;I am learning cybersecurity in Coursera and I knew about phishing scams. I also understand malware and ransomware. Moreover, I will introduce the quiz of phishing scams by Google.&lt;/p&gt;
&lt;h3 id=&#34;the-link-of-quiz-of-phising-scams&#34;&gt;The link of quiz of phising scams&lt;/h3&gt;
&lt;p&gt;The link is this. It is japanese one but we can use English one also.&lt;/p&gt;
&lt;p&gt;I filled in my name and mail address. I did not have to write my name and mail address. It is no problem that you use your real one. They were just used on view.&lt;/p&gt;</description>
    </item>
    <item>
      <title>【GoogleのCybersecurityをCourseraで学ぶ】｜IT × 英語力アップ／IELTS対策</title>
      <link>https://xainome-blog.pages.dev/posts/2025/12/google-cybersecurity-coursera-study/</link>
      <pubDate>Tue, 02 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2025/12/google-cybersecurity-coursera-study/</guid>
      <description>&lt;h2 id=&#34;english_practice&#34;&gt;English_Practice&lt;/h2&gt;
&lt;h3 id=&#34;overall-cybersecurity-and-other-lessons&#34;&gt;Overall Cybersecurity and other lessons&lt;/h3&gt;
&lt;p&gt;I applyed for free lessons of Japan re-skilling consortium before. I take some Google&amp;rsquo;s lesson for free.&lt;/p&gt;
&lt;p&gt;However, they are a half year left because they started from June 2025 until June 2026. I already finished taking the &amp;ldquo;AI prompting&amp;rdquo;, but I do not finish taking &amp;ldquo;Cybersecurity&amp;rdquo;, &amp;ldquo;data analytics&amp;rdquo; and &amp;ldquo;AI essential&amp;rdquo;. Even though &amp;ldquo;Cybersecurity&amp;rdquo; and &amp;ldquo;data analytics&amp;rdquo; take for a long time, I want to do because of usefull.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Win11Debloat を使ってPCのパフォーマンスを多少改善する</title>
      <link>https://xainome-blog.pages.dev/posts/2025/05/win11debloat-pc-performance/</link>
      <pubDate>Sat, 24 May 2025 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2025/05/win11debloat-pc-performance/</guid>
      <description>&lt;h2 id=&#34;win11debloat&#34;&gt;Win11Debloat&lt;/h2&gt;
&lt;p&gt;たまたま見つけた記事でFreeTimeTechという企業のwindows11debloaterが紹介されていました。ただ、アプリを導入するのは少し躊躇したので調べた結果、Win11Debloatというツールに至りました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Raphire/Win11Debloat&#34;&gt;こちら&lt;/a&gt;からツールの詳細を知ることができます。Githubからの導入なので多少ハードルが上がりますが、心理的なハードルは下がる気がします。&lt;/p&gt;
&lt;p&gt;注意事項としては重要なアプリを消さないこと、効果が限定的であるかもしれないということですね。もともとあるアプリがそこまでCUPやメモリを使用してないと考えられるので、効果が限定的だと考えられます。私はこれに気づく前にやってしまいましたが…&lt;/p&gt;
&lt;h3 id=&#34;win11debloat_導入方法&#34;&gt;Win11Debloat_導入方法&lt;/h3&gt;
&lt;p&gt;導入方法は簡単でpowershellまたはコマンドプロンプトを管理者権限で開き、以下のコマンドを実行します。その後、画面の指示に従って実行していきます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;amp; ([scriptblock]::Create((irm &amp;#34;https://debloat.raphi.re/&amp;#34;)))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;他の方法もありますが、そちらが良ければ確認してみてください。コマンドを実行すると以下のような画面になり、別のターミナルが開きます。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Win11Debloat_introduce&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/05/win11debloat-pc-performance/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-05-24-141308.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Win11Debloat_menu&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/05/win11debloat-pc-performance/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-05-24-141313-1024x711.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;win11debloat_内容&#34;&gt;Win11Debloat_内容&lt;/h3&gt;
&lt;p&gt;ここから数字を選択します。一旦0を選んで情報を確認したほうが良いとは思いますが、面倒であれば1を選択すれば十分だと思います。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Win11Debloat_contents&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/05/win11debloat-pc-performance/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-05-24-141609.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;1を選択するとこんな感じで何を削除したり変えたりするのかが表示されます。問題なければ決定します。一応削除前のCPUとメモリを見てみました。こんな感じ。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Win11Debloat_before changing&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/05/win11debloat-pc-performance/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-05-24-141847.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;2を選択するとこんな感じです。ここから更に選択して削除していきます。3を出すとリストを表示してどれを消すか選択できます。ぶっちゃけ詳しくなければやらないほうが良い気がします。重要なシステムを消す可能性がありますので。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/05/win11debloat-pc-performance/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-05-24-144057-1024x90.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/05/win11debloat-pc-performance/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-05-24-144540.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;2を選択するとこんな感じでどのようなアプリを消して変更するか選択していきます。こちらは最悪翻訳しながらできるので、面倒でなければこちらでもよいかと思います。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/05/win11debloat-pc-performance/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-05-24-144935-1024x867.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/05/win11debloat-pc-performance/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-05-24-145241.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;終わりに&#34;&gt;終わりに&lt;/h3&gt;
&lt;p&gt;終わったらボタンを押して終了ですね。終わった後がこんな感じ。正直そこまで変わった感じはしないですね。メモリは私がタブを開きすぎなので良いとして、それがあったとしても大きく変わった感じはない気がします。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/05/win11debloat-pc-performance/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-05-24-145320.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;とは言え少しでも軽くしたければ使うのもありだと思います。Windowsには余計なものも入ってることが多いので。気になるのであれば試してください。ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cursorの話題に乗り遅れたけどpyxelの修正に使ってみたよ</title>
      <link>https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/</link>
      <pubDate>Sun, 02 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/</guid>
      <description>&lt;h2 id=&#34;cursorを使ってみた&#34;&gt;Cursorを使ってみた&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cursor.com/pricing&#34;&gt;Cursor&lt;/a&gt;が凄いとだいぶ前に話題になりましたが、重い腰を上げてようやく使ってみました。&lt;/p&gt;
&lt;p&gt;コードエディターとして使っても優秀ですし、テキストベースで自身の考えを整理するのにも使えそうですね。&lt;/p&gt;
&lt;p&gt;興味を持ったのが音声入力でテキスト変換し、文字おこしした文を整理してもらうという&lt;a href=&#34;https://anond.hatelabo.jp/20250228171948&#34;&gt;記事&lt;/a&gt;です。日常的にも使えそうですし、コードの修正にも活用できそうでしたので使うことにしました。&lt;/p&gt;
&lt;h3 id=&#34;cursorのインストールとダウンロード&#34;&gt;Cursorのインストールとダウンロード&lt;/h3&gt;
&lt;p&gt;まずはインストーラーのダウンロードから。Windows、Mac、LINUXがあるので使っているPCに応じて選びましょう。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Cursor_サイト&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/image-1024x504.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ダウンロードが完了したら、インストーラーを実行しましょう。基本的には何も変更せずポチポチ推して大丈夫です。こだわりがあれば変更するくらいですね。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-102646.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-102732.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-102747.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-102922.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;cursorの初期設定&#34;&gt;Cursorの初期設定&lt;/h3&gt;
&lt;p&gt;インストールが完了したら実行して開きましょう。デフォルトのIDEはVS Codeになりますが、他のIDEを使ってる場合はそちらを選択しましょう。似たようなUIにしてくれると思います。&lt;/p&gt;
&lt;p&gt;AIに対する言語は必要であれば選択しましょう。日本語なら&amp;quot;日本語&amp;quot;や&amp;quot;Japanese&amp;quot;で大丈夫だと思います。&lt;/p&gt;
&lt;p&gt;Codebase-wideはプロジェクト全体を読み込ませるかどうかですね。単体のコードだけを読み込ませるなら不要だと思います。設定が完了したら&amp;quot;Continue&amp;quot;をクリックしましょう。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Cursor_設定画面&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-105943.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;こちらはVS Codeを使ってると表示されます。VS Codeで使用してる拡張機能をそのまま使用するかの確認です。使うのであれば&amp;quot;Use Extensions&amp;quot;ですね。他のIDEはわかりませんが…&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Cursor_拡張機能&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-110035.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;こちらは利用状況を送信するかの設定です。&amp;ldquo;Privacy Mode&amp;quot;であれば送信されなくなります。私は個人で使う分には気にならないですし、もっと発展してほしいので送信するようにしています。ただ、業務委託では使えませんが。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-110215.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;設定が完了したらログインが必要になります。Freeであってもですね。今のところはproにする予定がないのですが…&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Cursor_ログイン&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-110302.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;リポジトリのクローン&#34;&gt;リポジトリのクローン&lt;/h3&gt;
&lt;p&gt;ログインが完了したら初期画面はこんな感じ。後はここからプロジェクトを開くなり、Gitからリポジトリの接続をすることになります。ちなみに日本語UIへの変更はVS Codeと同じ手順で変更できます。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Cursor_クローン&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-110523.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;真ん中のcloneをクリックするとGitからcloneすることができます。Githubの場合は8桁のコードを求められます。画面に表示されますのでそれをペーストすれば問題ありません。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Cursor_コード&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-112842.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;初期画面はこんな感じ。拡張機能のCotinueと似たようなUIに感じますね。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Cursor_実際の画面&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-113017.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;freeの場合、最初の2週間はproを使うことができます。アカウントの設定画面でどれくらい使ったかを確認することができます。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Cursor_使用量&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-134141.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;cursorを使ってコーディング&#34;&gt;Cursorを使ってコーディング&lt;/h3&gt;
&lt;p&gt;次は実際に使ってみましょう。Agent、Ask、Editを使い分けます。使い分けとしてはこんな感じみたいです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Agent: AIが考えてコードの変更や提案をする&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ask: シンプルに質問する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edit: コードやテキストを変更したり指示する&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;Cursor_chatが画面&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-134311.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;モデルは4oですね。モデルによってはproにするか設定を変えないとダメみたいです。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-134748.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-134742.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;実際に実行してみるとこんな感じです。変更内容に問題なければ確定します。ちなみに動かしてみましたが、特に問題もなく動きました。リファクタリングが楽でめっちゃ嬉しい！&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Cursor_Edit&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-135003-1024x550.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;最後にAIに指示を出して意図通りの動きをするコードが作れるか試してみました。複雑になりすぎないように2つに分割しました。私が描いたイメージはAIが読み取ってくれるわけではないので、そこはコードをコピペして指示を出しました。こんな感じ。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Cursor_Agent&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/03/cursor-pyxel-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-02-172348.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;少しだけ手作業で修正しましたが、ほぼ完ぺきに作ってくれました。障害物は名前から推定したんだと思います。流石に配色とその位置から形を推測するのはまだ無理だと思うので。&lt;/p&gt;
&lt;h3 id=&#34;終わりに&#34;&gt;終わりに&lt;/h3&gt;
&lt;p&gt;ただ、正直に言うとなめてました（笑）ほぼ完璧に指示をこなして&lt;a href=&#34;https://github.com/sai-nome/pyxel&#34;&gt;コード&lt;/a&gt;を書いてくれるとは。何よりリファクタリングが嬉しいですね。もちろんこれだけのためにお試しで導入するのもありだと思います。読みやすくもなるし、今後の作業も楽になると思うので。ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deepseekが話題なので軽く触ってみたよ</title>
      <link>https://xainome-blog.pages.dev/posts/2025/01/deepseek-review/</link>
      <pubDate>Tue, 28 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2025/01/deepseek-review/</guid>
      <description>&lt;h2 id=&#34;deepseekを試した背景&#34;&gt;Deepseekを試した背景&lt;/h2&gt;
&lt;p&gt;英語にカマかけてAIについてほぼ触れてこなかったのですが、Deepseekは割と盛り上がってるみたいなので触ってみました。&lt;/p&gt;
&lt;p&gt;一応、o3が出ることやCursor、Browser Use(openAIが&lt;a href=&#34;https://openai.com/index/introducing-operator/&#34;&gt;operator&lt;/a&gt;を出してましたが…)があることは知っています。&lt;/p&gt;
&lt;p&gt;ただ、開発をほぼやってなかったのでノータッチでしたが、今回は軽量で低コストでo1に匹敵するということで気になったので触ってみました。&lt;/p&gt;
&lt;p&gt;とは言えDeepseekが中国産というのは知っています。どうしても不安がぬぐえない部分があったので、軽く調べて判断することにしました。&lt;/p&gt;
&lt;h3 id=&#34;ai検索エンジンの利用状況&#34;&gt;AI検索エンジンの利用状況&lt;/h3&gt;
&lt;p&gt;さて、AI検索エンジンと言われて何を使ってますか？&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.perplexity.ai/&#34;&gt;perplexity&lt;/a&gt;でしょうか？それともOpenAIのSearchGPT？あるいはGoogleのDeepResearchでしょうか？私が使っていたのは&lt;a href=&#34;https://felo.ai/ja/search&#34;&gt;felo&lt;/a&gt;になります。&lt;/p&gt;
&lt;p&gt;feloは日本初のAI検索エンジンになります。無料でも使えますし、20個以上のソースから回答してくれます。有料になればさらに思考を深めて解答したり、マインドマップの生成も無限にできます。無料でも回数制限がありますが、使うことはできます。&lt;/p&gt;
&lt;h3 id=&#34;deepseekのセキュリティについて&#34;&gt;Deepseekのセキュリティについて&lt;/h3&gt;
&lt;p&gt;ということでDeepseekのセキュリティ系について聞いてみました。回答としてはこんな感じ。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/deepseek-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-01-27-122228.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/deepseek-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-01-27-122144.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;他のAIと同じく個人情報の取り扱いには気を付けたほうが良いが、そこ以外でデータが抜かれる可能性は低いよと解釈しました。一応ソース元を軽く見たりもしましたが、個人的に不安になるほどの内容はなかったので使ってみることにしました。&lt;/p&gt;
&lt;p&gt;ただ、中国には国家情報法というものがあるんですね。これは知っておいてよかった気がします。今後中国産系のアプリやらサービスを使う場合はこの辺も気を付けたほうが良いとわかったので。後は中国の思想に寄ってることですね。特定の話はできないとか。とは言え日本独自だろうが米国独自だろうが多少なりともありそうな気はしてますが…&lt;/p&gt;
&lt;h3 id=&#34;ai検索エンジンとしての性能&#34;&gt;AI検索エンジンとしての性能&lt;/h3&gt;
&lt;p&gt;というわけでまずは普通に使ってみます。web版ですね。まずは登録します。私はGoogleアカウントで登録しました。今回はコード支援ツールであるContinueとClineとcursorの違いについて聞いてみました。まずはfeloでdeepthinkあり。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/deepseek-review/images/image-18-664x1024.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;次はdeepseekですね。こちらも同様にdeepthinkありのsearch付きで。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Deepseek_検索&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/deepseek-review/images/image-19-509x1024.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;こちらもかなり細かく書かれています。feloはdeepthinkを使ったうえでの結果なので、普段の検索であればこちらでもよい気がします。feloのdeepthinkは無料だと回数制限があるので。ただ、マインドマップという利点があるので、使い分けできればよさそうです。&lt;/p&gt;
&lt;h3 id=&#34;deepseekをコード支援ツールに導入&#34;&gt;Deepseekをコード支援ツールに導入&lt;/h3&gt;
&lt;p&gt;次はコード支援ツールへの導入ですね。一旦&lt;a href=&#34;https://xainome-blog.pages.dev/posts/2024/09/github-copilot-vscode-continue/&#34;&gt;continue&lt;/a&gt;に導入してみます。まずはapiキーの発行からですね。&lt;a href=&#34;https://platform.deepseek.com/usage&#34;&gt;ここ&lt;/a&gt;からプラットフォームへログインできます。apiキーの発行手順は簡単です。キーの値だけ忘れないようにしてください。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Deepseek_api&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/deepseek-review/images/image-20-1024x504.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Deepseek_apiキー名前&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/deepseek-review/images/image-21-1024x504.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Deepseek_apiキー作成&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/deepseek-review/images/image-22-1024x504.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ちなみに中国国内であれば多少のトークンが付与されます。それ以外の人はクレジットカード、デビットカードまたはpaypalの設定が必要です。というわけでtop up(トークンのチャージ)をしたら使用してみましょう！こんな感じで確認できます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/deepseek-review/images/image-25.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ちなみに余談ですが&lt;strong&gt;top up&lt;/strong&gt;という単語はよく目にします。カードに現金をチャージしたりするときもtop upが使われます。なので、覚えておくと海外旅行行った時も便利ですよ！&lt;/p&gt;
&lt;p&gt;まずはcontinueに導入してみます。だいぶ昔にコード補完として入れてましたが、あまり使ってなかったですね。ということで入れてみます。&lt;/p&gt;
&lt;p&gt;昔tabAutocompleteModelにstarcoder2:3bを使ってましたが、同じ書き方はできないので一旦コメントアウトしました。&lt;/p&gt;
&lt;p&gt;Continueタブを開いて設定(歯車)からjsonファイルを開きます。そこにモデルとcompleteモデルの追加をすれば完了です。この設定は&lt;a href=&#34;https://note.weizwz.com/editor/vscode/vscode-deepseek&#34;&gt;ここ&lt;/a&gt;から引用してきました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/deepseek-review/images/image-24.png&#34;&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    {
      &amp;#34;model&amp;#34;: &amp;#34;deepseek-coder&amp;#34;,
      &amp;#34;provider&amp;#34;: &amp;#34;deepseek&amp;#34;,
      &amp;#34;contextLength&amp;#34;: 128000,
      // 替换为自己的 API Key
      &amp;#34;apiKey&amp;#34;: &amp;#34;xxx&amp;#34;, 
      &amp;#34;title&amp;#34;: &amp;#34;DeepSeek v3&amp;#34;
    }
  ],
  &amp;#34;tabAutocompleteModel&amp;#34;: {
    &amp;#34;title&amp;#34;: &amp;#34;DeepSeek Coder&amp;#34;,
    &amp;#34;provider&amp;#34;: &amp;#34;deepseek&amp;#34;,
    &amp;#34;model&amp;#34;: &amp;#34;deepseek-coder&amp;#34;,
    // 之前遗漏了，这块加上apiKey后tab补全才会生效
    &amp;#34;apiKey&amp;#34;: &amp;#34;xxx&amp;#34;, 
  },
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;トークンのチャージ&#34;&gt;&lt;strong&gt;トークンのチャージ&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;もし、アカウントにチャージがされていないとこんな感じのエラーが出ますので支払いを忘れずにしておきましょう。&lt;/p&gt;</description>
    </item>
    <item>
      <title>BigQueryのテーブルのカラム説明欄に一括で追記したい！</title>
      <link>https://xainome-blog.pages.dev/posts/2025/01/bulk-update-bigquery-column-descriptions/</link>
      <pubDate>Sat, 25 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2025/01/bulk-update-bigquery-column-descriptions/</guid>
      <description>&lt;h2 id=&#34;bqコマンドを使ってカラム説明を一括入力&#34;&gt;bqコマンドを使ってカラム説明を一括入力&lt;/h2&gt;
&lt;p&gt;業務委託で&lt;a href=&#34;https://xainome-blog.pages.dev/posts/2023/11/learning-gcp-for-freelance-project/&#34;&gt;副業&lt;/a&gt;としてやっていた仕事の内、カラムに説明を追加するというタスクがありました。&lt;/p&gt;
&lt;p&gt;今後非エンジニアの人も使えるようにするため、カラムの意味を把握する必要がありました。そこで説明欄を埋める必要があるという流れです。&lt;/p&gt;
&lt;p&gt;ただ、一つ一つ手作業で埋めるのは手間なのでいい方法がないか探して試したやり方ですね。ということで&lt;a href=&#34;https://cloud.google.com/bigquery/docs/managing-table-schemas?hl=ja&amp;amp;utm_source=chatgpt.com&#34;&gt;bqコマンド&lt;/a&gt;を使用して進めてみます。&lt;/p&gt;
&lt;p&gt;まずは埋めたいテーブルはこんな感じ。カラム名はさておき、説明が埋まってないという状況ですね。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;bqコマンド_カラム説明追加前&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/bulk-update-bigquery-column-descriptions/images/image-14.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;ターミナルでbqコマンド実行&#34;&gt;ターミナルでbqコマンド実行&lt;/h3&gt;
&lt;p&gt;まずはターミナルを開いて一旦テーブルの中を確認してみます。ターミナル自体は簡単に開けます。ここからですね。画像の左から2番目のアイコンから開けます。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;bqコマンド_テーブル&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/bulk-update-bigquery-column-descriptions/images/image-10.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;コマンドは以下ですね。dataset_idとtable_idは任意で変えることになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bq show --format=prettyjson &amp;lt;dataset_id&amp;gt;.&amp;lt;table_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;コマンドが実行されると人によっては承認が必要みたいです。承認しましょう。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/bulk-update-bigquery-column-descriptions/images/image-7.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;テーブル確認&#34;&gt;テーブル確認&lt;/h3&gt;
&lt;p&gt;ターミナルに以下のように表示されます。もし説明欄に入力していると文字化けのように見えます。ただ、文字化けではなくエスケープ表示にされてます。書き換えるときも日本語で入力しても問題ないので、今は無視して進めましょう。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;bqコマンド_カラム確認&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/bulk-update-bigquery-column-descriptions/images/image-8.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;特に問題なさそうであればこのスキーマをjsonファイルに書きましょう。コマンドはこんな感じ。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bq show --format=prettyjson &amp;lt;dataset_id&amp;gt;.&amp;lt;teble_id&amp;gt; &amp;gt; &amp;lt;file_name&amp;gt;.json
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こうするとローカルのフォルダにjsonファイルが格納されます。コマンドを実行したらファイルを確認しましょう。ターミナルのエディタを開くから確認することができます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/bulk-update-bigquery-column-descriptions/images/image-11.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;中を開くと初期ファイルと作成したjsonファイルがあります。作成したjsonファイルを開いてみます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/bulk-update-bigquery-column-descriptions/images/image-12-wpp1737756773809.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ファイルを開くとターミナルで確認したような文字列があります。後は同じように説明を追加します。エスケープ表示ですが日本語に変更してみました。それからfieldsの中身のみが必要になります。[]の中身だけ取り出しましょう。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;bqコマンド_jsonカラム説明追加前&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/bulk-update-bigquery-column-descriptions/images/image-13.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;bqコマンド_jsonカラム説明追加後&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/bulk-update-bigquery-column-descriptions/images/image-16.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;bqコマンド_カラムの説明欄更新&#34;&gt;bqコマンド_カラムの説明欄更新&lt;/h3&gt;
&lt;p&gt;ではこのjsonファイルを使用してカラムの説明欄を更新してみます。コマンドは以下&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bq update --source &amp;lt;file_name&amp;gt;.json &amp;lt;dateset_id&amp;gt;.&amp;lt;table_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;更新が完了したら&amp;quot;successfully updated.&amp;ldquo;と出るので確認してみましょう。特に問題なければこれで完了になります。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2025/01/bulk-update-bigquery-column-descriptions/images/image-17-wpp1737766290568.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;終わりに&#34;&gt;終わりに&lt;/h3&gt;
&lt;p&gt;当初はgcloud alphaというコマンドがあり、そちらを使おうと思ってました。&lt;/p&gt;
&lt;p&gt;ただ、いいやり方が見つからず従来のbqコマンドとファイルの編集を利用したやり方を採用しました。&lt;/p&gt;
&lt;p&gt;最近AIのニュースを見てはいたのですが、全く触ってないので何かやってみたいですね。ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pyxelを使って簡単なゲームの作成を試してみたい！part3</title>
      <link>https://xainome-blog.pages.dev/posts/2024/12/build-game-with-pyxel-part-3/</link>
      <pubDate>Mon, 30 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/12/build-game-with-pyxel-part-3/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://xainome-blog.pages.dev/posts/2024/12/build-game-with-pyxel-part-2/&#34;&gt;前回&lt;/a&gt;&lt;a href=&#34;https://github.com/kitao/pyxel&#34;&gt;pyxeleditor&lt;/a&gt;を使ってサウンドを作って動かすところまでやってみました。&lt;/p&gt;
&lt;h2 id=&#34;スコアとゲームオーバーの実装&#34;&gt;スコアとゲームオーバーの実装&lt;/h2&gt;
&lt;h3 id=&#34;スコア表示の実装&#34;&gt;スコア表示の実装&lt;/h3&gt;
&lt;p&gt;今回はゲーム性を持たせるところですね。やることはスコアの作成とゲームオーバーの作成ですね。まずはスコアの作成をしていきます。コードとしてはシンプルです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;class Scrolling_Game:
    def __init__(self):
        …
        self.score = 0
        …
    def draw(self):
        …
        pyxel.text(5, 5, f&amp;#34;Score: {self.score}&amp;#34;, 1)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;textの後の引数はx座標とy座標。後はテキストとカラーパレットですね。カラーパレットはドット絵と同じで0が黒、7が白になります。&lt;/p&gt;
&lt;p&gt;さらにスコアについては特定のアイテムを取った時にプラスしていきたいので、変数にしています。ただ、固定ならテキストを入力で問題ないですね。表示させるとこんな感じ。左上にスコアが出ています。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;pyxel_スコア&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/build-game-with-pyxel-part-3/images/image-22.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;スコア増加の実装&#34;&gt;スコア増加の実装&lt;/h3&gt;
&lt;p&gt;次はどうやってスコアを増加させるかですね。シンプルな方法でアテイムを取ったら増加するという方法でやろうと思います。&lt;/p&gt;
&lt;p&gt;というわけでアイテムを書きました。ハチミツの壺ですね。「ハチミツ食べたいな～」でおなじみの奴です。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;pyxel_スコアアイテム&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/build-game-with-pyxel-part-3/images/image-23.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;他にもいろいろ描いてますが、将来的に使いたいなーと思って描いたやつです。気にしないでください（笑）&lt;/p&gt;
&lt;p&gt;それから出現をランダムで出したいと思います。ここもそこまで難しくないですね。初期変数をランダムに設定し、draw関数でランダム変数を設定する感じですね。以下のコード&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import random

class Scrolling_Game:
    def __init__(self):
        …
        self.item_x = random.randint(0, 120)
        self.item_y = random.randint(0, 120)
        …
    def draw(self):
        pyxel.blt(self.item_x, self.item_y, 0, 8, 24, 8, 8, 0)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;当たり判定の実装&#34;&gt;当たり判定の実装&lt;/h3&gt;
&lt;p&gt;これでランダムに出現するようになりました。ただ、初期配置でランダムになるだけで取得もできないし、スコアも変わらないです。なので、次は取得して配置を変え、スコアを上げるコードを書いていきます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;class Scrolling_Game:
    …
    def update(self):
        …
        # 当たり判定
        if (self.char_x &amp;lt; self.item_x + 8 and 
            self.char_x + 16 &amp;gt; self.item_x and
            self.char_y &amp;lt; self.item_y + 8 and
            self.char_y + 16 &amp;gt; self.item_y):
            self.score += 100
            self.item_x = random.randint(0, 120)
            self.item_y = random.randint(0, 120)
    …
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで当たり判定とスコアの上昇、アイテムの再配置を行いました。動かすとこのような感じですね。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pyxelを使って簡単なゲームの作成を試してみたい！part2</title>
      <link>https://xainome-blog.pages.dev/posts/2024/12/build-game-with-pyxel-part-2/</link>
      <pubDate>Fri, 27 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/12/build-game-with-pyxel-part-2/</guid>
      <description>&lt;h2 id=&#34;pyxeleditorでキャラの動きやサウンド&#34;&gt;pyxeleditorでキャラの動きやサウンド&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://xainome-blog.pages.dev/posts/2024/12/build-game-with-pyxel-part-1/&#34;&gt;前回&lt;/a&gt;&lt;a href=&#34;https://github.com/kitao/pyxel&#34;&gt;pyxel&lt;/a&gt;のインストールからドット絵を描いて表示させるところまでやってみました。今回は実際にキャラクターを動かしたり、サウンドを作ったりしたいと思います。&lt;/p&gt;
&lt;h3 id=&#34;pyxeleditorで作った部分&#34;&gt;pyxeleditorで作った部分&lt;/h3&gt;
&lt;p&gt;実際に動いた画面がこちら。&lt;/p&gt;
&lt;h3 id=&#34;コードの中身_init&#34;&gt;コードの中身_init&lt;/h3&gt;
&lt;p&gt;一旦各コードを簡単に見ていこうと思います。まずは__init__内ですね。前回も話したのでざっくりと見ます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pyxel.init(128, 128, title=&amp;#39;Scrolling Game&amp;#39;)
pyxel.load(&amp;#39;assets/scroll_game.pyxres&amp;#39;)
self.char_x = 50  # キャラクターのX座標
self.char_y = 50  # キャラクターのY座標
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;initで画面サイズの設定、char_xとchar_yはキャラ座標を設定しています。loadでpixel editで作成したものをロードしています。ドット絵、タイルマップ、サウンドなど全て一旦ロードしています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;self.char_frame = 0  # 表示する画像のインデックス (0 または 1)
self.frame_count = 0 # フレームカウンター
self.is_moving = False  # 移動中フラグを追加
self.last_input = False #直前のフレームでキー入力があったか
pyxel.run(self.update, self.draw)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;他のコードはコメントも記載していますが、キャラ画像の入れ替えやフラグの設定をしています。後はpyxelの起動ですね。&lt;/p&gt;
&lt;h3 id=&#34;コードの中身_update&#34;&gt;コードの中身_update&lt;/h3&gt;
&lt;p&gt;次はupdate関数ですね。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# ゲーム中断
if pyxel.btnp(pyxel.KEY_Q):
    pyxel.quit()
# キー入力と移動処理
self.is_moving = False
key_pressed = False # 今のフレームでキーが押されているか
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Qを押したらゲームを中断します。それからフラグとキー入力の初期設定をしています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# キー入力処理とキャラクターの移動
if pyxel.btn(pyxel.KEY_LEFT):
    self.char_x -= 1
    self.is_moving = True  # 移動中フラグを立てる
    key_pressed = True
if pyxel.btn(pyxel.KEY_RIGHT):
    self.char_x += 1
    self.is_moving = True
    key_pressed = True
if pyxel.btn(pyxel.KEY_UP):
    self.char_y -= 1
    self.is_moving = True
    key_pressed = True
if pyxel.btn(pyxel.KEY_DOWN):
    self.char_y += 1
    self.is_moving = True
    key_pressed = True
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ここでは各方向キーを入力した時の設定をしています。上下左右分書いてるので記述は多いですが、内容はシンプルです。キャラクターの座標をずらして、フラグを書き換えています。というか関数化したほうがもっとシンプルになりますね…&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pyxelを使って簡単なゲームの作成を試してみたい！part1</title>
      <link>https://xainome-blog.pages.dev/posts/2024/12/build-game-with-pyxel-part-1/</link>
      <pubDate>Sat, 21 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/12/build-game-with-pyxel-part-1/</guid>
      <description>&lt;h2 id=&#34;pyxelでゲーム開発入門&#34;&gt;Pyxelでゲーム開発入門&lt;/h2&gt;
&lt;p&gt;ゲームを作成するのであれば&lt;a href=&#34;https://unity.com/ja&#34;&gt;Unity&lt;/a&gt;や&lt;a href=&#34;https://www.unrealengine.com/ja&#34;&gt;Unreal Engine&lt;/a&gt;が有名です。それとは別にpythonでコーディングができる&lt;a href=&#34;https://github.com/kitao/pyxel/blob/main/docs/README.ja.md&#34;&gt;pyxel&lt;/a&gt;があります。&lt;/p&gt;
&lt;p&gt;pyxelはレトロゲームエンジンになります。ファミコンのようなドット絵スタイルのゲームしか作れませんが、pythonを知ってる人にはちょうどいいかもしれません。&lt;/p&gt;
&lt;h3 id=&#34;開発環境の準備&#34;&gt;開発環境の準備&lt;/h3&gt;
&lt;p&gt;pythonを導入している前提ですが、少し進めていきたいと思います。基本的には&lt;a href=&#34;https://github.com/kitao/pyxel/blob/main/docs/README.ja.md&#34;&gt;README&lt;/a&gt;通りに進めていけばよいと思います。まずはライブラリのインストールを進めていきます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install -U pyxel
私の例: py -3.10 -m pip install -U pyxel
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;-Uがないとエディター画面が出ないので忘れずにつけましょう！その後は参考のためサンプルを導入するのもよいと思います。なくても特に問題はありません。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pyxel copy_examples
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;基本的なコード構造&#34;&gt;基本的なコード構造&lt;/h3&gt;
&lt;p&gt;そうすると簡単なゲームやガイドなどが入ってます。これを理解できれば基本的なコードは書けるようになると思います。基本的なコードはこんな感じになってます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import pyxel

class App:
    def __init__(self):
        pyxel.init(160, 120)
        self.x = 0
        pyxel.run(self.update, self.draw)

    def update(self):
        self.x = (self.x + 1) % pyxel.width

    def draw(self):
        pyxel.cls(0)
        pyxel.rect(self.x, 0, 8, 8, 9)

App()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;クラスの中に__init__関数とupdate関数とdraw関数があります。__init__関数では画面サイズの指定や各関数の実行ができます。&lt;/p&gt;
&lt;p&gt;update関数ではキー入力や画面の切り替えを行う関数になります。update関数がメインになりそうです。もちろんupdate関数だけじゃなくて新しく関数を作っても問題ないです。キャラクター用や画面用などいろいろ作ると使い分けが楽になると思います。&lt;/p&gt;
&lt;p&gt;draw関数では画面やキャラクターの描画を行います。エディター画面で作成した背景やキャラクターを呼び出したりします。&lt;/p&gt;
&lt;h3 id=&#34;ドット絵とタイルマップの作成&#34;&gt;ドット絵とタイルマップの作成&lt;/h3&gt;
&lt;p&gt;というわけでまずはドット絵とタイルマップの作成からですね。ちなみに私は絵心は全くないので、大したものは書けません。所謂味がある絵みたいなイメージですね…コマンドは以下になります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pyxel edit &amp;#34;絶対パス&amp;#34;
例: pyxel edit &amp;#34;C:\pyxel\assets\game.pyxres&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt=&#34;pyxel_蜂A&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/build-game-with-pyxel-part-1/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-12-20-142209.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;pyxel_蜂B&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/build-game-with-pyxel-part-1/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-12-20-142217.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/build-game-with-pyxel-part-1/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-12-20-142225.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;コマンドは相対パスだと開かないので気を付けてください。一応実行しているフォルダーに移動してファイル名のみ指定しても問題ありません。&lt;/p&gt;
&lt;p&gt;こんな感じで蜂A、蜂B、空、草原、岩のタイルを用意してみました。適当ですが苦手なりにそれっぽくできた気がします。まずはタイルマップの作成をします。左上のエディターからタイルマップを選び、書いたタイルを指定して書いていきます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/build-game-with-pyxel-part-1/images/image-19.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;タイルマップへのキャラクター表示&#34;&gt;タイルマップへのキャラクター表示&lt;/h3&gt;
&lt;p&gt;今度はコードを使ってタイルマップにキャラクターを表示してみます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>AIVMGeneraterでAivisSpeechでも使えるようにしたよ！</title>
      <link>https://xainome-blog.pages.dev/posts/2024/12/aivmgenerater-aivisspeech/</link>
      <pubDate>Wed, 18 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/12/aivmgenerater-aivisspeech/</guid>
      <description>&lt;h2 id=&#34;aivmgeneraterを使えるようになるまで&#34;&gt;AIVMGeneraterを使えるようになるまで&lt;/h2&gt;
&lt;p&gt;前回Style-Bert-VITS2を使って音声合成モデルを作りました。今回は作ったモデルをAivis Speechでも使えるようにしようと思います。&lt;/p&gt;
&lt;p&gt;AIVMGeneraterでは自作した音声合成モデルをAivis Speechで使えるようにします。以前までは音声合成モデルさえあればAIVMGeneraterで変換できるようになってました。しかし、今は使えなくなってます。そのため、.onnxファイルを作って変換する必要があります。&lt;/p&gt;
&lt;p&gt;ただ、Style-Bert-VITS2を使えるのであればできますので諦めずやっていきましょう！&lt;/p&gt;
&lt;h3 id=&#34;style-bert-vits2をdevブランチへ切り替え&#34;&gt;Style-Bert-VITS2をdevブランチへ切り替え&lt;/h3&gt;
&lt;p&gt;まずはStyle-Bert-VITS2をdevブランチへ切り替えます。デフォルトだとmainブランチになってますので、これをdevブランチへ切り替えます。ターミナルからコマンド実施でもよいですが、VSCodeを使っているのであれば以下の方法で切り替えて実施できます。&lt;/p&gt;
&lt;p&gt;まずはGitのタブを選択しましょう。それからソース管理の設定から&amp;quot;チェックアウト先&amp;quot;を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;AIVMGenerater_Style-Bert-VITS2_ブランチ切り替え&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/aivmgenerater-aivisspeech/images/image-16.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;そうすると真ん中あたりにこんな感じでブランチやリモートブランチが出てきます。ここからorigin/devを選択しましょう。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/aivmgenerater-aivisspeech/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-12-12-162355.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;onnxファイルの作成&#34;&gt;onnxファイルの作成&lt;/h3&gt;
&lt;p&gt;そうすると中のファイルなどが変わっていると思います。以下を確認してみましょう！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;convert_onnx.py&amp;quot;が存在しているかどうか&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;requirements.txtにonnx系のライブラリが記述されているかどうか&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;AIVMGenerater_Style-Bert-VITS2_devブランチのファイル&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/aivmgenerater-aivisspeech/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-12-12-162440-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/aivmgenerater-aivisspeech/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-12-13-121326-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;上記が確認出来たらrequirements.txtで一括再インストールをしてconvert_onnx.pyを実行しましょう。私の環境でのコマンドだと以下のような感じですね。この辺は適宜自身の環境に合わせて変えてください。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;py -3.10 -m pip install -r requirements.txt
py -3.10 convert_onnx.py --model model_assets/{モデル名}
例：py -3.10 convert_onnx.py --model model_assets/10minmodel
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;そうするとモデルファイル内に.onnxファイルができてると思います。モデルごとにできるので少し容量を使っちゃいますが…&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Style-Bert-VITS2_onnxファイル&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/aivmgenerater-aivisspeech/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-12-12-223554.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;aivmgeneraterの設定&#34;&gt;AIVMGeneraterの設定&lt;/h3&gt;
&lt;p&gt;.onnxファイルが出来たら&lt;a href=&#34;https://aivm-generator.aivis-project.com/&#34;&gt;こちら&lt;/a&gt;のページからAIVMGeneraterを使います。使い方はシンプルでモデルに関するファイルをアップして、サンプルボイスもアップして変換するだけです。&lt;/p&gt;
&lt;p&gt;メタデータ編集では製作者や説明を記載出来ます。この辺はなくても大丈夫です。私は一応記載しましたが。それからモデルの公開ですね。今回は公開しませんが、公開したい場合はライセンスを選びましょう。&lt;/p&gt;
&lt;p&gt;ACML 1.0 と ACML-NC-1.0 の違い&lt;strong&gt;営利目的の利用を許可&lt;/strong&gt;するかどうかです。ACML 1.0は許可しますが、ACML-NC-1.0は非営利目的のみとなっています。パブリックドメインは著作権フリーで、カスタムライセンスはライセンスを自作することになります。&lt;/p&gt;
&lt;p&gt;ACML 1.0かACML-NC-1.0のどちらかを選べば特に問題ないかと思います。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;AIVMGenerater_設定&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/aivmgenerater-aivisspeech/images/image-17-660x1024.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;それからアイコン、スタイル説明、サンプルボイスを追加しましょう。サンプルボイスは実際にモデルを使った時の音声を貼っておきます。&lt;/p&gt;
&lt;p&gt;アイコンはデフォルトだと卵型の形になります。公開する場合は設定しておきましょう。スタイルは何もなければノーマルになります。公開するスタイルに合わせて書き換えましょう。&lt;/p&gt;
&lt;p&gt;設定が完了したら、変換をします。そうすると変換が完了したファイルがダウンロードされます。許可を求められた場合は許可しましょう。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/aivmgenerater-aivisspeech/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-12-13-101125.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;aivis-speechへの取り込み&#34;&gt;Aivis Speechへの取り込み&lt;/h3&gt;
&lt;p&gt;ダウンロードが完了したら、Aivis Speechに取り込みます。まずはAivis Speechを起動します。&amp;ldquo;設定&amp;rdquo; &amp;gt; &amp;ldquo;音声合成モデルの管理&amp;quot;を選択します。そしたら右上の&amp;quot;インストール/更新&amp;quot;を選択して.aivmxファイルを選択します。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/aivmgenerater-aivisspeech/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-12-13-102254-1024x574.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ファイルを選択したら右下の&amp;quot;インストール/更新&amp;quot;を選択しましょう。このような画面になったらインストール完了です。後は自由に使えるようになります。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/aivmgenerater-aivisspeech/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-12-13-102425-1024x574.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;終わりに&#34;&gt;終わりに&lt;/h3&gt;
&lt;p&gt;今後ですがもう少しモデルの作成を試してみたいなと思います。10minmodelを作りましたが、お試しで作った物なので。使ってみた感じつまずいたり、うまく喋れてない部分がありました。なので、データの再集録からですね。&lt;/p&gt;
&lt;p&gt;それからスタイルもいくつか使ってみたいですね。本来Audibuleスタイルで作りましたが、せっかくなら感情表現もできるキャラクター用も作ってみたいですし。&lt;/p&gt;
&lt;p&gt;ここまでできれば色んな音声合成モデルを作れるようになります。皆さんもぜひ試してみてください。唯一の難点はローカルでモデル作成しているときPCが使えないということですね。Colabを使えばいいと思いますが、あれだと数日かかりそうですし。ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>音声合成モデルをStyle-Bert-VITS2を使って作ってみたよ</title>
      <link>https://xainome-blog.pages.dev/posts/2024/12/voice-synthesis-style-bert-vits2-tutorial/</link>
      <pubDate>Sun, 15 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/12/voice-synthesis-style-bert-vits2-tutorial/</guid>
      <description>&lt;h2 id=&#34;音声合成モデルの作成&#34;&gt;音声合成モデルの作成&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://xainome-blog.pages.dev/posts/2024/12/stylebertvits2-tutorial/&#34;&gt;前回&lt;/a&gt;Style-Bert-VITS2を試しに使ってみることをやってみました。今回は実際にモデルを作ることをやろうと思います。&lt;/p&gt;
&lt;p&gt;まずは音声の収録ですね。こちらに関しては自身でいろいろ試してみるしかないですね。とりあえずノイズキャンセリング付きや単一指向性マイクなどがいいかもしれません。後は収録時に詰まったり、変な発声になったりせず滑らかに読むことですね。無音は多少なっても大丈夫なので。&lt;/p&gt;
&lt;p&gt;次に音声データセットの作成です。こちらは前回やったので飛ばします。収録した音声を勝手に10秒程度に切り分けてくれますので。&lt;/p&gt;
&lt;h3 id=&#34;文字おこし時のエラー対処&#34;&gt;文字おこし時のエラー対処&lt;/h3&gt;
&lt;p&gt;私は文字おこしで以下のエラーが出たので&amp;quot;pip install tf-keras&amp;quot;で対処しました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;RuntimeError: Failed to import transformers.models.whisper.modeling_tf_whisper because of the following error (look up to see its traceback):
Your currently installed version of Keras is Keras 3, but this is not yet supported in Transformers. Please install the backwards-compatible tf-keras package with `pip install tf-keras`.
. エラーメッセージが空の場合、何も問題がない可能性があるので、書き起こしファイルをチェックして問題なければ無視してください。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;その次はこのようなエラーが出ました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;site-packages\transformers\pipelines\audio_utils.py&amp;#34;, line 37, in ffmpeg_read
    raise ValueError(&amp;#34;ffmpeg was not found but is required to load audio files from filename&amp;#34;) from error
ValueError: ffmpeg was not found but is required to load audio files from filename
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;その場合は以下の手順で対応しました。私はwindowsかつVS Codeなのでmacとかは別になります。Gitでクローンする方法でも大丈夫です。&lt;/p&gt;</description>
    </item>
    <item>
      <title>StyleBertVITS2を使って自身のデータセットを作成してみるよ</title>
      <link>https://xainome-blog.pages.dev/posts/2024/12/stylebertvits2-tutorial/</link>
      <pubDate>Mon, 02 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/12/stylebertvits2-tutorial/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://xainome-blog.pages.dev/posts/2024/11/ai-voice-synthesis-aivisspeech-review/&#34;&gt;前回&lt;/a&gt;Aivis Speechを触ってみたので自身の音声合成モデルを作ってみたいなと思い調べてみました！StyleBertVITS2は音声合成がメインになると思います。他にも学習やデータセットの作成もできます。というわけでStyleBertVITS2を使っていきます！&lt;/p&gt;
&lt;h2 id=&#34;stylebertvits2のインストール&#34;&gt;StyleBertVITS2のインストール&lt;/h2&gt;
&lt;p&gt;というわけでまずはStyleBertVITS2のインストールからですね。基本的には&lt;a href=&#34;https://github.com/litagin02/Style-Bert-VITS2&#34;&gt;Github&lt;/a&gt;に載ってますのでその通りで問題ないと思います。&lt;/p&gt;
&lt;p&gt;ただ、私は仮想環境作るのが面倒なタイプでpythonのversion別(3.10と3.12)でしか管理してないのでそれに合わせたコマンド使用しています。プロジェクトが複数存在しないのであれば、使わなくていいかなと思う派です。思想は人それぞれなので。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# 各種ライブラリのインストール
git clone https://github.com/litagin02/Style-Bert-VITS2.git
cd Style-Bert-VITS2
py -3.10 -m pip install &amp;#34;torch&amp;lt;2.4&amp;#34; &amp;#34;torchaudio&amp;lt;2.4&amp;#34; --index-url https://download.pytorch.org/whl/cu118
py -3.10 -m pip install -r requirements.txt
# モデルのダウンロード
py -3.10 initialize.py
# エディター画面の表示
py -3.10 server_editor.py --inbrowser
または
py -3.10 app.py
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;stylebertvits2_server_editorpyの実行&#34;&gt;StyleBertVITS2_server_editor.pyの実行&lt;/h3&gt;
&lt;p&gt;server_editor.pyを実行した場合は以下のような画面になります。その前に利用規約に同意しましょう。特に性的や政治的、フェイク系はやめましょうという感じですね。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;StyleBertVITS2_server_editor.py&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/stylebertvits2-tutorial/images/image-1024x618.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/stylebertvits2-tutorial/images/image-1-1024x716.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;この辺は音声合成モデルを使用するという感じですね。やってることはAivis Speechと同じような感じだと思います。&lt;/p&gt;
&lt;h3 id=&#34;stylebertvits2_apppyの実行&#34;&gt;StyleBertVITS2_app.pyの実行&lt;/h3&gt;
&lt;p&gt;こちらではモデルの作成などは出来なさそうなので、もう一方のプログラムを実行してみます。app.pyのほうですね。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;StyleBertVITS2_app.py&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/stylebertvits2-tutorial/images/image-2-643x1024.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;こちらであればデータセット作成、モデルの学習、マージもできそうなのでこっちを使ってみます。&lt;/p&gt;
&lt;h3 id=&#34;スタイルの作成方法&#34;&gt;スタイルの作成方法&lt;/h3&gt;
&lt;p&gt;まずはスタイルの作成をする必要がありますがデータが必要になります。必要なデータは1時間ほどあれば十分だと思いますが、数十分でもできそうな気はしています。試してないので何とも言えませんが…&lt;/p&gt;
&lt;p&gt;もし10秒程度のwavファイルが360個ほどあれば十分なのでその時はスタイルの作成を行ってください。説明にもありますが、Dataフォルダとは別で配置しておくとスタイルの管理も楽なので別フォルダを作っておくと良いかもしれません。1スタイルなら適当な配置でもよさそうです。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;StyleBertVITS2_スタイル作成&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/stylebertvits2-tutorial/images/image-4-1024x705.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;wavファイルの準備&#34;&gt;wavファイルの準備&lt;/h3&gt;
&lt;p&gt;次はデータセットがない場合ですね。もし自身の声を使用しない場合はどこからかwavファイルをダウンロードする必要があります。状況によっては環境音や音楽を削除するなどの対応も必要かと思います。ただ、今回は自身の声で作成する想定なのでこの工程は省きます。&lt;/p&gt;
&lt;p&gt;もし、細かい音声データを大量には持ってないけど、数十分~1時間のwavファイルがある場合はデータセットの作成を行いましょう。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;StyleBertVITS2_データセット作成&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/stylebertvits2-tutorial/images/image-5-930x1024.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;データセットの作成&#34;&gt;データセットの作成&lt;/h3&gt;
&lt;p&gt;まずはinputフォルダにデータを入れます。録音などの環境がまだ整ってないので一旦前回使用したwavファイルを使ってみます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/stylebertvits2-tutorial/images/image-6.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;次はモデル名を決めましょう。私はまだ本格的にやらないので適当に&amp;quot;test&amp;quot;にしました。秒数の設定などは一旦デフォルトにしています。この辺は好きなように設定すると良いです。&amp;ldquo;成功すればスライスが完了しました。&amp;ldquo;というメッセージが出て所定のフォルダに出力されます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/stylebertvits2-tutorial/images/image-7-1024x434.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;大体10秒近くの音声ファイルが出力されます。これでスタイル作成の準備が整ったのでスタイル作成をして学習という流れになります。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/12/stylebertvits2-tutorial/images/image-8.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;終わりに&#34;&gt;終わりに&lt;/h3&gt;
&lt;p&gt;ここまで書いてきましたが、私の方でまだデータの準備ができていません。&lt;/p&gt;
&lt;p&gt;一人で話して録音する分には問題ないです。ただ、マイクがゴミだったのでまともなマイクを使って収録したいと思います。&lt;/p&gt;</description>
    </item>
    <item>
      <title>AI音声合成のAivisSpeechを触ってみたよ！</title>
      <link>https://xainome-blog.pages.dev/posts/2024/11/ai-voice-synthesis-aivisspeech-review/</link>
      <pubDate>Fri, 29 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/11/ai-voice-synthesis-aivisspeech-review/</guid>
      <description>&lt;p&gt;まずはAudibleという形でこの記事を読み込ませてみました。今後も活用してみようと思います。&lt;/p&gt;
&lt;h2 id=&#34;aivisspeech-とは&#34;&gt;AivisSpeech とは？&lt;/h2&gt;
&lt;p&gt;DMMの&lt;a href=&#34;https://nijivoice.com/&#34;&gt;にじボイス&lt;/a&gt;(旧:DMMボイス)でいろいろ騒がれていたところに商用利用もできる無料のAI音声合成が出ていました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://aivis-project.com/&#34;&gt;Aivis Project&lt;/a&gt;のAivisSpeechですね。他のプロジェクトもありますが、一旦試しで使ってみる場合はAivisSpeechになると思います。&lt;/p&gt;
&lt;h3 id=&#34;aivisspeechのインストール方法&#34;&gt;AivisSpeechのインストール方法&lt;/h3&gt;
&lt;p&gt;というわけでまずはダウンロードしてみましょう！ダウンロードする場合はWindowsとMacがあります。私はWindowsなのでこちらのインストーラー版をダウンロードしてきます。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;AivisSpeech_インストーラー&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/ai-voice-synthesis-aivisspeech-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-26-110642.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;インストーラーを実行しようとするとワーニングの表記が出ます。元のHPにも書かれていますが、コード署名はまだ行われていないようです。一旦開発をガシガシ進めて、余裕が出来たらコード署名もやるとは思います。今回はこのまま実行していきます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/ai-voice-synthesis-aivisspeech-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-26-110745.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;インストールが完了したら実行しましょう。途中でダウンロードするファイルがありますが、不要であれば削除しても問題ありません。私はチェックを入れて特に問題なかったので。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/ai-voice-synthesis-aivisspeech-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-26-111031.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;起動するときと喋らせるときは時間がかかることがあります。この辺はPCの性能にもよりますので、人によっては数秒以上かかることもあるかと思います。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/ai-voice-synthesis-aivisspeech-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-26-111209-1024x630.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ライセンス情報に同意して始めましょう。内容を確認したほうが良いですが、著作権や商用、個人情報について書いてはないのでそのまま続けましょう！&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/ai-voice-synthesis-aivisspeech-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-26-112509-1024x630.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ポリシーは自由にしてもらって大丈夫です。私は基本的により良くなっていってほしいので許可することは多いです。ただ、拒否しても問題ありません。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/ai-voice-synthesis-aivisspeech-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-26-112522-1024x630.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;音声合成&#34;&gt;音声合成&lt;/h3&gt;
&lt;p&gt;ダウンロードが完了したら試しに文字を打って実行してみましょう。PCによっては多少時間がかかるかもしれませんが、数秒で応えてくれます。デフォルトだとこんな感じですね。&lt;/p&gt;
&lt;p&gt;右側の和側やテンポなどを変え、アクセントも少し変化させてみます。右側の喋る部分についてはプリセットで登録できますので、好みの話し方を模索すると良いと思います。こんな感じ。&lt;/p&gt;
&lt;h3 id=&#34;音声の書き出しと読み込み&#34;&gt;音声の書き出しと読み込み&lt;/h3&gt;
&lt;p&gt;話し方を決めて話す内容を決めたら音声を書き出してみましょう！&amp;ldquo;音声書き出し&amp;quot;だと段落ごとに出力されますので、それが嫌な場合は&amp;quot;音声をつなげ書き出し&amp;quot;を行います。出力時の拡張子はwavファイルになります。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;AivisSpeech_ファイル変更&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/ai-voice-synthesis-aivisspeech-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-27-130049-1024x575.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;また、書いた内容をテキストファイルとして出力することもできます。逆に書いた内容がテキストファイルとして存在していれば読み込むことも可能です。&lt;/p&gt;
&lt;p&gt;そしてプロジェクトを保存すればいつでも同じ話し方と話す内容で作業することができます。&lt;/p&gt;
&lt;p&gt;それからモデルによってはスタイルがあります。このスタイルはアイコンをクリックすることで変更することができます。デフォルトだと6種類ですね。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;AivisSpeech_スタイル変更&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/ai-voice-synthesis-aivisspeech-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-27-134956-1024x575.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;設定などの変更について&#34;&gt;設定などの変更について&lt;/h3&gt;
&lt;p&gt;後は設定もいろいろ変更できます。基本的にCPUでも動かせますがGPUでも動かすことができます。それから保存先です。ここを設定しておくと保存が楽になるのでやっておくとおすすめです。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;AivisSpeech_設定変更&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/ai-voice-synthesis-aivisspeech-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-27-141229-1024x575.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/ai-voice-synthesis-aivisspeech-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-27-141245-1024x575.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;もし、他の操作でわからない点や気になることがあればヘルプを見ることをおすすめします。ルビを振ったり、メモを残す方法などもありますので興味があれば一読すると良いと思います。&lt;/p&gt;
&lt;h3 id=&#34;終わりに&#34;&gt;終わりに&lt;/h3&gt;
&lt;p&gt;他の音声モデルについては&lt;a href=&#34;https://hub.aivis-project.com/&#34;&gt;こちら&lt;/a&gt;から確認することができます。ただ、今はあまり多くないのでここから選択するか、待つか、自分で作ってみるのも手だと思います。作るのは大変そうですが…&lt;/p&gt;
&lt;p&gt;次はモデルを作ってAivis Speechに取り込むまでをやってみたいですね。ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>pCloudがセールをやってたので購入してみたよ！</title>
      <link>https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/</link>
      <pubDate>Sun, 17 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/</guid>
      <description>&lt;h2 id=&#34;pcloud-3in1バンドルのレビュー&#34;&gt;pCloud 3in1バンドルのレビュー&lt;/h2&gt;
&lt;p&gt;pCloudがブラックフライデーセールをやっていたので購入してみました。以前から気になっていたのですが、このタイミングの&lt;a href=&#34;https://landing.pcloud.com/ja/BF2024&#34;&gt;セール&lt;/a&gt;がよさそうだったので待ってました。&lt;/p&gt;
&lt;h3 id=&#34;購入したもの&#34;&gt;購入したもの&lt;/h3&gt;
&lt;p&gt;今回買ったのは3in1バンドルですね。内容は以下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ストレージ5TB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;セキュリティ性が高いEncryption&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;パスワード管理サービスのPass Premium&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;pcloudのセール価格について&#34;&gt;pCloudのセール価格について&lt;/h3&gt;
&lt;p&gt;値段は599$、現在は154円/$なので大体9万2千円ですね。最初のコストが高いですが、99年使えるのでサブスク換算だとかなり安くなります。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;pCloud_3in1&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/image-1024x486.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;その他の値段を見ると以下の金額。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1TBだと199$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2TBだと279$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;10TBだと799$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば1TBを買った場合、月26円ぐらいで1TBのストレージが使えます。もちろん写真以外にも動画、音楽、ドキュメントファイルなどなんでもよいですね。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;pCloud_ストレージセール&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/image-1-1024x486.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;注意してほしいのがこの会社が潰れないということが前提ですね。潰れない限りは日がたつことにどんどん安くなっていくイメージですね。&lt;/p&gt;
&lt;p&gt;AWSやGoogle Cloud、iCloudは月間のサブスクなので、これらを使っているのであれば一考の余地ありという感じです。&lt;/p&gt;
&lt;h3 id=&#34;実際に触ってみた感想&#34;&gt;実際に触ってみた感想&lt;/h3&gt;
&lt;p&gt;実際に使ってみた画面がこちらですね。「Automatic Upload」には自動でアップロードされたファイルがあります。こちらはwebで見た画面です。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;pCloud_web&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/image-3-1024x486.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.pcloud.com/ja/download-free-online-cloud-file-storage.html&#34;&gt;アプリ&lt;/a&gt;もありますので必要であればダウンロードしましょう。PC版モバイル版ありますのでファイルの同期をしてみます。&lt;/p&gt;
&lt;p&gt;ちなみにPC版のアプリは画像のように各フォルダー別にバックアップをすることができます。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;pCloud_backup&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/image-4.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;他のフォルダも同期から選択することができます。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;pCloud_フォルダ同期&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/image-5.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;CryptoフォルダはEncryptionサービスになります。見られたくないものや大事な書類を入れておくものに使ったりします。ただ、個人で使う場合は個人情報ぐらいしか思いつかないですね。プログラムならprivateでgit管理しそうですし…&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;pCloud_Crypto&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/image-6.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;pcloud-pass-premiumについて&#34;&gt;pCloud Pass Premiumについて&lt;/h3&gt;
&lt;p&gt;もう一つPass Premiumというサービスを買いました。これはパスワードの管理ですね。こちらもWeb版アプリ版モバイル版で使うことができます。&lt;/p&gt;
&lt;p&gt;ログインするとこんな感じです。色んなブラウザやパスワード管理ツールが出てきます。私はChromeを使ってるので実際にインポートしてみます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-17-165453.png&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;chromeのエクスポート方法&#34;&gt;Chromeのエクスポート方法&lt;/h4&gt;
&lt;p&gt;Chromeの場合は右上の縦三点リーダーから&amp;quot;設定&amp;quot; &amp;gt; &amp;ldquo;パスワードと自動入力&amp;rdquo; &amp;gt; &amp;ldquo;Googleパスワードマネージャー&amp;quot;を選択します。&lt;/p&gt;
&lt;p&gt;パスワードマネージャー画面から&amp;quot;設定&amp;quot;を選び&amp;quot;パスワードのエクスポート&amp;quot;にある&amp;quot;ファイルをダウンロード&amp;quot;をクリックします。そうするとcsvファイルがダウンロードされます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-17-165038-1024x183.png&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;ファイルのインポート他&#34;&gt;ファイルのインポート他&lt;/h4&gt;
&lt;p&gt;ダウンロード後はpCloud passからChromeを選び以下の画面にファイルをアップロードします。内容を確認して問題なければ&amp;quot;選択内容をインポート&amp;quot;をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-17-165519.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-17-165550.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;もし他のブラウザやパスワード管理ツールを追加したければ&amp;quot;追加&amp;quot;をクリックして同様の手順で設定すれば問題ありません。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-17-165717-1024x234.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ちなみにGoogle Driveやフォトのバックアップができますが、1アカウントだけみたいなので複数のアカウントに分けてる場合は別の方法が必要そうですね。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/image-7-1024x683.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ざっくりpCloudはこんな感じですね。5TBもあるのである程度動画を入れても問題なさそうです。&lt;a href=&#34;https://xainome.blog/wp-admin/post.php?post=147&amp;amp;action=edit&#34;&gt;以前動画を作った&lt;/a&gt;ことがあるという話をしたのですが、それを全部突っ込んでチャンネル爆破でも楽しそうですね。&lt;/p&gt;
&lt;h3 id=&#34;お得なキャンペーンをやってるらしい&#34;&gt;お得なキャンペーンをやってるらしい&lt;/h3&gt;
&lt;p&gt;最後に&lt;a href=&#34;https://d-gogo.com/pages/pcloud-blackfriday2024?srsltid=AfmBOop0I9FajtXVHoDodDLrY00w_jOY3-3H68EpwLupCy0ALZVx4ltH&#34;&gt;対象のサイト&lt;/a&gt;からpCloudの商品を買えばアマギフがもらえます。もちろん買う商品によって値段は変わりますが、1割弱戻ってくるのでお得です。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-17-132051.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;もしpCloudを購入したらエントリーしましょう。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-17-132112.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;姓名とメアドを記載したらエントリー完了です。ただ、調査がセール終了後になりますのでアマギフ送付が正月くらいになるみたいです。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-17-143525-1024x625.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/11/pcloud-lifetime-storage-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-11-17-143505.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;最後に&#34;&gt;最後に&lt;/h3&gt;
&lt;p&gt;とは言えストレージはそんなに要らなければ買う必要はないと思います。強固なフォルダーもあまり使わなそうですし、パスワード管理は代用がいくらでもあるので。私は将来的にあると使えるかな？程度で買ったので興味とお金に余裕があれば試してみてください！ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>簿記の勉強を暇なタイミングやる！世界でも使えそうかも？</title>
      <link>https://xainome-blog.pages.dev/posts/2024/10/learning-bookkeeping-for-global-career/</link>
      <pubDate>Sat, 26 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/10/learning-bookkeeping-for-global-career/</guid>
      <description>&lt;h2 id=&#34;簿記を始めたのはなぜか&#34;&gt;簿記を始めたのはなぜか？&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://xainome-blog.pages.dev/posts/2024/10/recent-games-roundup-october-2024/&#34;&gt;前回のブログ&lt;/a&gt;でゲームに飽きてきたという話をしました。というわけで勉強をしようかと思います。&lt;/p&gt;
&lt;h3 id=&#34;簿記に挑戦コースについて&#34;&gt;簿記に挑戦：コースについて&lt;/h3&gt;
&lt;p&gt;プログラムの勉強もいいんですが、普段＋副業でもやってるので変わった勉強をしたいなと思いましした。そこで&lt;a href=&#34;https://www.cpa-learning.com/home&#34;&gt;このサイト&lt;/a&gt;ですね。アカウントを登録すると使えるようになります。&lt;/p&gt;
&lt;p&gt;色んなコースがありますが、メインは簿記だと思います。問題集の解説もありますので、試験勉強だけでも使えると思います。他のコースは今のところ興味がわかないので無視します。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;簿記_コース&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/10/learning-bookkeeping-for-global-career/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-10-25-125433-1024x375.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;まずは簿記3級ですね。簿記2級を1つ見てみたんですが、簿記3級の知識を前提に話を進めていたので。&lt;/p&gt;
&lt;h3 id=&#34;簿記に挑戦教材の活用&#34;&gt;簿記に挑戦：教材の活用&lt;/h3&gt;
&lt;p&gt;それから動画だけでなく教材もあります。紙媒体ではなくpdfですが。コースを見ると左のタブに&lt;strong&gt;講義&lt;/strong&gt;、右のタブに&lt;strong&gt;教材&lt;/strong&gt;があります。ここからダウンロードできますので、欲しければダウンロードしてみてください。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;簿記_教材&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/10/learning-bookkeeping-for-global-career/images/image-6-1020x1024.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;さて、動画見て教材見て手を動かしながらやるのが勉強としては一番の近道だと思います。&lt;/p&gt;
&lt;p&gt;進めていきながら時々忘れていることがあれば、立ち止まってなるべく思い出すまで考えて、どうしても出なければ復習するという感じでやるのがいいかなと思います。&lt;/p&gt;
&lt;p&gt;ただ、私はITに従事する者です。これだけではわからないことがあった際に聞けないこともあるなと感じました。&lt;/p&gt;
&lt;h3 id=&#34;notebooklmを使ってサポート&#34;&gt;NotebookLMを使ってサポート&lt;/h3&gt;
&lt;p&gt;というわけで&lt;strong&gt;NotebookLM&lt;/strong&gt;の出番です。実は最初Difyを使おうとしたのですが、15MBという制限がありましたので変更しました。勉強したいpdfを全てぶち込んでみましょう。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;簿記_NotebookLM&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/10/learning-bookkeeping-for-global-career/images/image-7-1024x532.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;一旦概要と用語集を作ってみました。&lt;/p&gt;
&lt;p&gt;作り方はシンプルでチャットに「教科書から概要を作成してください」や「教科書から用語集を作成してください」と入力します。&lt;/p&gt;
&lt;p&gt;そうするとpdfを読み取って作成してくれます。それをメモに保存するという流れになります。作成されたチャットの下部に「メモに保存」があるのでそれをクリックすれば作成されます。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;簿記_NotebookLM_用語集&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/10/learning-bookkeeping-for-global-career/images/image-8-1024x388.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;notebooklmの活用法&#34;&gt;NotebookLMの活用法&lt;/h3&gt;
&lt;p&gt;大体概要や用語集を作れば困ることは少ないかと思いますが、動画内の説明でわからないことがあれば質問すると答えてくれると思います。あるいはこんな感じで質問の方法を出してくれることもありますので。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;簿記_NotebookLM_質問&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/10/learning-bookkeeping-for-global-career/images/image-9-1024x152.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;もう一つ有効活用としては類似問題の作成ですね。「問題集を見て似たような問題を3問作成してください。」と言えば3問類似問題を作成してくれます。一応「解答を作成して下さい」と言えばそちらも作成してくれます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/10/learning-bookkeeping-for-global-career/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-10-25-140445-1024x373.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/10/learning-bookkeeping-for-global-career/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-10-25-140504-1024x415.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;とは言え全て正確か？という言われるとわかりません。特に類似問題を作成した後の解答などは怪しいかもしれません。LLMを使うときは当たり前ですが、鵜呑みにはしないようにしましょう。時には教材を見直すことも必要なので。&lt;/p&gt;
&lt;h3 id=&#34;courseraでさらに深い学びを&#34;&gt;Courseraでさらに深い学びを&lt;/h3&gt;
&lt;p&gt;今は空いた時間でやってるところなのでこの勉強をしていますが、仕事を辞めた直後ぐらいであれば&lt;strong&gt;Coursera&lt;/strong&gt;で勉強しようかと思います。&lt;a href=&#34;https://www.coursera.org/&#34;&gt;こちら&lt;/a&gt;ですね。&lt;/p&gt;
&lt;p&gt;ここはほぼIT系の勉強になりますが、認定証ももらえますし、コースによっては海外大学の証明書ももらえます。もちろん有償ですが…&lt;/p&gt;
&lt;p&gt;ただ、コースの認定証だけなら7日間の無料トライアルがあります。この期間に1つぐらい取りたいなと思ったので空いた時間にやってみようと思います。ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>llma-cpp-pythonを使って今更ローカルでLLMを動かしてみるよ！</title>
      <link>https://xainome-blog.pages.dev/posts/2024/10/llma-cpp-python-llm/</link>
      <pubDate>Fri, 11 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/10/llma-cpp-python-llm/</guid>
      <description>&lt;h2 id=&#34;llama-cpp-pythonのインストールとセットアップ&#34;&gt;llama-cpp-pythonのインストールとセットアップ&lt;/h2&gt;
&lt;p&gt;前回Github copilotをを使わず、vscodeでAIを動かしてコードを頼むようにしてみました。&lt;/p&gt;
&lt;p&gt;そこでローカルでllama3.2:3bが動かせるなら他のモデルでもいけるのでは？ということが気になって調べて動かしてみました。&lt;/p&gt;
&lt;p&gt;githubのライブラリは&lt;a href=&#34;https://github.com/abetlen/llama-cpp-python&#34;&gt;こちら&lt;/a&gt;になります。&lt;/p&gt;
&lt;p&gt;というわけでまずはライブラリのインストール&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install llama-cpp-python
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こちらはcpu対応になります。もしエラーが出たら下のほうも試して見てください。私はvisual sutadioが入ってるので特に問題はありませんでした。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install llama-cpp-python \ --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;gpuを使いたい方はいろんなインストールパターンがあるので試して見てください。CUDAであればこんな感じ&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install llama-cpp-python \ --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cu121
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;ダウンロードしたモデルの紹介&#34;&gt;ダウンロードしたモデルの紹介&lt;/h3&gt;
&lt;p&gt;ライブラリのインストールが完了したら今度はモデルをダウンロードしてきましょう。配置場所はどこでも構いません。&lt;/p&gt;
&lt;p&gt;私は今回2つのモデルをダウンロードしてきました。&lt;/p&gt;
&lt;p&gt;sakanaAI: &lt;a href=&#34;https://huggingface.co/mmnga/SakanaAI-EvoLLM-JP-v1-7B-gguf&#34;&gt;https://huggingface.co/mmnga/SakanaAI-EvoLLM-JP-v1-7B-gguf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;gemma: &lt;a href=&#34;https://huggingface.co/alfredplpl/gemma-2-2b-jpn-it-gguf&#34;&gt;https://huggingface.co/alfredplpl/gemma-2-2b-jpn-it-gguf&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;llama-cpp-pythonを使ってコードでのモデル呼び出し&#34;&gt;llama-cpp-pythonを使ってコードでのモデル呼び出し&lt;/h3&gt;
&lt;p&gt;インストールが完了したら実際にコードに書いていきます。一旦こんな感じ&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;from llama_cpp import Llama

prompt = &amp;#34;(12+50)*30/5-6*(38-19) この計算結果は何？&amp;#34;
sakana_llm = Llama(model_path=&amp;#34;./models/sakana/SakanaAI-EvoLLM-JP-v1-7B-q4_K_M.gguf&amp;#34;)
gemma_llm = Llama(model_path=&amp;#34;./models/gemma/gemma-2-2b-jpn-it-Q4_K_M.gguf&amp;#34;)

sakana_response = sakana_llm.create_chat_completion(
    messages = [
        {
            &amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;,
            &amp;#34;content&amp;#34;: prompt,
        }
    ]
)

gemma_response = gemma_llm.create_chat_completion(
    messages = [
        {
            &amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;,
            &amp;#34;content&amp;#34;: prompt,
        }
    ]
)

print(sakana_response[&amp;#34;choices&amp;#34;][0][&amp;#34;message&amp;#34;][&amp;#34;content&amp;#34;].strip())
print(gemma_response[&amp;#34;choices&amp;#34;][0][&amp;#34;message&amp;#34;][&amp;#34;content&amp;#34;].strip())
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;llama-cpp-pythonを使った実行結果と考察&#34;&gt;llama-cpp-pythonを使った実行結果と考察&lt;/h3&gt;
&lt;p&gt;それからどのくらい時間がかかるか気になったので計測してみました。ちなみに私の環境ではこんな感じで時間がかかっています。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Github Copilotを使わずVSCodeにContinueを入れて使ってみる</title>
      <link>https://xainome-blog.pages.dev/posts/2024/09/github-copilot-vscode-continue/</link>
      <pubDate>Mon, 30 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/09/github-copilot-vscode-continue/</guid>
      <description>&lt;h2 id=&#34;無料で使えるaiツールcontinueでvscodeにaiコード補完機能を導入する方法&#34;&gt;無料で使えるAIツール「Continue」でVSCodeにAIコード補完機能を導入する方法&lt;/h2&gt;
&lt;p&gt;Github Copilotが出てだいぶ時間が経ちましたが、IDEで未だにAIを使わず開発をしています。&lt;/p&gt;
&lt;p&gt;Github Copilotは料金がかかりますし、open-interpreterを使ったとしてもopenAIのapiを使ってるので料金はかかります。&lt;/p&gt;
&lt;p&gt;結果ほぼIDEでAIを使わずやってきたのですが、最近Continueが出たということを聞きました。こちらはllamaなどのオープンソースを使ってるので、料金はかからなそうです。参考にした記事は&lt;a href=&#34;https://www.theregister.com/2024/08/18/self_hosted_github_copilot/&#34;&gt;こちら&lt;/a&gt;になります。Continueのサイトは&lt;a href=&#34;https://www.continue.dev/&#34;&gt;こちら&lt;/a&gt;です。llamaの使い方は&lt;a href=&#34;https://docs.continue.dev/customize/tutorials/llama3.1&#34;&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id=&#34;continueのインストール手順&#34;&gt;Continueのインストール手順&lt;/h3&gt;
&lt;p&gt;というわけでまずはインストールしてみます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/github-copilot-vscode-continue/images/image-6-1024x534.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;インストールが完了すると左のタブに表示されます。モデルの選択でどのモデルを使用するか選ぶことができます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/github-copilot-vscode-continue/images/image-8.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;llamaモデルのダウンロードと設定&#34;&gt;Llamaモデルのダウンロードと設定&lt;/h3&gt;
&lt;p&gt;チュートリアルに従って次はllamaをダウンロードします。&lt;a href=&#34;https://ollama.com/&#34;&gt;こちら&lt;/a&gt;ですね。最近llama3.2が発表されたので3.2になってますね。3.1が良ければ&lt;a href=&#34;https://ollama.com/library/llama3.1&#34;&gt;こちら&lt;/a&gt;からダウンロードできます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/github-copilot-vscode-continue/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-09-29-151308.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;次にOSを選んでダウンロードしましょう。もしモデルのアップデート通知が欲しければアカウントを作って登録すると良いと思います。ニュースになるので今はやらなくてもいいかと&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/github-copilot-vscode-continue/images/image-9.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;ターミナルでモデルを実行&#34;&gt;ターミナルでモデルを実行&lt;/h3&gt;
&lt;p&gt;実行ファイルがダウンロードされるので開いて案内に従っていきます。インストールが完了すると実行ファイルなどが入っています。実行するとコマンドプロンプトから実行してくださいと言われます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/github-copilot-vscode-continue/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-09-29-163827.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/github-copilot-vscode-continue/images/image-10.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;というわけでターミナルを開いて以下のコマンドを実行します。チュートリアルでは3.1:8bとなってますが、今回は3.2:3bを使用します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ollama run llama3.2:3b
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;大きなモデルの利用任意&#34;&gt;大きなモデルの利用（任意）&lt;/h3&gt;
&lt;p&gt;一応チュートリアルでは&lt;a href=&#34;https://console.groq.com/settings/profile&#34;&gt;Groq&lt;/a&gt;と&lt;a href=&#34;https://api.together.xyz/signup&#34;&gt;together&lt;/a&gt;などのサイトのAPIを使えば大きなモデルも使うことができるみたいです。ただ、料金などもかかりますので今回は省きます。&lt;/p&gt;
&lt;h3 id=&#34;continueのモデル設定とconfigjsonの編集&#34;&gt;Continueのモデル設定とconfig.jsonの編集&lt;/h3&gt;
&lt;p&gt;最初のモデル選択の部分でFree Trialのモデルを使えます。こちらを使う場合はGitHubにサインインする必要があります。今回はllamaをインストールしたのでlocal modelを使うことになります。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/github-copilot-vscode-continue/images/image-11.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;次はconfig.jsonを編集していきます。llama3.1を使う場合はこの&amp;quot;Add Chat model&amp;quot;から設定できますが、今回は3.2なのでconfig.jsonを直接編集していきます。Free Trialが不要であれば削除しましょう。編集する際は歯車を押せばconfig.jsonを開きます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/github-copilot-vscode-continue/images/image-12.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;エラー対処とモデルの接続&#34;&gt;エラー対処とモデルの接続&lt;/h3&gt;
&lt;p&gt;文字を入力してみましたが、エラーが出ました。大元のモデルは動いてますが、チャットモデルも必要みたいです。オートコンプリートモデルはコーディングをするとき予測して文字を補完するモデルです。というわけでpullしてみます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/github-copilot-vscode-continue/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-09-29-171653.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;コマンドのターミナルをクリックすればターミナルにコマンドがコピーされますので、pullしましょう！もしこんなエラーが出たらおそらくVSCodeがポートを使用しているのでターミナルから実行してみてください。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Error: Head &amp;#34;http://127.0.0.1:11434/&amp;#34;: dial tcp 127.0.0.1:11434: bind: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;両方のモデルをpullすれば無事接続ができます。接続した際、llama3.1のモデルがconfigに追加されます。まあtitleやmodel名は違いますが消しても大丈夫です。接続できたことを確認できれば、初めのconfigで設定したモデルを使用できるようになります。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/github-copilot-vscode-continue/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-09-29-175602.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;continueを実際に使ってみる&#34;&gt;Continueを実際に使ってみる&lt;/h3&gt;
&lt;p&gt;というわけで使えるようになりました。もちろんChat-GPTやCloudeのほうが性能がいいと思います。ノートPCで使えるローカルモデルではないですし。ただ、ネットにつながず軽量なモデルだとは思いますのでもう少し試してみようと思います。&lt;/p&gt;</description>
    </item>
    <item>
      <title>機械学習の無料講座をGoogleが出しているので受けてみたよ</title>
      <link>https://xainome-blog.pages.dev/posts/2024/09/machine-learning-google/</link>
      <pubDate>Sat, 14 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/09/machine-learning-google/</guid>
      <description>&lt;h2 id=&#34;e資格合格後に再学習を決意した理由&#34;&gt;E資格合格後に再学習を決意した理由&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://xainome-blog.pages.dev/posts/2024/03/jdla-deep-learning-engineer-exam-2024-1-to/&#34;&gt;E資格を合格した&lt;/a&gt;後復習とか出来てないので、改めて学びなおしてみようと思ったのがきっかけになります。&lt;a href=&#34;https://developers.google.com/machine-learning/foundational-courses?hl=ja&#34;&gt;こちら&lt;/a&gt;から受けることができます。必要に応じて日本語に切り替えることもできます。&lt;/p&gt;
&lt;p&gt;生成AIの進歩もありそれにまつわるような部分もあるので、ぜひ理解を深めたうえで使っていくと良いと思います。&lt;/p&gt;
&lt;h3 id=&#34;機械学習講座の学習ツールとインターフェース&#34;&gt;機械学習講座の学習ツールとインターフェース&lt;/h3&gt;
&lt;p&gt;タブに基礎コースと上級コースがあるのでまずは基礎コースからやってみました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/machine-learning-google/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-09-13-123515.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;初めの内容としてはこんな感じですね。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/machine-learning-google/images/image-1024x489.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;右タブに&lt;strong&gt;情報&lt;/strong&gt;と&lt;strong&gt;チャット&lt;/strong&gt;と&lt;strong&gt;API&lt;/strong&gt;があります。&lt;/p&gt;
&lt;p&gt;情報はこのページの目次ですね。チャットは生成AIを使って質問することができます。わからないことがあったら随時聞いてみるといいと思います。サービスの同意をしたら試してみましょう！&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/machine-learning-google/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-09-13-124011.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/machine-learning-google/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-09-13-153202.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;APIを使えばデータを見ることができます。一覧は&lt;a href=&#34;https://developers.google.com/apis-explorer?hl=ja&#34;&gt;こちら&lt;/a&gt;にあります。今回は一旦無視しますね。&lt;/p&gt;
&lt;h3 id=&#34;理解度チェックとインタラクティブな学習&#34;&gt;理解度チェックとインタラクティブな学習&lt;/h3&gt;
&lt;p&gt;目次の項目によっては理解度チェックがあります。下の画像の場合は三択から1つ選んでクリックすることになります。日本語だと微妙な部分もありますので、英語で見てみるのも手ですね。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/machine-learning-google/images/image-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;正解の選択肢では説明を見られるものもあります。間違った場合は別の選択肢をクリックしましょう。間違ってもペナルティがあるわけではないので、ミスは気にせずページをよく読んで解答するとよいです。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;機械学習テスト&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/machine-learning-google/images/image-2.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;動画コンテンツでの学習補助&#34;&gt;動画コンテンツでの学習補助&lt;/h3&gt;
&lt;p&gt;さらに動画もあります。概要の説明をしているので興味があれば見てみてください。英語説明ですが画面を見てるとなんとなくわかるので、必要であれば字幕を付けるなどして見てください。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;機械学習動画&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/machine-learning-google/images/image-4.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;基礎講座だけでも十分機械学習について学ぶことができます。一応上級講座も見てみました。&lt;/p&gt;
&lt;p&gt;基本的に変わりませんが、前提知識や実装経験が必要になってきます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/machine-learning-google/images/image-5.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;なのでまずは基礎で十分理解と実装経験を積んでから上級に行くことをおすすめします。&lt;/p&gt;
&lt;h3 id=&#34;機械学習のプログラミング演習活用&#34;&gt;機械学習のプログラミング演習活用&lt;/h3&gt;
&lt;p&gt;講座を進めていくとプログラミング演習を実施することもできます。英語なので必要に応じて日本語訳してみてください。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/machine-learning-google/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-09-13-161117.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;機械学習講座後のバッジとプロフィールの公開&#34;&gt;機械学習講座後のバッジとプロフィールの公開&lt;/h3&gt;
&lt;p&gt;学習が終わってチェックテストをクリアするとバッジをもらうことができます。お気に入りを5つまで設定できるので、いっぱい集めてみようと思います。&lt;/p&gt;
&lt;p&gt;プロフィールを公開すれば他の人にも見られるようになります。転職等で使えるんですかね？&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;機械学習バッジ&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/09/machine-learning-google/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-09-14-081903.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;今後の学びと実践に向けた決意&#34;&gt;今後の学びと実践に向けた決意&lt;/h3&gt;
&lt;p&gt;機械学習には教師あり、教師なし、強化学習、生成があります。本来全てやることは少ないかと思うので全て学ぶにはかなり時間がかかると思います。&lt;/p&gt;
&lt;p&gt;ただ、これが理解できればどのようなデータが仕事に使えるかわかるようになります。また売上予測や顧客分類、キャンペーンの効果も見える部分が出てくると思います。&lt;/p&gt;
&lt;p&gt;しっかり学んで実際のデータで試してみれば学習の実感が出てくると思うので頑張っていきましょう！私も再度学びなおして理解を深めていきます。ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>人間っぽいふるまいをするスクレイピングを検討した話</title>
      <link>https://xainome-blog.pages.dev/posts/2024/08/web-scraping/</link>
      <pubDate>Fri, 30 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/08/web-scraping/</guid>
      <description>&lt;h2 id=&#34;前提利用規約に違反しないこと&#34;&gt;前提：利用規約に違反しないこと&lt;/h2&gt;
&lt;p&gt;前提として&lt;strong&gt;利用規約&lt;/strong&gt;に違反する行為はやめたほうが良いと考えています。&lt;/p&gt;
&lt;p&gt;法的に訴えられても文句は言えないですし。&lt;/p&gt;
&lt;p&gt;多くの人が利用している&lt;a href=&#34;https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=GLSBYFE9MGKKQXXM&#34;&gt;amazonなども利用規約&lt;/a&gt;で禁止しているので、スクレイピングをする際はしっかりと利用規約を読んだうえで行ってください。許可が下りれば問題ないとは思いますが。&lt;/p&gt;
&lt;h3 id=&#34;サイト側のスクレイピング対策&#34;&gt;サイト側のスクレイピング対策&lt;/h3&gt;
&lt;p&gt;本題に入ります。&lt;/p&gt;
&lt;p&gt;サイト側でスクレイピングを弾く設定がいくつか存在します。例えばユーザーっぽくないふるまいでサイトにアクセスした場合。あるいは特定のサイトを経由しないと見れないURLに直接アクセスした場合。ゆうまでもなく連続でいろんなURLにアクセスした場合。&lt;/p&gt;
&lt;p&gt;連続でアクセスされるとサーバーに負荷がかかるので、これが弾かれるのは想像に難くないと思います。&lt;/p&gt;
&lt;h3 id=&#34;スクレイピング対策を避ける方法&#34;&gt;スクレイピング対策を避ける方法&lt;/h3&gt;
&lt;p&gt;ただ、スクレイピングするされた場合、上記のような特徴が存在します。&lt;/p&gt;
&lt;p&gt;この辺はアクセスログを監視すると見れるかと思います。おそらくですが。&lt;/p&gt;
&lt;p&gt;では人間っぽくふるまうにはどうしたらよいか調べた中で書いてみます。&lt;/p&gt;
&lt;p&gt;一応言語はpythonを使います。他の言語でもできるかと思うので参考程度にはなるかと思います。&lt;/p&gt;
&lt;h3 id=&#34;pythonでのスクレイピング基礎&#34;&gt;Pythonでのスクレイピング基礎&lt;/h3&gt;
&lt;p&gt;一般的にpythonでのスクレイピングではrequestsモジュールを使います。他にもseleniumやpyppeteerなどがありますが、一旦requestsを使っていきます。&lt;/p&gt;
&lt;p&gt;インストールはpipを使います。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install requests
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;もしpythonのバージョンなどで分けてる場合はこちら&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;py -3.12 -m pip install requests
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;インストールが終わったらアクセスしてみましょう。今回は私のサイトにアクセスしてみます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import requests

response = requests.get(&amp;#39;https://xainome.blog/’)
print(response.text)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こうするとHTMLの中身を取得することができます。&lt;/p&gt;
&lt;p&gt;そこから取得したい情報があればBeautifulSoupを使って要素を取り出してみましょう。まずはインストール&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install beautifulsoup4
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;実際のアクセスとhtmlの解析&#34;&gt;実際のアクセスとHTMLの解析&lt;/h3&gt;
&lt;p&gt;インストールができたらHTMLを解析します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;from bs4 import BeautifulSoup

soup = BeautifulSoup(html_parse, &amp;#39;html.parser&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで解析の準備ができました。解析の話は本題とそれますのでここまでにしようと思います。&lt;/p&gt;
&lt;p&gt;解析やHTMLの情報取得に興味があれば調べてもいいですし、生成AIに聞いてみるでもいいと思います。このようなコード、銘柄、市場などが一覧で取得することができます。もちろんAPIを使うという手もありますが。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;東京証券取引所_銘柄一覧_グロース&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/08/web-scraping/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-08-30-091809.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;リクエストヘッダーの設定&#34;&gt;リクエストヘッダーの設定&lt;/h3&gt;
&lt;p&gt;実は通常のリクエストを送る場合ユーザーではなく、言語別のリクエストを送っていることになります。&lt;/p&gt;
&lt;p&gt;リクエストにはRequests Headersというものが設定できます。これは私たちがPCやスマホでサイトにアクセスするときも送信されています。&lt;/p&gt;
&lt;p&gt;まずは設定してみます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;headers = {
    &amp;#39;User-agent&amp;#39; = &amp;#39;Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36&amp;#39;
}
response = requests.get(search_url, headers=headers)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こんな感じで設定します。特に何も設定しなかった場合、&amp;lsquo;python-requests/2.25.1&amp;rsquo;という設定で送られるみたいです。恐らくjsやGoとかでも似たような設定になるかと思います。&lt;/p&gt;</description>
    </item>
    <item>
      <title>PrefectとBigQueryを使っているので現状やったことを書いてみる</title>
      <link>https://xainome-blog.pages.dev/posts/2024/08/prefect-bigquery/</link>
      <pubDate>Fri, 23 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/08/prefect-bigquery/</guid>
      <description>&lt;h2 id=&#34;副業でのprefect-cloudとbigqueryの使用&#34;&gt;副業でのPrefect CloudとBigQueryの使用&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://xainome-blog.pages.dev/posts/2023/11/learning-gcp-for-freelance-project/&#34;&gt;副業&lt;/a&gt;でPrefect CloudとBigQueryを使っているので触った点と書いてみようと思います。&lt;/p&gt;
&lt;h3 id=&#34;環境の設定とインストール&#34;&gt;環境の設定とインストール&lt;/h3&gt;
&lt;p&gt;私はWindowsを使っています。契約を結んでいる企業の導入手順がMacで書かれていたのでそこもいろいろ調べてやってみました。&lt;/p&gt;
&lt;h3 id=&#34;prefectとは&#34;&gt;Prefectとは？&lt;/h3&gt;
&lt;p&gt;そもそもprefectとは何ぞや？というところですね。prefectは&lt;strong&gt;Pythonベースのワークフローエンジン&lt;/strong&gt;になります。&lt;/p&gt;
&lt;p&gt;pythonジョブの実行を自動化したりデバッグしたりする機能をpythonコードで書けるシステムになります。&lt;/p&gt;
&lt;p&gt;AWSだとStepfunctionのイメージに近いですね。それに加えてEventBridgeやCloud Watch Logsが足されたような感じです。&lt;/p&gt;
&lt;p&gt;おそらくAWSやGoogle Cloudに比べてコストが低く、使いやすいという点で採用されたと考えられます。&lt;/p&gt;
&lt;p&gt;Prefectの参照しているドキュメントは&lt;a href=&#34;https://docs.prefect.io/2.19.9/&#34;&gt;こちら&lt;/a&gt;です。ちなみに3.0がリリースされたみたいなのでそちらのドキュメントは&lt;a href=&#34;https://docs-3.prefect.io/3.0rc/get-started/index&#34;&gt;こちら&lt;/a&gt;になります。&lt;/p&gt;
&lt;h3 id=&#34;インストール手順&#34;&gt;インストール手順&lt;/h3&gt;
&lt;p&gt;一応pythonをインストールしている前提でお話しします。&lt;/p&gt;
&lt;p&gt;まずはprefect cloudのインストールを行います。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install prefect
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;次はタスクを実行するためのコマンドが必要になります。ただ、Windowsにはパッケージ管理ツールがありません。&lt;/p&gt;
&lt;p&gt;なくても問題ないですが、せっかくなので導入してみます。今後パッケージを入れるときは活用していきたいです。&lt;/p&gt;
&lt;h3 id=&#34;scoopの導入&#34;&gt;Scoopの導入&lt;/h3&gt;
&lt;p&gt;今回使ったパッケージは&lt;a href=&#34;https://scoop.sh/&#34;&gt;scoop&lt;/a&gt;になります。手順はサイトにあるのでコマンドプロンプトに入力します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;デフォルトでmainがありますが、もしバケットを別にして管理したい場合は以下のコマンドを使います。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# バケットの追加
scoop bucket add extras
# バケット一覧
scoop bucket list
# インストール一覧
scoop list
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt=&#34;scoop bucket 一覧&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/08/prefect-bigquery/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-08-22-231456-1024x110.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;scoop インストール一覧&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/08/prefect-bigquery/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-08-22-231504.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;今回はtaskだけ必要なのでmainに入れました。これで&lt;a href=&#34;https://github.com/go-task/task&#34;&gt;taskコマンド&lt;/a&gt;が使えるようになります。&lt;/p&gt;
&lt;h3 id=&#34;prefectの設定と実行&#34;&gt;Prefectの設定と実行&lt;/h3&gt;
&lt;p&gt;ただ、taskを実行するにはTaskfile.yamlが必要になります。中身はプロジェクトによりますが私がやったのはこんな感じ。全部ではないですが…&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;tasks:
  start-local:
    cmds:
      - pip install -r requirements.txt
      - prefect config set PREFECT_API_URL=http://127.0.0.1:4200/api
      - prefect server start

  start-local-agent:
    cmds:
      - prefect config set PREFECT_API_URL=http://127.0.0.1:4200/api
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Taskfile.yamlの準備が出来たらターミナルの用意します。&lt;/p&gt;</description>
    </item>
    <item>
      <title>SageMakerエンドポイントを利用してモデル管理を調べた話</title>
      <link>https://xainome-blog.pages.dev/posts/2024/08/sagemaker-endpoint-model-management/</link>
      <pubDate>Sat, 03 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/08/sagemaker-endpoint-model-management/</guid>
      <description>&lt;h2 id=&#34;awsを使用してaiモデルを複数管理する方法&#34;&gt;AWSを使用してAIモデルを複数管理する方法&lt;/h2&gt;
&lt;p&gt;AWSを使用してAIのモデルを複数管理したいという話がありました。&lt;/p&gt;
&lt;p&gt;学習済みのモデルなので本番では推論しか使われませんが、モデルのバージョン管理を行いたいということだったので調査をしました。&lt;/p&gt;
&lt;p&gt;S3にモデルを置くだけでもある程度管理はできますが、SageMakerのエンドポイントを使うかもしれないということでSageMakerでの管理を調べることになりました。&lt;/p&gt;
&lt;p&gt;基本的な書き方はサンプルの書き方に沿ってます。&lt;a href=&#34;https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/model-registry-models.html&#34;&gt;こちら&lt;/a&gt;です。&lt;/p&gt;
&lt;h2 id=&#34;モデルのs3へのアップロード&#34;&gt;モデルのS3へのアップロード&lt;/h2&gt;
&lt;p&gt;まずはモデルをS3にアップロードするところからです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# tensorflowを使うのでmodel.tar.gzにモデルを固める
TAR_DIR = &amp;#39;./tmp&amp;#39; # 一時的なモデルディレクトリ
CODE_DIR = &amp;#39;./code&amp;#39; # infarence.py等のディレクトリ
MODEL_DIR = &amp;#39;./model&amp;#39; # モデルディレクトリ
TAR_NAME = os.path.join(TAR_DIR , &amp;#39;model.tar.gz&amp;#39;)
with tarfile.open(TAR_NAME, mode=&amp;#39;w:gz&amp;#39;) as tar
    tar.add(MODEL_DIR)
    tar.add(CODE_DIR)

# モデルをS3にアップロード(複数モデルをアップロードする想定)
s3_uri1 = sagemaker.session.Session(default_bucket=&amp;#39;development&amp;#39;).upload_data(
    path = TAR_NAME
    key_prefix = &amp;#39;image_recognition/test/model1&amp;#39;
)
s3_uri2 = sagemaker.session.Session(default_bucket=&amp;#39;development&amp;#39;).upload_data(
    path = TAR_NAME
    key_prefix = &amp;#39;image_recognition/test/model2&amp;#39;
)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;イメージの作成&#34;&gt;イメージの作成&lt;/h2&gt;
&lt;p&gt;モデルをアップロードしたら次はイメージの作成をします。イメージに関しては1イメージで複数モデル格納できますが、未調査のため一旦複数イメージを作成します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;image_uri1 = sagemaker.image_uris.retrieve(
    framework=&amp;#39;tensorflow&amp;#39;,
    region=sagemaker.session.Session().boto_region_name,
    version=&amp;#39;2.12&amp;#39;,
    instance_type=&amp;#39;ml.m5.xlarge&amp;#39;,
    image_scope=inference&amp;#39;
)
image_uri2 = sagemaker.image_uris.retrieve(
    framework=&amp;#39;tensorflow&amp;#39;,
    region=sagemaker.session.Session().boto_region_name,
    version=&amp;#39;2.12&amp;#39;,
    instance_type=&amp;#39;ml.m5.xlarge&amp;#39;,
    image_scope=inference&amp;#39;
)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;モデルパッケージグループの作成&#34;&gt;モデルパッケージグループの作成&lt;/h2&gt;
&lt;p&gt;モデルパッケージグループの作成をします。この中にモデルを複数入れることでバージョン管理を行っていきます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>短期売買と分析力が向上しそうな株価予測をだらだらとやる part9</title>
      <link>https://xainome-blog.pages.dev/posts/2024/07/stock-price-prediction-part-9/</link>
      <pubDate>Wed, 24 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/07/stock-price-prediction-part-9/</guid>
      <description>&lt;h2 id=&#34;前回のあらすじ&#34;&gt;前回のあらすじ&lt;/h2&gt;
&lt;p&gt;確率的勾配降下法を使って予測をしてみました。&lt;/p&gt;
&lt;p&gt;うまくいかなかったので、別の方法を試すことにしました。&lt;/p&gt;
&lt;h2 id=&#34;lstm&#34;&gt;LSTM&lt;/h2&gt;
&lt;p&gt;時系列分析の代表モデルと言えばLSTMだと思います。&lt;/p&gt;
&lt;p&gt;というわけで前回とはプログラムを分けて実装しました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM, Input
import matplotlib.pyplot as plt

import glob
dm_fol = &amp;#39;./datamart/&amp;#39;
stock_list = glob.glob(dm_fol + &amp;#34;*.parquet&amp;#34;)

# データの読み込みと前処理
def preprocess_data(df, time_step=60):
    df[&amp;#39;Close&amp;#39;] = df[&amp;#39;Close&amp;#39;].astype(float)
    data = df[[&amp;#39;Close&amp;#39;]].values

    # データのスケーリング
    scaler = MinMaxScaler(feature_range=(0, 1))
    scaled_data = scaler.fit_transform(data)
    
    # LSTM用のデータセット作成
    X, Y = [], []
    for i in range(time_step, len(scaled_data)):
        X.append(scaled_data[i-time_step:i, 0])
        Y.append(scaled_data[i, 0])
    
    X, Y = np.array(X), np.array(Y)
    X = X.reshape(X.shape[0], X.shape[1], 1)
    
    return X, Y, scaler

# LSTMモデルの構築
def create_lstm_model(input_shape):
    model = Sequential()
    model.add(Input(shape=input_shape))  # Inputオブジェクトを使用して入力形状を指定
    model.add(LSTM(50, return_sequences=True))
    # model.add(LSTM(50, return_sequences=True, input_shape=input_shape))
    model.add(LSTM(50, return_sequences=False))
    model.add(Dense(25))
    model.add(Dense(1))
    model.compile(optimizer=&amp;#39;adam&amp;#39;, loss=&amp;#39;mean_squared_error&amp;#39;)
    return model

# モデルの評価とプロット
def evaluate_model(df, model, scaler, X_train, y_train, X_test, y_test, time_step, sticker_name):
    y_train_pred = model.predict(X_train)
    y_test_pred = model.predict(X_test)
    
    y_train_pred = scaler.inverse_transform(y_train_pred)
    y_test_pred = scaler.inverse_transform(y_test_pred)
    
    y_train = scaler.inverse_transform([y_train])
    y_test = scaler.inverse_transform([y_test])
    
    train_mse = np.mean((y_train_pred - y_train[0]) ** 2)
    test_mse = np.mean((y_test_pred - y_test[0]) ** 2)
    print(f&amp;#34;Train Mean Squared Error: {train_mse}&amp;#34;)
    print(f&amp;#34;Test Mean Squared Error: {test_mse}&amp;#34;)
    
    # プロット
    df.set_index(&amp;#39;Date&amp;#39;, inplace=True)
    train_dates = df.iloc[time_step:len(y_train[0])+time_step].index
    test_dates = df.iloc[len(y_train[0])+time_step-1:-1].index
    
    plt.figure(figsize=(14, 7))
    # plt.plot(train_dates, y_train[0], label=&amp;#39;Train Actual&amp;#39;, color=&amp;#39;black&amp;#39;)
    plt.plot(test_dates, y_test[0], label=&amp;#39;Test Actual&amp;#39;, color=&amp;#39;red&amp;#39;)
    plt.plot(test_dates, y_test_pred, label=&amp;#39;Test Predicted&amp;#39;, color=&amp;#39;blue&amp;#39;)
    plt.title(sticker_name+&amp;#39;: Actual vs Predicted Stock Prices&amp;#39;)
    plt.xlabel(&amp;#39;Date&amp;#39;)
    plt.ylabel(&amp;#39;Close&amp;#39;)
    plt.legend()
    plt.show()

# 次の日の予測
def predict_next_day(model, scaler, df, time_step=60):
    data = df[[&amp;#39;Close&amp;#39;]].values
    last_data = data[-time_step:]
    last_data_scaled = scaler.transform(last_data)
    X_input = last_data_scaled.reshape(1, time_step, 1)
    next_day_prediction = model.predict(X_input)
    next_day_prediction = scaler.inverse_transform(next_day_prediction)
    print(f&amp;#34;Next Day Prediction: {next_day_prediction[0][0]}&amp;#34;)

# データの読み込み
for count, stock_data in enumerate(stock_list):
  df = pd.read_parquet(stock_data)
  sticker_name = stock_data.split(&amp;#39;\\&amp;#39;)[1].replace(&amp;#39;.parquet&amp;#39;, &amp;#39;&amp;#39;)

  # データの前処理
  time_step = 60
  X, Y, scaler = preprocess_data(df, time_step)

  # データの分割
  train_size = int(len(X) * 0.8)
  X_train, X_test = X[:train_size], X[train_size:]
  y_train, y_test = Y[:train_size], Y[train_size:]

  # モデルの構築と訓練
  model = create_lstm_model((X_train.shape[1], 1))
  model.fit(X_train, y_train, batch_size=1, epochs=1)

  # モデルの評価
  evaluate_model(df, model, scaler, X_train, y_train, X_test, y_test, time_step, sticker_name)

  # 次の日の予測
  predict_next_day(model, scaler, df, time_step)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;コード確認&#34;&gt;コード確認&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    # LSTM用のデータセット作成
    X, Y = [], []
    for i in range(time_step, len(scaled_data)):
        X.append(scaled_data[i-time_step:i, 0])
        Y.append(scaled_data[i, 0])
    
    X, Y = np.array(X), np.array(Y)
    X = X.reshape(X.shape[0], X.shape[1], 1)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;LSTM用のデータセットは60日分のデータを学習として使い、次の日を出力として使用するという特徴があります。&lt;/p&gt;</description>
    </item>
    <item>
      <title>短期売買と分析力が向上しそうな株価予測をだらだらとやる part8</title>
      <link>https://xainome-blog.pages.dev/posts/2024/07/stock-price-prediction-part-8/</link>
      <pubDate>Mon, 15 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/07/stock-price-prediction-part-8/</guid>
      <description>&lt;h2 id=&#34;前回のあらすじ&#34;&gt;前回のあらすじ&lt;/h2&gt;
&lt;p&gt;株価予測を行うコードをいったん書いてみました。&lt;/p&gt;
&lt;p&gt;課題はまだ残ったままですが、今回はそこを解決しつつモデルを追加で学習するというやり方を試してみました。&lt;/p&gt;
&lt;h2 id=&#34;確率的勾配降下法&#34;&gt;確率的勾配降下法&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;def predict_next_day(model, scaler, df):
    last_row = df.drop(columns=[&amp;#39;Close&amp;#39;]).iloc[-1].values.reshape(1, -1)
    # last_row = df.iloc[-1, :-1].values.reshape(1, -1)
    df.drop(columns=[&amp;#39;Close&amp;#39;]).iloc[-1].to_csv(&amp;#34;test.csv&amp;#34;)
    last_row_scaled = scaler.transform(last_row)
    next_day_prediction = model.predict(last_row_scaled)
    print(f&amp;#34;Previous Day Prediction: {df.iloc[-1][&amp;#39;Close&amp;#39;]}&amp;#34;)
    print(f&amp;#34;Next Day Prediction: {next_day_prediction[0]}&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;前回の予測部分ですが予測するカラムが異なっていたので変な値が出ていました。&lt;/p&gt;
&lt;p&gt;修正したことによってだいぶまともな値に修正ができました。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;0800.HK&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/07/stock-price-prediction-part-8/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-07-15-203700-1024x556.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ただ、うまくいくときはきれいな形になっていますがそうでないことも多いです。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;AOS&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/07/stock-price-prediction-part-8/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-07-15-203305-1-1024x555.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ATNF&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/07/stock-price-prediction-part-8/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-07-15-203344-1-1024x541.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;EGHT&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/07/stock-price-prediction-part-8/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-07-15-203520-1-1024x538.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;波があるところはうまくできている方ですが、直線気味だとうまくいかないですね。&lt;/p&gt;
&lt;p&gt;毎回初期化しているのですが、ダメですね。使ってるモデルが確率的勾配降下法も要因としてあるかもしれないです。&lt;/p&gt;
&lt;p&gt;というわけで追加学習する形に変更しようと試してみました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;def update_model(model, scaler, new_df):
    target = new_df[&amp;#39;Close&amp;#39;].shift(-1).dropna()
    features = new_df.drop(columns=[&amp;#39;Close&amp;#39;])
    features = features[:-1]
    
    # データのスケーリング
    X = scaler.transform(features.values)
    y = target.values
    
    model.partial_fit(X, y)

    # 新しいデータに対する予測と評価
    # X_new = scaler.transform(new_df.drop(columns=[&amp;#39;Close&amp;#39;]).values)
    X_new = scaler.transform(new_df.drop(columns=[&amp;#39;Close&amp;#39;]).iloc[:-1].values)
    y_new = new_df[&amp;#39;Close&amp;#39;].shift(-1).dropna().values
    y_new_pred = model.predict(X_new)
    mse_new = mean_squared_error(y_new, y_new_pred)
    print(f&amp;#34;New Data MSE: {mse_new}&amp;#34;)

for count, stock_data in enumerate(stock_list):
  ・
　・
　・
  if count == 0:
    model, scaler, X_train, X_test, y_train, y_test = train_model(df)

    # モデルの評価
    y_pred = evaluate_model(model, X_test, y_test)

  else:

    update_model(model, scaler, df)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt=&#34;AOS2&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/07/stock-price-prediction-part-8/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-07-15-205739-1-1024x549.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>短期売買と分析力が向上しそうな株価予測をだらだらとやる part7</title>
      <link>https://xainome-blog.pages.dev/posts/2024/07/stock-price-prediction-part-7/</link>
      <pubDate>Sat, 06 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/07/stock-price-prediction-part-7/</guid>
      <description>&lt;h2 id=&#34;前回のあらすじ&#34;&gt;前回のあらすじ&lt;/h2&gt;
&lt;p&gt;オシレーター系指標の説明変数を追加するコードを書きました。&lt;/p&gt;
&lt;h2 id=&#34;株価予測_コード&#34;&gt;株価予測_コード&lt;/h2&gt;
&lt;p&gt;今回やることは株価の予測になります。&lt;/p&gt;
&lt;p&gt;今回は1ファイルずつ読み込んで実行しています。ティッカーリストがあればティッカーごとにダウンロードしてきて加工する方法もあったのでいずれやります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import pandas as pd
import numpy as np
import yfinance as yf
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

dm_fol = &amp;#39;./datamart/&amp;#39;

import glob
stock_list = glob.glob(dm_fol + &amp;#34;*.parquet&amp;#34;)

def preprocess_data(df):

    df.sort_values(&amp;#39;Date&amp;#39;, inplace=True)
    # 日付を特徴量に変換
    df[&amp;#39;Year&amp;#39;] = df[&amp;#39;Date&amp;#39;].dt.year
    df[&amp;#39;Month&amp;#39;] = df[&amp;#39;Date&amp;#39;].dt.month
    df[&amp;#39;Day&amp;#39;] = df[&amp;#39;Date&amp;#39;].dt.day
    df[&amp;#39;Weekday&amp;#39;] = df[&amp;#39;Date&amp;#39;].dt.weekday
    df[&amp;#39;Quarter&amp;#39;] = df[&amp;#39;Date&amp;#39;].dt.quarter

    # 周期成分のエンコーディング
    df[&amp;#39;Month_sin&amp;#39;] = np.sin(2 * np.pi * df[&amp;#39;Month&amp;#39;] / 12)
    df[&amp;#39;Month_cos&amp;#39;] = np.cos(2 * np.pi * df[&amp;#39;Month&amp;#39;] / 12)
    df[&amp;#39;Day_sin&amp;#39;] = np.sin(2 * np.pi * df[&amp;#39;Day&amp;#39;] / 31)
    df[&amp;#39;Day_cos&amp;#39;] = np.cos(2 * np.pi * df[&amp;#39;Day&amp;#39;] / 31)
    df[&amp;#39;Weekday_sin&amp;#39;] = np.sin(2 * np.pi * df[&amp;#39;Weekday&amp;#39;] / 7)
    df[&amp;#39;Weekday_cos&amp;#39;] = np.cos(2 * np.pi * df[&amp;#39;Weekday&amp;#39;] / 7)

    # 日付を削除
    df.drop(columns=[&amp;#39;symbol&amp;#39;,&amp;#39;Date&amp;#39;], inplace=True)
    # &amp;#34;symbol&amp;#34;以外のobject型カラムをワンホットエンコーディング
    df = pd.get_dummies(df, columns=[col for col in df.select_dtypes(include=[&amp;#39;object&amp;#39;]).columns])

    # 全ての値が欠損している列を削除
    df.dropna(axis=1, how=&amp;#39;all&amp;#39;, inplace=True)

    # 値が欠損している行を削除
    df.dropna(axis=0, how=&amp;#39;any&amp;#39;, inplace=True)
    return df

def train_model(df):
    target = df[&amp;#39;Close&amp;#39;].shift(-1).dropna()
    features = df.drop(columns=[&amp;#39;Close&amp;#39;])
    features = features[:-1]

    # データのスケーリング
    scaler = StandardScaler()
    X = scaler.fit_transform(features.values)
    y = target.values
    
    # データを7:3に分割
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, shuffle=False)
    
    model = SGDRegressor(max_iter=1000, tol=1e-3)
    model.fit(X_train, y_train)
    
    return model, scaler, X_test, y_test

def evaluate_model(model, scaler, X_test, y_test):
    y_pred = model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    print(f&amp;#34;Mean Squared Error: {mse}&amp;#34;)
    plt.figure(figsize=(14, 7))
    plt.plot(y_test, label=&amp;#39;Actual&amp;#39;, color=&amp;#39;black&amp;#39;)
    plt.plot(y_pred, label=&amp;#39;Predicted&amp;#39;, color=&amp;#39;blue&amp;#39;)
    plt.title(&amp;#39;Actual vs Predicted Stock Prices&amp;#39;)
    plt.xlabel(&amp;#39;Sample&amp;#39;)
    plt.ylabel(&amp;#39;Price&amp;#39;)
    plt.legend()
    plt.show()

def predict_next_day(model, scaler, df):
    last_row = df.iloc[-1, :-1].values.reshape(1, -1)
    df.iloc[-1, :-1].to_csv(&amp;#34;test.csv&amp;#34;)
    last_row_scaled = scaler.transform(last_row)
    next_day_prediction = model.predict(last_row_scaled)
    print(f&amp;#34;Next Day Prediction: {next_day_prediction[0]}&amp;#34;)

# 初回データロードとモデル学習
# start_date = &amp;#39;1990-04-01&amp;#39;
# end_date = &amp;#39;2024-07-03&amp;#39;
# symbols = [&amp;#39;AAPL&amp;#39;, &amp;#39;MSFT&amp;#39;, &amp;#39;GOOGL&amp;#39;]
for stock_data in stock_list:
  df = pd.read_parquet(stock_data)
  df = preprocess_data(df)
  model, scaler, X_test, y_test = train_model(df)

  # モデルの評価
  evaluate_model(model, scaler, X_test, y_test)

  # 次の日の予測
  predict_next_day(model, scaler, df)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;コードの内容&#34;&gt;コードの内容&lt;/h2&gt;
&lt;p&gt;やったこととしては日付を特徴量に変換しました。&lt;/p&gt;</description>
    </item>
    <item>
      <title>短期売買と分析力が向上しそうな株価予測をだらだらとやる part6</title>
      <link>https://xainome-blog.pages.dev/posts/2024/07/stock-price-prediction-part-6/</link>
      <pubDate>Tue, 02 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/07/stock-price-prediction-part-6/</guid>
      <description>&lt;h2 id=&#34;前回のあらすじ&#34;&gt;前回のあらすじ&lt;/h2&gt;
&lt;p&gt;トレンド系指標の説明変数を追加したところで終わりました。&lt;/p&gt;
&lt;h2 id=&#34;オシレーター系指標&#34;&gt;オシレーター系指標&lt;/h2&gt;
&lt;p&gt;今回作成したのは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RSI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RCI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;移動平均線乖離率&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;スローストキャスティクス&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;モメンタムとROC&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MFI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CCI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ギャップ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ヒストリカル・ボラティリティ&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;def rsi(df):
  # RSIの計算
  window = 14

  # 終値の変化
  df[&amp;#39;Change&amp;#39;] = df[&amp;#39;Adj Close&amp;#39;].diff()

  # 上昇幅と下落幅の計算
  df[&amp;#39;Gain&amp;#39;] = np.where(df[&amp;#39;Change&amp;#39;] &amp;gt; 0, df[&amp;#39;Change&amp;#39;], 0)
  df[&amp;#39;Loss&amp;#39;] = np.where(df[&amp;#39;Change&amp;#39;] &amp;lt; 0, -df[&amp;#39;Change&amp;#39;], 0)

  # 平均上昇幅と平均下落幅の計算
  df[&amp;#39;Avg_Gain&amp;#39;] = df[&amp;#39;Gain&amp;#39;].rolling(window=window).mean()
  df[&amp;#39;Avg_Loss&amp;#39;] = df[&amp;#39;Loss&amp;#39;].rolling(window=window).mean()

  # 相対力（RS）の計算
  df[&amp;#39;RS&amp;#39;] = df[&amp;#39;Avg_Gain&amp;#39;] / df[&amp;#39;Avg_Loss&amp;#39;]

  # RSIの計算
  df[&amp;#39;RSI&amp;#39;] = 100 - (100 / (1 + df[&amp;#39;RS&amp;#39;]))

  # シグナルの判定
  df[&amp;#39;rsi_Signal&amp;#39;] = np.where(df[&amp;#39;RSI&amp;#39;] &amp;gt; 70, &amp;#39;Sell&amp;#39;, np.where(df[&amp;#39;RSI&amp;#39;] &amp;lt; 30, &amp;#39;Buy&amp;#39;, np.nan))

def calculate_rci(series):
    n = len(series)
    date_rank = np.arange(1, n + 1)
    price_rank = series.rank().values
    ssd = np.sum((date_rank - price_rank) ** 2)
    rci = 1 - (6 * ssd) / (n * (n ** 2 - 1))
    return rci

def rci(df):
  # RCIの計算
  window = 14

  df[&amp;#39;RCI&amp;#39;] = df[&amp;#39;Adj Close&amp;#39;].rolling(window=window).apply(calculate_rci, raw=False)

  # シグナルの判定（RSIと同様に70以上で売りシグナル、30以下で買いシグナル）
  df[&amp;#39;rci_Signal&amp;#39;] = np.where(df[&amp;#39;RCI&amp;#39;] &amp;gt; 70, &amp;#39;Sell&amp;#39;, np.where(df[&amp;#39;RCI&amp;#39;] &amp;lt; 30, &amp;#39;Buy&amp;#39;, np.nan))

def madp(df):
  # 乖離率の計算
  df[&amp;#39;madp&amp;#39;] = (df[&amp;#39;Adj Close&amp;#39;] - df[&amp;#39;SMA&amp;#39;]) / df[&amp;#39;SMA&amp;#39;] * 100

  # シグナルの判定
  df[&amp;#39;madp_Signal&amp;#39;] = np.nan
  threshold = 5  # 閾値の設定

  for i in range(1, len(df)):
      if df[&amp;#39;madp&amp;#39;].iloc[i-1] &amp;lt; -threshold and df[&amp;#39;madp&amp;#39;].iloc[i] &amp;gt; df[&amp;#39;madp&amp;#39;].iloc[i-1]:
          df.at[df.index[i], &amp;#39;madp_Signal&amp;#39;] = &amp;#39;Buy&amp;#39;
      elif df[&amp;#39;madp&amp;#39;].iloc[i-1] &amp;gt; threshold and df[&amp;#39;madp&amp;#39;].iloc[i] &amp;lt; df[&amp;#39;madp&amp;#39;].iloc[i-1]:
          df.at[df.index[i], &amp;#39;madp_Signal&amp;#39;] = &amp;#39;Sell&amp;#39;

def stochastic(df):
  # %Kの計算
  window = 14
  df[&amp;#39;14-High&amp;#39;] = df[&amp;#39;High&amp;#39;].rolling(window=window).max()
  df[&amp;#39;14-Low&amp;#39;] = df[&amp;#39;Low&amp;#39;].rolling(window=window).min()
  df[&amp;#39;%K&amp;#39;] = (df[&amp;#39;Adj Close&amp;#39;] - df[&amp;#39;14-Low&amp;#39;]) / (df[&amp;#39;14-High&amp;#39;] - df[&amp;#39;14-Low&amp;#39;]) * 100

  # スロー%Dの計算
  df[&amp;#39;slow%D&amp;#39;] = df[&amp;#39;%K&amp;#39;].rolling(window=3).mean()

  # シグナルの判定
  df[&amp;#39;sto_Signal&amp;#39;] = np.nan
  for i in range(1, len(df)):
      if df[&amp;#39;slow%D&amp;#39;].iloc[i-1] &amp;lt; 20 and df[&amp;#39;slow%D&amp;#39;].iloc[i] &amp;gt; df[&amp;#39;slow%D&amp;#39;].iloc[i-1]:
          df.at[df.index[i], &amp;#39;sto_Signal&amp;#39;] = &amp;#39;Buy&amp;#39;
      elif df[&amp;#39;slow%D&amp;#39;].iloc[i-1] &amp;gt; 80 and df[&amp;#39;slow%D&amp;#39;].iloc[i] &amp;lt; df[&amp;#39;slow%D&amp;#39;].iloc[i-1]:
          df.at[df.index[i], &amp;#39;sto_Signal&amp;#39;] = &amp;#39;Sell&amp;#39;

def momentum_roc(df):
  # モメンタムとROCの計算
  window = 14
  df[&amp;#39;Momentum&amp;#39;] = df[&amp;#39;Adj Close&amp;#39;] - df[&amp;#39;Adj Close&amp;#39;].shift(window)
  df[&amp;#39;ROC&amp;#39;] = ((df[&amp;#39;Adj Close&amp;#39;] - df[&amp;#39;Adj Close&amp;#39;].shift(window)) / df[&amp;#39;Adj Close&amp;#39;].shift(window)) * 100

  # トレンドの判定
  df[&amp;#39;Momentum_Trend&amp;#39;] = np.where(df[&amp;#39;Momentum&amp;#39;] &amp;gt; 0, &amp;#39;Uptrend&amp;#39;, np.where(df[&amp;#39;Momentum&amp;#39;] &amp;lt; 0, &amp;#39;Downtrend&amp;#39;, &amp;#39;Neutral&amp;#39;))
  df[&amp;#39;ROC_Trend&amp;#39;] = np.where(df[&amp;#39;ROC&amp;#39;] &amp;gt; 0, &amp;#39;Uptrend&amp;#39;, np.where(df[&amp;#39;ROC&amp;#39;] &amp;lt; 0, &amp;#39;Downtrend&amp;#39;, &amp;#39;Neutral&amp;#39;))

def mfi(df):
  # 典型価格（TP）の計算
  df[&amp;#39;TP&amp;#39;] = (df[&amp;#39;High&amp;#39;] + df[&amp;#39;Low&amp;#39;] + df[&amp;#39;Adj Close&amp;#39;]) / 3

  # マネーフロー（Raw Money Flow）の計算
  df[&amp;#39;Raw Money Flow&amp;#39;] = df[&amp;#39;TP&amp;#39;] * df[&amp;#39;Volume&amp;#39;]

  # ポジティブマネーフローとネガティブマネーフローの計算
  df[&amp;#39;Positive Money Flow&amp;#39;] = np.where(df[&amp;#39;TP&amp;#39;] &amp;gt; df[&amp;#39;TP&amp;#39;].shift(1), df[&amp;#39;Raw Money Flow&amp;#39;], 0)
  df[&amp;#39;Negative Money Flow&amp;#39;] = np.where(df[&amp;#39;TP&amp;#39;] &amp;lt; df[&amp;#39;TP&amp;#39;].shift(1), df[&amp;#39;Raw Money Flow&amp;#39;], 0)

  # 14期間の合計
  window = 14
  df[&amp;#39;Positive Money Flow Sum&amp;#39;] = df[&amp;#39;Positive Money Flow&amp;#39;].rolling(window=window).sum()
  df[&amp;#39;Negative Money Flow Sum&amp;#39;] = df[&amp;#39;Negative Money Flow&amp;#39;].rolling(window=window).sum()

  # MFIの計算
  df[&amp;#39;Money Flow Ratio&amp;#39;] = df[&amp;#39;Positive Money Flow Sum&amp;#39;] / df[&amp;#39;Negative Money Flow Sum&amp;#39;]
  df[&amp;#39;MFI&amp;#39;] = 100 - (100 / (1 + df[&amp;#39;Money Flow Ratio&amp;#39;]))

  # シグナルの判定
  df[&amp;#39;mfi_Signal&amp;#39;] = np.nan
  for i in range(1, len(df)):
      if df[&amp;#39;MFI&amp;#39;].iloc[i-1] &amp;lt; 20 and df[&amp;#39;MFI&amp;#39;].iloc[i] &amp;gt; df[&amp;#39;MFI&amp;#39;].iloc[i-1]:
          df.at[df.index[i], &amp;#39;mfi_Signal&amp;#39;] = &amp;#39;Buy&amp;#39;
      elif df[&amp;#39;MFI&amp;#39;].iloc[i-1] &amp;gt; 80 and df[&amp;#39;MFI&amp;#39;].iloc[i] &amp;lt; df[&amp;#39;MFI&amp;#39;].iloc[i-1]:
          df.at[df.index[i], &amp;#39;mfi_Signal&amp;#39;] = &amp;#39;Sell&amp;#39;

def cci(df):
  # 典型価格（TP）の計算
  df[&amp;#39;TP&amp;#39;] = (df[&amp;#39;High&amp;#39;] + df[&amp;#39;Low&amp;#39;] + df[&amp;#39;Adj Close&amp;#39;]) / 3

  # 単純移動平均（SMA）の計算
  window = 20
  df[&amp;#39;cci_SMA&amp;#39;] = df[&amp;#39;TP&amp;#39;].rolling(window=window).mean()

  # 偏差（Mean Deviation）の計算
  df[&amp;#39;Mean Deviation&amp;#39;] = df[&amp;#39;TP&amp;#39;].rolling(window=window).apply(lambda x: np.mean(np.abs(x - x.mean())), raw=True)

  # CCIの計算
  df[&amp;#39;CCI&amp;#39;] = (df[&amp;#39;TP&amp;#39;] - df[&amp;#39;cci_SMA&amp;#39;]) / (0.015 * df[&amp;#39;Mean Deviation&amp;#39;])

  # シグナルの判定
  df[&amp;#39;cci_Signal&amp;#39;] = np.nan
  for i in range(1, len(df)):
      if df[&amp;#39;CCI&amp;#39;].iloc[i-1] &amp;lt; -100 and df[&amp;#39;CCI&amp;#39;].iloc[i] &amp;gt; df[&amp;#39;CCI&amp;#39;].iloc[i-1]:
          df.at[df.index[i], &amp;#39;cci_Signal&amp;#39;] = &amp;#39;Buy&amp;#39;
      elif df[&amp;#39;CCI&amp;#39;].iloc[i-1] &amp;gt; 100 and df[&amp;#39;CCI&amp;#39;].iloc[i] &amp;lt; df[&amp;#39;CCI&amp;#39;].iloc[i-1]:
          df.at[df.index[i], &amp;#39;cci_Signal&amp;#39;] = &amp;#39;Sell&amp;#39;

def gap(df):
# ギャップアップとギャップダウンの計算
  df[&amp;#39;Previous Close&amp;#39;] = df[&amp;#39;Adj Close&amp;#39;].shift(1)
  df[&amp;#39;Gap&amp;#39;] = df[&amp;#39;Open&amp;#39;] - df[&amp;#39;Previous Close&amp;#39;]
  df[&amp;#39;Gap Type&amp;#39;] = np.where(df[&amp;#39;Gap&amp;#39;] &amp;gt; 0, &amp;#39;Gap Up&amp;#39;, np.where(df[&amp;#39;Gap&amp;#39;] &amp;lt; 0, &amp;#39;Gap Down&amp;#39;, &amp;#39;No Gap&amp;#39;))

def hv(df):
  # ヒストリカル・ボラティリティの計算
  window = 20

  # リターンの計算
  df[&amp;#39;Return&amp;#39;] = np.log(df[&amp;#39;Adj Close&amp;#39;] / df[&amp;#39;Adj Close&amp;#39;].shift(1))

  # 標準偏差の計算
  df[&amp;#39;HV&amp;#39;] = df[&amp;#39;Return&amp;#39;].rolling(window=window).std() * np.sqrt(252)

  # df[&amp;#39;RCI&amp;#39;] = df[&amp;#39;Adj Close&amp;#39;].rolling(window=window).apply(calculate_rci, raw=False)

  # シグナルの判定
  df[&amp;#39;hv_Signal&amp;#39;] = np.nan
  for i in range(1, len(df)):
      if df[&amp;#39;RCI&amp;#39;].iloc[i-1] &amp;lt; -80 and df[&amp;#39;RCI&amp;#39;].iloc[i] &amp;gt; df[&amp;#39;RCI&amp;#39;].iloc[i-1]:
          df.at[df.index[i], &amp;#39;hv_Signal&amp;#39;] = &amp;#39;Buy&amp;#39;
      elif df[&amp;#39;RCI&amp;#39;].iloc[i-1] &amp;gt; 80 and df[&amp;#39;RCI&amp;#39;].iloc[i] &amp;lt; df[&amp;#39;RCI&amp;#39;].iloc[i-1]:
          df.at[df.index[i], &amp;#39;hv_Signal&amp;#39;] = &amp;#39;Sell&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;次回は予測をしていこうと思います。&lt;/p&gt;</description>
    </item>
    <item>
      <title>短期売買と分析力が向上しそうな株価予測をだらだらとやる part5</title>
      <link>https://xainome-blog.pages.dev/posts/2024/06/stock-price-prediction-part-5/</link>
      <pubDate>Tue, 25 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/06/stock-price-prediction-part-5/</guid>
      <description>&lt;h2 id=&#34;前回のあらすじ&#34;&gt;前回のあらすじ&lt;/h2&gt;
&lt;p&gt;オシレータ系指標とその他の指標について確認しました。&lt;/p&gt;
&lt;p&gt;今回は実際にコードに落とし込んで、グラフで見てみようと思います。&lt;/p&gt;
&lt;h2 id=&#34;作成したコード&#34;&gt;作成したコード&lt;/h2&gt;
&lt;p&gt;今回はとりあえずトレンド系指標の説明変数を見てみたいと思います。クラスかはまだやってないので、いずれやっておきます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os

out_fol = &amp;#34;./stock_data/&amp;#34;
import glob
stock_list = glob.glob(out_fol + &amp;#34;*.csv&amp;#34;)

def moveing_average(df):
  # 単純移動平均線（SMA）の計算
  df[&amp;#39;SMA&amp;#39;] = df[&amp;#39;Adj Close&amp;#39;].rolling(window=20).mean()
  # 指数平滑移動平均線（EMA）の計算
  df[&amp;#39;EMA&amp;#39;] = df[&amp;#39;Adj Close&amp;#39;].ewm(span=20, adjust=False).mean()
  # グラフのプロット
  plt.figure(figsize=(14, 7))
  plt.plot(df[&amp;#39;Adj Close&amp;#39;], label=&amp;#39;Close Price&amp;#39;, color=&amp;#39;black&amp;#39;)
  plt.plot(df[&amp;#39;SMA&amp;#39;], label=&amp;#39;20-Day SMA&amp;#39;, color=&amp;#39;blue&amp;#39;)
  plt.plot(df[&amp;#39;EMA&amp;#39;], label=&amp;#39;20-Day EMA&amp;#39;, color=&amp;#39;red&amp;#39;)

  plt.title(&amp;#39;Stock Price with 20-Day SMA and 20-Day EMA&amp;#39;)
  plt.xlabel(&amp;#39;Date&amp;#39;)
  plt.ylabel(&amp;#39;Price&amp;#39;)
  plt.legend()
  plt.grid(True)
  plt.show()

def macd(df):
  # 短期EMA（12日）の計算
  short_ema = df[&amp;#39;Adj Close&amp;#39;].ewm(span=12, adjust=False).mean()

  # 長期EMA（26日）の計算
  long_ema = df[&amp;#39;Adj Close&amp;#39;].ewm(span=26, adjust=False).mean()

  # MACDラインの計算
  df[&amp;#39;MACD&amp;#39;] = short_ema - long_ema

  # シグナルラインの計算（9日間のMACDのEMA）
  df[&amp;#39;Signal_Line&amp;#39;] = df[&amp;#39;MACD&amp;#39;].ewm(span=9, adjust=False).mean()

  # MACDヒストグラムの計算
  df[&amp;#39;MACD_Histogram&amp;#39;] = df[&amp;#39;MACD&amp;#39;] - df[&amp;#39;Signal_Line&amp;#39;]
  # グラフのプロット
  plt.figure(figsize=(14, 7))
  # 終値のプロット
  plt.subplot(2, 1, 1)
  plt.plot(df[&amp;#39;Close&amp;#39;], label=&amp;#39;Close Price&amp;#39;, color=&amp;#39;black&amp;#39;)
  plt.title(&amp;#39;Stock Price and MACD&amp;#39;)
  plt.xlabel(&amp;#39;Date&amp;#39;)
  plt.ylabel(&amp;#39;Price&amp;#39;)
  plt.legend()

  # MACDとシグナルラインのプロット
  plt.subplot(2, 1, 2)
  plt.plot(df[&amp;#39;MACD&amp;#39;], label=&amp;#39;MACD&amp;#39;, color=&amp;#39;blue&amp;#39;)
  plt.plot(df[&amp;#39;Signal_Line&amp;#39;], label=&amp;#39;Signal Line&amp;#39;, color=&amp;#39;red&amp;#39;)
  plt.bar(df.index, df[&amp;#39;MACD_Histogram&amp;#39;], label=&amp;#39;MACD Histogram&amp;#39;, color=&amp;#39;gray&amp;#39;)
  plt.xlabel(&amp;#39;Date&amp;#39;)
  plt.ylabel(&amp;#39;Value&amp;#39;)
  plt.legend()

  plt.tight_layout()
  plt.show()

def bollinger_bands(df):
  # 中央バンド（20日間の単純移動平均線）の計算
  df[&amp;#39;Middle_Band&amp;#39;] = df[&amp;#39;Adj Close&amp;#39;].rolling(window=20).mean()

  # 標準偏差の計算
  df[&amp;#39;STD&amp;#39;] = df[&amp;#39;Adj Close&amp;#39;].rolling(window=20).std()

  # 上部バンドの計算
  df[&amp;#39;Upper_Band&amp;#39;] = df[&amp;#39;Middle_Band&amp;#39;] + (2 * df[&amp;#39;STD&amp;#39;])

  # 下部バンドの計算
  df[&amp;#39;Lower_Band&amp;#39;] = df[&amp;#39;Middle_Band&amp;#39;] - (2 * df[&amp;#39;STD&amp;#39;])

  # 過熱感の判断
  df[&amp;#39;bands_buy_flg&amp;#39;] = df[&amp;#39;Adj Close&amp;#39;] &amp;gt; df[&amp;#39;Lower_Band&amp;#39;]
  df[&amp;#39;bands_sell_flg&amp;#39;] = df[&amp;#39;Adj Close&amp;#39;] &amp;lt; df[&amp;#39;Upper_Band&amp;#39;]
  # グラフのプロット
  plt.figure(figsize=(14, 7))
  plt.plot(df[&amp;#39;Adj Close&amp;#39;], label=&amp;#39;Close Price&amp;#39;, color=&amp;#39;black&amp;#39;)
  plt.plot(df[&amp;#39;Middle_Band&amp;#39;], label=&amp;#39;Middle Band (SMA 20)&amp;#39;, color=&amp;#39;blue&amp;#39;)
  plt.plot(df[&amp;#39;Upper_Band&amp;#39;], label=&amp;#39;Upper Band (Middle + 2*STD)&amp;#39;, color=&amp;#39;red&amp;#39;)
  plt.plot(df[&amp;#39;Lower_Band&amp;#39;], label=&amp;#39;Lower Band (Middle - 2*STD)&amp;#39;, color=&amp;#39;green&amp;#39;)

  plt.fill_between(df.index, df[&amp;#39;Upper_Band&amp;#39;], df[&amp;#39;Lower_Band&amp;#39;], color=&amp;#39;grey&amp;#39;, alpha=0.1)
  plt.scatter(df.index[df[&amp;#39;bands_buy_flg&amp;#39;]], df[&amp;#39;Adj Close&amp;#39;][df[&amp;#39;bands_buy_flg&amp;#39;]], label=&amp;#39;bands_buy_flg&amp;#39;, color=&amp;#39;red&amp;#39;, marker=&amp;#39;o&amp;#39;)
  plt.scatter(df.index[df[&amp;#39;bands_sell_flg&amp;#39;]], df[&amp;#39;Adj Close&amp;#39;][df[&amp;#39;bands_sell_flg&amp;#39;]], label=&amp;#39;bands_sell_flg&amp;#39;, color=&amp;#39;green&amp;#39;, marker=&amp;#39;o&amp;#39;)

  plt.title(&amp;#39;Bollinger Bands with bands_buy_flg and bands_sell_flg Signals&amp;#39;)
  plt.xlabel(&amp;#39;Date&amp;#39;)
  plt.ylabel(&amp;#39;Price&amp;#39;)
  plt.legend()
  plt.grid(True)
  plt.show()

def ichimoku_kinko_hyo(df):
  # 転換線（過去9日間の最高値と最安値の平均値）
  df[&amp;#39;Tenkan_sen&amp;#39;] = (df[&amp;#39;High&amp;#39;].rolling(window=9).max() + df[&amp;#39;Low&amp;#39;].rolling(window=9).min()) / 2

  # 基準線（過去26日間の最高値と最安値の平均値）
  df[&amp;#39;Kijun_sen&amp;#39;] = (df[&amp;#39;High&amp;#39;].rolling(window=26).max() + df[&amp;#39;Low&amp;#39;].rolling(window=26).min()) / 2

  # 先行スパン1（転換線と基準線の平均値を26日先にプロット）
  df[&amp;#39;Senkou_Span_A&amp;#39;] = ((df[&amp;#39;Tenkan_sen&amp;#39;] + df[&amp;#39;Kijun_sen&amp;#39;]) / 2).shift(26)

  # 先行スパン2（過去52日間の最高値と最安値の平均値を26日先にプロット）
  df[&amp;#39;Senkou_Span_B&amp;#39;] = ((df[&amp;#39;High&amp;#39;].rolling(window=52).max() + df[&amp;#39;Low&amp;#39;].rolling(window=52).min()) / 2).shift(26)

  # 遅行スパン（現在の終値を26日遅らせてプロット）
  df[&amp;#39;Chikou_Span&amp;#39;] = df[&amp;#39;Adj Close&amp;#39;].shift(-26)

  # 雲の上・下の判定とシグナル
  df[&amp;#39;Signal&amp;#39;] = np.where(df[&amp;#39;Tenkan_sen&amp;#39;] &amp;gt; df[&amp;#39;Kijun_sen&amp;#39;], &amp;#39;Buy&amp;#39;, &amp;#39;Sell&amp;#39;)
  df[&amp;#39;Trend&amp;#39;] = np.where(df[&amp;#39;Adj Close&amp;#39;] &amp;gt; df[[&amp;#39;Senkou_Span_A&amp;#39;, &amp;#39;Senkou_Span_B&amp;#39;]].max(axis=1), &amp;#39;Uptrend&amp;#39;,
                        np.where(df[&amp;#39;Adj Close&amp;#39;] &amp;lt; df[[&amp;#39;Senkou_Span_A&amp;#39;, &amp;#39;Senkou_Span_B&amp;#39;]].min(axis=1), &amp;#39;Downtrend&amp;#39;, &amp;#39;Neutral&amp;#39;))
  # グラフのプロット
  plt.figure(figsize=(14, 7))
  plt.plot(df[&amp;#39;Adj Close&amp;#39;], label=&amp;#39;Close Price&amp;#39;, color=&amp;#39;black&amp;#39;)
  plt.plot(df[&amp;#39;Tenkan_sen&amp;#39;], label=&amp;#39;Tenkan-sen (Conversion Line)&amp;#39;, color=&amp;#39;blue&amp;#39;)
  plt.plot(df[&amp;#39;Kijun_sen&amp;#39;], label=&amp;#39;Kijun-sen (Base Line)&amp;#39;, color=&amp;#39;red&amp;#39;)
  plt.plot(df[&amp;#39;Senkou_Span_A&amp;#39;], label=&amp;#39;Senkou Span A (Leading Span 1)&amp;#39;, color=&amp;#39;green&amp;#39;)
  plt.plot(df[&amp;#39;Senkou_Span_B&amp;#39;], label=&amp;#39;Senkou Span B (Leading Span 2)&amp;#39;, color=&amp;#39;orange&amp;#39;)
  plt.plot(df[&amp;#39;Chikou_Span&amp;#39;], label=&amp;#39;Chikou Span (Lagging Span)&amp;#39;, color=&amp;#39;purple&amp;#39;)

  # 先行スパンの領域を塗りつぶす
  plt.fill_between(df.index, df[&amp;#39;Senkou_Span_A&amp;#39;], df[&amp;#39;Senkou_Span_B&amp;#39;], where=df[&amp;#39;Senkou_Span_A&amp;#39;] &amp;gt;= df[&amp;#39;Senkou_Span_B&amp;#39;], color=&amp;#39;lightgreen&amp;#39;, alpha=0.5)
  plt.fill_between(df.index, df[&amp;#39;Senkou_Span_A&amp;#39;], df[&amp;#39;Senkou_Span_B&amp;#39;], where=df[&amp;#39;Senkou_Span_A&amp;#39;] &amp;lt; df[&amp;#39;Senkou_Span_B&amp;#39;], color=&amp;#39;lightcoral&amp;#39;, alpha=0.5)

  plt.title(&amp;#39;Ichimoku Kinko Hyo (Ichimoku Cloud)&amp;#39;)
  plt.xlabel(&amp;#39;Date&amp;#39;)
  plt.ylabel(&amp;#39;Price&amp;#39;)
  plt.legend()
  plt.grid(True)
  plt.show()

  # シグナルとトレンドの表示
  print(df[[&amp;#39;Adj Close&amp;#39;, &amp;#39;Tenkan_sen&amp;#39;, &amp;#39;Kijun_sen&amp;#39;, &amp;#39;Signal&amp;#39;, &amp;#39;Trend&amp;#39;]].tail(30))

def directional_movement_index(df):
  # True Range（TR）の計算
  df[&amp;#39;TR&amp;#39;] = df[[&amp;#39;High&amp;#39;, &amp;#39;Low&amp;#39;, &amp;#39;Adj Close&amp;#39;]].apply(lambda x: max(x[&amp;#39;High&amp;#39;] - x[&amp;#39;Low&amp;#39;], abs(x[&amp;#39;High&amp;#39;] - x[&amp;#39;Adj Close&amp;#39;]), abs(x[&amp;#39;Low&amp;#39;] - x[&amp;#39;Adj Close&amp;#39;])), axis=1)

  # +DMと-DMの計算
  df[&amp;#39;+DM&amp;#39;] = df[&amp;#39;High&amp;#39;].diff().apply(lambda x: x if x &amp;gt; 0 else 0)
  df[&amp;#39;-DM&amp;#39;] = df[&amp;#39;Low&amp;#39;].diff().apply(lambda x: -x if x &amp;lt; 0 else 0)

  # 14期間のTR、+DM、-DMの合計
  df[&amp;#39;TR14&amp;#39;] = df[&amp;#39;TR&amp;#39;].rolling(window=14).sum()
  df[&amp;#39;+DM14&amp;#39;] = df[&amp;#39;+DM&amp;#39;].rolling(window=14).sum()
  df[&amp;#39;-DM14&amp;#39;] = df[&amp;#39;-DM&amp;#39;].rolling(window=14).sum()

  # +DIと-DIの計算
  df[&amp;#39;+DI14&amp;#39;] = 100 * (df[&amp;#39;+DM14&amp;#39;] / df[&amp;#39;TR14&amp;#39;])
  df[&amp;#39;-DI14&amp;#39;] = 100 * (df[&amp;#39;-DM14&amp;#39;] / df[&amp;#39;TR14&amp;#39;])

  # DXの計算
  df[&amp;#39;DX&amp;#39;] = 100 * (abs(df[&amp;#39;+DI14&amp;#39;] - df[&amp;#39;-DI14&amp;#39;]) / (df[&amp;#39;+DI14&amp;#39;] + df[&amp;#39;-DI14&amp;#39;]))

  # ADXの計算
  df[&amp;#39;ADX&amp;#39;] = df[&amp;#39;DX&amp;#39;].rolling(window=14).mean()

  # シグナルとトレンド強度の判定
  df[&amp;#39;Signal&amp;#39;] = np.where(df[&amp;#39;+DI14&amp;#39;] &amp;gt; df[&amp;#39;-DI14&amp;#39;], &amp;#39;Buy&amp;#39;, &amp;#39;Sell&amp;#39;)
  df[&amp;#39;Trend_Strength&amp;#39;] = np.where(df[&amp;#39;ADX&amp;#39;] &amp;gt;= 25, &amp;#39;Strong&amp;#39;, &amp;#39;Weak&amp;#39;)

  # ADXのトレンド（前日と比べて上昇または下降を判定）
  df[&amp;#39;ADX_Trend&amp;#39;] = df[&amp;#39;ADX&amp;#39;].diff().apply(lambda x: &amp;#39;Uptrend&amp;#39; if x &amp;gt; 0 else &amp;#39;Downtrend&amp;#39; if x &amp;lt; 0 else &amp;#39;No Change&amp;#39;)
  # グラフのプロット
  plt.figure(figsize=(14, 7))

  plt.plot(df[&amp;#39;+DI14&amp;#39;], label=&amp;#39;+DI (Positive Directional Indicator)&amp;#39;, color=&amp;#39;green&amp;#39;)
  plt.plot(df[&amp;#39;-DI14&amp;#39;], label=&amp;#39;-DI (Negative Directional Indicator)&amp;#39;, color=&amp;#39;red&amp;#39;)
  plt.plot(df[&amp;#39;ADX&amp;#39;], label=&amp;#39;ADX (Average Directional Index)&amp;#39;, color=&amp;#39;blue&amp;#39;)

  plt.title(&amp;#39;DMI (Directional Movement Index)&amp;#39;)
  plt.xlabel(&amp;#39;Date&amp;#39;)
  plt.ylabel(&amp;#39;Value&amp;#39;)
  plt.legend()
  plt.grid(True)
  plt.show()

  # 結果の表示
  print(df[[&amp;#39;+DI14&amp;#39;, &amp;#39;-DI14&amp;#39;, &amp;#39;ADX&amp;#39;, &amp;#39;Signal&amp;#39;, &amp;#39;Trend_Strength&amp;#39;]].tail(30))

def parabolic(df):
  # パラボリックSARの計算
  df[&amp;#39;SAR&amp;#39;] = np.nan
  df[&amp;#39;EP&amp;#39;] = np.nan
  df[&amp;#39;AF&amp;#39;] = np.nan

  # 初期値設定
  initial_trend = &amp;#39;up&amp;#39; if df[&amp;#39;Adj Close&amp;#39;].iloc[1] &amp;gt; df[&amp;#39;Adj Close&amp;#39;].iloc[0] else &amp;#39;down&amp;#39;
  initial_AF = 0.02
  max_AF = 0.2

  # 初期SAR、EP、AFの設定
  df.at[df.index[1], &amp;#39;SAR&amp;#39;] = df[&amp;#39;Low&amp;#39;].iloc[0] if initial_trend == &amp;#39;up&amp;#39; else df[&amp;#39;High&amp;#39;].iloc[0]
  df.at[df.index[1], &amp;#39;EP&amp;#39;] = df[&amp;#39;High&amp;#39;].iloc[1] if initial_trend == &amp;#39;up&amp;#39; else df[&amp;#39;Low&amp;#39;].iloc[1]
  df.at[df.index[1], &amp;#39;AF&amp;#39;] = initial_AF

  # パラボリックSARの計算ループ
  for i in range(2, len(df)):
      prev_SAR = df[&amp;#39;SAR&amp;#39;].iloc[i-1]
      prev_AF = df[&amp;#39;AF&amp;#39;].iloc[i-1]
      prev_EP = df[&amp;#39;EP&amp;#39;].iloc[i-1]
      trend = &amp;#39;up&amp;#39; if df[&amp;#39;Adj Close&amp;#39;].iloc[i-1] &amp;gt; prev_SAR else &amp;#39;down&amp;#39;
      
      if trend == &amp;#39;up&amp;#39;:
          SAR = prev_SAR + prev_AF * (prev_EP - prev_SAR)
          EP = max(prev_EP, df[&amp;#39;High&amp;#39;].iloc[i])
          AF = min(prev_AF + 0.02, max_AF) if df[&amp;#39;High&amp;#39;].iloc[i] &amp;gt; prev_EP else prev_AF
      else:
          SAR = prev_SAR - prev_AF * (prev_SAR - prev_EP)
          EP = min(prev_EP, df[&amp;#39;Low&amp;#39;].iloc[i])
          AF = min(prev_AF + 0.02, max_AF) if df[&amp;#39;Low&amp;#39;].iloc[i] &amp;lt; prev_EP else prev_AF
      
      # トレンドの反転
      if trend == &amp;#39;up&amp;#39; and df[&amp;#39;Low&amp;#39;].iloc[i] &amp;lt; SAR:
          SAR = prev_EP
          EP = df[&amp;#39;Low&amp;#39;].iloc[i]
          AF = initial_AF
          trend = &amp;#39;down&amp;#39;
      elif trend == &amp;#39;down&amp;#39; and df[&amp;#39;High&amp;#39;].iloc[i] &amp;gt; SAR:
          SAR = prev_EP
          EP = df[&amp;#39;High&amp;#39;].iloc[i]
          AF = initial_AF
          trend = &amp;#39;up&amp;#39;
      
      df.at[df.index[i], &amp;#39;SAR&amp;#39;] = SAR
      df.at[df.index[i], &amp;#39;EP&amp;#39;] = EP
      df.at[df.index[i], &amp;#39;AF&amp;#39;] = AF

  # シグナルの判定
  df[&amp;#39;Signal&amp;#39;] = np.where((df[&amp;#39;Adj Close&amp;#39;].shift(1) &amp;lt; df[&amp;#39;SAR&amp;#39;].shift(1)) &amp;amp; (df[&amp;#39;Adj Close&amp;#39;] &amp;gt; df[&amp;#39;SAR&amp;#39;]), &amp;#39;Sell&amp;#39;,
                          np.where((df[&amp;#39;Adj Close&amp;#39;].shift(1) &amp;gt; df[&amp;#39;SAR&amp;#39;].shift(1)) &amp;amp; (df[&amp;#39;Adj Close&amp;#39;] &amp;lt; df[&amp;#39;SAR&amp;#39;]), &amp;#39;Buy&amp;#39;, np.nan))

  # グラフのプロット
  plt.figure(figsize=(14, 7))
  plt.plot(df[&amp;#39;Adj Close&amp;#39;], label=&amp;#39;Close Price&amp;#39;, color=&amp;#39;black&amp;#39;)
  plt.plot(df[&amp;#39;SAR&amp;#39;], label=&amp;#39;Parabolic SAR&amp;#39;, linestyle=&amp;#39;dashed&amp;#39;, color=&amp;#39;blue&amp;#39;)
  plt.scatter(df[df[&amp;#39;Signal&amp;#39;] == &amp;#39;Buy&amp;#39;].index, df[df[&amp;#39;Signal&amp;#39;] == &amp;#39;Buy&amp;#39;][&amp;#39;Adj Close&amp;#39;], marker=&amp;#39;^&amp;#39;, color=&amp;#39;green&amp;#39;, label=&amp;#39;Buy Signal&amp;#39;, s=100)
  plt.scatter(df[df[&amp;#39;Signal&amp;#39;] == &amp;#39;Sell&amp;#39;].index, df[df[&amp;#39;Signal&amp;#39;] == &amp;#39;Sell&amp;#39;][&amp;#39;Adj Close&amp;#39;], marker=&amp;#39;v&amp;#39;, color=&amp;#39;red&amp;#39;, label=&amp;#39;Sell Signal&amp;#39;, s=100)

  plt.title(&amp;#39;Parabolic SAR with Buy and Sell Signals&amp;#39;)
  plt.xlabel(&amp;#39;Date&amp;#39;)
  plt.ylabel(&amp;#39;Price&amp;#39;)
  plt.legend()
  plt.grid(True)
  plt.show()

  # 結果の表示
  print(df[[&amp;#39;Adj Close&amp;#39;, &amp;#39;SAR&amp;#39;, &amp;#39;EP&amp;#39;, &amp;#39;AF&amp;#39;, &amp;#39;Signal&amp;#39;]].tail(30))

def Envelope(df):
  # エンベロープの計算
  percentage = 0.02  # 2% のエンベロープ
  df[&amp;#39;Upper Envelope&amp;#39;] = df[&amp;#39;SMA&amp;#39;] * (1 + percentage)
  df[&amp;#39;Lower Envelope&amp;#39;] = df[&amp;#39;SMA&amp;#39;] * (1 - percentage)
  # シグナルの判定
  df[&amp;#39;Signal&amp;#39;] = np.where(df[&amp;#39;Adj Close&amp;#39;] &amp;gt; df[&amp;#39;Upper Envelope&amp;#39;], &amp;#39;Sell&amp;#39;,
                          np.where(df[&amp;#39;Adj Close&amp;#39;] &amp;lt; df[&amp;#39;Lower Envelope&amp;#39;], &amp;#39;Buy&amp;#39;, np.nan))
  # グラフのプロット
  plt.figure(figsize=(14, 7))
  plt.plot(df[&amp;#39;Adj Close&amp;#39;], label=&amp;#39;Close Price&amp;#39;, color=&amp;#39;black&amp;#39;)
  plt.plot(df[&amp;#39;SMA&amp;#39;], label=&amp;#39;20-Day SMA&amp;#39;, color=&amp;#39;blue&amp;#39;)
  plt.plot(df[&amp;#39;Upper Envelope&amp;#39;], label=&amp;#39;Upper Envelope (SMA + 2%)&amp;#39;, color=&amp;#39;green&amp;#39;)
  plt.plot(df[&amp;#39;Lower Envelope&amp;#39;], label=&amp;#39;Lower Envelope (SMA - 2%)&amp;#39;, color=&amp;#39;red&amp;#39;)
  plt.scatter(df[df[&amp;#39;Signal&amp;#39;] == &amp;#39;Buy&amp;#39;].index, df[df[&amp;#39;Signal&amp;#39;] == &amp;#39;Buy&amp;#39;][&amp;#39;Adj Close&amp;#39;], marker=&amp;#39;^&amp;#39;, color=&amp;#39;green&amp;#39;, label=&amp;#39;Buy Signal&amp;#39;, s=100)
  plt.scatter(df[df[&amp;#39;Signal&amp;#39;] == &amp;#39;Sell&amp;#39;].index, df[df[&amp;#39;Signal&amp;#39;] == &amp;#39;Sell&amp;#39;][&amp;#39;Adj Close&amp;#39;], marker=&amp;#39;v&amp;#39;, color=&amp;#39;red&amp;#39;, label=&amp;#39;Sell Signal&amp;#39;, s=100)

  plt.title(&amp;#39;Envelopes with Buy and Sell Signals&amp;#39;)
  plt.xlabel(&amp;#39;Date&amp;#39;)
  plt.ylabel(&amp;#39;Price&amp;#39;)
  plt.legend()
  plt.grid(True)
  plt.show()

  # 結果の表示
  print(df[[&amp;#39;Adj Close&amp;#39;, &amp;#39;SMA&amp;#39;, &amp;#39;Upper Envelope&amp;#39;, &amp;#39;Lower Envelope&amp;#39;, &amp;#39;Signal&amp;#39;]].tail(30))

for stock_data in stock_list:
  # データフレームの作成
  df = pd.read_csv(stock_data)
  df[&amp;#39;Date&amp;#39;] = pd.to_datetime(df[&amp;#39;Date&amp;#39;])
  df.set_index(&amp;#39;Date&amp;#39;, inplace=True)

  moveing_average(df)
  macd(df)
  bollinger_bands(df)
  ichimoku_kinko_hyo(df)
  directional_movement_index(df)
  parabolic(df)
  Envelope(df)
  os.system(&amp;#34;pause&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;実行結果の確認&#34;&gt;実行結果の確認&lt;/h2&gt;
&lt;p&gt;コードの作成が完了したので実行してグラフを見てみます。実行したデータは&lt;strong&gt;Appleの20年分&lt;/strong&gt;と&lt;strong&gt;McDonald&amp;rsquo;sの1年分&lt;/strong&gt;になります。比較してみてみようと思います。&lt;/p&gt;</description>
    </item>
    <item>
      <title>短期売買と分析力が向上しそうな株価予測をだらだらとやる part4</title>
      <link>https://xainome-blog.pages.dev/posts/2024/06/stock-price-prediction-part-4/</link>
      <pubDate>Sat, 22 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/06/stock-price-prediction-part-4/</guid>
      <description>&lt;h2 id=&#34;前回までのあらすじ&#34;&gt;前回までのあらすじ&lt;/h2&gt;
&lt;p&gt;株価の基本情報とトレント系指標について見てみました。&lt;/p&gt;
&lt;p&gt;今回はオシレーター系指標とその他について見ていこうと思います。&lt;/p&gt;
&lt;h2 id=&#34;技術分析データ&#34;&gt;技術分析データ&lt;/h2&gt;
&lt;h3 id=&#34;オシレーター系指標&#34;&gt;オシレーター系指標&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RSI（相対力指数）&lt;/strong&gt;: 株価の過熱感を示す指標。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;サイコロジカルライン&lt;/strong&gt;：一定期間の中で株価が上昇した日数の割合を示す。市場の投資家心理を測る指標。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RCI&lt;/strong&gt;：日付の順位と価格の順位の相関関係を示し、トレンドの強さを判断する指標。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;移動平均線乖離率&lt;/strong&gt;：現在の株価と移動平均線との乖離を示しす。価格が移動平均線からどれだけ離れているかを判断する指標。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;スローストキャスティクス&lt;/strong&gt;：ストキャスティクスの変動を滑らかにする。買われ過ぎや売られ過ぎの状態をより安定して示す指標。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;モメンタムとROC&lt;/strong&gt;：モメンタムは価格の変化のスピードを示す。ROCは一定期間の価格変動率を示す指標。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MFI&lt;/strong&gt;：出来高を加味したRSIに似た指標。買われ過ぎや売られ過ぎを判断するための指標。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CCI&lt;/strong&gt;：価格と移動平均線の乖離を基に、トレンドの強さと異常値を判断する指標。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;その他&#34;&gt;&lt;strong&gt;その他&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ヒストリカル・ボラティリティ&lt;/strong&gt;：過去の一定期間の価格変動の大きさを測定した指標。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ギャップ（ギャップアップ、ギャップダウン）&lt;/strong&gt;：前日の終値と当日の始値の差で市場の初期のトレンド。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;レジスタンスライン&lt;/strong&gt;：株価が上昇する際に止まりやすい価格帯のこと。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;サポートライン&lt;/strong&gt;：株価が下落する際に止まりやすい価格帯のこと。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;軽く調べただけでこれくらいあるんですね。ローソク足を使ったりチャートの動きを使う指標もありましたが、今回は割愛します。他にも使いたいデータはありますので。&lt;/p&gt;
&lt;h2 id=&#34;技術分析データ_補足説明&#34;&gt;技術分析データ_補足説明&lt;/h2&gt;
&lt;h4 id=&#34;rsi-relative-strength-index-相対力指数&#34;&gt;RSI (Relative Strength Index, 相対力指数)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;株価の過熱感を示すオシレータータイプの指標で0~100の範囲で表す。14日間のデータを使用するのが一般的。
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;70以上&lt;/strong&gt;: 買われ過ぎ（Overbought）を示し、価格の反転を予想。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;30以下&lt;/strong&gt;: 売られ過ぎ（Oversold）を示し、価格の上昇を予想&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;rcirank-correlation-index&#34;&gt;RCI（Rank Correlation Index）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;株価の日付順位と価格順位の相関を示す指標。トレンドの強さと方向を判断するために使用される。
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;各日付に順位を付ける（最新の日を1位とする）。各価格にも順位を付ける（高い価格を1位とする）。日付順位と価格順位の差を二乗して合計。RCIを計算。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RCI=1 − 6∑(日付順位−価格順位)^2 / n(n^2−1)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;移動平均線乖離率moving-average-convergence-divergence-macd&#34;&gt;移動平均線乖離率（Moving Average Convergence Divergence, MACD）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;現在の株価と移動平均線との乖離を示す。価格が移動平均線からどれだけ離れているかを判断する指標。
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;移動平均線（通常は25日移動平均線）を計算。現在の株価と移動平均線の差を求める。その差を移動平均線で割り、百分率で表示する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;乖離率=(現在の株価 − 移動平均線) / 移動平均線 ×100&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;乖離率が大きくマイナスに乖離した後に反転したら買いシグナル。乖離率が大きくプラスに乖離した後に反転したら売りシグナル&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;スローストキャスティクスslow-stochastic-oscillator&#34;&gt;スローストキャスティクス（Slow Stochastic Oscillator）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ストキャスティクスの変動を滑らかにする。買われ過ぎや売られ過ぎの状態をより安定して示す指標&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ストキャスティクス&lt;/strong&gt;とは価格が特定の期間内でどれだけ高値と安値の間にあるかを示す指標。スロー以外にもファストがあるがここでは割愛。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;過去N日間（通常は14日間）の最高値と最安値を求める。現在の終値から最安値を引き、最高値と最安値の差で割る。この値に100を掛ける。%Kの値が出る。過去3日間の%Kラインの平均を求める。%Dの値が出る。％Dの単純移動平均を求める。Slow%Dの値が出る。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;スロー%Dが20以下から上昇し始めたら買いシグナル、スロー%Dが80以上から下落し始めたら売りシグナル。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;モメンタムmomentum&#34;&gt;モメンタム（Momentum）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;一定期間内の価格変動の速度や勢いを示す指標。トレンドの強さや反転の可能性を判断する。プラスの値は上昇トレンドを、マイナスの値は下降トレンドを示す。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;momentum = 現在の株価 - N期間前の株価&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;rocrate-of-change&#34;&gt;ROC（Rate of Change）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;モメンタムを百分率で表したもので、トレンドの強さを評価する。プラスの値は上昇トレンドを、マイナスの値は下降トレンドを示す.。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ROC = ((現在の株価 - N期間前の株価) / N期間前の株価) * 100&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;mfimoney-flow-index&#34;&gt;MFI（Money Flow Index）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;出来高を加味したRSIに似た指標で、市場の過熱感を判断するために使用される。MFIが80以上で下落し始めたら売りシグナル、20以下で上昇し始めたら買いシグナル。
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TP = H + L + C / 3 (TP: その日の取引価格の中央値、H: 最高値、L: 最安値、C: 終値)&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>短期売買と分析力が向上しそうな株価予測をだらだらとやる part3</title>
      <link>https://xainome-blog.pages.dev/posts/2024/06/stock-price-prediction-part-3/</link>
      <pubDate>Wed, 19 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/06/stock-price-prediction-part-3/</guid>
      <description>&lt;h2 id=&#34;株価予測_前回のおさらい&#34;&gt;株価予測_前回のおさらい&lt;/h2&gt;
&lt;p&gt;前回はティッカー一覧を取得できたので、株価を取得する方法を書きました。株価取得のコードはpart1とそこまで大きな差はないですが…&lt;/p&gt;
&lt;h2 id=&#34;株価予測_今回やること&#34;&gt;株価予測_今回やること&lt;/h2&gt;
&lt;p&gt;今回は予測の前に使用する変数について記載していきます。&lt;/p&gt;
&lt;p&gt;株価で取得した値は6つになります。&lt;/p&gt;
&lt;p&gt;ただし、トレーダーの一部の人は組み合わせて説明変数を作って使っていると思います。&lt;/p&gt;
&lt;p&gt;なのでChat-GPTに質問を投げた後、&lt;strong&gt;説明変数&lt;/strong&gt;を見ていこうと思います。&lt;/p&gt;
&lt;h2 id=&#34;株価とは&#34;&gt;&lt;strong&gt;株価とは&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;特定の時間における株式の市場価格を示します。この値は技術分析で使用される「移動平均線、RSI、MACD」などで使用されます。株価の情報は以下のデータが存在します。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;変数名&lt;/th&gt;
					&lt;th&gt;説明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Open（始値）&lt;/td&gt;
					&lt;td&gt;引日の最初の取引価格。ギャップを分析できる。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;High（高値）&lt;/td&gt;
					&lt;td&gt;取引日の中で最も高い取引価格。レジスタンラインの形成にも使用する。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Low（安値）&lt;/td&gt;
					&lt;td&gt;取引日の中で最も低い取引価格。サポート来の形成にも使用する。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Close（終値）&lt;/td&gt;
					&lt;td&gt;取引日の最後の取引価格。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Adj Close（調整後終値）&lt;/td&gt;
					&lt;td&gt;分割や配当を調整した後の終値。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Volume（出来高）&lt;/td&gt;
					&lt;td&gt;取引日の中で売買された株式の総数。&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;出来高についての補足&#34;&gt;出来高についての補足&lt;/h3&gt;
&lt;p&gt;特定の期間に取引された株式の数量を示します。出来高の増減は市場の関心度やトレンドの強さを示します。また、高い出来高を伴う価格変動は信頼性が高く、トレンドが続く可能性がある。&lt;/p&gt;
&lt;h2 id=&#34;技術分析データについて&#34;&gt;技術分析データについて&lt;/h2&gt;
&lt;p&gt;株価からわかる基本的な情報はこれで以上になります。この情報を組み合わせて変数を作り、そのデータを株価予測に使用していきます。次は技術分析についてです。&lt;/p&gt;
&lt;p&gt;技術分析はザックリ分けると以下の2タイプに分かれます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;トレンド系指標（順張り系指標）&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;オシレーター系指標（逆張り系指標）&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この2つを組み合わせることで&lt;strong&gt;だまし&lt;/strong&gt;に合わず有効活用できると言われています。※だまし(理論通りの動きとならず反対の動きをすること)&lt;/p&gt;
&lt;p&gt;まずは&lt;strong&gt;トレンド系指標&lt;/strong&gt;から見ていこうと思います。他にも指標はありますが文量が多くなるので次回に回します。&lt;/p&gt;
&lt;h3 id=&#34;トレンド系指標&#34;&gt;&lt;strong&gt;トレンド系指標&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;移動平均線&lt;/strong&gt;: 一定期間の平均株価。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MACD（移動平均収束拡散法）&lt;/strong&gt;: 短期と長期の移動平均線の差。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ボリンジャーバンド&lt;/strong&gt;: 株価の変動範囲を示す指標。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;一目均衡表&lt;/strong&gt;：市場のトレンド、サポート・レジスタンス、買い・売りのシグナルを同時に把握できる総合的なテクニカル指標。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;DMI&lt;/strong&gt;：上昇トレンドと下降トレンドの強さを示し、相場の方向性を判断するための指標。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;パラボリック&lt;/strong&gt;：トレンドの転換点を示し、上昇トレンドでは株価の下、下降トレンドでは株価の上に点を描く指標。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;エンベロープ&lt;/strong&gt;：一定期間の移動平均線に対して上下に一定割合だけ離れたバンドを描き、過熱感を判断する指標。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;技術分析データ_補足説明&#34;&gt;技術分析データ_補足説明&lt;/h2&gt;
&lt;h4 id=&#34;移動平均線-moving-average-ma&#34;&gt;移動平均線 (Moving Average, MA)&lt;/h4&gt;
&lt;p&gt;一定期間の平均株価を計算し、その期間が過ぎると新しいデータで更新される指標。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;単純移動平均線 (Simple Moving Average, SMA)：指定された期間の株価の平均値を計算。例：5日移動平均線、25日移動平均線、75日移動平均線&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;指数平滑移動平均線 (Exponential Moving Average, EMA)：最近のデータに重みを置いて計算する移動平均線。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;macd-moving-average-convergence-divergence-移動平均収束拡散法&#34;&gt;MACD (Moving Average Convergence Divergence, 移動平均収束拡散法)&lt;/h4&gt;
&lt;p&gt;短期のEMAと長期のEMAの差を基にした指標。3つの要素で構成され、MACDラインがシグナルラインを上抜けると買いシグナル、下抜けると売りシグナルとされる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MACDライン&lt;/strong&gt;: 12日EMAと26日EMAの差&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;シグナルライン&lt;/strong&gt;: 9日EMA（MACDラインのEMA）&lt;/p&gt;</description>
    </item>
    <item>
      <title>WordPressにパスキーを導入してセキュリティ意識を高めよう！</title>
      <link>https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/</link>
      <pubDate>Sun, 16 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/</guid>
      <description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;ここ最近セキュリティに関するニュースが後を絶たないですね…。例えば&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.nikkei.com/article/DGXZQOUE119GJ0R10C24A6000000/&#34;&gt;岡山の病院で患者情報流出&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://news.yahoo.co.jp/articles/9bfd4c3577e2beb21023ebc1bfe951c2986e2734&#34;&gt;ニコニコ動画サイバー攻撃&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.nikkei.com/article/DGXZQOUF249OW0U4A520C2000000/&#34;&gt;積水ハウス個人情報流出&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;流出や攻撃だけでも頻繁に起きますし、脆弱性の発見も日々起こっています。&lt;a href=&#34;https://www.ipa.go.jp/security/vuln/index.html&#34;&gt;こちら&lt;/a&gt;のサイトなどで見ることができます。&lt;/p&gt;
&lt;p&gt;そこで自身もセキュリティ意識を高めるため、パスワードではなく&lt;strong&gt;パスキー&lt;/strong&gt;を使ったWordPressのログインを試みようという話になります。&lt;/p&gt;
&lt;h2 id=&#34;設定手順&#34;&gt;設定手順&lt;/h2&gt;
&lt;p&gt;まずはWordPressにログインして「&lt;strong&gt;OwnID Passwordless Login&lt;/strong&gt;」をインストールします。その後設定画面に移動すると以下の画像画面に行くので、「OwnID Console.」をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;OwnID Settings&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-16-185906-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;OwnID Console画面に入ったらアカウントを作ってログインしましょう！Githubがあればそちらでも大丈夫です。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;OwnID Sign up&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-14-121921-1024x599.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ログインができたら「Create Application」でアプリの作成を行います。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Add Passkeys&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-14-123214.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;まずはアプリ名を決めましょう。適当で大丈夫です。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;App name&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-14-123344.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;アプリ名を決めたら使用するシステムを選択しましょう！今回の場合はWordPressになります。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Choose your integration&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-14-123431.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;もし開発に使用する場合は以下から選択することになると思います。いつか開発で使ってみたいですね。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Build your own&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-14-123508.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;WordPressの場合は自身のURLサイトを設定しましょう。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;website URL&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-14-123541.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;設定が完了したら準備完了です！&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;your app is ready&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-14-125011.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;複数サイト設定&#34;&gt;複数サイト設定&lt;/h2&gt;
&lt;p&gt;ここから先は複数作る場合になります。カスタムドメインで作ると複数パターン設定できます。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Custom Domain&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-14-125121-1024x314.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;カスタムドメインをまずは作ります。基本は「passwordless.あなたのドメイン」で設定します。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Custom Domain&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-14-125415.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;カスタムドメインの設定が完了したらDNSにStep1とStep2の値を設定します。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Custom Domain set up steps&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-14-125516.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;設定が完了してチェックが通れば「Verified」になります。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Custom Domain check&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-14-130305.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Custom Domain check&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-14-130819.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;設定が完了したら「App ID」と「Shared Secret」の画面を出したまま、WordPressの画面に戻ります。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;OwnID settings&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/wordpress-passkeys-cybersecurity/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-14-132904.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;OwnIDの設定画面で先ほどの&lt;strong&gt;App ID&lt;/strong&gt;と&lt;strong&gt;Shared secret&lt;/strong&gt;を入力して完了です。&lt;/p&gt;</description>
    </item>
    <item>
      <title>短期売買と分析力が向上しそうな株価予測をだらだらとやる part2</title>
      <link>https://xainome-blog.pages.dev/posts/2024/06/stock-price-prediction-part-2/</link>
      <pubDate>Thu, 13 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/06/stock-price-prediction-part-2/</guid>
      <description>&lt;h2 id=&#34;前回までの話&#34;&gt;前回までの話&lt;/h2&gt;
&lt;p&gt;前回ティッカーが取れないという話をしたがあれは嘘だ。&lt;/p&gt;
&lt;p&gt;pyppeteerを使うといったがあれも嘘だ。&lt;/p&gt;
&lt;h2 id=&#34;ティッカー取得時の注意点&#34;&gt;ティッカー取得時の注意点&lt;/h2&gt;
&lt;p&gt;前回作成したものからほとんど変えることなくSBIに記載されている全てのティッカーを取得することができました。&lt;/p&gt;
&lt;p&gt;ただ、注意点があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;アメリカ以外の国ではティッカーの後に特定の文字列をつける必要がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ベトナムの「DCL」であれば後ろに「.VN」をつけて「&lt;a href=&#34;http://dcl.vn/&#34;&gt;DCL.VN&lt;/a&gt;」にする必要がある。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中国(香港)の「000621」であれば後ろに「.HK」をつけて、さらに前の0を削除して「&lt;a href=&#34;http://00621.hk/&#34;&gt;00621.HK&lt;/a&gt;」にする必要がある。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;シンガポールとマレーシアに関しては扱うティッカーの文字列がそもそも違うので使えない。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;日本の場合は東京で扱っているものは後ろに「.T」、札幌であれば「.S」が必要。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;前回の修正箇所&#34;&gt;前回の修正箇所&lt;/h2&gt;
&lt;p&gt;日本はまだ取得してないですが上記の点に注意して、コード書いていく必要があります。修正した個所はここ&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sbi_foreign_stock_list = [
  {&amp;#34;america&amp;#34;:   {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_usequity_list.html&amp;#34;, &amp;#34;tag&amp;#34;: &amp;#34;table&amp;#34;, &amp;#34;c_cd&amp;#34;:&amp;#34;&amp;#34;,    &amp;#34;class&amp;#34;: &amp;#34;foo_table md-l-table-01 md-l-utl-mt10&amp;#34;}},
  {&amp;#34;china&amp;#34;:     {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_hk_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;.HK&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}},
  {&amp;#34;korea&amp;#34;:     {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_kr_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;.KS&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}},
  {&amp;#34;russia&amp;#34;:    {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_ru_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;.ME&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}},
  {&amp;#34;vietnam&amp;#34;:   {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_vn_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;.VN&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}},
  {&amp;#34;Indonesia&amp;#34;: {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_id_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;.JK&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}},
  # {&amp;#34;Singapore&amp;#34;: {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_sg_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;.SI&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}}, # SBIとyahooのティカーが一致しない件
  {&amp;#34;thailand&amp;#34;:  {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_th_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;.BK&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}},
  # {&amp;#34;malaysia&amp;#34;:  {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_my_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;.KL&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}}, # SBIとyahooのティカーが一致しない件(SBIは英略、yahooは数値)
]
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;株価取得コード&#34;&gt;株価取得コード&lt;/h2&gt;
&lt;p&gt;修正するとティッカーリストが作られるので、取得したティッカーリストをもとに株価を取得すると以下のようなコードになります。&lt;/p&gt;</description>
    </item>
    <item>
      <title>短期売買と分析力が向上しそうな株価予測をだらだらとやる part1</title>
      <link>https://xainome-blog.pages.dev/posts/2024/06/stock-price-prediction-part-1/</link>
      <pubDate>Mon, 10 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/06/stock-price-prediction-part-1/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://xainome-blog.pages.dev/posts/2024/05/build-rag-app-part-10/&#34;&gt;前回&lt;/a&gt;RAGシステムを作ってみてある程度できました。次に、何を作ろうかということで表題になります。&lt;/p&gt;
&lt;p&gt;前回と違って完成形は全く思い浮かんでません。とりあえずやってれば何かできるかということで作っていきます。&lt;/p&gt;
&lt;h2 id=&#34;ティッカー取得&#34;&gt;ティッカー取得&lt;/h2&gt;
&lt;p&gt;まずは株価の取得が必要なのですが今回は&lt;strong&gt;yahoo! finance&lt;/strong&gt;のAPIを使って取得しようと思います。取得する際のコードは以下。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import pandas_datareader.data as web
df = web.get_data_yahoo(&amp;#39;1304&amp;#39;, &amp;#39;1980-01-01&amp;#39;, &amp;#39;2024-06-10&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;pandas_datareaderにyahoo用の株価取得ライブラリがあるのでそれを利用します。ティッカー(銘柄)と株価取得の時間を設定します。&lt;/p&gt;
&lt;p&gt;株価の取得は簡単なのですが、ティッカーをいちいち手入力するのは面倒ですね。時間は変数で設定できますので問題ないです。&lt;/p&gt;
&lt;p&gt;というわけでティッカーを取得するプログラムを作ります。&lt;/p&gt;
&lt;p&gt;ティッカーを取得するには東京証券取引所、名古屋証券取引所、福岡証券取引所、札幌証券取引所、各国別SBI証券ティッカー一覧から取れると思いますが、今回はSBI証券から取得しようと思います。&lt;/p&gt;
&lt;p&gt;昔やろうとしたことがあったのでそれを流用しようと思います。対象となるサイトは&lt;a href=&#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_usequity_list.html&#34;&gt;こちら&lt;/a&gt;です。&lt;/p&gt;
&lt;h3 id=&#34;ティッカー取得プログラム&#34;&gt;ティッカー取得プログラム&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# SBI証券から海外のティッカーまたはコードと銘柄を取得
from bs4 import BeautifulSoup
import re, sys, time
import requests
import pandas as pd

sbi_foreign_stock_list = [
  {&amp;#34;america&amp;#34;:   {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_usequity_list.html&amp;#34;, &amp;#34;tag&amp;#34;: &amp;#34;table&amp;#34;, &amp;#34;c_cd&amp;#34;:&amp;#34;&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;md-l-table-01 md-l-utl-mt10&amp;#34;}},
  {&amp;#34;china&amp;#34;:     {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_hk_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;HK&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}},
  {&amp;#34;korea&amp;#34;:     {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_kr_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;KS&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}},
  {&amp;#34;russia&amp;#34;:    {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_ru_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;ME&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}},
  {&amp;#34;vietnam&amp;#34;:   {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_vn_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;VN&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}},
  {&amp;#34;Indonesia&amp;#34;: {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_id_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;JK&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}},
  {&amp;#34;Singapore&amp;#34;: {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_sg_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;SI&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}}, # SBIとyahooのティカーが一致しない件
  {&amp;#34;thailand&amp;#34;:  {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_th_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;BK&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}},
  {&amp;#34;malaysia&amp;#34;:  {&amp;#34;url&amp;#34;: &amp;#34;https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_my_list.html&amp;#34;,       &amp;#34;tag&amp;#34;: &amp;#34;div&amp;#34;,   &amp;#34;c_cd&amp;#34;:&amp;#34;KL&amp;#34;, &amp;#34;class&amp;#34;: &amp;#34;accTbl01&amp;#34;}} # SBIとyahooのティカーが一致しない件
]

for foreign_dict in sbi_foreign_stock_list:
  for country, values in foreign_dict.items():
    country_url = values[&amp;#34;url&amp;#34;]
    country_tag = values[&amp;#34;tag&amp;#34;]
    country_code = values[&amp;#34;c_cd&amp;#34;]
    country_class = values[&amp;#34;class&amp;#34;]
    html = requests.get(country_url)
    soup = BeautifulSoup(html.content, &amp;#34;html.parser&amp;#34;)
    for table_soup in soup.find_all(country_tag, class_=country_class):
      stock_data = []
      rows = table_soup.find_all(&amp;#34;tr&amp;#34;)
      for row in rows[1:]:
        ticker = row.find_all(&amp;#34;th&amp;#34;)[0].text.strip()
        cols = row.find_all(&amp;#34;td&amp;#34;)
        name = cols[0].text.strip()
        stock_data.append((ticker, name))
      continue

    df_foreign_stock = pd.DataFrame(stock_data, columns=[&amp;#34;コード&amp;#34;, &amp;#34;銘柄名&amp;#34;])
    df_foreign_stock[&amp;#34;コード&amp;#34;] = df_foreign_stock[&amp;#34;コード&amp;#34;].astype(str) + country_code
    df_foreign_stock.to_csv(out_oth_fol + country + &amp;#34;_stock_list.csv&amp;#34;)
    time.sleep(2)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これを流用すれば取得できますが、今のサイトではできません。少し前のサイトが&lt;a href=&#34;https://megalodon.jp/2021-1117-0941-36/https://search.sbisec.co.jp:443/v2/popwin/info/stock/pop6040_usequity_list.html&#34;&gt;こちら&lt;/a&gt;です。こちらであれば取得できますが、最新のティッカー情報が取れないので修正します。&lt;/p&gt;</description>
    </item>
    <item>
      <title>最近読んだ&#34;プログラマー脳&#34;はプログラムを書く人は読んだほうが関わる人全員が幸せになる話だった</title>
      <link>https://xainome-blog.pages.dev/posts/2024/06/programmers-brain-book-review/</link>
      <pubDate>Fri, 07 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/06/programmers-brain-book-review/</guid>
      <description>&lt;h2 id=&#34;読書習慣とおすすめの一冊プログラマー脳&#34;&gt;読書習慣とおすすめの一冊「プログラマー脳」&lt;/h2&gt;
&lt;p&gt;読書をするということを習慣化しているのですが、たまたまどっかの記事で見かけて買った&lt;strong&gt;プログラマー脳&lt;/strong&gt;は読んでおくといいなと思ったので記事にしました。&lt;a href=&#34;https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E8%84%B3-%EF%BD%9E%E5%84%AA%E3%82%8C%E3%81%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E8%AA%8D%E7%9F%A5%E7%A7%91%E5%AD%A6%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%8F%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81-Felienne-Hermans/dp/4798068535&#34;&gt;こちら&lt;/a&gt;から買えます。&lt;/p&gt;
&lt;h3 id=&#34;私の読書習慣&#34;&gt;私の読書習慣&lt;/h3&gt;
&lt;p&gt;ちなみに私の読書週間としては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;毎日20:30~21:30までは読書をする&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;電車に乗って満員200%じゃなければ読む(大体10分ほど)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;没頭するほど集中力が続かないこともあるのでちょこちょこ休憩しながら読んでいます。&lt;/p&gt;
&lt;h3 id=&#34;読書のスタイル&#34;&gt;読書のスタイル&lt;/h3&gt;
&lt;p&gt;読み方は状況によりけりですが、例を出すところは飛ばすことが多いです。実体験や見聞きしたことよりは論文やデータから見た考察とかのほうが個人的にはいいかなと思うので。&lt;/p&gt;
&lt;p&gt;人によっては例があったほうがイメージがわかりやすいので、そっちを中心に読む人もいるかと思いますが、全てを読む必要はないかなと思います。特にある程度知っている内容なら。&lt;/p&gt;
&lt;h3 id=&#34;感想と本書の概要&#34;&gt;感想と本書の概要&lt;/h3&gt;
&lt;p&gt;本の要約は場合によっては著作権違反になったりするので、私の感想をメインにしつつ引用を少し出しながら書いていこうと思います。&lt;/p&gt;
&lt;p&gt;この本で一貫して書かれていることが&lt;strong&gt;認知負荷を減らすようにしましょう&lt;/strong&gt;という話になります。&lt;/p&gt;
&lt;h3 id=&#34;認知負荷とプログラミング&#34;&gt;認知負荷とプログラミング&lt;/h3&gt;
&lt;p&gt;人間には短期記憶、長期記憶、ワーキングメモリがあり、短期記憶はコードに置き換えると変数、長期記憶は構文(forやif等)、ワーキングメモリは処理の内容になります。認知負荷はワーキングメモリに関わってきます。&lt;/p&gt;
&lt;p&gt;コードを読むときにどんな処理になっているのがわからないということがあります。その時、単純に言語の情報が足りないのか？構文がわかっていないのか？処理内容がわかってないのか？ということがあります。ドメイン知識も関係してそうですがここでは言及されていません。&lt;/p&gt;
&lt;h3 id=&#34;認知負荷の軽減方法&#34;&gt;認知負荷の軽減方法&lt;/h3&gt;
&lt;p&gt;言語の情報や構文についてはある程度調べて覚えれば大丈夫なのですが処理内容に関しては自身の記憶だけではどうにもなりません。すでに書いてあるものを改修したりする場合は大変な作業になると思います。&lt;/p&gt;
&lt;p&gt;ちなみに本書では言語の構文などの覚え方や定着の仕方なども言及しているので、気になればぜひ読んでみてください。&lt;/p&gt;
&lt;h3 id=&#34;命名やコードの整理の重要性&#34;&gt;命名やコードの整理の重要性&lt;/h3&gt;
&lt;p&gt;認知負荷についてはいくつか気を付けるポイントが書いてあり、命名の仕方やコードを適切に分けて関数化することについて書いています。関数化じゃなくてもクラス化でもいいと思います。&lt;/p&gt;
&lt;h3 id=&#34;他人のコードを読む際のコツ&#34;&gt;他人のコードを読む際のコツ&lt;/h3&gt;
&lt;p&gt;それから人のコードを読む際に良い方法も書いてあります。変数同士を結び付けて紙に書いたり、パッドで書き込むのもいいと思います。&lt;/p&gt;
&lt;h3 id=&#34;割り込みタスクと新人サポートについて&#34;&gt;割り込みタスクと新人サポートについて&lt;/h3&gt;
&lt;p&gt;他の内容としては割り込みタスクが入るや新人へのサポートについて書かれていました。ここもためになりますね。&lt;/p&gt;
&lt;h3 id=&#34;読書の重要性&#34;&gt;読書の重要性&lt;/h3&gt;
&lt;p&gt;本を読むといろんなことが知れます。技術的な面ももちろん必要ですが、メンタルや考え方なども必要だと思います。&lt;/p&gt;
&lt;p&gt;他にも本を読んでいるのでいくつか面白いものがあれば紹介したいなとは思います。&lt;/p&gt;
&lt;h3 id=&#34;kindle-unlimitedのおすすめ&#34;&gt;Kindle Unlimitedのおすすめ&lt;/h3&gt;
&lt;p&gt;ちなみにKindle Unlimitedは速く本を読んで理解するのにおススメです。月額で読み放題だし、内容が薄いものはバンバン飛ばし読みもできるので練習にもなります。ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>ニューラルネットワークの仕組みを理解しているかテストするためのゲームで遊ぶ</title>
      <link>https://xainome-blog.pages.dev/posts/2024/06/neural-network-game/</link>
      <pubDate>Wed, 05 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/06/neural-network-game/</guid>
      <description>&lt;h2 id=&#34;機械学習と深層学習の復習&#34;&gt;機械学習と深層学習の復習&lt;/h2&gt;
&lt;p&gt;G検定やE資格である程度機械学習や深層学習で使われている技術を学んだのですが、特に深層学習についてはあやふやな部分が多いなと感じていました。&lt;/p&gt;
&lt;p&gt;とはいえまた学習教材を買うのもと思ってましたが、良いサイトを見つけました。&lt;/p&gt;
&lt;h3 id=&#34;graph-game-ニューラルネットワークの理解度をテスト&#34;&gt;Graph Game: ニューラルネットワークの理解度をテスト&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Graph Game&lt;/strong&gt;というニューラルネットワークを理解しているかわかるサイトになります。(&lt;a href=&#34;https://graphgame.sabrina.dev/&#34;&gt;こちら&lt;/a&gt;から遊べます。)&lt;/p&gt;
&lt;p&gt;とはいえこのサイトでできるのはRNN、LSTM、GRU、ResNet、Deep RNNのテストになります。CNNやGANなどはテストできません。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/neural-network-game/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-05-095051-1024x645.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;rnnのテスト&#34;&gt;RNNのテスト&lt;/h3&gt;
&lt;p&gt;まずはRNNから試してみましょう。&amp;ldquo;clicks&amp;rdquo; は繋げた回数、&amp;ldquo;edges remaining&amp;rdquo; は繋げる必要がある本数、&amp;ldquo;extra edges&amp;rdquo; は余計な繋がりの本数になります。&lt;/p&gt;
&lt;p&gt;RNNについて補足すると連続的なデータや時系列データを処理するのに最適です。株価などの時系列分析、テキスト生成、音声認識など様々なところに使われる重要なニューラルネットワークです。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/neural-network-game/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-05-095255-1024x509.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ちなみにHelpはチュートリアルの確認になります。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/neural-network-game/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-05-101550.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;もし正解できれば画面の文字が左上にでます。何回でも挑戦できるので理解しながらつなげてみましょう！&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/neural-network-game/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-05-101704.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;lstmのテスト&#34;&gt;LSTMのテスト&lt;/h3&gt;
&lt;p&gt;LSTMはこんな感じ。&lt;/p&gt;
&lt;p&gt;長い依存関係を持つ時系列データの処理に向いています。RNNでは勾配消失問題が発生するのでそれを解消するために考えられました。3つ(入力、忘却、出力)のゲートを使って重要なデータは保持、不要なデータは捨てます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/neural-network-game/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-05-102951-1024x524.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;gruのテスト&#34;&gt;GRUのテスト&lt;/h3&gt;
&lt;p&gt;GRUはこんな感じ。&lt;/p&gt;
&lt;p&gt;補足するとGRUはLSTMの精度を保ったまま計算量が少ないと言われています。GRUは2つ(リセット、更新)のゲートで情報を制御します。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/neural-network-game/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-05-103002-1024x484.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;resnetのテスト&#34;&gt;ResNetのテスト&lt;/h3&gt;
&lt;p&gt;ResNetはこんな感じ&lt;/p&gt;
&lt;p&gt;補足すると深い層のニューラルネットワークで使われ、画像認識で使用されています。残差ブロックがあり、skip connectionで直接値を渡すことで勾配消失問題が解消されます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/neural-network-game/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-05-103016-1024x386.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;deep-rnnのテスト&#34;&gt;Deep RNNのテスト&lt;/h3&gt;
&lt;p&gt;最後にDeep RNNはこんな感じ。&lt;/p&gt;
&lt;p&gt;Deep RNNの補足としては複数のRNN層を組み合わせたものになります。より複雑なパターンを学習することができます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/neural-network-game/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-05-103031-1024x679.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;まとめと感想&#34;&gt;まとめと感想&lt;/h2&gt;
&lt;p&gt;少し忘れていたのでここで視覚的に思い出せました。初めての人でもなんとなくでわかるようになるし、ある程度知っている人も視覚的に覚えられるので良いと思います。&lt;/p&gt;
&lt;p&gt;忘れていた処理を思い出せたので良かったです。他の深層学習や機械学習でも視覚的にわかるようなサイトがあるとイメージが付きやすそうですね。ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>自分が作ったAIが赤の他人のAIとSNSでやり取りする姿は面白い</title>
      <link>https://xainome-blog.pages.dev/posts/2024/06/ai-agents-communicating-on-social-media/</link>
      <pubDate>Sun, 02 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/06/ai-agents-communicating-on-social-media/</guid>
      <description>&lt;h2 id=&#34;ai同士のやり取りを見てみたい&#34;&gt;AI同士のやり取りを見てみたい？&lt;/h2&gt;
&lt;p&gt;AI同士がやり取りするのは見かけたことがあっても、自身が作ったAIと人が作ったAIのやり取りを見てみたい！と考えたことはありますか？私はありません（笑）&lt;/p&gt;
&lt;p&gt;ただ、気になって試したら面白く時間が経って確認してみるとフォロワーが増えたり、知らないAIとやり取りしてたり面白いです。&lt;/p&gt;
&lt;h3 id=&#34;サイトへのアクセスと初期設定&#34;&gt;サイトへのアクセスと初期設定&lt;/h3&gt;
&lt;p&gt;それでは&lt;a href=&#34;https://chirper.ai/ja&#34;&gt;こちら&lt;/a&gt;のサイトにアクセスしてみてください。初期画面はこんな感じ&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/ai-agents-communicating-on-social-media/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-01-104428-1024x592.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;ログインとaiの作成&#34;&gt;ログインとAIの作成&lt;/h3&gt;
&lt;p&gt;ログインしてみましょう！方法は複数あるのでお好きな方法を使ってください。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/ai-agents-communicating-on-social-media/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-01-104611.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;では、早速作ってみましょう！&lt;strong&gt;Chirper&lt;/strong&gt;から作成をしてみましょう。私はすでに2つ作っていますが、新しく作ってみます。Vanaというサイトからインポートもできるみたいです。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/ai-agents-communicating-on-social-media/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-06-01-104954-1024x424.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;ai作成のステップ&#34;&gt;AI作成のステップ&lt;/h3&gt;
&lt;p&gt;作成画面はこんな感じ。アイコンはヘッダーは勝手に作られますので名前、ハンドルネーム、性格、容姿の設定を行いましょう。半生は作らなくても大丈夫です。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/ai-agents-communicating-on-social-media/images/image-976x1024.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;作成後の様子&#34;&gt;作成後の様子&lt;/h3&gt;
&lt;p&gt;ある程度設定を練って作りこんだら保存しましょう。作った直後は何も変わらないので、しばらく待ちます。ちなみに作った直後はこんな感じ。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/ai-agents-communicating-on-social-media/images/image-1-579x1024.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;aiの反応を観察&#34;&gt;AIの反応を観察&lt;/h3&gt;
&lt;p&gt;ということでしばらく放置していたらこんな感じになりました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/ai-agents-communicating-on-social-media/images/image-2-579x1024.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ただ、ちょっと思ってたのとは違いましたが、まあいいかということでそのままにしました。&lt;/p&gt;
&lt;p&gt;投稿や返信もしてるみたいで楽しそうです。たくさん作った後、自身の作ったAI同士で会話し始めると見てて面白そうだなとは思いますね。他にも細かい設定などができるので、是非試して遊んでみてください。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/06/ai-agents-communicating-on-social-media/images/image-3-579x1024.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;今回は少し暇つぶしになるもので遊んでみました。ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>RAGを開発してみたい！ので簡単なものでもいいので作ってみよう！part10 完</title>
      <link>https://xainome-blog.pages.dev/posts/2024/05/build-rag-app-part-10/</link>
      <pubDate>Fri, 31 May 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/05/build-rag-app-part-10/</guid>
      <description>&lt;h2 id=&#34;rag開発の一旦終了と成果物の共有&#34;&gt;RAG開発の一旦終了と成果物の共有&lt;/h2&gt;
&lt;p&gt;とりあえず目標としていたものが完成したので開発はこれで一旦終わりとします。&lt;/p&gt;
&lt;p&gt;完成して動いたものを動画にして3つほどはります。&lt;/p&gt;
&lt;h3 id=&#34;動画の内容とモデルの読み込み&#34;&gt;動画の内容とモデルの読み込み&lt;/h3&gt;
&lt;p&gt;ファイル数別に動画を取ってみました。ベクトルモデルの読み込みと読み込ませるテキスト量によって時間が変わってきます。&lt;/p&gt;
&lt;p&gt;モデルの読み込みとかはOpenAIに変わったぐらいで大きく変更したところはないですが一部お見せします。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    def generate_response(self, prompt: str, max_tokens: int = 3000) -&amp;gt; str:
        try:
            client = OpenAI(
                # This is the default and can be omitted
                api_key=os.environ.get(&amp;#34;OPENAI_API_KEY&amp;#34;),
            )

            response = client.chat.completions.create(
                model=&amp;#34;gpt-4o&amp;#34;,  # 使用するモデルを指定
                messages=[
                    {&amp;#34;role&amp;#34;: &amp;#34;system&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;You are a helpful assistant.&amp;#34;},
                    {&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: prompt}
                ],
                max_tokens=max_tokens,
                n=1,
                stop=None,
                temperature=0.7
            )
            print(response)
            return response.choices[0].message.content
        except Exception as e:
            logging.error(f&amp;#34;エラーが発生しました: {e}&amp;#34;)
            return &amp;#34;申し訳ありませんが、応答を生成する際にエラーが発生しました。&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この辺をGPT-4oに聞いてみたのですが最近のコードを提示してくれなかったので、chatを作成する部分はgit-hubを参考に作りました。&lt;a href=&#34;https://github.com/openai/openai-python&#34;&gt;こちら&lt;/a&gt;です。&lt;/p&gt;
&lt;h3 id=&#34;flaskの設定と変更点&#34;&gt;Flaskの設定と変更点&lt;/h3&gt;
&lt;p&gt;それからFlaskの部分ですね。&lt;/p&gt;</description>
    </item>
    <item>
      <title>オープンソースのLLMアプリ開発プラットフォーム&#34;Dify&#34;を使ってみたよ</title>
      <link>https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/</link>
      <pubDate>Mon, 27 May 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/</guid>
      <description>&lt;h2 id=&#34;difyを使ったllm開発アプリの導入と設定&#34;&gt;Difyを使ったLLM開発アプリの導入と設定&lt;/h2&gt;
&lt;p&gt;LLM開発アプリの選択肢として&lt;strong&gt;Dify&lt;/strong&gt;があると聞いたので触ってみました。&lt;/p&gt;
&lt;p&gt;最後にはこんな感じになるといいなと思ったものになります。&lt;/p&gt;
&lt;h3 id=&#34;dify_クラウド版とローカル版の比較&#34;&gt;Dify_クラウド版とローカル版の比較&lt;/h3&gt;
&lt;p&gt;やり方は2つあります。クラウド版とローカル版の2つなります。お好きな方を使っていただければと思いますが、ローカル版のほうが個人的にはいいかと思います。&lt;/p&gt;
&lt;h3 id=&#34;クラウド版の導入方法&#34;&gt;クラウド版の導入方法&lt;/h3&gt;
&lt;p&gt;クラウド版に関しては登録するだけで使えます。画面はこんな感じ&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-24-122507-1024x505.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;ローカル版の導入手順&#34;&gt;ローカル版の導入手順&lt;/h3&gt;
&lt;p&gt;ローカル版はGItとDockerが必要になるのでない人はインストールから始めましょう&lt;/p&gt;
&lt;h3 id=&#34;difyのインストールとセットアップ&#34;&gt;Difyのインストールとセットアップ&lt;/h3&gt;
&lt;p&gt;DockerはDocker Desktopを導入しておけば大丈夫です。docker composeも入っているので一緒にインストールされます。&lt;/p&gt;
&lt;p&gt;ではコマンドプロンプトを開いて開発する場所にgit cloneでdifyをインストールします。コマンドはこちら&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone https://github.com/langgenius/dify.git
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;docker-composeの起動&#34;&gt;Docker Composeの起動&lt;/h3&gt;
&lt;p&gt;インストールが出来たらdocker compseを起動させるのでフォルダを移動します。開発場所にdifyをインストールできたと思うのでdockerフォルダに移動します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cd docker
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;フォルダの移動が出来たらdocker composeの起動をします。起動できるとこんな感じ&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-24-213753-1024x368.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;アプリ作成の開始&#34;&gt;アプリ作成の開始&lt;/h3&gt;
&lt;p&gt;起動したらURLを入力して画面を表示させてみましょう！クラウド版とそこまで変わりません。&lt;/p&gt;
&lt;p&gt;URL: &lt;a href=&#34;http://localhost/apps&#34;&gt;http://localhost/apps&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-24-122518-1024x507.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;テンプレートから作成でもいいですが、私は最初から作成してみました。こんな感じ。今回はチャットボットを作ってみますので適当に名前を付けて作成します。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-27-141846.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;llmモデルの設定&#34;&gt;LLMモデルの設定&lt;/h3&gt;
&lt;p&gt;アプリが出来たらこんな感じの画面ができます。今回はgptモデルを使っていこうと思います。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-24-153647-1024x508.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;設定から色んなLLMモデルを選ぶことができます。今回はOpenAIを使用するのでOpenAIのAPI-KEYをセットしました。他に使いたいモデルがあればそのAPI-KEYを設定すれば使えます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-27-142415.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;それから使用するモデルは&amp;quot;システムモデル設定&amp;quot;から設定します。他のモデルも設定すればそちらも使えるようになります。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-27-142716.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;ナレッジの登録&#34;&gt;ナレッジの登録&lt;/h3&gt;
&lt;p&gt;今回作るチャットボットはRAGなので次はナレッジを登録します。&amp;ldquo;知識を作成&amp;quot;からファイルを登録してインデックス化していきます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-27-144132-1024x244.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ファイルのアップロードをします。私が本来作りたいのは15000ファイル位あったのでそこまではアップしませんが、いくつか登録します。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-27-144144-1024x441.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;アップロードが完了してインデックス化が完了すると&lt;strong&gt;利用可能&lt;/strong&gt;というステータスになります。エラーになってるものは利用できないので、再試行かアップのし直しでインデックス化を試みてください。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-27-144255-1024x235.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;アプリのプロンプト設定とテスト&#34;&gt;アプリのプロンプト設定とテスト&lt;/h3&gt;
&lt;p&gt;ナレッジの登録が完了したらいよいよアプリの作成です。手順つまりプロンプトを設定して、コンテキストに作ったナレッジを設定します。今回は取得したナレッジを要約するように指示します。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-27-145241-1024x346.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;設定したら公開するからアプリ実行をします。するとチャット画面に移動します。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-27-111838-1024x344.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-27-145723.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Star Chatからチャットを打ってどんな感じか動かしてみます。まず使えるファイルが1つだけだったので&amp;quot;特許権について&amp;quot;と聞いてみました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-27-111816.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;中を見たのですが合っていました。とは言え私は法律の専門家ではないのでよくわかってないですが、雰囲気的には合ってそうです。&lt;/p&gt;
&lt;h3 id=&#34;エラーの対応と改善&#34;&gt;エラーの対応と改善&lt;/h3&gt;
&lt;p&gt;一応やってるときにエラーが出たりしたのでその時の話も共有します。アプリの作成途中でこんな感じのエラーが出ました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-25-190325-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/05/llm-dify-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-05-25-215608-1-1024x36.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;どうやら課金のチャージができていなかったようです。そこでOpenAIのサイトでチャージしたらこのエラーは解消されました。&lt;/p&gt;
&lt;p&gt;APIあまり使ってなかったのですが、こういうことが起こるので自動設定でチャージさせるようにしました。ただ、悪用されたら怖いので注意を払う必要がありますね。&lt;/p&gt;
&lt;h3 id=&#34;difyを活用した応用の可能性&#34;&gt;Difyを活用した応用の可能性&lt;/h3&gt;
&lt;p&gt;これがうまいことできれば他のファイルでもできそうなので色んなとこで応用できそうです。もちろんセキュリティの問題が付きまといますので専門的な知識や暗黙知とかのファイルであれば有効活用できそうですね。ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>RAGを開発してみたい！ので簡単なものでもいいので作ってみよう！part9</title>
      <link>https://xainome-blog.pages.dev/posts/2024/05/build-rag-app-part-9/</link>
      <pubDate>Fri, 24 May 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/05/build-rag-app-part-9/</guid>
      <description>&lt;p&gt;一旦行き詰ったのでここまでを記録として残しておきます。&lt;/p&gt;
&lt;p&gt;行き詰った内容としてはローカルで実行できないこと、無料枠のcolabを利用してもダメだったことです。&lt;/p&gt;
&lt;p&gt;今回実施した内容としては以下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ベクトルデータベースの完成&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;生成モデルを利用して質問＋ファイルの内容を分割してプロンプトを投げる&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;‘paraphrase-multilingual-mpnet-base-v2’を利用したベクトルデータベースの作成が完了したのでGithubにあげようとしたのですが、jsonファイルは2GB以上、zip化しても500MB以上あったので断念しました。100MB未満なら簡単にあげられるのですが、それ以上はもう少し手順が必要みたいです。&lt;/p&gt;
&lt;p&gt;このファイル作るのに1週間近くはかかるんだなと思いました。ファイル数が多かったのもあるかもしれませんが、こんなに大変なんだなと実感しました。&lt;a href=&#34;https://zenn.dev/knowledgesense/articles/346183afdf750e&#34;&gt;この記事&lt;/a&gt;でベクトルデータベースの容量削減について書かれていますが、精度とかはまだ分かってないのでなるほどぐらいで終わりました。&lt;/p&gt;
&lt;p&gt;生成モデルを利用したプロンプトの作成と推論コードはザックリと以下になります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    def load_or_download_genmodel(model_name: str, local_dir: str) -&amp;gt; tuple[PreTrainedTokenizer | PreTrainedTokenizerFast, PreTrainedModel|SentenceTransformer]:
    # ローカルディレクトリが存在しない場合は作成
    if not os.path.exists(local_dir):
        os.makedirs(local_dir)
    # モデルがローカルに存在するかをチェック
    if not (os.path.exists(os.path.join(local_dir, &amp;#39;config.json&amp;#39;)) and
            os.path.exists(os.path.join(local_dir, &amp;#39;tokenizer_config.json&amp;#39;))):
        # モデルが存在しない場合はダウンロードして保存
        print(f&amp;#34;Model not found locally. Downloading {model_name}...&amp;#34;)
        tokenizer = AutoTokenizer.from_pretrained(model_name, force_download=True)
        model = AutoModelForCausalLM.from_pretrained(model_name, force_download=True)
        print(f&amp;#34;Saving model and tokenizer to {local_dir}...&amp;#34;)
        tokenizer.save_pretrained(local_dir)
        model.save_pretrained(local_dir)
    else:
        # モデルが存在する場合はローカルからロード
        print(f&amp;#34;Loading generative model and tokenizer from {local_dir}...&amp;#34;)
        tokenizer = AutoTokenizer.from_pretrained(local_dir)
        model = AutoModelForCausalLM.from_pretrained(local_dir)
    
    return tokenizer, model

    def process_text_in_chunks(self, question, text, model, tokenizer):
        for chunk in chunks:
            prompt = f&amp;#34;{question}\n\n{chunk}&amp;#34;
            inputs = tokenizer(prompt, return_tensors=&amp;#34;pt&amp;#34;, max_length=50, truncation=True)
            input_ids = inputs[&amp;#34;input_ids&amp;#34;]
            attention_mask = inputs[&amp;#34;attention_mask&amp;#34;]
            output = self.generative_model.generate(input_ids=input_ids, attention_mask=attention_mask, max_new_tokens=100, num_beams=3)
            result_text = tokenizer.decode(output[0], skip_special_tokens=True)
            combined_result += result_text + &amp;#34;\n&amp;#34;
        
        return combined_result

    def main(self, question):
		    # コサイン類推度から近いファイルを取得し、テキストを抽出→ここでは省く
        result = self.process_text_in_chunks(question, text, self.generative_model, self.tokenizer)
        return result

if __name__ == &amp;#39;__main__&amp;#39;:
    # 生成モデルをロードまたはダウンロード
    tokenizer, gen_model = load_or_download_genmodel(gen_model_name, gen_local_dir)
    cos_sim_calc = CosSimCalc(gen_model, tokenizer, emb_model)
    cos_sim_calc.main(question = &amp;#39;著作権について教えて下さい。&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;いろいろ試して見たんですがローカルだと動かないですし、高性能GCPを買うまではいかないので、クラウドで実行するかOpenAIなどのAPIに頼ることになりそうです。&lt;/p&gt;</description>
    </item>
    <item>
      <title>RAGを開発してみたい！ので簡単なものでもいいので作ってみよう！part8</title>
      <link>https://xainome-blog.pages.dev/posts/2024/05/build-rag-app-part-8/</link>
      <pubDate>Tue, 14 May 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/05/build-rag-app-part-8/</guid>
      <description>&lt;p&gt;前回問題としていたベクトル化についてですが解決して、ようやく2つ目の目標が終わりました！&lt;/p&gt;
&lt;p&gt;まずはこちらをご覧ください。&lt;/p&gt;
&lt;p&gt;こんな感じになりました。&lt;/p&gt;
&lt;p&gt;今はまだファイル数は20~30なのでまだまだ足りませんが、前回に比べるとかなりましになりました。&lt;/p&gt;
&lt;p&gt;今回やったこととしては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OpenAIのベクトル化からSentence Transformerを使用したベクトル化に変更&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;全ファイルをベクトルデータベースとしてjsonファイルに格納&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;になります。そのため一旦別プログラムでファイルを全てベクトル化し、画面に表示をさせるときはそのファイルを読み込んで類似度の計算を行っています。&lt;/p&gt;
&lt;p&gt;前のコードとそこまでは変わってないので変わった部分で言うと&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;class PDFToVector:
    def __init__(self, model_name: str):
        # モデルを読み込み
        self.model = SentenceTransformer(model_name)

    def split_text2vector(self, text: str, max_tokens=200) -&amp;gt; List[float]:
        vectors = []
        for i in range(0, len(text), max_tokens):
            segment = text[i:i+max_tokens]
            vector = self.model.encode(segment, convert_to_tensor=True)
            vectors.append(vector)
        average_vector = np.mean(vectors, axis=0).tolist()

    def embed_sentence(self, text: str, vector_fol: str, filename: str, vector_database: List) -&amp;gt; List:
        embedding = self.split_text2vector(text)
        vector = {
            &amp;#39;title&amp;#39;: filename,
            &amp;#39;body&amp;#39;: text,
            &amp;#39;embedding&amp;#39;: embedding
        }
        vector_database.append(vector)
        
    def main(self):
        # ベクトルデータベースを格納
        with open(vector_db_json, &amp;#39;w&amp;#39;, encoding=&amp;#39;utf-8&amp;#39;) as file:
            json.dump(vector_database, file, ensure_ascii=False, indent=4)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こんなとこだと思います。一部処理を省略していますが大体の変わったとこはここになります。&lt;/p&gt;</description>
    </item>
    <item>
      <title>RAGを開発してみたい！ので簡単なものでもいいので作ってみよう！part7</title>
      <link>https://xainome-blog.pages.dev/posts/2024/05/build-rag-app-part-7/</link>
      <pubDate>Thu, 09 May 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/05/build-rag-app-part-7/</guid>
      <description>&lt;p&gt;目標としていた部分が完成したのでデモ版という形でお見せしようと思います。&lt;/p&gt;
&lt;p&gt;想定していた形が取れたので割と嬉しいですね！ただ、上記はファイルが2つの場合でこのくらい時間がかかっています。&lt;/p&gt;
&lt;p&gt;次はファイルが5つの場合です。&lt;/p&gt;
&lt;p&gt;かなり時間がかかってますね。というのも実行するたびファイルをベクトル化しているので時間がかかる仕組みになっています。&lt;/p&gt;
&lt;p&gt;実行するたびopenaiのAPIもたたいているので料金も増えていきます。ということで次の課題は&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;openaiのベクトル化ではない代替手段を見つける&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ベクトルデータベースを作成する(すべてのファイルをベクトル化して、どこかに保存)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ひとまずはこの2つですかね？&lt;/p&gt;
&lt;p&gt;代替手段は見つければ何とかなりそうなので時間はかからないと思いますが、ベクトルデータベースの作成は異なるプログラムを作る必要がありそうですし、質問をベクトル化するプログラムの改修も入りそうなので少し時間がかかるかもですね。&lt;/p&gt;
&lt;p&gt;第二目標ほど時間はかからないと思いますが…&lt;/p&gt;
&lt;p&gt;今回修正した箇所はflaskを使用した場所と応答画面の作成になります。flaskは微修正だったので割愛しますが、画面のほうは以下のようになりました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#39;use client&amp;#39;;

import { useState } from &amp;#39;react&amp;#39;;

export default function QuestionForm() {
  // サーバーからの結果を保持する状態変数
  const [result, setResult] = useState(&amp;#39;&amp;#39;);

  const handleSubmit = async (e) =&amp;gt; {
    e.preventDefault();
    const question = e.target.elements.question.value;

    // サーバーにPOSTリクエストを送る
    const response = await fetch(&amp;#39;http://localhost:5000/process&amp;#39;, {
      method: &amp;#39;POST&amp;#39;,
      headers: {
        &amp;#39;Content-Type&amp;#39;: &amp;#39;application/json&amp;#39;
      },
      body: JSON.stringify({ query: question })
    });

    // サーバーからのレスポンスをJSON形式で取得
    const data = await response.json();
    // 結果を状態変数に保存
    setResult({ title: data.title, body: data.body, similarity: data.similarity } || &amp;#39;No result returned&amp;#39;); // デフォルトで&amp;#34;結果がない&amp;#34;と表示
    e.target.reset();
  }

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;form onSubmit={handleSubmit}&amp;gt;
        &amp;lt;textarea
          name=&amp;#34;question&amp;#34;
          placeholder=&amp;#34;質問を入力してください&amp;#34;
          rows={5}
        /&amp;gt;
        &amp;lt;button type=&amp;#34;submit&amp;#34;&amp;gt;送信&amp;lt;/button&amp;gt;
      &amp;lt;/form&amp;gt;
      
      {/* サーバーからの結果を表示 */}
      &amp;lt;div&amp;gt;
        &amp;lt;h3&amp;gt;回答:&amp;lt;/h3&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;タイトル:&amp;lt;/strong&amp;gt; {result.title}&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;類似度:&amp;lt;/strong&amp;gt; {result.similarity}&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;内容:&amp;lt;/strong&amp;gt; {result.body}&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;画面にタイトルと類似度と内容が表示されるようになってます。必要ないかもしれませんが、デフォルトでは結果が表示されない文言を出しています。多分出ることはないですが…&lt;/p&gt;</description>
    </item>
    <item>
      <title>RAGを開発してみたい！ので簡単なものでもいいので作ってみよう！part6</title>
      <link>https://xainome-blog.pages.dev/posts/2024/05/build-rag-app-part-6/</link>
      <pubDate>Sat, 04 May 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/05/build-rag-app-part-6/</guid>
      <description>&lt;p&gt;PCが故障したという話をしたのですが、コンセントから電源が抜けてたというオチでした。&lt;/p&gt;
&lt;p&gt;なのでRAGの開発を再開しました！&lt;/p&gt;
&lt;p&gt;前回開発した部分は&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;質疑応答画面の作成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回開発する部分は&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;画面(Next.js)から送られるデータを受け取るエンドポイントをFlaskに設定&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ベクトル化するプログラムをクラス化&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Flaskも触ったことないのでChat-GPTに質問しながら触ってました。一旦中身は以下の内容にしています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;from flask import Flask, request, jsonify
from flask_cors import CORS
import pdf_to_model
import logging

logging.basicConfig(level=logging.DEBUG)
app = Flask(__name__)
CORS(app)

@app.route(&amp;#39;/process&amp;#39;, methods=[&amp;#39;POST&amp;#39;])
def process_question():
    data = request.get_json()
    query = data.get(&amp;#39;query&amp;#39;)
    logging.debug(&amp;#34;Received query: %s&amp;#34;, query)
    try:
        vector = pdf_to_model.PDFToVector()
        result = vector.main(query)
        # 結果を JSON 形式で返す
        return jsonify(result[0])
        # return jsonify({&amp;#39;result&amp;#39;: &amp;#39;Processed result of &amp;#39; + query})
    except Exception as e:
        logging.error(&amp;#34;Error processing query: %s&amp;#34;, str(e))
        return jsonify({&amp;#39;error&amp;#39;: str(e)}), 500

if __name__ == &amp;#34;__main__&amp;#34;:
    app.run(debug=True)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ログの設定はする必要はないですが、まだ開発段階なので一旦設定しています。それから&amp;quot;CORS(app)&amp;ldquo;ですね。少し調べたのですが異なるオリジン間でのリソース共有を可能にするために必要な設定みたいです。そもそも同一のオリジンとは以下の3つが同じであることが条件です。&lt;/p&gt;</description>
    </item>
    <item>
      <title>PC故障したので開発を中断しています</title>
      <link>https://xainome-blog.pages.dev/posts/2024/04/pc-failure-paused-development/</link>
      <pubDate>Wed, 24 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/04/pc-failure-paused-development/</guid>
      <description>&lt;p&gt;題名の通りPCが故障しました( ;∀;)&lt;/p&gt;
&lt;p&gt;使っていたのは&lt;a href=&#34;https://kakaku.com/item/K0001372153/&#34;&gt;こちら&lt;/a&gt;になります。&lt;/p&gt;
&lt;p&gt;性能としてはに以下になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RAM: 16GB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SSD: 512G&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;11世代 Core i5&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GeForce RTX 3050 + Intel UHD Graphics&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;修理に関しては&lt;a href=&#34;https://www.smaphodock24.jp/&#34;&gt;パソコン修理24&lt;/a&gt;に依頼しました。近場の店舗に問診票を提出したので返信が返ってきたら出してこようと思います。&lt;/p&gt;
&lt;p&gt;もう一つ&lt;a href=&#34;https://www.4900.co.jp/&#34;&gt;PCホスピタル&lt;/a&gt;という場所もありましたが、値段が少しだけ高かったので見送りました。とはいえ5千円くらいですし、Googleの口コミだと悪い評価もあったので次回故障した場合はこっちに頼もうかと思いますが…&lt;/p&gt;
&lt;p&gt;作ったものをGithubにしっかりとコミットしておけばよかったのですが、面倒だったのでやらなかったのが失敗でした。修理から帰ってきたら変更のたびにコミットしようと思います。&lt;/p&gt;
&lt;p&gt;社内で作ったものであれば更新するたびにコミットしてますが、現場では修正が完了したらコミットなので見直した方がいいのかもしれないですね。&lt;/p&gt;
&lt;p&gt;一応次回はFlaskを使ってpythonとNext.jsの受け渡しの部分を行おうと思っています。&lt;/p&gt;
&lt;p&gt;また、前回Next.jsを選定した理由を書きましたが、コストの面について考えていなかったのでもしかしたらReactに変えるかもしれません。予定は未定です。&lt;/p&gt;
&lt;p&gt;少し落ち込んでますが、この修理が完了するまではVRで遊んだり本を読んだりして日々を過ごそうかと思います。ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>RAGを開発してみたい！ので簡単なものでもいいので作ってみよう！part5</title>
      <link>https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-5/</link>
      <pubDate>Mon, 22 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-5/</guid>
      <description>&lt;p&gt;さて前回までやったこととしては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;全データのベクトル化(途中で断念)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;画面の作成(Next.jsのインストールと起動)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;というところまでやってみました。今回は&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;質疑応答画面の作成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;というところまでやってみます。Next.jsは初めて触るので進みが遅々としていますがご了承ください。&lt;/p&gt;
&lt;p&gt;さてインストールするタイミングでこのようなことを聞かれました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Would you like to use TypeScript? » No / Yes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Would you like to use ESLint? » No / Yes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Would you like to use &lt;code&gt;src/&lt;/code&gt; directory? » No / Yes&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;他にもいくつか聞かれたので一応Claudeにどんな意味があって導入することのメリットデメリットを聞きながら質問に答えました。大体Yesにしましたが…&lt;/p&gt;
&lt;p&gt;さて前回の画面表示まで行けたのでここからどう作業を進めればいいのかわかってなかったので聞いてみました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-5/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-21-144001.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ということで質疑応答画面を作っていきます。本格的なデザインは気にせずに簡易的なものを作っていきます。&lt;/p&gt;
&lt;p&gt;と言ってもからコード書くのは大変ですし、学ぶのにも時間がかかるので今回もClaudeに手伝ってもらおうと思います。それで最初書いてもらったコードがこちら&lt;/p&gt;
&lt;p&gt;page.jsx&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import QuestionForm from &amp;#39;./components/QuestionForm&amp;#39;;

const HomePage = () =&amp;gt; {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;RAGシステム&amp;lt;/h1&amp;gt;
      &amp;lt;QuestionForm /&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}

export default HomePage;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;QuestionForm.jsx&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import { useState } from &amp;#39;react&amp;#39;;

const QuestionForm = () =&amp;gt; {
  const [question, setQuestion] = useState(&amp;#39;&amp;#39;);

  const handleSubmit = (e) =&amp;gt; {
    e.preventDefault();
    // 質問をサブミットする処理をここに書く
    console.log(&amp;#39;Submitted question:&amp;#39;, question);
    setQuestion(&amp;#39;&amp;#39;);
  }

  return (
    &amp;lt;form onSubmit={handleSubmit}&amp;gt;
      &amp;lt;textarea
        value={question}
        onChange={(e) =&amp;gt; setQuestion(e.target.value)}
        placeholder=&amp;#34;質問を入力してください&amp;#34;
        rows={5}
      /&amp;gt;
      &amp;lt;button type=&amp;#34;submit&amp;#34;&amp;gt;送信&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  )
}

export default QuestionForm;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ちなみに上記の書いてる内容はよくわかってないのでこっちはChat-GPTに解説してもらってました。新卒の時の研修で書いたHTMLやJSを思い出します。&lt;/p&gt;</description>
    </item>
    <item>
      <title>RAGを開発してみたい！ので簡単なものでもいいので作ってみよう！part4</title>
      <link>https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-4/</link>
      <pubDate>Fri, 19 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-4/</guid>
      <description>&lt;p&gt;前回で一通り作りたいものが作れたのでこの先はWebアプリ化できないかな～？という緩い感じで進めていこうと思います。&lt;/p&gt;
&lt;p&gt;前回行ったのは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;検索クエリのベクトル化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コサイン類似度の計算&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回行ったのは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;pdfファイルの全データベクトル化(途中で断念)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Web画面の作成(一部)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;pdfファイルのベクトル化に関しては前回やったのでそれをfor文で回してます。pdfは1つ1つ出力するようにして、後ほど全体を結合しようとしていました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;file_path_list = glob.glob(input_pdf+&amp;#39;/*.pdf&amp;#39;)
for pdf_path in file_path_list:
    # 前回やったベクトル化
    ・
    ・
    ・
    # JSON形式でベクトルデータベースを保存
    with open(json_save_name, &amp;#39;w&amp;#39;, encoding=&amp;#39;utf-8&amp;#39;) as file:
        json.dump(vector_database, file, ensure_ascii=False, indent=4)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;大体2500ファイルぐらいベクトル化したのですが、9$くらいになってました。残り12000ファイルほどあるので少し時間がかかるのと料金も計50$近くになりそうだったのでいったん中断しました。&lt;/p&gt;
&lt;p&gt;別の作業としてWeb画面を作っていこうと思ったのでまずは技術の選定からですね。ここに関してはChat-GPTとClaude両方に聞いてみましたが、Claudeのほうを採用しました。こんな感じです。Googleストアと書いたんですが1ミリも予定はないです（笑）&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-4/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-19-135322.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;返ってきた回答がこちら&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-4/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-19-135447.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ということでおすすめにしたがってNext.jsにしようと思います。ユーザーのストレスを考えるのは今じゃなくてもいいんですがせっかく自身のスキルにもつながるので選びました。&lt;/p&gt;
&lt;p&gt;ちなみにおススメした理由とかわかってなかったのでいくつか聞いてみました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;なぜNext.js(React)+Tailwind CSS や Vue.js はreactに比べてユーザーにストレスがかかりにくいのですか？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;単一ページアプリケーション(SPA)とはどういうものでしょうか？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Flash Of Unstyled Content(FOUC)や、SPAでよくみられるバンク画面の発生とはどういったものでしょうか？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;バックエンドではpythonを使用しているのでpythonフレームワークのflaskやdjangoという選択肢もあったと思いますが、なぜ候補から外れたのでしょうか？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;フロントエンドフレームワークとバックエンドWebフレームワークの違いは何ですか？&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そこからいろいろ聞いていた結果、Next.jsとFlask(python)の組み合わせにしようと思います。Webについては全く分からなかったので色々聞いてみました。流れとしては以下の感じです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Web画面から入力を受け取る&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;画面から受け取った入力を引数としてpythonに渡す&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pythonで引数をベクトル化しコサイン類似度の計算を行う&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pdfファイルを全てベクトル化して結合したものを取得して、入力に類似しているファイルのタイトルと内容を取得する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;取得したタイトルと内容を画面に表示する&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1と5がNext.js、2がflask、3と4がpythonという流れでやる予定で、今回は1をやっていきます。&lt;/p&gt;
&lt;p&gt;というわけでまたClaudeに使い方を聞いて進めていきます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-4/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-19-144643.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;これでインストールとプロジェクトの作成が完了して、デフォルトの画面が表示されるようになりました。こんな感じです。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-4/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-19-145303-1024x597.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;私はvscodeを使っているのですがターミナルからうまく実行できてないので少し調べる必要がありますね。それから&amp;quot;AppData/Roaming&amp;quot;の中にnpmというファイルが必要なのですが、インストールで作成されなかったので手動で作成したりと少し導入で手間取ってしまいました。&lt;/p&gt;
&lt;p&gt;今回はここまでにして次回は簡単な画面を作成していこうと思います。恐らく稚拙な画面になりそうですがまずは作るとこらからです。ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>RAGを開発してみたい！ので簡単なものでもいいので作ってみよう！part3</title>
      <link>https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-3/</link>
      <pubDate>Sun, 14 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-3/</guid>
      <description>&lt;p&gt;このpartで目標としていた基本形は作れたことになります。簡単な質問で&amp;quot;タイトル&amp;quot;と&amp;quot;内容&amp;quot;が返ってくるものになります。&lt;/p&gt;
&lt;p&gt;前回やったのは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;特殊文字の削除&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;大文字小文字統一&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ベクトル変換&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回行ったのは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;検索クエリのベクトル化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コサイン類似度の計算&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;になります。ベクトル化に関しては前回も行ったので同じものになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# これが検索用の文字列
QUERY = &amp;#39;保険金が欲しい&amp;#39;
# 検索用の文字列をベクトル化
query = openai.embeddings.create(
    model=&amp;#39;text-embedding-3-large&amp;#39;,
    input=QUERY
)
# ベクトル取得
query = query.data[0].embedding
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ちなみにモデルの部分に関しては&amp;rsquo;text-embedding-3-large&amp;rsquo;の他に&amp;rsquo;text-embedding-3-small&amp;rsquo;もありますのでお好きな方を使ってください。精度はlargeのほうがいいですが料金は下がると思います。&lt;/p&gt;
&lt;p&gt;次はコサイン類似度の計算になります。こちらは昔OpenAIでも提供されていたみたいですが、前のバージョンで提供されていたみたいなので他のもので代用します。簡単に自作できますがめんどくさい方はsklearnでも提供されているのでそちらを使ってください。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import numpy as np

def cosine_similarity(v1, v2):
    # ベクトルのドット積
    dot_product = np.dot(v1, v2)
    # ベクトルのノルム
    norm_v1 = np.linalg.norm(v1)
    norm_v2 = np.linalg.norm(v2)
    # コサイン類似度
    similarity = dot_product / (norm_v1 * norm_v2)
    return similarity

# 総当りで類似度を計算
results = map(
        lambda i: {
            &amp;#39;title&amp;#39;: i[&amp;#39;title&amp;#39;],
            &amp;#39;body&amp;#39;: i[&amp;#39;body&amp;#39;],
            # ここでクエリと各文章のコサイン類似度を計算
            &amp;#39;similarity&amp;#39;: cosine_similarity(i[&amp;#39;embedding&amp;#39;], query)
            },
        vector_database
)
# コサイン類似度で降順（大きい順）にソート
results = sorted(results, key=lambda i: i[&amp;#39;similarity&amp;#39;], reverse=True)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで関連するファイルと内容が取得できます。&amp;lsquo;result[0]&amp;lsquo;であれば最も関連するもの、&amp;lsquo;result[-1]&amp;lsquo;であれば関連しないものあるいは反対のものになります。反対かどうかはコサイン類似度の値が負の値になってるかで確認できます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>RAGを開発してみたい！ので簡単なものでもいいので作ってみよう！part2</title>
      <link>https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-2/</link>
      <pubDate>Fri, 12 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-2/</guid>
      <description>&lt;p&gt;このpartで基本が8割がた作れました。内容としては簡単な質問をすると&amp;quot;タイトル&amp;quot;と&amp;quot;内容&amp;quot;が返ってくる程度です。まだまだ理想には遠いですね。&lt;/p&gt;
&lt;p&gt;前回やったのは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;PDFファイル読み込み&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ページ番号取得と削除&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;色んな空白を削除&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回行ったのは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;特殊文字の削除&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;大文字小文字統一&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ベクトル変換&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この辺も全てChat-GPT任せでした。特殊文字に関してはURLとメールアドレス、特殊文字の削除になります。まあ私が扱ってるものの中にURLやメールアドレスはあまりなさそうですが、一般的には必要だと思います。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;text = re.sub(r&amp;#39;http[s]?://\S+&amp;#39;, &amp;#39;&amp;#39;, text)
text = re.sub(r&amp;#39;\S*@\S*\s?&amp;#39;, &amp;#39;&amp;#39;, text)
text = re.sub(r&amp;#39;[!#\$%&amp;amp;\&amp;#39;()*+,\-./:;&amp;lt;=&amp;gt;?@\[\\\]^_`{|}~]&amp;#39;, &amp;#39;&amp;#39;, text)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;次は大文字小文字の統一ですね。これが少し特殊ですが例えば &amp;ldquo;１２３ａｂｃｱｲｳｴｵ①②③¹²³&amp;quot;という文字があった時に&amp;quot;123abcアイウエオ123123&amp;quot;となるように変換しています。これもあまり使われてないと思いますが、一応変換しています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;normalized_text = &amp;#39;&amp;#39;.join([unicodedata.normalize(&amp;#39;NFKC&amp;#39;, char) if not unicodedata.east_asian_width(char) in (&amp;#39;F&amp;#39;, &amp;#39;W&amp;#39;, &amp;#39;A&amp;#39;) else char for char in text])
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;それからベクトル変換ですね。OpenAIの埋め込みベクトルに変換していきます。課金が必要なので他のやり方がないか考えたいところですが、簡単に実装するために使用します。いつかはTF-IDFかWord2Vecを使ってみたいです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;openai.api_key = os.environ[&amp;#39;OPENAI_API_KEY&amp;#39;]
vector_database.append({
        &amp;#39;title&amp;#39;: filename,
        &amp;#39;body&amp;#39;: text,
        &amp;#39;embedding&amp;#39;: vector
    })
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;課金といっても10000字くらい埋め込みベクトルに使っても0.01$もかかりませんので数円くらいならお試しで触ってみてください。&lt;/p&gt;
&lt;p&gt;一つだけ注意点を話すと8192トークンまでしか入力として受け取れないので、もし文字数が多くなる場合は分割して、それぞれの平均を取るといいかと思います。私の場合はとりあえず7000文字くらいで分割しています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;for i in range(0, len(text), max_tokens): # max_tokens=7000
    segment = text[i:i+max_tokens]
    res = openai.embeddings.create(
            model=&amp;#39;text-embedding-3-large&amp;#39;,
            input=segment
        )
    vectors.append(res.data[0].embedding)
average_vector = np.mean(vectors, axis=0).tolist()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;そういえばいつからかはわかりませんが埋め込みベクトルの数値を取り出す方法が変わってたみたいで、&amp;lsquo;res[data][0][embedding]&amp;rsquo; から &amp;lsquo;res.data[0].embedding&amp;rsquo;に変わっています。前の方法が良ければバージョンを下げていただければ大丈夫です。&lt;/p&gt;</description>
    </item>
    <item>
      <title>RAGを開発してみたい！ので簡単なものでもいいので作ってみよう！part1</title>
      <link>https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-1/</link>
      <pubDate>Sun, 07 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-1/</guid>
      <description>&lt;p&gt;大規模言語モデルが出てきてChat-GPTやGemini、Claudeが出てきましたが、&amp;ldquo;ハルシネーション&amp;quot;は中々解決できない問題ですね。人間でも勘違いや嘘を堂々と言うことはあるのでどっこいどっこいですが、なるべくなら減らしていきたいですね。&lt;/p&gt;
&lt;p&gt;そこで出てくるのが&amp;quot;RAG&amp;quot;になります。RAG（Retrieval-Augmented Generation）は、情報検索を組み込んだ生成モデルで、特に自然言語処理タスクでの応用が注目されています。RAGは、大量のテキストデータから関連情報を検索し、その情報を基に関連するテキストを生成します。&lt;/p&gt;
&lt;p&gt;というわけで開発手順をChat-GPTとClaudeに聞いてみました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-1/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-05-220738.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-1/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-05-220750-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;大体似たような回答になりました。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;データセットの準備と前処理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;検索エンジンの構築&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;学習済みモデルの構築&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RAGモデルの構築(検索エンジンと学習済みモデルを統合)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;モデルのトレーニング&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;モデルの評価と調整&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という流れになりました。&lt;/p&gt;
&lt;p&gt;データセットの準備のほうはできています。私は昔作った&lt;a href=&#34;https://github.com/sai-nome/precedent_conjugation&#34;&gt;こちら&lt;/a&gt;を再利用しようと思いますが、論文やら書籍をダウンロードしたほうが楽だと思います。&lt;/p&gt;
&lt;p&gt;というわけでデータセットの準備が終わったので今度は前処理をしていこうと思います。私のデータはPDFになってるので文字を抽出して、不要な文字を削除するところまでやります。&lt;/p&gt;
&lt;p&gt;ということでgithubには登録しましたが一部コードをピックアップして&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# PDFPage.create_pages()を使用してページのリストを取得し、その長さを数える
page_count = len(list(PDFPage.create_pages(document)))

# スペース、タブ、改行を削除
text = text.replace(&amp;#39; &amp;#39;, &amp;#39;&amp;#39;).replace(&amp;#39;\t&amp;#39;, &amp;#39;&amp;#39;).replace(&amp;#39;\n&amp;#39;, &amp;#39;&amp;#39;)
# 正規表現を使って他の空白文字を削除
text = re.sub(r&amp;#39;\s+&amp;#39;, &amp;#39;&amp;#39;, text)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;簡単ではありますがページ番号の削除と空白削除を行いましたので、とりあえず次のステップに進もうと思います。何をしたらいいかChat-GPTとClaudeに聞いてみました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-1/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-06-232405.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-1/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-06-232351.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Claude曰く形態素解析や正規化は行わなくてもいいみたいなので、一旦インデックスの作成をやっていこうと思います。ただ色々試行錯誤してやった方が精度が上がりそうであればやろうと思います。&lt;/p&gt;
&lt;p&gt;ところでClaudeに聞いたときこのような解答が返ってきたことがありました。野球って何でしょうか？（笑）&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/04/build-rag-app-part-1/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-06-232321.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ということで引き続き開発を進めていこうと思います。この先llamaindeを使うのか他のAPIを使うのか、ベクトルデータベースはどうするのか調べながら考えてみようと思います。ではでは&lt;/p&gt;</description>
    </item>
    <item>
      <title>やっていたKaggleのコンペが終わったので少し振り返る</title>
      <link>https://xainome-blog.pages.dev/posts/2024/04/kaggle-competition-retrospective/</link>
      <pubDate>Mon, 01 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/04/kaggle-competition-retrospective/</guid>
      <description>&lt;p&gt;私が参加していたコンペ(&lt;a href=&#34;https://www.kaggle.com/competitions/playground-series-s4e3&#34;&gt;こちら&lt;/a&gt;)が終わったので少し振り返ってみようと思います。&lt;/p&gt;
&lt;p&gt;一応私の経歴を軽く話すとデータサイエンティスト的な仕事をしつつも予測や分類自体はしたことなく、データセットの作り方や加工の作業がメインでpythonに関してはある程度分かっているという状況です。&lt;/p&gt;
&lt;p&gt;そのうえでG検定やE資格を取得済みなので、機械学習や深層学習の知識はある程度ある形でKaggleを始めて挑んでみました。&lt;/p&gt;
&lt;p&gt;定石としてタイタニックを触るべきですが、タイタニックのランキングを見てもつまらないので今開催されているSwagやKnowledgeと呼ばれるタイプのコンペに参加してみることをおススメします。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93-%E9%96%80%E8%84%87-%E5%A4%A7%E8%BC%94/dp/4297108437&#34;&gt;こちら&lt;/a&gt;の本でも言及されているのですがどうもタイタニックのデータは初心者向けではないみたいです。初心者を抜けた人向けなイメージです。&lt;/p&gt;
&lt;p&gt;それはさておき今回のコンペでは一旦自身で加工してみてモデルを作って提出をするという流れをやってみました。&lt;/p&gt;
&lt;p&gt;そこまでは前回のブログでも書いてました。その後ですが他の人のコードをを見て、Chat-GPTに解説してもらって分からない点を質問するということをひたすら繰り返してました。&lt;/p&gt;
&lt;p&gt;いくつかピックアップすると&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ワンホットエンコーディングした時、出現回数が最も少ないカラムを削除していた。なぜ削除するのか？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;テストデータセットの全行数に対してユニークな値の割合が5%未満のカラムを取得するのはなぜですか？どのような意味がありますか？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特徴量間のピアソン相関を計算するのはなぜか？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optunaの研究（study）を最適化とはどういう意味か？&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という感じでたくさんの質問を投げてみました。その後帰ってきた返答に関してわからなかった部分もさらに深堀して聞くということを繰り返していました。&lt;/p&gt;
&lt;p&gt;そこで理解した点としては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ユニーク値が少ない値に関してはワンホットエンコーディングを行うのが有効←その前にやることがある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特徴量を減らすには全体行の5%未満の値でもいいが、クロスバリデーションで特徴量の有無を見てモデルの評価を行ったほうがよい&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ヒートマップは線形関係に関しては有効だが非線形関係には向いてない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ワンホットエンコーディングした際、訓練データまたはテストデータ片方にしかないデータが存在することがあるので、1つにまとめるアプローチがある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optunaを使ってハイパーパラメータの最適化を行える&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;私の中ではヒートマップで各特徴量の相関を見たほうがいいと思っていたのですが、線形関係であれば見るべきであって、非線形関係であれば意味は少ないというのは新しい発見でした。よく考えればわかることではありますが（笑）&lt;/p&gt;
&lt;p&gt;それからクロスバリデーションで特徴量の有無によってモデルの評価と比較をすることができることは知りませんでした。クロスバリデーションはただデータセットを分割して検証をするだけで、特徴量の有無まで比較できるとは思ってませんでした。&lt;/p&gt;
&lt;p&gt;ここで私のコンペは終了しました。上記の気づきをコードに落とし込むことができませんでした。上の解説や質問と返答の理解に時間を費やしてました。まあ土日はゲームをしてたので結局やらずに終わっただけですが…&lt;/p&gt;
&lt;p&gt;コンペが終わった後のスコアとディスカッションも見てたのですが、public1位の人がprivateでは200位台になってたりしてそんなこともあるのかと思いながら見てました。&lt;/p&gt;
&lt;p&gt;ちなみに私は8個ほど順位を落としてました。そこまで熱心にデータの加工やパラメータの調整をしてないので気にしてないですが&lt;/p&gt;
&lt;p&gt;さてこのコンペが終わったのでまた次のコンペにも挑戦しようかと思います。まだSwagかKnowledgeに挑戦してみます。また現場で画像系のAIを作るみたいなので画像コンペにも参加してみようと思います。果たして役に立つのか不明ですが&lt;/p&gt;
&lt;p&gt;また今回の解説だったり質問の返答などは正しいとは限らないのでもう少し精査しようと思います。少しづつでも確実に自身の知恵としていきたいですね。ではでは&lt;/p&gt;</description>
    </item>
    <item>
      <title>最近の生成AIを3つほど試してみたよ！</title>
      <link>https://xainome-blog.pages.dev/posts/2024/03/three-generative-ai-tools-tested/</link>
      <pubDate>Thu, 28 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/03/three-generative-ai-tools-tested/</guid>
      <description>&lt;p&gt;OpenAIから&amp;quot;Sora&amp;quot;のお披露目があり、夏に&amp;quot;GPT-5&amp;quot;がでるという発表がありましたね。&lt;/p&gt;
&lt;p&gt;最近の生成AIはすごいなあと思いながら過ごしてますが、たまたま見つけた動画生成AI2つと音楽生成AIを見つけたので試してみました。全てGoogleのアカウントアあれば無料で試せますので興味があれば試してみてください！&lt;/p&gt;
&lt;p&gt;まずは&lt;a href=&#34;https://app.pixverse.ai/creative/list&#34;&gt;PixVerse&lt;/a&gt;ですね。テキストから動画を生成できます。時間は4秒だけですが一応できます。少し触ってみましたが思ったような動画を作るのは大変そうです。&lt;/p&gt;
&lt;p&gt;このときは&amp;quot;Giant bee stings bear&amp;quot;というプロンプトを入れてみました。想定とは違いますが欲しい物体は出てきましたね。&lt;/p&gt;
&lt;p&gt;次の動画生成AIは&lt;a href=&#34;https://haiper.ai/&#34;&gt;Haiper&lt;/a&gt;です。こちらでも同様のプロンプトをいれてみました。熊が出てこず蜂が前面に出てきて、人によっては嫌悪感を抱くかと思いますのでリンクだけ貼っておきます。興味があれば見てください。&lt;a href=&#34;https://app.haiper.ai/creation/66056e26d8fca66688e2341a&#34;&gt;こちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;蜂が蜂を食べてるみたいな動画でそれも不気味なんですよね。こちらは2秒だけですがPixVerseよりも精度や解像度はよさそうです。いいプロンプトを見つけてみたいものです。&lt;/p&gt;
&lt;p&gt;最後は音楽生成AIの&lt;a href=&#34;https://www.suno.ai/&#34;&gt;Suno&lt;/a&gt;です。入れてみたプロンプトは&amp;quot;A giant bee stings a bear in anger and rejoices when it is repelled.&amp;ldquo;になります。感情を入れてみました。&lt;/p&gt;
&lt;p&gt;できた音楽は2つになります。&lt;a href=&#34;https://app.suno.ai/song/1924cfa2-2626-43f3-a732-3cd2245cdb0f&#34;&gt;これ&lt;/a&gt;と&lt;a href=&#34;https://app.suno.ai/song/0e74d95c-c448-4ec9-bb89-f11c0cf2d3ca&#34;&gt;これ&lt;/a&gt;です。生成されたサムネはよくわかりませんが喜びを表した音楽ができました。また、歌詞も出ており英語で歌もついています。2つの歌詞は同じですが音楽が異なるのですごいなと感じましたね。ちなみに歌詞は下記&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Verse]
In the forest, giant bee is on the prowl (oh yeah)
Buzzin&amp;#39; &amp;#39;round, lookin&amp;#39; for some mischief now (oh-oh)
Spots a bear, thinks it&amp;#39;s time to have some fun (oh yeah)
Stings it hard, the battle has just begun (woo)

[Verse 2]
But the bear retaliates, swipes with all its might (oh no)
Giant bee is repelled, takes flight into the night (oh-oh)
Feelin&amp;#39; the sting, buzzing with adrenaline (oh yeah)
But still it&amp;#39;s jumpin&amp;#39; back, ready to sting again (woo)

[Chorus]
Buzzin&amp;#39; bee, buzzin&amp;#39; bee, flying wild and free (oh yeah)
Stingin&amp;#39; bear, stingin&amp;#39; bear, a rivalry we see (oh-oh)
Buzzin&amp;#39; bee, buzzin&amp;#39; bee, never gonna run (woo)
Keep on buzzin&amp;#39;, keep on stinging for fun (oh yeah)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こんな感じで色んな生成AIを触ってみました。他にも日本から出た画像生成AIの&lt;a href=&#34;https://akuma.ai/ja&#34;&gt;Akuma&lt;/a&gt;でしたり、&lt;a href=&#34;https://sakana.ai/evolutionary-model-merge-jp/&#34;&gt;Sakana AI&lt;/a&gt;という低コストで精度が高いモデルが作られたりしています。&lt;/p&gt;</description>
    </item>
    <item>
      <title>生成AIのさらなる進化と今後の仕事について</title>
      <link>https://xainome-blog.pages.dev/posts/2024/03/generative-ai-evolution-and-future-of-work/</link>
      <pubDate>Tue, 26 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/03/generative-ai-evolution-and-future-of-work/</guid>
      <description>&lt;p&gt;最近Inputが出来てないな～と思ったので色々調べてみたところ&lt;a href=&#34;https://www.nri.com/-/media/Corporate/jp/Files/PDF/knowledge/publication/chitekishisan/2024/01/cs20240104.pdf?la=ja-JP&amp;amp;hash=ED42BFF77381C8AD102B7792B56D2654AD7BC6D5&#34;&gt;この資料&lt;/a&gt;を見つけました。&lt;/p&gt;
&lt;p&gt;ざっくり内容を話すと生成AIが労働へ及ぼす影響や知識の獲得、またその後の働き方について書かれています。せっかくなのでChat-GPTとClaudeにも要約してもらいました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/03/generative-ai-evolution-and-future-of-work/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-03-26-223255.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/03/generative-ai-evolution-and-future-of-work/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-03-26-223307.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.nri.com/jp/knowledge/publication/cc/chitekishisan/lst/2024/01/04&#34;&gt;こちら&lt;/a&gt;ではもう少し細かく要約されたものがありますので興味があれば見てください。&lt;/p&gt;
&lt;p&gt;現在の生成AIでもいろんな職業に影響を与えていますが、この資料では将来的に膨大な知識が求められる職業にも影響があるという話です。AIを含むエンジニア系全般はもちろん科学者や技術者も対象です。&lt;/p&gt;
&lt;p&gt;今のプログラマーだったりデータサイエンティストも頼ったほうがよいものができやすいと思います。私もちょくちょくコードの書き方を聞いたりしてます。&lt;/p&gt;
&lt;p&gt;そんな生成AIが所謂 &amp;ldquo;業務知識&amp;rdquo; を持つようになったら労働を代替してくれるという話ですね。&lt;/p&gt;
&lt;p&gt;とはいえ全てを任せるわけじゃなく最後の確認は必要だと思いますが。&lt;/p&gt;
&lt;p&gt;ただ、最後の確認であればPLレベルの人がいれば十分で、ただのプログラマーやデータサイエンティストは不要になるのは間違いなさそうです。&lt;/p&gt;
&lt;p&gt;他に必要になるのは人間同士の調整をする役目の人ですかね？営業とかでしょうか&lt;/p&gt;
&lt;p&gt;この話を聞くと今のままではいずれ職がなくなるんだなと考えられますね。数年位であれば大丈夫でしょうが、10年20年先もまだ働く気がするのでそうなると先を考えて行動しないといけないですね。&lt;/p&gt;
&lt;p&gt;ブルーカラーの職業も最近はロボットが出てきているので代替されそうな気もしますが、人間の体のつくりは割と凄くて8時間動き続けても故障をしないものです。&lt;/p&gt;
&lt;p&gt;ただ、ロボットなどの機械は部品が摩擦などで擦れてくるので長期的には向かないらしいです。そう考えたらまだ大丈夫な気はしますね。&lt;/p&gt;
&lt;p&gt;一応金属も傷つけられたとしても時間をかけて回復するらしいのですが、動植物ほど早くなさそうです。そう考えるとブルーカラーがいいですかね？農業であれば食べ物も困らなさそうです。酪農もよさそうですがコストが高そうです。不動産とかもいいんですかね？気にはなってるんですが…&lt;/p&gt;
&lt;p&gt;そんな感じで将来のことを考えさせられる資料でした。私は将来的に人間は全員ニートになってほしいと思ってるんですが生きてるうちに来ないですかね？ではでは&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kaggleのスコアを少しずつ上げていってる話</title>
      <link>https://xainome-blog.pages.dev/posts/2024/03/improving-kaggle-competition-score/</link>
      <pubDate>Fri, 22 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/03/improving-kaggle-competition-score/</guid>
      <description>&lt;p&gt;前回から4日ほど空いてしまったのですが、Kaggleでどうやってスコアを上げるか四苦八苦してました。&lt;/p&gt;
&lt;p&gt;そもそも前のスコアが低すぎたので少し改善するだけで上がるかなと思ってたのですが、なぜか上がらず少し結果を見てたら自分のコードミスだったというオチです（笑）&lt;/p&gt;
&lt;p&gt;前回の予測コードがこちら&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/03/improving-kaggle-competition-score/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-03-22-090949.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;で修正したコードがこちら&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/03/improving-kaggle-competition-score/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-03-22-091019.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;for文を使って目的変数が変わるたびモデルの学習を行った後、予測を行っています。ちなみに私は訓練データを8:2に分割して実行しています。&lt;/p&gt;
&lt;p&gt;前の時は全ての目的変数の学習が終わったとモデル予測を行っていました。本来であれば目的変数1つに対して学習して予測を行うのですが、全て学習した後予測してたので最後の目的変数の学習をしたモデルになってたので、想定していた結果にはならなかったみたいです。&lt;/p&gt;
&lt;p&gt;というわけで修正した後のスコアがこちら&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/03/improving-kaggle-competition-score/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-03-21-235750.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;すごい！だいぶ上がった！というかこれが普通のスコアっぽい（笑）&lt;/p&gt;
&lt;p&gt;よくなったので今度はもう少しデータと向き合いつつ、より良い加工方法とモデルの作り方を見てみようと思います。またDiscussionを見つつ、他の人のNotebookを見てみました。他人のコードをChat-GPTに解説してもらいつつ、不明な点を聞いてみようと思います。&lt;/p&gt;
&lt;p&gt;余談ですが何もしないときとワンホットエンコーディングを行った時の結果を見てみます。AUCが上がったものもあれば下がったものもありますね。大幅に改善されたわけではないので、元のデータに対して加工したほうがよさそうです。外れ値とか入ってるかもしれないですね。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/03/improving-kaggle-competition-score/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-03-22-090502.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/03/improving-kaggle-competition-score/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-03-22-094827.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;というわけでKaggleいろいろ試してるという話でした。ではでは&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kaggleをとりあえず触ってみて少しづつ予測や分類を理解していくぞ！</title>
      <link>https://xainome-blog.pages.dev/posts/2024/03/kaggle-prediction-and-classification-basics/</link>
      <pubDate>Mon, 18 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/03/kaggle-prediction-and-classification-basics/</guid>
      <description>&lt;p&gt;最初の段階で&lt;a href=&#34;https://www.kaggle.com/competitions/titanic&#34;&gt;タイタニック&lt;/a&gt;を触ることが普通かもしれませんが、&lt;a href=&#34;https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93-%E9%96%80%E8%84%87-%E5%A4%A7%E8%BC%94/dp/4297108437&#34;&gt;この書籍&lt;/a&gt;でも触れてますがタイタニックは軽く触るくらいでいいと思います。&lt;/p&gt;
&lt;p&gt;順位もあまり動かないですし、モチベも続かないと思うので他のコンペに早く参加したほうが楽しい気がします。&lt;/p&gt;
&lt;p&gt;私は今開催されている&lt;a href=&#34;https://www.kaggle.com/competitions/playground-series-s4e3/&#34;&gt;こちら&lt;/a&gt;のコンペに参加しています。こちらのコンペは基となったデータから似たような特徴量を作成したものになります。中身はテーブルデータなうえに &amp;ldquo;id&amp;rdquo; と数値データのみなのでとっつきやすいと思います。&lt;/p&gt;
&lt;p&gt;とりあえず中を見てみます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;class &amp;#39;pandas.core.frame.DataFrame&amp;#39;&amp;gt;
RangeIndex: 19219 entries, 0 to 19218
Data columns (total 35 columns):
 #   Column                 Non-Null Count  Dtype  
--- ------ -------------- ----- 
 0   id                     19219 non-null  int64  
 1   X_Minimum              19219 non-null  int64  
 2   X_Maximum              19219 non-null  int64  
 3   Y_Minimum              19219 non-null  int64  
 4   Y_Maximum              19219 non-null  int64  
 5   Pixels_Areas           19219 non-null  int64  
 6   X_Perimeter            19219 non-null  int64  
 7   Y_Perimeter            19219 non-null  int64  
 8   Sum_of_Luminosity      19219 non-null  int64  
 9   Minimum_of_Luminosity  19219 non-null  int64  
 10  Maximum_of_Luminosity  19219 non-null  int64  
 11  Length_of_Conveyer     19219 non-null  int64  
 12  TypeOfSteel_A300       19219 non-null  int64  
 13  TypeOfSteel_A400       19219 non-null  int64  
 14  Steel_Plate_Thickness  19219 non-null  int64  
 15  Edges_Index            19219 non-null  float64
 16  Empty_Index            19219 non-null  float64
 17  Square_Index           19219 non-null  float64
 18  Outside_X_Index        19219 non-null  float64
 19  Edges_X_Index          19219 non-null  float64
 20  Edges_Y_Index          19219 non-null  float64
 21  Outside_Global_Index   19219 non-null  float64
 22  LogOfAreas             19219 non-null  float64
 23  Log_X_Index            19219 non-null  float64
 24  Log_Y_Index            19219 non-null  float64
 25  Orientation_Index      19219 non-null  float64
 26  Luminosity_Index       19219 non-null  float64
 27  SigmoidOfAreas         19219 non-null  float64
 28  Pastry                 19219 non-null  int64  
 29  Z_Scratch              19219 non-null  int64  
 30  K_Scatch               19219 non-null  int64  
 31  Stains                 19219 non-null  int64  
 32  Dirtiness              19219 non-null  int64  
 33  Bumps                  19219 non-null  int64  
 34  Other_Faults           19219 non-null  int64  
dtypes: float64(13), int64(22)
memory usage: 5.1 MB
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;中身は数値データで最後の7カラムが予測対象の列になります。それから欠損値はないみたいなので、欠損値については考えなくてよさそうです。&lt;/p&gt;</description>
    </item>
    <item>
      <title>仕事でミスが発生した場合、何を考えるか？どう対応するか？</title>
      <link>https://xainome-blog.pages.dev/posts/2024/03/how-to-handle-mistakes-at-work/</link>
      <pubDate>Fri, 15 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/03/how-to-handle-mistakes-at-work/</guid>
      <description>&lt;p&gt;人間が管理・作業をする以上ミスをするものだと思います。その度に反省して再発防止策を考えてシステム的にミスが起きないようにします。それを怠ったら同じミスが再発するわけですが…&lt;/p&gt;
&lt;p&gt;ちなみに私はよくミスを発生する人間だと自負しています。そんなこと自負するなと思いますが、学生のころからよくやっていたので折り紙つきです。&lt;/p&gt;
&lt;p&gt;そう考えると短所は&lt;strong&gt;注意散漫&lt;/strong&gt;になるのでしょうか？ケアレスミスや誤字脱字、表の線引きがずれてる等細かいところはよくあります。(毎日ではないですがレビューの時は6,7割)&lt;/p&gt;
&lt;p&gt;エンジニアであれば過去のプログラムを参考に現行のプログラムを作ったり修正したりするでしょう。その過去のプログラムの一部が間違っていてかつ自身が作ったということが多いです。頻度は1年に1回ぐらいだと思いますが…多分&lt;/p&gt;
&lt;p&gt;ケアレスミスや誤字脱字はまだしも、プログラムの仕様が異なるは&lt;strong&gt;大事&lt;/strong&gt;です。想定されていたものと異なるものができているわけですから。データを作る人だったら一部のデータが想定されたデータと異なるというとこでしょうか。&lt;/p&gt;
&lt;p&gt;お客さん側から指摘されれば謝罪→修正→リリース→再発防止策という流れで進むでしょうが、お客さん側も気づかず、自身が気づいた場合はどうでしょうか？さらにそれが本人が作った物であればどうするか？が本題です。&lt;/p&gt;
&lt;p&gt;他人が作ったものの場合は本人に直接聞くのが一般的だと思います。その後、本人からチームの人に共有してもらうのが波風立たないですね。勝手に&amp;quot;こんなミスがありました&amp;quot;という話をするとその人のメンタルに大ダメージを負っちゃいますので…&lt;/p&gt;
&lt;p&gt;それでは自身が作ったものの場合はどうでしょうか？上司やチームの人の相談しますか？見なかったふりをしますか？誰にも言わず修正しますか？私は葛藤したのちに相談するタイプです。隠蔽の考えがよぎるのですが、先々を考えるとまずいので相談します。&lt;/p&gt;
&lt;p&gt;相談については&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;メリット：将来他の人に迷惑が掛からない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;デメリット：信用が下がる、怒られる、状況によっては自社に損害が発生する&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まあ自身へのメリット少ないですが将来膨らむ迷惑や負債は潰せますね。デメリットの2つはまだしも損害発生は大事ですね。どうしようもないものはどうしようもないですが&lt;/p&gt;
&lt;p&gt;見なかったふりについては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;メリット：近々自身が辞めるもしくは抜ける予定ならば保身になる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;デメリット：将来他の人に迷惑をかける、ばれないかなどでメンタルがやられる&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所謂 &amp;ldquo;爆弾&amp;rdquo; や &amp;ldquo;負債&amp;rdquo; を残す形になります。保身のために言わない人も多そうですが、サイコパスでなければずっと頭をよぎりますし、他の人に押し付けるのはどうかと思います。周りがそんな人たちばかりなら速攻辞める職場ですね。&lt;/p&gt;
&lt;p&gt;次にしれっと修正するついては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;メリット：ばれなければ誰にも迷惑をかけない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;デメリット：記録に残さなければ同じミスを再発する可能性がある&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そもそもしれっと直せるような状況はあまりない気がしますが迷惑を一番かけない形になる気がします。ただ、同じミスは再発する可能性が高いですね。そこで終われば大体忘れるものですから。&lt;/p&gt;
&lt;p&gt;いずれにせよ障害の対応になるので自身にとっていいことは起こらないのですが、他の人にどれだけ迷惑をかけるかが変わるので正直に話しましょう。&lt;/p&gt;
&lt;p&gt;この話をしたのは直近で自身のミスに気付いたからですね。迷ったんですがしっかり話して、リカバリーと再リリースを早く実施して対応したので将来的に良かったと思います。自身の評価は下がった気がしますけどね（笑）&lt;/p&gt;
&lt;p&gt;まあ反省はしても落ち込まずどうしようもなくなったら &amp;ldquo;辞めてやるし、別のいい環境で頑張るわ！&amp;rdquo; くらいの心持をしましょう！誰にでも何とでもできますので、多分。ではでは&lt;/p&gt;</description>
    </item>
    <item>
      <title>E資格が終わったので実践としてKaggleにも挑戦してみよう！</title>
      <link>https://xainome-blog.pages.dev/posts/2024/03/jdla-deep-learning-engineer-exam-kaggle/</link>
      <pubDate>Wed, 13 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/03/jdla-deep-learning-engineer-exam-kaggle/</guid>
      <description>&lt;p&gt;G検定に続きE資格も無事取得できたので今度は統計検定準1級やDS検定になるかと思いますが、一旦受験関係はやめて&lt;a href=&#34;https://www.kaggle.com/&#34;&gt;Kaggle&lt;/a&gt;に挑戦しようと思います。&lt;/p&gt;
&lt;p&gt;英語という観点では少し不利ですが、名前はよく知られてますし英語の練習にもなるかもしれないのでこちらを選びました。日本語が良ければ&lt;a href=&#34;https://signate.jp/&#34;&gt;SIGNATE&lt;/a&gt;というコンペがあります。&lt;/p&gt;
&lt;p&gt;まずKaggleとはなんぞやということですが、競技プログラミングのデータサイエンティスト版ですね。要件を確認して、入力データを見て、予測や分類を行い、csvファイルを提出してスコアを競うという流れですね。&lt;/p&gt;
&lt;p&gt;Kaggleの始め方は該当のページに飛んでアカウントを作成してください。メールアドレスまたはGoogleアカウントですぐに始められます。&lt;/p&gt;
&lt;p&gt;そもそもKaggle以前にプログラム自体に触ったことがない人もいるかと思います。そんな人はpythonの勉強から始めましょう！&lt;a href=&#34;https://www.kaggle.com/learn&#34;&gt;こちら&lt;/a&gt;からKaggle内で勉強することもできます。pythonやpandasはもちろん、データの可視化、機械学習や深層学習、SQLも勉強できます。&lt;/p&gt;
&lt;p&gt;プログラムが書けるようになったらいよいよ挑戦することになると思いますが、データ分析で一番重要なのはデータへの理解と加工だと考えています。&lt;/p&gt;
&lt;p&gt;どんなデータが使われているか？、どの変数がどんな型になっているか？、外れ値や欠損値が含まれているか？、各変数の相関関係はどうか？など確認すべき点は多いです。また、そのデータに対する加工が適切かどうかも考えないといけません。欠損値は削除すべきか埋めるべきか？外れ値としてみるべきか？&lt;/p&gt;
&lt;p&gt;8割くらいがデータへの理解と加工が重要だと思うので&lt;a href=&#34;https://www.amazon.co.jp/kaggle%E3%81%A7%E4%B8%8A%E4%BD%8D%E3%81%AB%E5%85%A5%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%8E%A2%E7%B4%A2%E7%9A%84%E3%83%87%E3%83%BC%E3%82%BF%E8%A7%A3%E6%9E%90%E5%85%A5%E9%96%80-%E7%94%B0%E9%82%89-%E6%AD%A3%E5%B9%B8-ebook/dp/B086H28DBL/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;amp;crid=3O2P01WGDCRTZ&amp;amp;dib=eyJ2IjoiMSJ9.VKo1afpy2lhbFY0QIbE8PSFZ8HBXEAQK3SJjF4dpIJyY9CpYyvuQR1NkXC1viNvj00pv4ZD-9Sw0tdX6JWFIDIucqIAKQOyB7i2V97NPXHI4vLRienyDzYljbQVAbbjKfWnmuPqgoNjToEQYvHoLtNF3dYgodr_RmJpnHe8BPPyFLvnv6wYcu1ZFdItmMSJ9.-MoKmoq2GZtMneC9TEKzZJ7OUz1RjUYNHAwne2-MdWY&amp;amp;dib_tag=se&amp;amp;keywords=kaggle&amp;amp;qid=1710289522&amp;amp;s=digital-text&amp;amp;sprefix=kaggle%2Ckindle-unlimited%2C165&amp;amp;sr=1-1&#34;&gt;こちら&lt;/a&gt;をさらっと流し見するといいかもです。ただ、プログラムはほぼ書いておらず図の見方やデータの確認方法がメインなので流し見でいいかと思います。&lt;/p&gt;
&lt;p&gt;Kindle Unlimitedであればただで見れるので入っておくことをおススメします。サブスクで月額300円くらいですし、他のためになる本やくだらない本も読めますので本を読むいいきっかけになると思います。ただで見れるので細かく見ずわかってる場所は飛ばして、さらっと見ていきましょう。&lt;/p&gt;
&lt;p&gt;次は&lt;a href=&#34;https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93-%E9%96%80%E8%84%87-%E5%A4%A7%E8%BC%94-ebook/dp/B07YTDBC3Z/ref=sr_1_3?crid=394DHT0UTXAJA&amp;amp;dib=eyJ2IjoiMSJ9.gCaQZq2uOHGNriHWtAV1E9-VCYpj4wWhqkCaZICwsKaWvIhoEKOBjLI0M9hdGWpLgSNIGNzrL-ORFtorrj6HXZivfzS54iDslsqE7c7GUA3fmQSMdyYd4cTH5cLkqbT4FU4-UIqmtRueX6L9cTTr8Ryi2poweBiqHV1JZ3RuBvOua0zBmiYx1cm2QYPPryLw1_tOlPTl7sL0Ue6DgatP3ESIr8U8DBGEfUez1E2LtZ8.tNSHCrdnjBrTZNfHYMraE6P0iCJgR9TukGiybGfgl8Q&amp;amp;dib_tag=se&amp;amp;keywords=kaggle&amp;#43;%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E5%85%A5%E9%96%80&amp;amp;qid=1710291336&amp;amp;s=digital-text&amp;amp;sprefix=kaggle%2Ckindle-unlimited%2C237&amp;amp;sr=1-3-catcorr&#34;&gt;こちら&lt;/a&gt;ですね。たくさんの人がおすすめしてますが、データの加工方法からモデルの作成と評価、細かいポイントまで記載しています。私もまだ読み始めですが、目次を見た限りだとこれを見ればデータ分析が十分できると思います。画像や自然言語処理、GANなどは触れてないですが…&lt;/p&gt;
&lt;p&gt;本を読みながらKaggleを触っていくのがいいと思います。よくタイタニックがおすすめされていますが、ランキングはほぼ変わらない上にやる気に繋がりにくいので今開催されているコンペに出るといい気がします。&lt;/p&gt;
&lt;p&gt;賞金のほうでもいいですし、SwagやKnowledgeでもいいと思います。最初は上を目指さず、自身でいろいろ試して解答を提出して、他の人のコードを覗いたりDiscussionに参加したりするといいと思います。思わぬアイデアが埋まってたりしますし、知らないですが…&lt;/p&gt;
&lt;p&gt;とまあこんな感じで参加しようと思います。まずはテーブルデータのコンペから参加してみて、ゆくゆくは画像系とかやってみたいですね。ではでは&lt;/p&gt;</description>
    </item>
    <item>
      <title>E資格（エンジニア資格）2024#1に無事合格したのでそれまでの話をつらつらと</title>
      <link>https://xainome-blog.pages.dev/posts/2024/03/jdla-deep-learning-engineer-exam-2024-1-to/</link>
      <pubDate>Sun, 10 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/03/jdla-deep-learning-engineer-exam-2024-1-to/</guid>
      <description>&lt;p&gt;E資格について昔話したと思いますが(&lt;a href=&#34;https://xainome.blog/?p=214&#34;&gt;こちら&lt;/a&gt;)、結果はどうだったか、どんな勉強をしたのかを話していこうかと思います。&lt;/p&gt;
&lt;p&gt;まず&lt;a href=&#34;https://www.jdla.org/news/20240308001/&#34;&gt;こちら&lt;/a&gt;でJDLAが2024年第一回E資格の結果発表が出ています。合格率や平均得点率、年代・業種・職種・役職別の合格者数が出てます。&lt;/p&gt;
&lt;p&gt;私の結果がこんな感じです。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/03/jdla-deep-learning-engineer-exam-2024-1-to/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-03-09-094326.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;応用数学と開発環境は6割切ってますが、機械学習と深層学習は7割近くになってますね。ちなみに今のタイミングでX(旧: Twitter)で&amp;quot;E資格&amp;quot;を調べると他の人の得点率を見れます。落ちた人の結果を見ると機械学習と深層学習の得点率が低かったみたいです。&lt;/p&gt;
&lt;p&gt;問題数から見ると応用数学と開発環境は出題数が少ないので最悪ほぼ取れなくても問題なさそうです。機械学習と深層学習が問題数多いのでこちらを抑えればいけそうな気はしてます。&lt;/p&gt;
&lt;p&gt;結果はこんな感じでしたが勉強方法は割とシンプルです。&lt;/p&gt;
&lt;p&gt;前にもお話ししましたが私はStudy-AIを使って認定証を取りました。Study-AIでは模擬試験とその解説、過去問(32問分)がありますのでそこを徹底的に理解し、満点取れるまでやりました。&lt;/p&gt;
&lt;p&gt;他の方法だと黒本だったり参考書をチェックしたりですかね？それからデータ加工のプログラムは仕事で使ってるので &amp;ldquo;np.array&amp;rdquo; だったり、論文で書かれてることはこんな書き方できそうだなというのはなんとなくわかります。実際にプログラムを動かすのは大事ですね。&lt;/p&gt;
&lt;p&gt;何度も話してますが資格はあくまで資格なので実際に実装できたり、知識を活用していくことが大切だと思います。資格を取って終わり、じゃなくどう活用していくか？なのでそろそろKaggleに挑戦してみようかと思います。ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>pythonの仮想環境構築をいくつかやったので使ってみた感想を書く</title>
      <link>https://xainome-blog.pages.dev/posts/2024/03/python-virtual-environment-review/</link>
      <pubDate>Fri, 08 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/03/python-virtual-environment-review/</guid>
      <description>&lt;p&gt;前回の続きになります。&lt;/p&gt;
&lt;p&gt;前回は仮想環境が必要なの？というテーマで書いてみましたが、とはいえ使えるに越したことはないので実際に試してみて使った感想を残そうと思います。&lt;/p&gt;
&lt;p&gt;今回仮想環境を構築するにあたって試してみたのは以下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;pip&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;venv&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pyenv（環境的に使えなかった）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pipenv&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;poetry&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;docker（環境的に使えなかった）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rye（環境的に使えなかった）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一応ざっくりと説明すると&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ライブラリのインストール：pip、pipenv、poetry&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;仮想環境の構築：venv、pipenv、poetry、docker&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pythonのバージョン管理：pyenv、docker&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一般的に組み合わせとしては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;pip + venv + pyenv&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pipenv + pyenv&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;poetry + pyenv&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;docker + pipenv&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あたりだと思います。私も依存関係とかは詳しくないのでそうなんだという認識ですが…&lt;/p&gt;
&lt;p&gt;まずは &amp;ldquo;pip&amp;rdquo; 、pythonユーザーであれば皆さん使用してるので説明は省きますが、標準ライブラリで馴染みがあるものですね。&lt;/p&gt;
&lt;p&gt;次は &amp;ldquo;venv&amp;rdquo; 、昔はvertialenvが使われていたみたいですがそれが標準ライブラリになったものです。vertialenvとは別物ですが使い方は同じですね。&lt;/p&gt;
&lt;p&gt;仮想環境の作成や有効化ができ、標準ライブラリなので様々な教材でも使用されると思います。有効化に面倒な設定があったり、自動化やライブラリ一覧の出力にも手間がかかるので少し使いにくいですが、覚えておいた方がいいですね。vscode使うならインタープリターの選択で有効化できますが…&lt;/p&gt;
&lt;p&gt;次は &amp;ldquo;pyenv&amp;rdquo; です。私の環境ではシステム環境変数をいじれないので使えませんでした。&lt;/p&gt;
&lt;p&gt;pythonのバージョンがインストールできず、localやglobalの設定もできない状況でした。使えなくて残念ですが、vscodeのインタープリターで選択すれば問題ないのでいいかと&lt;/p&gt;
&lt;p&gt;あるいはユーザー環境変数で任意のpythonバージョンのPATHを上に移動させるとかですかね。&lt;/p&gt;
&lt;p&gt;次は &amp;ldquo;pipenv&amp;quot;です。こちらはライブラリのインストールと環境変数の作成が一体化した便利なライブラリになっています。&lt;/p&gt;
&lt;p&gt;個人的には一番使いやすく感じました。仮想環境構築のしやすさ、ライブラリ一覧の自動化は便利だなと感じました。制限がなければ &amp;ldquo;pipenv + pythonのバージョン管理&amp;rdquo; が一番楽な気はします。&lt;/p&gt;
&lt;p&gt;ただ、インストールの遅さや抱えてる問題もあるみたいなのでpipenvさえあればいいとは思いませんが、優先度は高いというイメージですね。&lt;/p&gt;
&lt;p&gt;次は &amp;ldquo;poetry&amp;rdquo; です。使う用途としては&amp;quot;pipenv&amp;quot;と同じですが、異なる点で言うとPyPIにビルド・公開ができるという点になります。&lt;/p&gt;
&lt;p&gt;PyPIにビルド・公開することはあまりないので、そうなるとpipenvとの使いやすさを比べてどうか？ということになりますが、使いやすさはpipenvに軍配が上がります。&lt;/p&gt;
&lt;p&gt;まず、poetryはpython3.9以上でしか使用できません。今の現場はpython3.7(いつか3.11になる予定)なので使えなかったりします。また、ライブラリのバージョンでも同様に使えないものがあります。&lt;/p&gt;
&lt;p&gt;他にも仮想環境の有効化がvenvと同様手間がかかったり、vscodeのインタープリター選択画面に出なかったのでパスを通す設定をしないといけないなどがあったりして使いにくさを感じました。私の環境構築方法に問題があるかもしれませんが…&lt;/p&gt;
&lt;p&gt;おまけとしてRyeはチームよりも個人開発向けなのでやろうとしたのですが、客先PCでは使わないほうがよさそうです。個人で触ってみようとは思います。&lt;/p&gt;
&lt;p&gt;それからDockerです。Desktop版をインストールしようとしましたがダメでした。とはいえAWSの実行ではdockerコンテナを利用しているので、ローカルでは使えませんが開発や本番環境では使われているのでdockerfileの中身やdocker-composeをチェックしてみます。ローカルだとどんな使いやすさなんですかね？&lt;/p&gt;
&lt;p&gt;前にも話したんですが、pythonやライブラリのバージョンが固定されているような現場では正直不要だとは思いますが、知っておいて損はないかと思いますし、知識はどこかで役立つと思います。&lt;/p&gt;
&lt;p&gt;手軽で使いやすいという点では &amp;ldquo;pipenv&amp;rdquo; &amp;gt; &amp;ldquo;poetry&amp;rdquo; &amp;gt;= &amp;ldquo;pip + venv&amp;quot;に&amp;quot;pyenv&amp;quot;を足したものかと思いますが、覚え順としては&amp;quot;pip + venv&amp;rdquo; &amp;gt; &amp;ldquo;pipenv&amp;rdquo; &amp;gt; &amp;ldquo;poetry&amp;rdquo; がいいと思います。ついでにDockerまで使えればほぼ問題ないという印象です。&lt;/p&gt;</description>
    </item>
    <item>
      <title>常駐先のPCでPythonの仮想環境構築って必要なの？</title>
      <link>https://xainome-blog.pages.dev/posts/2024/03/pc-python-virtual-environment/</link>
      <pubDate>Wed, 06 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/03/pc-python-virtual-environment/</guid>
      <description>&lt;p&gt;たまには自身の仕事の環境のことでも話をしてみるのもいいかと思って記事にしました。ただ自身の疑問や考えを整理するために書いてるので、大したことは書かないかと思います。人間っぽくていいなと思います。&lt;/p&gt;
&lt;p&gt;大前提としてpythonの仮想環境構築について知っておくに越したことはないと思います。客先に派遣される業態ではいつ使うかわかりませんし、自社開発でもライブラリの更新をした方がセキュリティ面でも安心できると思うので、安定板と更新版で使い分けができそうです。&lt;/p&gt;
&lt;p&gt;さて、最近新PCに移行することになりました。前のPCでは仮想環境を使ってこなかったので、これを機に仮想環境について調べこの記事を書くことにしました。仮想環境で何を使ったかはあまり触れないと思います。&lt;/p&gt;
&lt;p&gt;私の現場では客先常駐ではないですが、お客様先から配布されたPCを使って開発を行います。スペックは特段低いわけではないので、重たい処理や大量のデータを扱わなければ問題ない程度です。ちなみにWindowsです。&lt;/p&gt;
&lt;p&gt;ただお客様先から配布されたPCなのでセキュリティは固めです。実はpyenvを使おうとしたのですがインストールがうまくいかずpythonバージョンの使い分けができませんでした。&lt;/p&gt;
&lt;p&gt;他にもDocker Desktopをインストールしようとしましたがこちらも無理でした。申請すれば通るかもしれないですが、他にも方法はありますので一旦諦めました。ちなみにWinMerge(ファイル同士の比較)もインストールできませんでした。前のPCは標準搭載だったのですが…&lt;/p&gt;
&lt;p&gt;ここから本題なのですが、仮想環境を作る必要があるのか？ライブラリの管理をする必要があるのか？という問題です。もちろん客先によっては自由度が高いところもあるので一概には不要だとは思いません。&lt;/p&gt;
&lt;p&gt;私の話になりますが、本番環境ではAWSを使っています。開発環境もありますがスコアリングのみであればローカルでvscodeを使用しています。&lt;/p&gt;
&lt;p&gt;AWSではDockerfileでpythonとライブラリのバージョンを指定して実行しているのですが、そのバージョンが全てのプロジェクトで統一されています。pythonのバージョンであれば3.7.12、pandasであれば1.12.0という具合です。&lt;/p&gt;
&lt;p&gt;こうなるとローカルでも使用するpythonやライブラリのバージョンは固定されるので、仮想環境の構築は不要でとりあえずpipでインストールしてしまえばいい気もします。requirements.txtに吐き出していまえば他の人にも共有できて同じ環境が作れますし…&lt;/p&gt;
&lt;p&gt;整理してみましたがやはり不要な気がします。とは言え仮想環境構築で使ったvenvとpyenv(ほぼインストールのみですが…)の使い方もわかりましたし、他のライブラリであるpipenvやPoetryも触ってみようと思います。&lt;/p&gt;
&lt;p&gt;次に話すとしたら実際に仮想環境構築したことかAWSについてですかね？ではでは&lt;/p&gt;</description>
    </item>
    <item>
      <title>セキュリティを学ぶことができる&#34;TryHackMe&#34;で遊んでみたよ！</title>
      <link>https://xainome-blog.pages.dev/posts/2024/03/cybersecurity-study-tryhackme-review/</link>
      <pubDate>Fri, 01 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/03/cybersecurity-study-tryhackme-review/</guid>
      <description>&lt;p&gt;最近のニュースでセキュリティに関する漏洩がよく起きている気がします。&lt;/p&gt;
&lt;p&gt;外部からの攻撃はもちろん内部からの漏洩も存在します。内部からの攻撃(人的ミス、スパイ等)は防ぐのは難しそうですが外部からの攻撃であれば大体は防ぐことができると思います。&lt;/p&gt;
&lt;p&gt;クラウド等であればセキュリティに関するものもありますが、Webサイト等ではセキュリティに弱い部分もありそうな気はします。&lt;/p&gt;
&lt;p&gt;セキュリティについて騒がれているのに私は全く知らなかったので少しは勉強しようかと思って&amp;quot;TryHackMe&amp;quot;というサイトで学習し始めました。&lt;a href=&#34;https://tryhackme.com/&#34;&gt;こちら&lt;/a&gt;から学べます。&lt;/p&gt;
&lt;p&gt;ただ、こちらは全て英語になりますので翻訳しながら少しずつ進めています。学習はこんな感じです。やる内容と進行度、難易度が表示されています。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/03/cybersecurity-study-tryhackme-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-02-28-233045-1024x605.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;少し触ってみた内容では以下の画像みたいな感じです。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/03/cybersecurity-study-tryhackme-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-02-28-222146-1024x520.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;左の方ではハッキングの内容や手順を動画付きで説明して、右側では実行する環境を作って手順通りに作業していきます。&lt;/p&gt;
&lt;p&gt;まだ始めたばっかりなのでわかっていないことや翻訳しながらで大変ですが、少しずつ学んでセキュリティ意識を高めていけたらと思います。&lt;/p&gt;
&lt;p&gt;余談なんですが最近物理学が面白いと思い始めました。理系なので物理学に触れたことはありますが、あまり理解できていませんでした。量子力学はAIと同様発展途中ですが、もしかしたら数十年後には必要不可欠になりそうなので、そっちも知っておくとよさそうです。&lt;/p&gt;
&lt;p&gt;今はAIみたいな実用段階ではないですが今のうちに知って、ビジネスにも活かせる段階になった時、有利に働き稼ぐ手段が増える！かもしれないですね（笑）ではでは&lt;/p&gt;</description>
    </item>
    <item>
      <title>引き続きfreeCodeCampの機械学習で苦戦している話</title>
      <link>https://xainome-blog.pages.dev/posts/2024/02/freecodecamp-machine-learning/</link>
      <pubDate>Wed, 28 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/02/freecodecamp-machine-learning/</guid>
      <description>&lt;p&gt;勉強していますか！&lt;/p&gt;
&lt;p&gt;私は引き続きfreeCodeCampで認定証を取れるよう頑張っているのですが、なかなか難しくて苦戦しています。&lt;/p&gt;
&lt;p&gt;現状機械学習プロジェクトで終わってるのがじゃんけんと画像分類と医療費予測ですね&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/02/freecodecamp-machine-learning/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-02-27-220446.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;画像分類と医療費予測はそこまで難しくないのですが、じゃんけんと今やってる自然言語処理は苦戦しています。&lt;/p&gt;
&lt;p&gt;じゃんけんは4人のボットに60%以上の勝率を出すことがクリアの条件です。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/02/freecodecamp-machine-learning/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-02-27-220833.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;4人のボットはそれぞれ特徴があって(以下グー: &amp;ldquo;R&amp;rdquo;、チョキ: &amp;ldquo;S&amp;rdquo;、パー: &amp;ldquo;P&amp;quot;とする)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;特定の順でじゃんけんの手を出す&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;前回出したプレイヤーの手に勝つ手を出す&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プレイヤーの過去10回分を集計して1番多く出した手に勝つ手を出す&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;過去2回分(&amp;ldquo;RR&amp;quot;や&amp;quot;PP&amp;quot;等)のパターンを毎回全て記録し、前回出した手＋&amp;ldquo;次出す手&amp;quot;を過去履歴から一番多い手に勝つ手を出す。(例：過去のパターンで&amp;quot;RR&amp;quot;が8回、&amp;ldquo;RS&amp;quot;が5回、&amp;ldquo;RP&amp;quot;が10回だった場合、前回プレイヤーの手が&amp;quot;R&amp;quot;なら&amp;quot;RP&amp;quot;が10回の最多なので&amp;quot;P&amp;quot;に勝つ&amp;quot;S&amp;quot;を出す)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この4人に勝率60%以上出せばいいのですが時間がかかってしまいました。ちなみに最終的には画像のような勝率になってました&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/02/freecodecamp-machine-learning/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-02-27-223907.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;1人以外は99%以上の勝率になりました（笑）。3人だけ個別で対応して1人は何もしなくてもテストクリアしたので特に対策はしていません。もしかしたら連鎖マルコフモデルを使えばよかったかもしれませんが、力押しです💪&lt;/p&gt;
&lt;p&gt;画像分類と医療費予測はChat-GPTに手伝ってもらいました。とは言え簡単な加工とモデルの作成だけだったのですが、コードの中身を全て解説してもらいながら終わらせました。&lt;/p&gt;
&lt;p&gt;残りの自然言語処理問題ですね。書籍推薦アルゴリズムとスパム分類ですね。こちらもChat-GPTに頼って解説してもらいながやったのですがうまくいきませんでした…&lt;/p&gt;
&lt;p&gt;なかなか難しいですがもう少しいい方法がないかChat-GPTとキャッチボールしながら探してみようと思います。気晴らしに他の講座をやるのも手ですね！ではでは&lt;/p&gt;</description>
    </item>
    <item>
      <title>freeCodeCampというサイトで認定証でも取ってみる話</title>
      <link>https://xainome-blog.pages.dev/posts/2024/02/freecodecamp/</link>
      <pubDate>Sun, 25 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/02/freecodecamp/</guid>
      <description>&lt;p&gt;E資格が終わって次に何しようかなと思った時にたまたま目が付いたサイト&amp;quot;&lt;strong&gt;&lt;a href=&#34;https://www.freecodecamp.org/&#34;&gt;freeCodeCamp&lt;/a&gt;&lt;/strong&gt;&amp;ldquo;をやってみました。&lt;/p&gt;
&lt;p&gt;一応無料でできるものでテストに合格できれば認定証がもらえます。このようなサイトや&lt;a href=&#34;https://www.coursera.org/&#34;&gt;Coursera&lt;/a&gt;などで認定証をもらえますが、どこまで効果があるかはわかりません。&lt;/p&gt;
&lt;p&gt;ただし、海外でも十分役に立つかなと思っているので学位とかなければ取るに越したことはないかと思います。日本だけでいいなら不要だと思いますが、私は日本だけで活躍するのは危ういと感じているので、海外でも使えそうなものを探していました。&lt;/p&gt;
&lt;p&gt;講座はいろいろありますので気になったものを触ってみればと思います。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/02/freecodecamp/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-02-24-222817.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;基本は英語ですが日本語に変えることもできます。翻訳が怪しい部分もありますが、なんとなくわかります。本格的な翻訳も募集しているみたいです。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/02/freecodecamp/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-02-24-222830-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;私はメインはpythonを使っていますのでpythonに関する認定証を2つ取りました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/02/freecodecamp/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-02-24-223207.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;今は残りのpythonに関する認定証を取得中です。少し難しいですが…&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/02/freecodecamp/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-02-24-223249.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;これが終わったら他のやつも取ってみようと思います。APIやデータベースはできたほうが楽しそうですからね。&lt;/p&gt;
&lt;p&gt;問題としてChat-GPTを使っても問題ない気はします。コードをほぼ任せてみましたが合格できましたので。また、Copilotのような機能があるので気にせず、積極的に利用しても問題ないかと思います。コードの中身はしっかりと理解したほうがいいですが…&lt;/p&gt;
&lt;p&gt;テストを受ける前に学習をすることもできます。動画での学習と内容チェックですね。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/02/freecodecamp/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-02-24-224955-1024x631.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/02/freecodecamp/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-02-24-225006.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;さて、生成AIが出てきてもしかしたらプログラマーやデータサイエンティスなどの業種が将来的になくなるかもしれない時代、さらに日本は少子化により給料も需要も下がるかもしれない時代に突入しているので、今のうちにやれることをやって将来に備えたいですね。&lt;/p&gt;
&lt;p&gt;それでは楽しいエンジニアライフを。ではでは。&lt;/p&gt;</description>
    </item>
    <item>
      <title>E資格お疲れさまでした！合格したかどうか五分五分…</title>
      <link>https://xainome-blog.pages.dev/posts/2024/02/jdla-deep-learning-engineer-exam-to/</link>
      <pubDate>Tue, 20 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/02/jdla-deep-learning-engineer-exam-to/</guid>
      <description>&lt;p&gt;2024#1のE資格お疲れさまでした！個人的には五分五分くらいの出来でした。振り返るとあの箇所間違ってたなと思うとこもいくつかあります。&lt;/p&gt;
&lt;p&gt;今回テストを受けてみてわかったことは、G検定同様言い回しが少し独特に感じました。言い方を変えると表面だけの理解では解けないと感じました。&lt;/p&gt;
&lt;p&gt;全ての問題がそうではないですが4割くらいがそう感じました。&lt;/p&gt;
&lt;p&gt;また問題数は103問の120分ですがある程度理解して入れば、計算問題があっても20分くらいは余る気がします。&lt;/p&gt;
&lt;p&gt;シラバスを見て記事に簡単にまとめたりしましたが、全く出ない内容(コンテナやCTC等)があったりして少し困惑しました。学べてよかったとは思いますが…&lt;/p&gt;
&lt;p&gt;次回のシラバス(&lt;a href=&#34;https://www.jdla.org/certificate/engineer/&#34;&gt;こちら&lt;/a&gt;からダウンロードできます。)見る感じだと数学の内容はあまり変わらず、機械学習はバッサリ削られてる雰囲気です。深層学習も音声処理とメタ学習はバッサリですね。能動学習と連合学習は元からなかった気がします。&lt;/p&gt;
&lt;p&gt;こうやってバッサリカットされたということは他の箇所が頻出するということなので、深層学習はより理解を深めたいといけなさそうですね。特に生成AIに関するGPT系やGNA系は最近の論文も確認したほうがよさそうですね。&lt;/p&gt;
&lt;p&gt;今回の学習で色んな事が学べました。Dockerはローカルで使ったことがないので触ってみよう！とかHagging Faceで配布されてるモデル使って自然言語処理のプログラム作ってみよう！とか画像認識でいい使い道ないかな？とか考えてました。&lt;/p&gt;
&lt;p&gt;一先ず資格が終わって勉強から解放されたので他にやりたいことをやっていきたいと思います。ちなみに試験後にコオロギラーメン食べてきたのでその話もしようと思います。ではでは！&lt;/p&gt;</description>
    </item>
    <item>
      <title>E資格受験前なので復習がてら学んだことをざっくり振り返る ~ 深層学習後編、開発環境編~</title>
      <link>https://xainome-blog.pages.dev/posts/2024/02/jdla-deep-learning-engineer-exam-deep-learning-fundamentals-part-2/</link>
      <pubDate>Sat, 17 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/02/jdla-deep-learning-engineer-exam-deep-learning-fundamentals-part-2/</guid>
      <description>&lt;p&gt;前回の続きになります。深層学習の後編になります。もう一息です。&lt;/p&gt;
&lt;p&gt;まずは生成モデルと識別モデルについてです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;識別モデルは入力Xから出力Yへの直接的なマッピングを学習することを目指しています。このマッピングは条件付き確率P(Y | X)を使用して表される。与えられた入力データに基づいて出力ラベルの確率を最も正確に予測する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;生成モデルはデータの同時確率P(X,Y)またはデータの周辺確率P(X)を通じて行われる。観測されたデータがどのように生成されるかの理解を深め、新しいデータポイントを生成する能力を持つこと。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ナイーブベイズ&lt;/strong&gt;：P(X | Y) = ΠnP(xi |Y)、P(xi |Y)は特徴xiが与えられたクラスYに属する条件付確率&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GAN&lt;/strong&gt;：生成器Gがランダムノイズからデータを生成し、識別器Dが実データと生成データを区別しようとする。minG maxD V(D,G) = Ex&lt;del&gt;Pdata(x) [logD(x)] + Ez&lt;/del&gt;P(z) [log(1 - D(G(z)))]、V(D,G)は識別機Dと生成器Gの値関数、Pdataは実データの分布、Pzは生成器の入力となるノイズの分布。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;次はVAEとVQ-VAEについてです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;VAE(Variational Autoencoder)&lt;/strong&gt;：入力データを低次元の潜在空間にエンコードし、その潜在表現から元のデータを復元するように学習するオートエンコーダの一種。潜在空間における確率分布をモデリングすることにより、新しいデータの生成も可能。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;データxから潜在変数zの分布qΦ(z | x)を推定し、デコーダを用いてzからxを再構築する確率pθ(x | z)を最大化する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;潜在変数zの事後分布qΦ(z | x)が事前分布p(x)に近づくように制約をかける。そして以下の損失関数を最大化する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L(θ,Φ; x) = Eq(z | x)[logpθ(x | z)] - Dkl(qθ(z | x)||p(x))、DklでqΦ(z | x)とp(z)の分布の類似度を測る。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;VQ-VAE(Vector Quantized-Variational Autoencoder)&lt;/strong&gt;：VAEの概念を拡張し、潜在空間において離散的な表現を使用する。ンコーダが出力する連続的な潜在表現を、事前に定義された離散的なコードブックにマッピングすることにより、潜在表現をベクトル量子化する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エンコーダが出力する潜在変数ze(x)を、コードブック内の最も近いコードベクトルzq​にマッピングする。損失関数は以下のように定義する。
&lt;ul&gt;
&lt;li&gt;L = logpθ(x | zq) + ||sg[ze(x)] - zq||^2 + β||ze(x) - sg[zq]||^2、sg[⋅]はstop-gradient演算子、バックプロパゲーション時にその入力に対する勾配の計算を停止させる。βはハイパーパラメータ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用例：画像生成や画像編集、データ圧縮、音声合成と音声変換、テキスト生成とスタイル転送、異常検知、強化学習&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;次はDCGANとConditional GANについてです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;DCGAN(Deep Convolutional Generative Adversarial Networks)&lt;/strong&gt;：CNNを用いたGANの一種、プーリング層を使わずに、ストライド畳み込みと逆畳み込みを使用する。 学習済みモデルは、未ラベルの大規模データセットから有用な特徴を自動で抽出するでき、他のタスクに転移学習で利用可能。 バッチ正規化をGeneratorとDiscriminatorの両方に適用することで、学習過程を安定させる。&lt;/p&gt;</description>
    </item>
    <item>
      <title>E資格受験前なので復習がてら学んだことをざっくり振り返る ~ 深層学習前編 ~</title>
      <link>https://xainome-blog.pages.dev/posts/2024/02/jdla-deep-learning-engineer-exam-deep-learning-fundamentals-part-1/</link>
      <pubDate>Mon, 12 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/02/jdla-deep-learning-engineer-exam-deep-learning-fundamentals-part-1/</guid>
      <description>&lt;p&gt;前回は応用数学や機械学習につてい振り返ったので、今回は深層学習について振り返ります。おそらく長くなりそうなので2分割しようと思います。&lt;/p&gt;
&lt;p&gt;まずは**全結合型ニューラルネットワーク(Fully Connected Neural Network, FCNN)**についてです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;入力層、隠れ層、出力層から構成され各層の全てのノードが前の層の全てのノードに重み付きの接続をしている。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;前向き伝播 (Forward Propagation)&lt;/strong&gt;：各ニューロンの出力は、前層の出力、重み、バイアスに基づいて計算され、活性化関数を通過する。活性化関数については後述します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;誤差逆伝播 (Backpropagation)&lt;/strong&gt;：出力層の予測値と実際の値との差を計算し、その差を用いて重みを更新する。連鎖律を用いて各重みに対する誤差の勾配を計算し、勾配降下法等を使用して重みを更新する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;問題点と解決策&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;過剰適合&lt;/strong&gt;：機械学習と同様、正則化(L1、L2正則化)やドロップアウトを使用する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;勾配消失/勾配爆発&lt;/strong&gt;：層を深くしたことで勾配が急速に減少または増加する問題。解決策には重みの初期化方法の工夫（He初期化など）、バッチ正規化、残差接続（ResNet）などがあります&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;次は損失関数の&lt;strong&gt;最尤推定による条件付き分布の学習&lt;/strong&gt;についてですが、前回の機械学習でも触れたので軽く触れる程度にします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回帰問題&lt;/strong&gt;：ガウス分布の尤度を最大化することは、平均二乗誤差を最小化することと同等。損失関数はL(θ) = 1 / nΣ(y - f(x, θ))^2、yは実測値、f(x, θ)は予測値&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;分類問題&lt;/strong&gt;：多クラス分類では、カテゴリカル分布の尤度を最大化することが、クロスエントロピー損失の最小化と同等。損失関数はL(θ) = -ΣnΣCylogf(x, θ)、yはi番目のデータがcに属するかを示す指標変数、f(x, θ)はモデルによるクラスcへの所属確立への予測。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;次は活性化関数についてです。主に隠れ層と出力層で使われます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;シグモイド関数&lt;/strong&gt;：σ(x) = 1 / (1 + e^-x)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;出力が0から1、二値分類問題の出力層でよく使用されるが、勾配消失問題のため隠れ層ではあまり使用されない。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Softmax関数&lt;/strong&gt;：Softmax(x) = e^x / Σe^x&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;出力層の多クラス分類で使用、出力値の合計が1になるようクラスに属する確率を計算する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ReLU関数&lt;/strong&gt;：ReLU(x) = max(0, x)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;出力が-1から1、原点に対して対象なので隠れ層でよく使われる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Leaky ReLU関数&lt;/strong&gt;：LeakyReLU(x) = max(αx, x)、αは小さな正の定数&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ReLUの改良版でx &amp;lt; 0で微小な勾配をすることで、ニューロンが不活性になり,任意の入力に対して出力0だけになる問題を緩和。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;双曲線正接関数(ハイパボリックタンジェント)&lt;/strong&gt;：tanh(x) = (e^x - e^-x) / (e^x + e^-x)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;計算が効率的で勾配消失問題も緩和するので隠れ層でよく使用される。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;次に誤差逆伝播法についてです。前述で述べた個所は省略します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;計算グラフ&lt;/strong&gt;：この項目については割愛しますが、調べると表は出てきますので、誤差逆伝播法の計算がどのようなものかがよくわかります。&lt;/p&gt;</description>
    </item>
    <item>
      <title>E資格受験前なので復習がてら学んだことをざっくり振り返る ~ 応用数学と機械学習編 ~</title>
      <link>https://xainome-blog.pages.dev/posts/2024/02/jdla-deep-learning-engineer-exam-applied-mathematics-machine-learning/</link>
      <pubDate>Thu, 08 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/02/jdla-deep-learning-engineer-exam-applied-mathematics-machine-learning/</guid>
      <description>&lt;p&gt;E資格で出る内容として&amp;quot;確率や情報理論の計算&amp;quot;、&amp;ldquo;機械学習&amp;rdquo;、&amp;ldquo;深層学習&amp;rdquo;、&amp;ldquo;開発運用環境&amp;quot;があります。&lt;a href=&#34;https://www.jdla.org/download/e-syllabus_2022/&#34;&gt;こちら&lt;/a&gt;からシラバスをダウンロードして確認できます。LaTeXを導入してないので数式がかなり見にくいですが、よくわからなければ調べてみてください。&lt;/p&gt;
&lt;p&gt;まずは確率・統計の式です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ベルヌーイ分布&lt;/strong&gt;：P(X=x) = p^x(1−p)^(1−x)、xは結果の値(成功=1、失敗=0)、P は成功確率を表す。例としてスパムメールフィルタリングやクリック予測で使用される&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ガウス分布(正規分布)&lt;/strong&gt;：P(x) = 1 / √(2πσ^2) exp(-(x-μ)^2/2σ^2)​、ここでμは平均、σ^2 は分散を表す。例として異常検出や回帰分析で使用される&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;多項分布&lt;/strong&gt;：P(X1=x1,…,Xk​=xk​) = n! / x1​!…xk!​ p1^x1…pk^xk、期待値E[X] = xp、分散V[X] = E[X^2] - E[X]^2​ = xp(1 - p)、共分散Cov(X,Y) = Σxy - μxμy、相関係数 r = σxy / σxσy(-1~1の範囲)ここでμは平均、σは標準偏差を表す。例としてテキストデータやカテゴリデータのモデリングで使用される。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ベイズ則&lt;/strong&gt;(&lt;strong&gt;条件付き確率&lt;/strong&gt;)：P(A∣B) = P(B∣A)P(A) / P(B)、例として機械学習モデルのパラメータ推定などで使用される。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;次は情報理論の式です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;自己情報量&lt;/strong&gt;：I(x) = - logP(x)、底は2でP(x)はあることが起こる確率→確率が小さくなるほど、情報量は大きくなる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;平均情報量(エントロピー)&lt;/strong&gt;：H(X) = -ΣP(x)logP(x)、底は2でP(x)はあることが起こる確率、エントロピーが高いほどランダムで予測が難しくなり、データの圧縮や決定木などの機械学習モデルでの特徴選択に使用される。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;結合エントロピー&lt;/strong&gt;：H(X,Y) = -ΣP(X,Y)logP(X,Y) → XとYがお互いに独立であればH(X, Y) = H(X) + H(Y)が成り立つ。XとYは事象&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;条件付きエントロピー&lt;/strong&gt;：H(X | Y) = - ΣxΣyP(X = x | Y = y)P(Y = y)log(P(X = x | Y = y))&lt;/p&gt;</description>
    </item>
    <item>
      <title>Google Cloudで生成AIやクラウドの使い方に関するゲームで遊んでみよう！</title>
      <link>https://xainome-blog.pages.dev/posts/2024/02/google-cloud-generative-ai-game/</link>
      <pubDate>Sat, 03 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/02/google-cloud-generative-ai-game/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://go.qwiklabs.com/arcade&#34;&gt;こちら&lt;/a&gt;からゲームに参加することができます。&lt;/p&gt;
&lt;p&gt;アクセスコードも画面に出ていますので入力して入ってください。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/02/google-cloud-generative-ai-game/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-02-03-104949-1024x348.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;アクセスコードを入力するとゲームに参加できますので一つ一つ完了していきましょう！&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/02/google-cloud-generative-ai-game/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-02-03-105208.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;言語の設定はここから変換できますので、気になる方は日本語に変換してください&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/02/google-cloud-generative-ai-game/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-02-03-105430.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;中身はゲームというよりはGoogle Cloudの使い方を教えてくれるものでした。GCPに使い慣れていないせいか苦戦はしましたが、少しづつ進めてます。クリアするとチェックが付くみたいです。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/02/google-cloud-generative-ai-game/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-02-03-112543-1024x813.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Level1ではGoogle Storage、BigQuery、CloudFunction等の使い方を学ぶことができます。&lt;/p&gt;
&lt;p&gt;今のところ無料で出来ていますのでもう少し進めてみようと思いますが、ゲームという観点ではAWSのほうが楽しいかもしれないですね。街の発展ができますので&lt;/p&gt;
&lt;p&gt;AIに関する技術は確かに重要ですが、クラウドを扱う知識はもっと必要になるかと感じます。AIだけでなくサービスの提供にも必要なので知っておいて損はないと思います。&lt;/p&gt;
&lt;p&gt;クラウドはAWSかGCPかAzureのいずれかを知っていれば十分な気はしますが、もし興味があれば触ってみると自身の幅が広がるかなと思いますので。ではでは&lt;/p&gt;</description>
    </item>
    <item>
      <title>AWSCloudQuestでゲーム感覚でAWSを触ってみよう！</title>
      <link>https://xainome-blog.pages.dev/posts/2024/01/awscloudquest-game-aws/</link>
      <pubDate>Tue, 30 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/01/awscloudquest-game-aws/</guid>
      <description>&lt;p&gt;私の現場ではAWSを使っています。全てを1から作ったわけではないですが、StepFunctionやLambda、CodeCommitなど基本的なものは使ってますし、必要に応じて作成したりしています。&lt;/p&gt;
&lt;p&gt;ある程度使っていますが、たまたま見つけた記事で興味が出たので&amp;quot;AWSCloudQuest&amp;quot;というサービスを触ってみようかと思います。&lt;a href=&#34;https://explore.skillbuilder.aws/learn/course/external/view/elearning/17553/aws-cloud-quest-cloud-practitioner-japanese-ri-ben-yu-ban&#34;&gt;こちら&lt;/a&gt;からスキルビルダーのアカウントを作ってサインインしてみましょう！&lt;/p&gt;
&lt;p&gt;このサービスはゲーム感覚でAWSの仕組みを理解し、実際に操作して、AWSの認定も取ろうというサービスになります。実際にプレイするとこんな感じになります。初期画面がこちら&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/awscloudquest-game-aws/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-28-133334-1024x568.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;この後、アバターの作成に入ります。アバターを作り終えると街に放り出されます。画面では何もないですが、初めは誘導されますのでそれに従って行動してください。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/awscloudquest-game-aws/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-28-133540-1024x569.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;まずは最初の課題ですね。話を聞いて何をするのか把握します。私はAWSを触ったことがあるので多少わかりますが、ここで単語がわからなくても問題ありません。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/awscloudquest-game-aws/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-27-193115-1024x564.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;まずは&amp;quot;学習&amp;quot;からです。ステップを進めて内容を確認しましょう。また、左の動画からAWSのコンセプトや使用するサービスについてがわかります。今回はS3についての内容です。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/awscloudquest-game-aws/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-28-122901-1024x542.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;次は&amp;quot;計画&amp;quot;ですね。左の&amp;quot;実践ラボの目標&amp;quot;は実戦で行う内容で、&amp;ldquo;DIY&amp;quot;は今回の依頼内容になります。これを把握しておきます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/awscloudquest-game-aws/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-28-122917-1-1024x546.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;次は&amp;quot;実戦&amp;quot;になります。AWSコンソールを押して、専用のアカウントでAWSにログインしますのでステップを見ながら作業を進めていきます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/awscloudquest-game-aws/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-28-122927-1-1024x541.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;最後に&amp;quot;DIY&amp;quot;になります。これが本来顧客が求めていることなのでこれができればクエスト完了です。先ほどのコンソールからDIYアクティブをしましょう。完了したらバケット名を入力して検証をクリックします。問題なければクリアメッセージが出て終了をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/awscloudquest-game-aws/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-28-122940-1-1024x537.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;クリアすると報酬を受け取ります。なんかいろいろ解放されたみたいです（笑）。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/awscloudquest-game-aws/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-28-125833-1024x580.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/awscloudquest-game-aws/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-28-125907.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/awscloudquest-game-aws/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-28-125918.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/awscloudquest-game-aws/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-28-125926.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/awscloudquest-game-aws/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-28-125946.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;これが終わったら次のクエストが出るのでまたクエストをこなして、街を発展させていくみたいです。&lt;/p&gt;
&lt;p&gt;このサービスは一部が無料なので全てこなしたければサブスクに登録する必要があります。私はまだ登録してないですが、もう少し遊んでみて楽しければ登録してみようかと思います。&lt;/p&gt;
&lt;p&gt;これを機にスキルビルダーで認定取得するのも面白そうですね。ではでは&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python3.12で仮想環境を整え、Open Interpreterを使って少し苦戦した話</title>
      <link>https://xainome-blog.pages.dev/posts/2024/01/python3-12-virtual-environment-open-interpreter/</link>
      <pubDate>Sat, 27 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/01/python3-12-virtual-environment-open-interpreter/</guid>
      <description>&lt;p&gt;話題としては遅い気がしますが、初めてOpen Interpreterを使いました。そのことについて記載しようと思います。&lt;/p&gt;
&lt;h3 id=&#34;open-interpreterについて&#34;&gt;Open Interpreterについて&lt;/h3&gt;
&lt;p&gt;最近社用PCのPythonバージョンを3.12に上げました。なので自身のPCのPythonバージョンも3.12に上げることにしました。また、同タイミングでOpne Interpreterのことを知ったので使ってみようとしました。&lt;/p&gt;
&lt;p&gt;私はCode Interpreterのことは知っていたのですが使ったことはなかったです。違いがあまりわからないのですが、Code Interpreterのオープンソース版がOpne Interpreterのようです。&lt;/p&gt;
&lt;p&gt;Open Interpreterを実行した際、自動でライブラリをインストールされることがあるみたいです。まずは仮想環境を作ることにしました。&lt;/p&gt;
&lt;h3 id=&#34;仮想環境の作成とライブラリインストール&#34;&gt;仮想環境の作成とライブラリインストール&lt;/h3&gt;
&lt;p&gt;今回仮想環境で使ったライブラリは&amp;quot;pipenv&amp;quot;になります。特にこれといった理由はないです。Condaでもvenvでもいいとは思います。pipenvの使い方は&lt;a href=&#34;https://qiita.com/y-tsutsu/items/54c10e0b2c6b565c887a&#34;&gt;こちら&lt;/a&gt;を参考にしました。&lt;/p&gt;
&lt;p&gt;Pipenvをインストールし、必要なライブラリをインストールします。初期化しなくてもライブラリのインストール時に勝手に作られるので、意図的にPyhonのバージョンを変えなければ初期化しなくても問題ありません。&lt;/p&gt;
&lt;p&gt;もし、ライブラリのインストール時に &amp;ldquo;RuntimeError: Failed to lock Pipfile.lock {ライブラリ名}&amp;rdquo; というエラーが出た場合は一度仮想環境を削除して、再度作成するとうまくいくと思います。私の経験談なのでサンプル数1ですが…&lt;/p&gt;
&lt;p&gt;仮想環境を作った時はそこのインタープリターを選択しましょう。処理の実行が失敗しますので…&lt;/p&gt;
&lt;p&gt;仮想環境ができたのでいよいよOpen Interpreterをインストールします。&amp;ldquo;pipenv shell&amp;quot;でアクティブ化し、&amp;ldquo;pipenv install open-interpreter&amp;quot;を実行します。&lt;/p&gt;
&lt;h3 id=&#34;open-interpreterインストール時のエラー対処&#34;&gt;Open Interpreterインストール時のエラー対処&lt;/h3&gt;
&lt;p&gt;右のエラーが出ました。&amp;ldquo;ERROR: Couldn&amp;rsquo;t install package: {} Package installation failed…&amp;rdquo;&lt;/p&gt;
&lt;p&gt;これだけ見ても原因は変わりませんが、面倒なのでコマンドを実行した後の行から全てコピーしてきてテキストファイルに張り付け、Chat-gptに聞いてみました。そしたら下記の回答が返ってきました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/python3-12-virtual-environment-open-interpreter/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-27-143242.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;これ見たときに「Python関係ないのに必要なの？」と思っちゃいました。だってC++とRustですからね。ちなみにRustを聞いたとき浮かんだのはゲームのほうでした（笑）&lt;/p&gt;
&lt;p&gt;一応目視でも似たようなエラーが出ているかを確認してみると以下の2つのエラーが見れました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;error: Microsoft Visual C++ 14.0 or greater is required. Get it with &amp;ldquo;Microsoft C++ Build Tools&amp;rdquo;: &lt;a href=&#34;https://visualstudio.microsoft.com/visual-cpp-build-tools/&#34;&gt;https://visualstudio.microsoft.com/visual-cpp-build-tools/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ERROR: Failed building wheel for tiktoken、ERROR: Could not build wheels for tiktoken, which is required to install pyproject.toml-based projects&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gemini-proを使って簡単なチャットボットを作ってみよう！</title>
      <link>https://xainome-blog.pages.dev/posts/2024/01/gemini-pro-tutorial/</link>
      <pubDate>Mon, 22 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/01/gemini-pro-tutorial/</guid>
      <description>&lt;p&gt;生成AIがどんどん進化していく中でGoogleが新たなモデルを出しました。それが&amp;quot;Gemini-pro&amp;quot;です。&lt;/p&gt;
&lt;p&gt;ちなみに&lt;a href=&#34;https://deepmind.google/technologies/gemini/#bard&#34;&gt;こちら&lt;/a&gt;のページの下の画像リンクからGeminiが搭載されたBardを使うことができます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/gemini-pro-tutorial/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-22-161239-1024x359.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;チャットボットを作るにはAPIが必要なのでまずはAPIキーを取得します。キーは&lt;a href=&#34;https://ai.google.dev/&#34;&gt;こちら&lt;/a&gt;から取得できます。画像の&amp;quot;Get API key in Google AI Studio&amp;quot;のリンクをクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/gemini-pro-tutorial/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-22-162015-1024x430.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ページが移動したら&amp;quot;Get API key&amp;quot;タブから&amp;quot;Create API key in new project&amp;quot;をクリックすればAPIキーを取得することができます。これでチャットボットの準備ができました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/gemini-pro-tutorial/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-22-162415-1024x230.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;次にGoogle Colaboratoryを起動します。APIキーの設定とモデルの取得と機械学習webアプリケーションを設定するだけで使うことができます。今回は&amp;quot;Gradio&amp;quot;を使うことにします。他のアプリもありますが、いつか使ってみたいですね。&lt;/p&gt;
&lt;p&gt;コードは以下のように設定します。&amp;ldquo;YOU&amp;rsquo;RE_APIKEY&amp;quot;に取得したAPIキーを入れてください。&lt;/p&gt;
&lt;p&gt;!pip install gradio&lt;/p&gt;
&lt;p&gt;import gradio as gr&lt;br&gt;
import google.generativeai as genai&lt;/p&gt;
&lt;p&gt;# APIキーの設定&lt;br&gt;
GOOGLE_API_KEY = &amp;ldquo;YOU&amp;rsquo;RE_APIKEY&amp;rdquo;&lt;br&gt;
genai.configure(api_key=GOOGLE_API_KEY)&lt;/p&gt;
&lt;p&gt;# Generative AIモデルの初期化&lt;br&gt;
model = genai.GenerativeModel(&amp;ldquo;gemini-pro&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;# チャットボットの動作を定義&lt;br&gt;
def chatbot(prompt):&lt;br&gt;
# Generative AIモデルを使用して推論を実行&lt;br&gt;
response = model.generate_content(prompt)&lt;br&gt;
return response.text&lt;/p&gt;
&lt;p&gt;# Gradio UIの設定&lt;br&gt;
iface = gr.Interface(&lt;br&gt;
fn=chatbot,&lt;br&gt;
inputs=gr.Textbox(type=&amp;ldquo;text&amp;rdquo;, placeholder=&amp;ldquo;Press Enter to Submit&amp;rdquo;),&lt;br&gt;
outputs=&amp;ldquo;text&amp;rdquo;,&lt;br&gt;
live=True&lt;br&gt;
)&lt;/p&gt;</description>
    </item>
    <item>
      <title>生成AIでプロンプトを使うときに大切な26項目</title>
      <link>https://xainome-blog.pages.dev/posts/2024/01/26-tips-for-generative-ai-prompts/</link>
      <pubDate>Thu, 18 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/01/26-tips-for-generative-ai-prompts/</guid>
      <description>&lt;p&gt;2023年12月16日にプロンプトを使うときに最適な支持を出す「26の指針」が発表されました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://arxiv.org/abs/2312.16171v1&#34;&gt;こちら&lt;/a&gt;から確認できます。対象のモデルはLLaMA-1/2とGPT-3.5/4が対象になります。&lt;/p&gt;
&lt;p&gt;その指示の効果などは&lt;a href=&#34;https://github.com/VILA-Lab/ATLAS&#34;&gt;こちら&lt;/a&gt;のGithubで確認することができます。そして指示については以下の項目になります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;LLM使用時のコミュニケーション&lt;/strong&gt;: 礼儀的なフレーズ（「お願いします」「もしよろしければ」「ありがとう」）は不要。直接的な言葉遣いをする。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;対象者の明示&lt;/strong&gt;: 「専門家向け」といった対象者をプロンプトに含める。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;複雑なタスクの分解&lt;/strong&gt;: 難しいタスクは、簡単なプロンプトの連続に分けて実行する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;肯定的な指示&lt;/strong&gt;: 「～する」という肯定的な指示を使用し、「～しない」という否定的な表現を避ける。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;明確化と理解の促進&lt;/strong&gt;: 特定のトピックを簡単な言葉で説明する。11歳の子供に説明するようにする。初心者向けの説明を行う。エッセイ／テキスト／パラグラフを5歳児に説明するように簡略化する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;報酬の提示&lt;/strong&gt;: 「より良い解決策にはxxxドルのチップを払う」と報酬を明示する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;例題主導型のプロンプト&lt;/strong&gt;: 数例に基づくプロンプトを使用する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;プロンプトのフォーマット&lt;/strong&gt;: 「###Instruction###」で指示を開始する。必要に応じて「###Example###」や「###Question###」を追加する。指示、例、質問、文脈、入力データを区別するために改行を使用する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;指示的なフレーズの使用&lt;/strong&gt;: 「あなたのタスクは」「あなたは必ず」といったフレーズを含める。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ペナルティの提示&lt;/strong&gt;: 「あなたはペナルティを受ける」というフレーズをプロンプトに組み込む。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;自然な回答の促進&lt;/strong&gt;: 「自然で人間らしい方法で質問に答える」というフレーズを使用する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ステップ・バイ・ステップの考慮&lt;/strong&gt;: 導入的なフレーズとして「ステップ・バイ・ステップ考える」を使用する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;バイアスのチェック&lt;/strong&gt;: 「あなたの回答にバイアスがかかっていないか、固定観念によるものではないかを確認してください」というフレーズを追加する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;情報の精密化&lt;/strong&gt;: AIモデルが必要な情報を得るまで、ユーザーに繰り返し質問するよう指示する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;理解度のテスト&lt;/strong&gt;: 特定のトピックやアイデアについて尋ね、ユーザー自身の理解度をテストする。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;モデルへの役割割り当て&lt;/strong&gt;: モデルに特定の役割を割り当てる。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;区切り文字の使用&lt;/strong&gt;: 区切り文字を使用する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;単語やフレーズの繰り返し&lt;/strong&gt;: プロンプト内で特定の単語やフレーズを複数回繰り返す。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;思考の連鎖と例示&lt;/strong&gt;: CoT（Chain-of-Thought）と例示を組み合わせる。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;出力プライマーの使用&lt;/strong&gt;: 望ましい応答の開始部分でプロンプトを終了する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;詳細な記述の要求&lt;/strong&gt;: 必要な情報を提供し、[トピック]について詳細な[エッセイ／テキスト／段落]を書くよう指示する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文体の維持における修正&lt;/strong&gt;: ユーザーの送信したすべての段落を見直し、文法や語彙を改善するよう指示するが、文体を変えない。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;複雑なコーディングプロンプト&lt;/strong&gt;: 複数のファイルにまたがるコードを生成する際に、指定されたファイルを自動的に作成するよう指示する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;一貫性のあるテキスト生成&lt;/strong&gt;: ユーザーが提供する出発点から、LLMが一貫性を持ってテキストを生成するよう促進する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;生成要件の明示&lt;/strong&gt;: モデルがコンテンツを生成するために従うべき要件を、キーワード、規制、ヒント、または指示の形で明確に示す。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;サンプルに基づくテキスト作成&lt;/strong&gt;: 提供されたサンプルに似たエッセイや段落などのテキストを書くよう指示する。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ただ、英語での調査でモデルも一部だけなので参考程度で考えたほうがいいかなという気はします。日本語でやる場合は、他の方法などもあるかもしれないですね。&lt;/p&gt;</description>
    </item>
    <item>
      <title>E資格まで後1ヵ月なので頑張ろう！</title>
      <link>https://xainome-blog.pages.dev/posts/2024/01/jdla-deep-learning-engineer-exam-to-1/</link>
      <pubDate>Wed, 17 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/01/jdla-deep-learning-engineer-exam-to-1/</guid>
      <description>&lt;p&gt;さて約1ヵ月後にE資格が迫ってきました。そろそろ本気で取り掛からないとなと感じています。&lt;/p&gt;
&lt;p&gt;せっかくなので受ける経緯とどう勉強したかを書いてみようかと思います。&lt;/p&gt;
&lt;p&gt;そもそも私はG検定を受けていました。それが1年前ですが転職を考えたときに実務の部分が薄く感じたので資格で補強しようと考えました。&lt;/p&gt;
&lt;p&gt;無事G検定は2023年3月頃に合格しました。その直後ですが、とあるメールが届きました。E資格の資格を受ける料金が割引されるという内容でした。&lt;/p&gt;
&lt;p&gt;ちなみにE資格は割とお金がかかるものになってます。会社によっては何十万とかかったりします。もちろん国の補助金で安くなったりする場合もありますが、それでも10万以上かかるのが普通です。&lt;/p&gt;
&lt;p&gt;ちなみに私はStudy-AIという企業様のe-ラーニングを受けていました。入会料金が3万で月々3千円くらいです。かつ、受験料が3万ぐらいなので最短だと合計7万5千くらいになると思います。これが企業の講習では最安かと思います。大学の講義を受けるなら別かもしれませんが…&lt;/p&gt;
&lt;p&gt;私が受験資格を得たStudy-AIという企業様の講習内容ですがざっくり以下になります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;応用数学&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;機械学習&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;深層学習-前編&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;深層学習-後編&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;E資格試験対策&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;G検定でも上記の内容はでましたが、E資格ではより詳細でコードも含めた内容となっています。&lt;/p&gt;
&lt;p&gt;また、1~4ではレポートの提出とテストの合格が必須条件になっています。&lt;/p&gt;
&lt;p&gt;私が提出したレポート内容ですが、配布されたコードの実行キャプチャとビデオ講義の内容で大事な個所をまとめました。&lt;/p&gt;
&lt;p&gt;テストの内容は講義で書かれていないことばかりですが、内容を把握していれば問題ないかと思います。ただし、間違っても正しい解答はわからない上にテスト実施は5回までとなっているので少し慎重になったほうがいいかもしれません。&lt;/p&gt;
&lt;p&gt;解答料金やテスト実行回数増加料金(いずれも3千円ほど)払えばやりやすくなるかもしれませんが…&lt;/p&gt;
&lt;p&gt;1~4まで終わるとE資格の修了者ナンバーがもらえます。ただし、修了者ナンバーをもらうまでの期限があるのでそれまでにレポートの提出とテスト合格しないといけません。大体E資格受験の1ヵ月前までが期限になります。&lt;/p&gt;
&lt;p&gt;修了者ナンバーをもらえれば&lt;a href=&#34;https://www.pearsonvue.co.jp/Clients/JDLA.aspx&#34;&gt;こちら&lt;/a&gt;からアカウントを作成して、申し込みをし、受験料を払えば当日受験することができます。&lt;/p&gt;
&lt;p&gt;果たしてこの資格が役に立つのかといえば微妙かもしれませんが、実際に手を動かすきっかけになるかと思うのでありかもしれません。また、今ならテストについては画像キャプチャしてGPTにでも聞けば解答を得られるかもしれないですね、やったことないですが…&lt;/p&gt;
&lt;p&gt;ブログの更新が遅くなりましたが引き続き勉強続けていきたいと思います。ではでは&lt;/p&gt;</description>
    </item>
    <item>
      <title>Claude(クロード)という新しい生成AIを触ってみたよ</title>
      <link>https://xainome-blog.pages.dev/posts/2024/01/claude-generative-ai-review/</link>
      <pubDate>Wed, 10 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/01/claude-generative-ai-review/</guid>
      <description>&lt;p&gt;生成AIの進化がすごい昨今ですが7月頃に出たAnthropic社のClaudeという生成AIを触ってみました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/claude-generative-ai-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-10-213216.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;一応聞いてみましたが、やはり英語のほうが得意みたいですね。とはいえ日本語も対応しているみたいなので少し触ってみます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/claude-generative-ai-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-10-213230.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Chat-GPTとどう違いがあるのかわかってなかったので聞いてみたら、こんな感じの回答をもらえました。Chat-GPTは会話重視ですがClaudeは情報提供重視みたいですね。ただ、情報提供だと曖昧なので少し深堀してみようと思います。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/claude-generative-ai-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-10-213245.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;なるほど、こんな感じですか。とはいえChat-GPTと大きく違うかと言われるとまだよくわからないのですが…&lt;/p&gt;
&lt;p&gt;次は最新情報の日付を調べてみましょう。Chat-GPTは2023年の4月時点の情報だったと思いますが、こっちはどうでしょうか？&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/claude-generative-ai-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-10-213302.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;あまり的を得ない回答でした。もう少し具体的な日付を出せるようやってみましょう。最近起きた能登半島の地震について聞いてみました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/claude-generative-ai-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-10-221754.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;一応2022年のデータはあるが詳しい情報まではないという感じですね。最後にファイルの確認をしてみましょうか。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/01/claude-generative-ai-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-01-10-222407.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;裁判の判例ファイルをアップしてみたのですが、合ってそうです。ちなみにこれ無料で使えています。Chat-gpt3.5だと判例は読み切れなかったかと思いますので、コスパに対する性能は高そうです。&lt;/p&gt;
&lt;p&gt;今回はこれくらいで終わりにしようと思います。最近の進化は凄すぎてなかなか追うのは難しそうです。ですが、時代に取り残されないよう活用できる側にまわるため色んな情報を取り入れていきましょう！ではでは&lt;/p&gt;</description>
    </item>
    <item>
      <title>転職メールの管理をBardにやらせたら楽になるのではと試行錯誤したやつ</title>
      <link>https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/</link>
      <pubDate>Wed, 27 Dec 2023 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/</guid>
      <description>&lt;p&gt;ここのとこあまり役に立たなそうな事ばかり書いていたので変わった内容を書いてみました&lt;/p&gt;
&lt;p&gt;転職を検討した際にいろんなサイトから&amp;quot;スカウト&amp;quot;や&amp;quot;気になる&amp;quot;などのメールが来るかと思います。正直をそれらを整理するのが面倒だし、確認も大変だなと思うことが多々あります。&lt;/p&gt;
&lt;p&gt;そこでGmailを使ってるならBradを使って楽にならないのかと考えました&lt;/p&gt;
&lt;p&gt;今回は&amp;quot;Green&amp;quot;という転職サイトを使ってみました。まずはこんな感じ&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-27-091702-wpp1703664689246-1024x591.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;なるほど、ここで表示されてるのは&amp;quot;スカウト&amp;quot;をいただいた企業様一覧ですね。&lt;/p&gt;
&lt;p&gt;この一覧はスプレッドシートで見れるので作成してもらったらこんな感じ&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-27-091804-wpp1703664767533-1024x611.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;おお！これを使えばだいぶ管理がしやすくなるのでは！&lt;/p&gt;
&lt;p&gt;&amp;ldquo;スカウト&amp;quot;もありますが、&amp;ldquo;気になる&amp;quot;という機能もあるみたいでこちらは件数がかなり多いです。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-27-091737-wpp1703664893321-1024x523.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;おや？想定よりもかなり少ない件数になりました。&lt;/p&gt;
&lt;p&gt;少し趣向を変えて質問してみようと思います。メールの文面で該当するものを抽出してもらいます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-27-091830-wpp1703664972158-1024x550.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;確かにでましたが、やはり全部は出てこないみたいです。Gmailにはタブ別に分けられていたりするのでタブを指定してみました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-27-091914-wpp1703665531121-1024x584.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;何をもって可能性が高いと言ってるかは不明ですが、200件以上あることはわかりました。&lt;/p&gt;
&lt;p&gt;ただ、この表には200件も入ってなかったので入るよう指示を出します。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-27-091943-1-wpp1703665397942-1024x481.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-27-091955-wpp1703665163231-1024x401.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;途中で切れてしまいました。そもそも1つの表にまとめてほしいのでそう指示を出してみます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-27-092016-1024x633.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;いやいや、まさかの手動でやれと！？面倒だから頼んでるのに！？ちょっと苛だったので命令口調に&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-27-092032-1024x521.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;おお！これで確認が楽になるのか！数時間かかってもいいからやってくれるのであれば有難い！ということで必要な情報を渡しました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-27-092047-1024x578.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;これで出来たらウキウキだ！楽しみ！と思って待ってました。とはいえせっかちなので数十分後にきいてみました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-27-092108-1024x277.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;まあ、しょうがない件数も多かったから時間はかかるよねと。数時間後…&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-27-092134-1024x581.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;いや、まだやってすらなかったのかい！ということで作業を開始するよう指示を出しました。数時間後…&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-27-092207-1024x558.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;まとめる作業が大変みたいです。1.5Gってそんなにデータ量あるの！？と思いましたが辛抱強く待つことにしました。2日後…&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-27-092224-wpp1703665304217-1024x580.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;キターーーーーー！終わった！長かった！途中何回か聞きましたが、同じ回答だったので割愛しました。よし、このURLで確認できればこのやりとりももう終わり！&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/job-search-email-bard/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-27-092240.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;はあ？ナニコレ？できてないじゃん。それとも出来たけど消したりでもした？Bardに呆れた私はこれ以降使うことをやめました。&lt;/p&gt;
&lt;p&gt;とはいえ、誰かとのやり取りぐらいだったら簡単にまとめられそうなので忘れがちな人にはいいかもしれないです。&lt;/p&gt;
&lt;p&gt;ただ、Chat-GPTでも個人情報の流出があったりしたので、Bardのような色んなGoogleアプリの連携ができるとより流出の可能性があるのでは？と気にしてたりします。&lt;/p&gt;
&lt;p&gt;AIは便利ですが、万能ではなくリスクもあるので気を付けつつ、楽な暮らしを目指していきたいですね！ではまた次回の記事で&lt;/p&gt;</description>
    </item>
    <item>
      <title>GitHubに今更創作物を登録してみました</title>
      <link>https://xainome-blog.pages.dev/posts/2023/12/publishing-personal-projects-on-github/</link>
      <pubDate>Wed, 20 Dec 2023 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2023/12/publishing-personal-projects-on-github/</guid>
      <description>&lt;p&gt;転職をする際、エンジニアの場合自身で何か作ったものがあれば提出することがあると思います。また、転職サイトによってはGitを登録することもあると思います。&lt;/p&gt;
&lt;p&gt;私は仕事に必要な時にその場で覚えるタイプなのですが、たまに興味があるものがあってそれを作ってみたいということがちょくちょくありました。ただ、最後まで作りきったことは少ないのですが…&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sai-nome&#34;&gt;こちら&lt;/a&gt;から見ることはできると思います。publicなので誰でも見れます。仕事では基本privateですが、特に利益に繋がったり特別な制作物でなければpublicでもいい気がします。何が利益に繋がるかはわかりませんが…&lt;/p&gt;
&lt;p&gt;ところで、人のGitHubを見たことがほとんどないのですが、一般的にはどのようなものをGitにあげてるんでしょうか？何か面白いものや変わった制作物が上がってたりするんでしょうか？&lt;/p&gt;
&lt;p&gt;以前会社で作ったものをGitに上げて転職に使ってた事件がありましたが、会社の制作物はいくら自身が作ったとはいえ問題ですね。私もそうならないよう気を付けつつ、何かしら作り続けたいなとは思います。頑張って最後まで作るよう努力します…&lt;/p&gt;</description>
    </item>
    <item>
      <title>GASを使って勤怠管理の提出を忘れないようにしたい！</title>
      <link>https://xainome-blog.pages.dev/posts/2023/12/gas-attendance-management/</link>
      <pubDate>Sun, 03 Dec 2023 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2023/12/gas-attendance-management/</guid>
      <description>&lt;p&gt;皆さんは日々の作業の中で提出物などはありますか？&lt;/p&gt;
&lt;p&gt;私は月の初めの第1営業日、月の終わりから5営業日前、最終営業日に勤怠の提出があります。忘れがちな私はよく上司から提出していないと言われ、言う側も言われる側もストレスだと思い、Slackに通知が来るようなプログラムを組むことにしました。&lt;/p&gt;
&lt;p&gt;連携で使用したアプリは以下の2つになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GAS(Google Apps Script)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Slack&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;やることは以下の順でやっていきます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Slackに通知するためのアプリ作成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://xainome-blog.pages.dev/posts/2023/12/gas-attendance-management/#apps&#34;&gt;アプリの作成&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://xainome-blog.pages.dev/posts/2023/12/gas-attendance-management/#notice&#34;&gt;通知の設定&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://xainome-blog.pages.dev/posts/2023/12/gas-attendance-management/#work&#34;&gt;ワークスペースへのインストールとURL作成&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GASにコードを書いて日時実行の設定を行う&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://xainome-blog.pages.dev/posts/2023/12/gas-attendance-management/#code&#34;&gt;コードの作成&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://xainome-blog.pages.dev/posts/2023/12/gas-attendance-management/#trigger&#34;&gt;実行トリガーの作成&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;アプリの作成&lt;/p&gt;
&lt;p&gt;1つ目ですがまずはSlackのアプリ作成から始めます。&lt;a href=&#34;https://api.slack.com/apps&#34;&gt;こちら&lt;/a&gt;からアプリ作成ができます。リンク先に飛んだ後、赤枠の「Create New App」をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/gas-attendance-management/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-02-153025-wpp1701501782703.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;この画面が出たら赤枠の「From scratch」をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/gas-attendance-management/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-02-153040-wpp1701502071691.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;この画面が出たらアプリの名前と使用するワークスペースを設定します。仕事で使ってる人はワークスペースが所属している会社名になったりすると思います。設定が完了したら「Create App」をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/gas-attendance-management/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-02-153104-wpp1701502109236.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;通知の設定&lt;/p&gt;
&lt;p&gt;この画面になりますので「OAuth &amp;amp; Permissions」をクリックして、通知の設定をします。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/gas-attendance-management/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-02-153407-wpp1701502138773.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;次に、Scopesでアプリに与える権限の設定を行います。「Add an OAuth Scope」をクリックし、「incoming-webhook」を選択します。今回は特定のチャンネル(自身のみ)通知を送る設定なのでこちらを選択します。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/gas-attendance-management/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-02-155128-wpp1701501905755.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ワークスペースへのインストールとURL作成&lt;/p&gt;
&lt;p&gt;同じタブで下の方にスクロールするとこの画面が出ますので「install to Workspace」をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/gas-attendance-management/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-02-155203-wpp1701501948122.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;次に、権限が求められますので投稿先を自身のチャンネルに設定して、「許可する」をクリックします。もし、他の人にも通知をしたい場合は、そのチャンネルに設定してください。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/gas-attendance-management/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-02-155230-wpp1701501832629.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;これで通知に必要なURLを設定することができましたので、次はコードの作成に移ります。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/12/gas-attendance-management/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-12-02-155324-wpp1701502023177.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;コードの作成&lt;/p&gt;
&lt;p&gt;2つめのGASに関しては&lt;a href=&#34;https://qiita.com/ykhirao/items/782e20ab0465533c48f6&#34;&gt;こちら&lt;/a&gt;を参考にして作り、コードのきれいさを保つため、Chat-GPTに頼みました。1つ目の設定が終わったらwebhook URLをコード内に貼り付けます。&lt;/p&gt;
&lt;p&gt;もし、会社で特定の日が休日であればそこも考慮することができます。私は年末年始辺りの日付を入れてます。&amp;ldquo;specialHolidays&amp;quot;という変数に日付を入れていただけるとできます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;// Slackに特定の日の通知を送る関数
function documentAlert() {
  const today = new Date();
  // const today = new Date(&amp;#34;2023/12/22&amp;#34;); // テスト用: 

  const monthEnd5Date = getLastDateOfMonth(today);
  const monthEnd1Date = getLastDateOfMonth(today);
  const monthStartDate = new Date(today.getFullYear(), today.getMonth(), 1);

  sendNotificationIfDue(today, monthEnd5Date, -5, today+&amp;#34;、5営業日前になりました。見込み版勤怠の提出をお願いします。&amp;#34;);
  sendNotificationIfDue(today, monthEnd1Date, -1, today+&amp;#34;、最終営業日になりました。確定版勤怠の提出をお願いします。&amp;#34;);
  sendNotificationIfDue(today, monthStartDate, 1, today+&amp;#34;、第一営業日になりました。自社勤怠と交通費精算の提出をお願いします。&amp;#34;);
}

// 営業日計算関数
function dayCount(date, offsetDays) {
  let counter = 1;

  while (counter &amp;lt;= Math.abs(offsetDays)) {
    if (!isHoliday_(date)) counter++;
    if (counter &amp;gt; Math.abs(offsetDays)) break;
    date.setDate(date.getDate() + Math.sign(offsetDays));
  }
  return date;
}

// Slackに通知を送る関数
function slackSend(message) {
  const webhookUrl = &amp;#34;ワークスペースのWebhook URL&amp;#34;;
  
  const payload = {
    &amp;#34;text&amp;#34;: message
  };

  const options = {
    &amp;#34;method&amp;#34;: &amp;#34;post&amp;#34;,
    &amp;#34;muteHttpExceptions&amp;#34;: true,
    &amp;#34;contentType&amp;#34;: &amp;#34;application/json&amp;#34;,
    &amp;#34;payload&amp;#34;: JSON.stringify(payload)
  };

  UrlFetchApp.fetch(webhookUrl, options);
}

// 休日か否かを判定する関数
function isHoliday_(date) {
  if (isWeekend(date) || isHolidayEvent(date) || isSpecialHoliday(date)) {
    return true;
  }
  return false;
}

// 土日判定
function isWeekend(date) {
  const dayOfWeek = date.getDay();
  return dayOfWeek === 0 || dayOfWeek === 6;
}

// 祝日イベント判定
function isHolidayEvent(date) {
  const calendarId = &amp;#34;ja.japanese#holiday@group.v.calendar.google.com&amp;#34;;
  const events = CalendarApp.getCalendarById(calendarId).getEventsForDay(date);
  return events.length &amp;gt; 0;
}

// 特定の休日判定
function isSpecialHoliday(date) {
  const specialHolidays = [&amp;#34;0101&amp;#34;, &amp;#34;0102&amp;#34;, &amp;#34;0103&amp;#34;, &amp;#34;1229&amp;#34;, &amp;#34;1230&amp;#34;, &amp;#34;1231&amp;#34;];
  const formattedDate = Utilities.formatDate(date, &amp;#34;JST&amp;#34;, &amp;#34;MMdd&amp;#34;);
  return specialHolidays.includes(formattedDate);
}

// 月末最終日を取得する関数
function getLastDateOfMonth(date) {
  return new Date(date.getFullYear(), date.getMonth() + 1, 0);
}

// 特定の日に通知を送るためのヘルパー関数
function sendNotificationIfDue(today, baseDate, offsetDays, message) {
  const targetDate = dayCount(baseDate, offsetDays);
  if (isSameDay(today, targetDate)) {
    slackSend(message);
  }
}

// 二つの日付が同じ日か判定する関数
function isSameDay(date1, date2) {
  return date1.getDate() === date2.getDate();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;実行トリガーの作成&lt;/p&gt;</description>
    </item>
    <item>
      <title>GPTsを使って1からGCPを触ってみたよ</title>
      <link>https://xainome-blog.pages.dev/posts/2023/11/gpts-1-from-gcp-review/</link>
      <pubDate>Fri, 24 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2023/11/gpts-1-from-gcp-review/</guid>
      <description>&lt;p&gt;昨今OpenAIのCEOが退任したり、復帰したりと騒がせている状況ですが、私はGPTsをうまく使えないか模索していたりします。&lt;/p&gt;
&lt;p&gt;そんな中でGPTsを使ってGCPの構築を手伝ってもらいました。まずはGPTsの設定ですね&lt;/p&gt;
&lt;p&gt;GPTsの設定は簡単でした。「Create a GPT」からオリジナルのGPTを作り、ガイドに従ってどのようなGPTを作りたいのか指示を出します。Configureは無視していいです。ファイルについては業界特有の知識などが必要であれば添付するといいかと思いますが、今回は使いません。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/11/gpts-1-from-gcp-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-11-24-205007-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/11/gpts-1-from-gcp-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-11-24-210127-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;私の場合は、GCPの使い方を知りたかっただけですので特にファイルの添付なども不要です。その後は解答の仕方を聞かれたり、アイコンの見た目やGPTの名前を決めて完了になります。&lt;/p&gt;
&lt;p&gt;作った後は簡単でひたすら作ったGPTに質問をします。BigQueryとFirestoreの違いは何か？とかcsvファイルのインポートの仕方はどうしたらいいか？とかLokker StudioとBigQueryを連携してレポートを出す方法を教えて等です。&lt;/p&gt;
&lt;p&gt;以下は国のデータから人口動態のcsvファイルを取ってきてインポートしたデータになります。それをグラフで可視化してみました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/11/gpts-1-from-gcp-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-11-24-225513.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/11/gpts-1-from-gcp-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-11-24-225607-1024x755.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;このようにGPTsを作って質問すれば、簡単にGCPの構築もできますし、試したいことも出てくると思います。IT系であれば特化したGPTは作りやすいですし、専門的な知識をファイルかURLで与えれば専門分野に特化したGCPもできると思います。また、他人が作成したGCPを使うこともできますので興味があれば調べて触ってみるのもいいと思います。では、よい生成AIライフを～&lt;/p&gt;</description>
    </item>
    <item>
      <title>副業でGCPの案件をやりそうなので勉強中です</title>
      <link>https://xainome-blog.pages.dev/posts/2023/11/learning-gcp-for-freelance-project/</link>
      <pubDate>Sun, 19 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2023/11/learning-gcp-for-freelance-project/</guid>
      <description>&lt;p&gt;最近、友人から副業をやらないかというお誘いがありました。とはいえAWSを使ったことはありますが、GCPを使ったことがないのでとりあえず触ってみてほしいとのことでした。&lt;/p&gt;
&lt;p&gt;触ってほしいのは以下の3つ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;firestore&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BigQuery&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Looker Studio&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Firestoreの役目としてはスキーマレスで動的なデータ構造に対応、スケーラビリティに優れ、リアルタイムのデータ処理に適しています。&lt;/p&gt;
&lt;p&gt;BigQueryの役目としては複雑なデータ構造に対応、大規模かつ高速処理に特化し、大量で複雑な分析に向いています。&lt;/p&gt;
&lt;p&gt;Looker StudioはBIツールとして使われ、BigQuery内のデータを可視化でき、ダッシュボードを作成し、ユーザーに理解しやすい形で表示できるツールになります。&lt;/p&gt;
&lt;p&gt;ちなみにBigQueryにはデフォルトでオープンデータがあるのでデータ収集やインポートの必要はなさそうです。実務作業ではインポートの必要性もありそうですが、今は使えるようになるのが目標なのでこれで十分だと思います。&lt;/p&gt;
&lt;p&gt;BigQueryでクエリを作成し、作られたデータをLooker Studioで表示するまではできそうなのですが、Firestoreのリアルタイムでデータは株や道路情報などがありますが、扱うのはもう少し先になりそうです。&lt;/p&gt;
&lt;p&gt;副業案件までどこまで触れるかわかりませんが、自身のできることを増やし、その中で得意なこと、掛け合わせたもので専門性を高めて、来たるAI＆1億人未満の日本社会に備えられたらなーとは思います。&lt;/p&gt;</description>
    </item>
    <item>
      <title>parquetファイルの中身はVSCODEの拡張機能 Data Wranglerで見れる！</title>
      <link>https://xainome-blog.pages.dev/posts/2023/11/parquet-vscode-data-wrangler/</link>
      <pubDate>Tue, 07 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2023/11/parquet-vscode-data-wrangler/</guid>
      <description>&lt;h2 id=&#34;parquetファイルについて&#34;&gt;parquetファイルについて&lt;/h2&gt;
&lt;p&gt;parquetファイルは非常に優秀なファイルだと思います。&lt;/p&gt;
&lt;p&gt;pythonでデータを扱う場合、小規模のデータであればcsvファイルが使われがちですが、私の現場ではparquetファイルが使われています。&lt;/p&gt;
&lt;h3 id=&#34;parquetのメリット&#34;&gt;parquetのメリット&lt;/h3&gt;
&lt;p&gt;メリットとしては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;データが圧縮されるため、ストレージの節約になる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ファイルを読み込む際、型の指定をしなくても自動で読み込んでくれる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;データを列で読み込むと高速で読み込める&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;parquetのデメリット&#34;&gt;parquetのデメリット&lt;/h3&gt;
&lt;p&gt;デメリットとしては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ファイルを手軽に扱えない(テキストファイルで開いたり、書き換えたり)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;個人的にはこのように感じています。&lt;/p&gt;
&lt;h3 id=&#34;data-wranglerについて&#34;&gt;Data Wranglerについて&lt;/h3&gt;
&lt;p&gt;これが&lt;a href=&#34;https://code.visualstudio.com/docs/datascience/data-wrangler&#34;&gt;Data Wrangler&lt;/a&gt;(ラングラー)を使えば手軽に見ることができます！ただし、書き換えたりはできないですが…。&lt;/p&gt;
&lt;p&gt;しかも導入手順も簡単！&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;拡張機能からData Wranglerをインストール&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;対象のファイルを右クリック &amp;gt; Opne in Data Wranglerをクリック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pythonやjupyter notebookのカーネルに接続する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;必要なライブラリが足らなければインストールを行う&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;こうすることで以下のような画面でparquetファイルの中身を見ることができます！(画面黒いと目にいいよね)&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Data Wrangler_parquet&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/11/parquet-vscode-data-wrangler/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-11-07-224946-1024x547.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;csvファイルも同じように見れます&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Data Wrangler_csv&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/11/parquet-vscode-data-wrangler/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-11-07-224915-1024x547.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;ちなみに上記のデータはスクレイピングで取ってきた求人情報になります(スクレイピングプログラムはChat-GPTに頼みました)。一応利用規約見てスクレイピングに関する規約はなかったので大丈夫かと思いますが、もしやる際は連続アクセスにならないよう2,3秒時間を空けることを勧めます。&lt;/p&gt;
&lt;h3 id=&#34;データ操作について&#34;&gt;データ操作について&lt;/h3&gt;
&lt;p&gt;上のカラム名の場所に欠損の数やユニークな値の数、数値であればヒストグラムの分布などが描かれたりします&lt;/p&gt;
&lt;p&gt;また左の操作でカラムの操作や欠損値埋め、文字列変換、グループ化など簡単なデータ変換であればこちらで操作できるうえに、コード化ファイルを出力することもできます！&lt;/p&gt;
&lt;p&gt;おおまかにデータを見ながら加工をし、そのプログラムを作ってくれる素晴らしい機能をMicrosoftが提供していますのでぜひ活用していきたいですね！&lt;/p&gt;</description>
    </item>
    <item>
      <title>E資格の試験勉強を再開し始めました！</title>
      <link>https://xainome-blog.pages.dev/posts/2023/10/jdla-deep-learning-engineer-exam-study/</link>
      <pubDate>Mon, 30 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2023/10/jdla-deep-learning-engineer-exam-study/</guid>
      <description>&lt;p&gt;私は4月頃にE資格の勉強を始めました。&lt;/p&gt;
&lt;p&gt;受験の日付は8月の中旬で受験をするための資格取得期限が7月中旬でした&lt;/p&gt;
&lt;p&gt;資格の取得は無事取得できたのですが、残り1か月の期間で合格できる気がしなく2024年2月初旬に受けることを決めました。&lt;/p&gt;
&lt;p&gt;で、残り3か月になったのでそろそろ勉強を始めないと頭の悪い私は合格できる気がしないので勉強を再開したという経緯になります。&lt;/p&gt;
&lt;p&gt;そもそもE資格とは何ぞやということですが、簡潔に言えば「深層学習の理論を理解し、実装能力や知識を有する認定資格」というものになります。&lt;/p&gt;
&lt;p&gt;なのでこの資格を取れば深層学習に関する知識を持ち、プログラムの実装もできるはず…&lt;/p&gt;
&lt;p&gt;ですが、実際にプログラムの実装をしない人が多いような気もしています。kaggleなどで同時に進めていくとより理解は深まりそうな気もしていますが、そこまでする人もいなさそうです(私含め)&lt;/p&gt;
&lt;p&gt;資格はあくまで資格でその先の何をしたいのかが重要なので、転職だったりkaggleで試してみるなど覚えたスキルを活用できる場所を見つけるのが大切ですよね&lt;/p&gt;
&lt;p&gt;そんなわけでkaggleを触ってみつつ、勉強を進めていきたいなと思うこのころです&lt;/p&gt;</description>
    </item>
    <item>
      <title>今更Chat-GPTの有料版に課金してプラグインで遊んでます</title>
      <link>https://xainome-blog.pages.dev/posts/2023/10/chatgpt-plus-plugins-review/</link>
      <pubDate>Sun, 29 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2023/10/chatgpt-plus-plugins-review/</guid>
      <description>&lt;p&gt;最近chat-gptに課金してプラグインで遊ぶことを覚えました（笑）&lt;/p&gt;
&lt;p&gt;chat-gptがリリースされてもうすぐ1年経とうとしていますが、AIの発展はすごいですね&lt;/p&gt;
&lt;p&gt;プラグインも1000個近くあるみたいで、全てを把握するのは難しそうですね&lt;/p&gt;
&lt;p&gt;いずれChromeの拡張機能のように悪意のあるプラグインができたりしそうですが…&lt;/p&gt;
&lt;p&gt;それはさておき私は以下のプラグインを入れて遊んでます&lt;/p&gt;
&lt;p&gt;1.Scraper&lt;/p&gt;
&lt;p&gt;2.WebPilot&lt;/p&gt;
&lt;p&gt;3.Scholer AI&lt;/p&gt;
&lt;p&gt;4.SEO&lt;/p&gt;
&lt;p&gt;1はスクレイピングをするときに使ってます。URLに載ってる欲しい情報を書き、そのコードを書いてもらい、後でcolabで実行しています&lt;/p&gt;
&lt;p&gt;エラーが出ても修正するようお願いしたら修正してもらえるので楽ですね、下の画像のように出してもらってます&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/10/chatgpt-plus-plugins-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-10-29-221713.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/10/chatgpt-plus-plugins-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-10-29-221725-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Chat-gptは2021年の9月ぐらいの情報しかないのですが2を使えば最新の情報も取得できますので、調べ物があるときにはお勧めです。簡単な情報ならChromeでもいいですが、日本であまり流行ってないゲームや海外の情報であれば日本語訳もしてくれます&lt;/p&gt;
&lt;p&gt;3はScholoerという論文を掲載しているサイトで載ってる論文を探してくれます。とはいえあまり使いこなせてないのですが…&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/10/chatgpt-plus-plugins-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-10-29-221412-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;4はサイトのSEO対策について教えてくれます。これを見て参考になることがあるかと思いますが、私の場合はoutput優先なのであまり使いこなせないかも…&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2023/10/chatgpt-plus-plugins-review/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-10-29-221450.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;こんな感じでプラグインを使いこなすと面白いかと思います。他にも株に関する情報だったり地震やゲーム、経済などももわかりますので是非興味があれば触ってみるといいと思います&lt;/p&gt;
&lt;p&gt;プログラマーならAPIを使ってプログラムを書いたり、プラグインを作る側にまわったほうがいいんでしょうが、APIを使った開発をやったことがないのでいずれやってみたいですね&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
