[{"content":"はじめに モバイルPCでOllamaを動かした記録です。\nwindowsで作業をしています。\nインストール ollamaをインストールします。\nscoopというwindowsで使用可能な管理ツールでインストールします。\nhttps://scoop.sh/\nscoop install ollam インストーラからだとGUIが使えます\nhttps://ollama.com/download/windows\n実行 qwen3.5という日本語に強いらしいモデルを使用します。\nhttps://ollama.com/library/qwen3.5\n他のモデルを使用したい場合は以下のリンクから検索ができます。\nhttps://ollama.com/search\n起動 CUIから ollama runで指定したモデルが起動します。\nローカルに指定したモデルがなければ自動的にインストールしてくれます。\n今回は容量が6.6GBで、普通のPCで使えると思われるqwen3.5:4bを使用します。\nollama run qwen3.5:4b 上記のコマンド実施後はチャット形式で会話が始まります。\nAPIから CUIから呼び出したので次はAPIから呼び出しましょう。\ncurlを使用すると以下のように呼び出せます。\ntime curl http://localhost:11434/api/chat -d \u0026#39;{\u0026#34;model\u0026#34;: \u0026#34;qwen3:0.6b\u0026#34;,\u0026#34;messages\u0026#34;: [{ \u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;Hello!\u0026#34; }]}\u0026#39; ストリーム形式で実行したい場合は以下のようにパラメータを指定してください。\ncurl http://localhost:11434/api/chat -d \u0026#39;{\u0026#34;model\u0026#34;: \u0026#34;qwen3:0.6b\u0026#34;,\u0026#34;messages\u0026#34;: [{ \u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;Hello!\u0026#34; }],\u0026#34;stream\u0026#34;: true}\u0026#39; もしollamaの実行がされていないなら応答は返ってこないので以下のコマンドで起動しましょう。\nollama serve プログラムから pythonからollamaの呼び出しを行います。\nライブラリ管理ツールのuvを使用するのであらかじめuvをインストールしておきます。\nscoop install uv ライブラリインストール\nuv init uv add openai openai_ollam\nfrom openai import OpenAI client = OpenAI( api_key=\u0026#34;\u0026#34;, base_url=\u0026#34;http://localhost:11434/v1\u0026#34; ) response = client.chat.completions.create( model=\u0026#34;qwen3:8b\u0026#34;, messages=[{\u0026#34;role\u0026#34;:\u0026#34;user\u0026#34;,\u0026#34;content\u0026#34;:\u0026#34;こんにちは\u0026#34;}], temperature=0 ) print(response) print(response.choices[0].message.content) Ollama公式ライブラリだとさらに簡素な実装となります。\nuv add ollama ollama_lib.py\nimport ollama response = ollama.chat( model=\u0026#34;qwen3:8b\u0026#34;, messages=[{\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;LLMについて\u0026#34;}] ) print(response.message.content) 最後にページから情報を取ってきて、要約を行ったり、ブログの情報に基づいて回答を行うプログラムを実行しましょう。\nますhtto通信を行うためのライブラリインストールしましょう\nuv add requests 以下がページを取得して、LLMに読み込ませ、ページの要約をし、質問を受け付けるプログラムです。\nimport sys import requests import json from html.parser import HTMLParser OLLAMA_URL = \u0026#34;http://127.0.0.1:11434/api/chat\u0026#34; class ArticleTextExtractor(HTMLParser): def __init__(self): super().__init__() self.text_parts = [] self._skip_tags = {\u0026#34;script\u0026#34;, \u0026#34;style\u0026#34;, \u0026#34;nav\u0026#34;, \u0026#34;header\u0026#34;, \u0026#34;footer\u0026#34;} self._current_skip = 0 def handle_starttag(self, tag, attrs): if tag in self._skip_tags: self._current_skip += 1 def handle_endtag(self, tag): if tag in self._skip_tags and self._current_skip \u0026gt; 0: self._current_skip -= 1 def handle_data(self, data): if self._current_skip == 0: text = data.strip() if text: self.text_parts.append(text) def get_text(self): return \u0026#34;\\n\u0026#34;.join(self.text_parts) def fetch_article(url: str) -\u0026gt; str: headers = {\u0026#34;User-Agent\u0026#34;: \u0026#34;Mozilla/5.0\u0026#34;} response = requests.get(url, headers=headers, timeout=10) response.raise_for_status() parser = ArticleTextExtractor() parser.feed(response.text) return parser.get_text() def chat(messages: list) -\u0026gt; str: payload = { \u0026#34;model\u0026#34;: \u0026#34;qwen3:0.6b\u0026#34;, \u0026#34;messages\u0026#34;: messages, \u0026#34;stream\u0026#34;: True, } reply = [] with requests.post(OLLAMA_URL, json=payload, stream=True) as r: for line in r.iter_lines(decode_unicode=True): if not line: continue try: data = json.loads(line) if \u0026#34;message\u0026#34; in data and \u0026#34;content\u0026#34; in data[\u0026#34;message\u0026#34;]: chunk = data[\u0026#34;message\u0026#34;][\u0026#34;content\u0026#34;] print(chunk, end=\u0026#34;\u0026#34;, flush=True) reply.append(chunk) except json.JSONDecodeError: continue print() return \u0026#34;\u0026#34;.join(reply) if __name__ == \u0026#34;__main__\u0026#34;: if len(sys.argv) \u0026lt; 2: print(\u0026#34;使い方: python summarize_article.py \u0026lt;URL\u0026gt;\u0026#34;) sys.exit(1) url = sys.argv[1] print(f\u0026#34;記事を取得中: {url}\u0026#34;) article_text = fetch_article(url) print(f\u0026#34;取得完了 ({len(article_text)}文字)\\n\u0026#34;) messages = [ { \u0026#34;role\u0026#34;: \u0026#34;system\u0026#34;, \u0026#34;content\u0026#34;: f\u0026#34;あなたは記事についての質問に答えるアシスタントです。以下の記事を参照して回答してください。\\n\\n{article_text}\u0026#34;, }, { \u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;この記事を日本語で簡潔に要約してください。 /no_think\u0026#34;, }, ] print(\u0026#34;=== 要約 ===\u0026#34;) summary = chat(messages) messages.append({\u0026#34;role\u0026#34;: \u0026#34;assistant\u0026#34;, \u0026#34;content\u0026#34;: summary}) print(\u0026#34;\\n(終了するには \u0026#39;q\u0026#39; または \u0026#39;quit\u0026#39; を入力)\\n\u0026#34;) while True: try: user_input = input(\u0026#34;質問: \u0026#34;).strip() except (EOFError, KeyboardInterrupt): print(\u0026#34;\\n終了します\u0026#34;) break if not user_input: continue if user_input.lower() in (\u0026#34;q\u0026#34;, \u0026#34;quit\u0026#34;): print(\u0026#34;終了します\u0026#34;) break messages.append({\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: user_input + \u0026#34; /no_think\u0026#34;}) print(\u0026#34;回答: \u0026#34;, end=\u0026#34;\u0026#34;, flush=True) reply = chat(messages) messages.append({\u0026#34;role\u0026#34;: \u0026#34;assistant\u0026#34;, \u0026#34;content\u0026#34;: reply}) print() 使用方法\npython main.py \u0026lt;記事のURL\u0026gt; 以上で、CLI、API、プログラムからのLLMの簡単な使用した記録となります。\n関連リンク https://github.com/ollama/ollama-python\n","date":"2026-05-22","permalink":"https://mikage-sumiyoshi-tech.uriboorn.workers.dev/posts/ollama_intro/","summary":"\u003ch1 id=\"はじめに\"\u003eはじめに\u003c/h1\u003e\n\u003cp\u003eモバイルPCでOllamaを動かした記録です。\u003c/p\u003e\n\u003cp\u003ewindowsで作業をしています。\u003c/p\u003e\n\u003ch1 id=\"インストール\"\u003eインストール\u003c/h1\u003e\n\u003cp\u003eollamaをインストールします。\u003c/p\u003e\n\u003cp\u003escoopというwindowsで使用可能な管理ツールでインストールします。\u003c/p\u003e","tags":["Ollama","LLM"],"title":"OllamaでローカルLLMを動かす"},{"content":"はじめに 自作ブログの初投稿記事となります。\n記事を書くにあたり、はてなブログ、note、QiitaやZennもいいですが、自分のものは自分で管理したいという思いや、知り合いが自分でサーバを借りて旅行ブログを書いていたり、面白いTwitterのFFがサイトを自分で建てていたので、せっかくなので自作ブログを立てようかと思いました。\nサイトを立てることで開発の最低限のweb周りの知識をつけたいことも理由の一つです。\n以下に自作ブログを作成しようとして、調べたこと考えたことを綴っていきます。\n専門ではないので調べながら書いていっており、間違いがあるかも知れません。\n方針 前提 Jamstackが流行っているらしいので、SSGとheadless CMSを使っていきます。\nJamstackとはSSG(静的サイトジェネレータ) + API + Markupを使用した構成です。\nSSGはNext.jsなどのフレームワークでクライアントにはすでに作成されたhtmlを返すだけの仕組みです。\nheadless CMSは画像などのコンテンツを管理されている場所です。headlssというのは内容のプレビューがないためこのような名前となっています。\nSSGがheadless CMSを呼び出してhtmlを作成し、クライアントに返す流れとなります。\n検討事項 構成にあたり、それぞれの選択肢には以下のことを頭に入れて考えています。本記事で全部は触れませんが、構成を選ぶ際に調べておきたい項目です。\n無料か有料か おうちサーバーかレンタルサーバーかホスティングサービスを使うか フロントエンドにどれほど慣れているか デザインはどれほどできるか好みのデザイン CMSはAPIかGit型か、ホストはするか SGGとの連携のしやすさ、無料枠 メンテのしやすさ ドメインの有無 構成 SSG(静的サイトジェネレータ) ブログなので動的なものは必要ないのでSSGから探すことにしました。\n主観だけどとりあえず有名どころの以下から探すこととしました。\nNext.js https://nextjs.org/\nVercel社が作ったフレームワーク。\nサービスのVecelと連携しやすい。\n普及率が一番高そう。\nHugo https://gohugo.io/\nGoで書かれたSSG。\n早い。\nAstroも良さそうだけど今回は割愛。\n他にはここを参考にするのが良いと思います。\nhttps://jamstack.org/generators/\nTheme ある程度型が決まったThemeが提供されています。\nこれでデザインがそれほどできなくても綺麗なサイトが作ることができます。\nSSG + Themeと検索すると出てくるので気になったもので検索するとヒットします。\nHugo https://themes.gohugo.io/\nPapermodがすごく良さそう\nNextjs Vercel社提供\nhttps://vercel.com/templates/next.js\nThemeFisher https://themefisher.com/\n様々なSGGのThemeを作っている会社のもの\n有料なのがほとんど\nCMS 記事の内容や画像などのコンテンツを管理するシステムです\nCMSはContents Management Systemの略です。\n近年は画面からコンテンツを切り離して管理するため、headless cmsが流行っているようです。\nheadless cmsを使用することで表示方法を選ぶことなく自由度が高く開発ができるようです。\n選ぶ際には以下のことを考慮します。\n無料か有料か GitHubなどGitのシステムにコンテンツを保存する形かAPIとして呼び出す形か セルフホスティングか外部セルフホスティングか SSGに対応しているか microCMS https://microcms.io/\n日本製で無料枠が贅沢使え、microCMS社にホスティングされています。\nコンテンツを編集しやすく特に強いこだわりがなければこれで良いです。\n私はサポーターズのハッカソンで知りました。\nStrapi https://strapi.io/\n一番か二番くらい人気のオープンソースのCMS。セルフホスティング。\nWordPress https://wordpress.com/ja/\nheadlessCMSとしても使えるらしい。\nSanity https://www.sanity.io/\n無料で使用できるセルフホスティングが必要ないCMS。\nスキーマ(API)の構成が編集しやすく開発者フレンドリーらしい。\nホスト 商用利用できるか、無料枠がどれほどかで論点になりそうです。\nレンタルサーバ 情報学を専攻したものなら自分でブログを作りたいのでパス。\nお金もかかるので。\nVecel https://vercel.com/\n最新の技術が取り入れられてるらしい。\n個人で使う分には無料枠で十分そう。\n無料枠で商用利用不可。\nNetlify https://www.netlify.com/\nこちらも個人で使う分には無料枠。\n無料枠で商用利用可。\nGithub Pages https://docs.github.com/ja/pages/getting-started-with-github-pages/creating-a-github-pages-site\nGithubを使うなら選択肢にはいる。\n昔URLでメインページから同じサイトの他のページにうまく遷移できなくて、設定がめんどくさくなったので避けています。\nFirebase https://firebase.google.com/?hl=ja\nGoogleの提供しているもの。\n他のNetlifyやVerelの方がSupabaseと連携しやすいのでそっち使うのが良さそうです。\n自作ブログでBaas使わないと思いますが\u0026hellip;。\nCloudflare Pages https://www.cloudflare.com/ja-jp/developer-platform/products/pages/\nおうちサーバをしている人ならお世話になったことがあると思われるCloudflareのホスティングサービス。\nCDNが強そうです。\nおうちサーバー メンテをしたくないので個人的には無しの方向でいきたいです。\nもしするならドメイン取得、Raspberry Piでポート解放、Nginxで公開、プライベートIP固定、Cloudflare Tunnelsの設定で対応するかもです。\nDNSの紐付けどうするんだろ\u0026hellip;。\nその他 あまり調べていませんが、せっかく見つけたので軽く書いておきます。\nSurge https://surge.sh/\n情報が少なめ？\n手軽で便利そうです\nRender https://render.com/\nDBとか使えます。\n少し自作ブログにはオーバースペック\nParse Platform https://parseplatform.org/\nBaasのひとつです。\nglitch https://blog.glitch.com/\n開発環境がオンラインにあって共同編集できるらしいです。\nVercelかNetlifyでいいかなと思います。\nドメイン 買う お金をかけたくないのでなし。\n無料ドメイン https://www.freenom.com/ja/index.html?lang=ja\nhttp://www.dot.tk/ja/index.html\n更新に労力が\u0026hellip;\nホストサイトで指定 ホストのサブドメインを使用することになります。\nこれが無難。\n結論 Next.jsかHugoでブログに対応したThemeを使用し、microCMSでコンテンツ管理をしてVercelかNetlifyにデプロイとします。\n他に良い構成があるかは引き続き調べてみます。\n変えたとしても構成を分離しているので変更が少ないのがメリットですね。\n参考 https://themefisher.com/\nhttps://jamstack.org/\n","date":"2026-01-09","permalink":"https://mikage-sumiyoshi-tech.uriboorn.workers.dev/posts/make_my_blog/","summary":"\u003ch1 id=\"はじめに\"\u003eはじめに\u003c/h1\u003e\n\u003cp\u003e自作ブログの初投稿記事となります。\u003c/p\u003e\n\u003cp\u003e記事を書くにあたり、はてなブログ、note、QiitaやZennもいいですが、自分のものは自分で管理したいという思いや、知り合いが自分でサーバを借りて旅行ブログを書いていたり、面白いTwitterのFFがサイトを自分で建てていたので、せっかくなので自作ブログを立てようかと思いました。\u003c/p\u003e","tags":["個人開発","フロントエンド"],"title":"自作ブログの構成を考える"}]