<?xml version="1.0" encoding="utf-8"?>
  <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:webfeeds="http://webfeeds.org/rss/1.0">
     <channel>
        <title>かめ。ブログ</title>
        <link>https://kame.blog/</link>
        <description>フロントエンドエンジニアが「Web」「Youtube」「3D」「お金」「お買い物情報」など、興味があることについて深堀っていくブログです。</description>
        <category>blog</category>
        <language>ja</language>
        <docs>https://kame.blog/api/rss</docs>
        <image>
          <url>https://kame.blog/icon-384x384.png</url>
          <title>かめ。ブログ</title>
          <link>https://kame.blog/</link>
          <width>384</width>
          <height>384</height>
        </image>
        
<item>
<title>DependabotからRenovateに変更しました</title>
<link>https://kame.blog/entry/dependabot-to-renovate</link>
<description>Dependabotはstorybookのようなバージョンが上がるライブラリが複数ある場合にめんどうになるため</description>
<pubDate>2024-04-03T01:34:35.541Z</pubDate>
<content:encoded><![CDATA[<h2 id="hda0b045c6d">変更した理由</h2><p>storybookなど複数ライブラリが同時にアップデートされる際に一つ一つマージしていくのが大変でした。<br>renovateを使えばその辺りのライブラリを一つのプルリクエストでできるため便利そうです。<br></p><h2 id="h3de35099b3">参考</h2><p><a href="https://zenn.dev/book000/articles/renovate-dep-auto-update" target="_blank" rel="noopener noreferrer">Renovate を使ってほぼ完全自動で依存パッケージをアップデートする</a><br><a href="https://tech.smarthr.jp/entry/2020/06/08/114108" target="_blank" rel="noopener noreferrer">「プロダクト間共通の React コンポーネントライブラリ」がどうなったか、という話 - SmartHR Tech Blog</a><br></p><h2 id="h5bd7516c58">Renovateの設定</h2><p>renovate.json</p><pre><code>{
  "extends": ["github&gt;kufu/renovate-config"]
}</code></pre><p><br></p><h2 id="he33238d9bf">Dependabotの無効化</h2><p>いったん<code>open-pull-requests-limit</code>を<code>0</code>にすることによって、いったん様子も見たいため<code>dependabot.yml</code>は残しつつ無効にするようにしました。</p><pre><code>open-pull-requests-limit: 0</code></pre><p><br></p>]]></content:encoded>
<webfeeds:cover image="undefined" />
<image>
	<url>undefined</url>
	<title>DependabotからRenovateに変更しました</title>
	<link>https://kame.blog/entry/dependabot-to-renovate</link>
	<width>undefined</width>
	<height>undefined</height>
</image>
</item>

<item>
<title>mdxファイルを取得してAlgoliaに登録するNodeの処理</title>
<link>https://kame.blog/entry/mdx-to-algolia</link>
<description>Nodeでアプリ依存せずに、mdxからデータを取得してAlgoliaに登録する</description>
<pubDate>2024-01-15T00:08:34.393Z</pubDate>
<content:encoded><![CDATA[<h2>必要なnpm</h2>
<ul>
<li><a href="https://www.npmjs.com/package/algoliasearch">algoliasearch</a></li>
</ul>
<h2>package.json</h2>
<pre><code class="language-json:package.json">  "scripts": {
    "generateMdxToAlgolia": "node ./src/utils/server/generateMdxToAlgolia",
  },
</code></pre>
<p><code>build</code>時に、合わせて実行するようにしておくと良いでnpす。</p>
<h2>.env</h2>
<pre><code class="language-.env">SITE_DOMAIN=サイトのドメイン
NEXT_PUBLIC_ALGOLIA_APPLICATION_ID=AlgoliaアプリケーションID
ALGOLIA_ADMIN_API_KEY=Algolia管理APIキー
NEXT_PUBLIC_ALGOLIA_INDEX=Algoliaインデックス
</code></pre>
<h2>generateMdxToAlgolia</h2>
<pre><code class="language-node:generateMdxToAlgolia.js">const path = require('path');
const fs = require('fs');
const algoliasearch = require('algoliasearch');

const postDir = path.join(process.cwd(), `src/log`);

const generateMdxToAlgolia = async () => {
  if (
    !process.env.SITE_DOMAIN ||
    !process.env.NEXT_PUBLIC_ALGOLIA_APPLICATION_ID ||
    !process.env.ALGOLIA_ADMIN_API_KEY ||
    !process.env.NEXT_PUBLIC_ALGOLIA_INDEX
  ) {
    return;
  }

  const htmlTagRegex = /&#x3C;("[^"]*"|'[^']*'|[^'">])*>/g;

  const objects = fs
    .readdirSync(`${postDir}/`)
    .filter((file) => {
      return path.extname(file).toLowerCase() === '.mdx';
    })
    .map((path) => {
      const fileName = path.replace(/\.mdx$/, '');
      const text = fs.readFileSync(`${postDir}/${path}`, 'utf8');
      const title = text.match(/title: (.*)/);
      const description = text.match(/description: (.*)/);

      return {
        objectID: fileName,
        type: 'log',
        title: title ? title[1] : '',
        description: description ? description[1] : '',
        url: `https://${process.env.SITE_DOMAIN}/log/${fileName}`,
        content: text.replace(htmlTagRegex, '').replace(/\r\n|\r|\n/g, ' '),
      };
    });

  const client = algoliasearch(
    process.env.NEXT_PUBLIC_ALGOLIA_APPLICATION_ID,
    process.env.ALGOLIA_ADMIN_API_KEY
  );
  const index = client.initIndex(process.env.NEXT_PUBLIC_ALGOLIA_INDEX);
  await index.saveObjects(objects, { autoGenerateObjectIDIfNotExist: true });
};

generateMdxToAlgolia();

</code></pre>
<ul>
<li><code>objectID</code>は、ファイル名を使用</li>
<li><code>title</code>と<code>description</code>は、<code>mdx</code>ファイルの<code>frontmatter</code>の記述方法を想定しています。</li>
</ul>
<h2>実行方法</h2>
<pre><code class="language-bash">NEXT_PUBLIC_ALGOLIA_APPLICATIO_IDN=${APPLICATIO_IDN} ALGOLIA_ADMIN_API_KEY=${ALGOLIA_ADMIN_API_KEY} NEXT_PUBLIC_ALGOLIA_INDEX=${ALGOLIA_INDEX} SITE_DOMAIN=${SITE_DOMAIN} npm run generateMdxToAlgolia
</code></pre>
<p><code>NEXT_PUBLIC</code>となっているのは、<code>Next</code>で使用するものも含まれているため共通で使えるようにしています。</p>]]></content:encoded>
<webfeeds:cover image="undefined" />
<image>
	<url>undefined</url>
	<title>mdxファイルを取得してAlgoliaに登録するNodeの処理</title>
	<link>https://kame.blog/entry/mdx-to-algolia</link>
	<width>undefined</width>
	<height>undefined</height>
</image>
</item>

<item>
<title>MicroCMSのデータを取得してAlgoliaに登録するNodeの処理</title>
<link>https://kame.blog/entry/microcms-to-algolia</link>
<description>Nodeでアプリ依存せずに、MicroCMSからデータを取得してAlgoliaに登録する</description>
<pubDate>2024-01-14T06:13:38.942Z</pubDate>
<content:encoded><![CDATA[<h2>必要なnpm</h2>
<ul>
<li><a href="https://www.npmjs.com/package/algoliasearch">algoliasearch</a></li>
<li><a href="https://www.npmjs.com/package/remove-markdown">remove-markdown</a></li>
</ul>
<h2>package.json</h2>
<pre><code class="language-json:package.json">  "scripts": {
    "generateMicroCmsToAlgolia": "node ./src/utils/server/generateMicroCmsToAlgolia",
  },
</code></pre>
<p><code>build</code>時に、合わせて実行するようにしておくと良いです。</p>
<h2>.env</h2>
<pre><code class="language-.env">MICROCMS_SERVICE_DOMAIN=MicroCMSのドメイン
MICROCMS_API_KEY=MicroCMSのAPIキー
SITE_DOMAIN=サイトのドメイン
NEXT_PUBLIC_ALGOLIA_APPLICATION_ID=AlgoliaアプリケーションID
ALGOLIA_ADMIN_API_KEY=Algolia管理APIキー
NEXT_PUBLIC_ALGOLIA_INDEX=Algoliaインデックス
</code></pre>
<h2>generateMicroCmsToAlgolia</h2>
<pre><code class="language-node:generateMicroCmsToAlgolia">const axios = require('axios').default;
const removeMd = require('remove-markdown');
const algoliasearch = require('algoliasearch');

const getMicroCMSdata = async (name, limit, query) => {
  const url = `https://${process.env.MICROCMS_SERVICE_DOMAIN}.microcms.io/api/v1/${name}`;
  const apiKeyHeaderOption = {
    headers: { 'X-API-KEY': process.env.MICROCMS_API_KEY },
  };

  const getUrlOption = (number, url) => {
    return url + `?limit=${number}${query || ''}`;
  };

  const getTotalCountUrl = getUrlOption(0, url);
  const totalCountUrlData = await axios
    .get(getTotalCountUrl, apiKeyHeaderOption)
    .then((r) => r.data);
  const { totalCount } = await totalCountUrlData;

  const getContentUrl = getUrlOption(limit || totalCount, url);
  const contentUrlData = await axios
    .get(getContentUrl, apiKeyHeaderOption)
    .then((r) => r.data);
  const data = await contentUrlData;

  return data;
};

const generateMicroCmsToAlgolia = async () => {
  if (
    !process.env.MICROCMS_SERVICE_DOMAIN ||
    !process.env.MICROCMS_API_KEY ||
    !process.env.SITE_DOMAIN ||
    !process.env.NEXT_PUBLIC_ALGOLIA_APPLICATION_ID ||
    !process.env.ALGOLIA_ADMIN_API_KEY ||
    !process.env.NEXT_PUBLIC_ALGOLIA_INDEX
  ) {
    return;
  }
  const { contents: entries } = await getMicroCMSdata(
    'entries',
    999,
    '&#x26;orders=-publishedAt&#x26;fields=id,title,categories.label,categories.value,tags.label,tags.value,publishedAt,image,description,body'
  );

  const htmlTagRegex = /&#x3C;("[^"]*"|'[^']*'|[^'">])*>/g;

  const objects = entries.map((entry) => {
    return {
      objectID: entry.id,
      url: `https://${process.env.SITE_DOMAIN}/entry/${entry.id}`,
      title: entry.title,
      description: entry.description,
      tags: entry.tags,
      categories: entry.categories,
      content: entry.body
        .map((v) => {
          const commentValue = v;
          if (v.fieldId === 'comments') {
            return commentValue.comments
              .map((v) => `${v.name ? `${v.name}: ` : ''}${v.text}`)
              .join('');
          }

          if (v.fieldId === 'html') {
            return v.value.replace(htmlTagRegex, '');
          }

          if (v.fieldId === 'markdown') {
            return removeMd(v.value);
          }

          if (v.fieldId === 'richeditor' &#x26;&#x26; v.value) {
            return v.value.replace(htmlTagRegex, '');
          }
        })
        .join('')
        .slice(0, 3200), // 数が多いAlgoliaの無料版の文字制限に引っかかってしまうため制限しています
    };
  });

  const client = algoliasearch(
    process.env.NEXT_PUBLIC_ALGOLIA_APPLICATION_ID,
    process.env.ALGOLIA_ADMIN_API_KEY
  );
  const index = client.initIndex(process.env.NEXT_PUBLIC_ALGOLIA_INDEX);
  await index.saveObjects(objects, { autoGenerateObjectIDIfNotExist: true });
};

generateMicroCmsToAlgolia().catch((error) => {
  console.error(error);
});
</code></pre>
<p>これは、このブログの<code>field</code>をもとに制作しています。<code>fieldId</code>や<code>entry</code>の項目については
それぞれのMicroCMSの設定に合わせてください。</p>
<h2>実行方法</h2>
<pre><code class="language-bash">MICROCMS_API_KEY=${MICROCMS_API_KEY} MICROCMS_SERVICE_DOMAIN=${MICROCMS_SERVICE_DOMAIN} NEXT_PUBLIC_ALGOLIA_APPLICATIO_IDN=${APPLICATIO_IDN} ALGOLIA_ADMIN_API_KEY=${ALGOLIA_ADMIN_API_KEY} NEXT_PUBLIC_ALGOLIA_INDEX=${ALGOLIA_INDEX} SITE_DOMAIN=${SITE_DOMAIN} npm run generateMicroCmsToAlgolia
</code></pre>
<p><code>NEXT_PUBLIC</code>となっているのは、<code>Next</code>で使用するものも含まれているため共通で使えるようにしています。</p>]]></content:encoded>
<webfeeds:cover image="undefined" />
<image>
	<url>undefined</url>
	<title>MicroCMSのデータを取得してAlgoliaに登録するNodeの処理</title>
	<link>https://kame.blog/entry/microcms-to-algolia</link>
	<width>undefined</width>
	<height>undefined</height>
</image>
</item>

<item>
<title>VScode ChatGPT genieでコミットメッセージ作成やレビューをしてもらう</title>
<link>https://kame.blog/entry/vscode-chatgpt-genie-commit-message</link>
<description>VScodeのプラグインを使ってchatGPTにコードやレビューを気軽におねがいする。</description>
<pubDate>2023-08-14T00:00:04.755Z</pubDate>
<content:encoded><![CDATA[<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">VscodeでChatgGPT Genie使ってgit diffだしてそれにたいしてコミットメッセージ書いてもらうと便利かも。 <a href="https://t.co/ij337aDVmS">pic.twitter.com/ij337aDVmS</a></p>&mdash; kame (@kamem) <a href="https://twitter.com/kamem/status/1690183470902034432?ref_src=twsrc%5Etfw">August 12, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p><strong>GPT-3.5系を使うとあまりうまくレビューしてくれないことが多かったです。GTP-4を使いましょう。</strong></p>
<p>それでも完璧なレビューをしてくれるとは限らないので参考程度に考えるとよかなと思います。</p>
<h2>-U10で前後の変更箇所を広げて、diff.txtに吐きだす</h2>
<pre><code>git diff  -U10 > ./tmp/diff.txt
</code></pre>
<p>広げておくと、周りの情報を加味したコミットメッセージを作ってくれます。
コミットの内容にもよるので、<code>-U10</code>の部分はそのときどきで変更してください。</p>
<p>吐き出し先はtmpとしています。tmpフォルダは作っておかないとエラーになります。</p>
<h2>vscodeのユーザー設定にGenieのカスタムプロンプトを追加する</h2>
<h3>commit messageを書いてもらう</h3>
<pre><code>"genieai.promptPrefix.customPrompt1": "あなたはプロのエンジニアです。今回の変更・追加箇所に対してコミットメッセージを日本語で考えてください",
"genieai.promptPrefix.customPrompt1-enabled": true,
</code></pre>
<h4>genieai.promptPrefix.commit-messageにお願いする</h4>
<p>こちらが追加になっているようです。
プロジェクトに合わせて書き換えることにより。適切なコミットメッセージをかいてくれます。</p>
<pre><code>  "genieai.promptPrefix.commit-message": "Suggest a precise and informative commit message based on the following diff. Do not use markdown syntax in your response.\nPlease do not enclose your message in double quotes.\n日本語でお願いします。\n"
</code></pre>
<p>右のカミナリマークのアイコンをクリックすることでコミットメッセージを生成してくれます。
<img src="https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/679c10c5ae194201bb90af2d2d94e050/vscode-chatgpt-genie-commit-message.png?h=80" alt="vscode genie commit"></p>
<h3>レビューをしてもらう</h3>
<pre><code>"genieai.promptPrefix.customPrompt2": "あなたはプロのエンジニアです。今回の変更・追加箇所に対して日本語でレビューを行ってください",
"genieai.promptPrefix.customPrompt2-enabled": true,
</code></pre>
<p>英語が良い場合は日本語での部分を消すなどすると良いかと思います。</p>
<p>promptは完璧なものではないと思うので、うまくいかない場合や、さらによいpromptがある場合は差し替えて使ってください。（教えてくれたらさらに嬉しいです）</p>
<h4>レビューしてほしい観点をさらに細かく書いておくと、それあわせて詳細に書いてくれます。</h4>
<pre><code>前提: 
* プロのフロントエンドエンジニアです。
* これからレビューを行うという視点で、diffの解析を行なってください。
* 今回の変更・追加箇所を意識してください。
* コードの説明は不要です。
* 問題がない旨の記載不要です。
* 全体のコードの記載は不要です。

変更に対して、下記の観点でレビューを行なってください。
* コードエラーの確認
* 文法エラーの確認
* 単語、タグ名、属性名のミスの確認
* より良いコード、リファクタの提案
* より良い関数名の提案
* 閉じタグの有無

日本語で記載してください。
</code></pre>
<h2>使い方</h2>
<p>customPromptを追加すると、他と同様左クリックに表示されるので、テキストを選択してからGenie: Custom prompt 1 or 2を選択してください。</p><p><img src="https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/5ad1f3e028ce4deab035787918c7e0ff/genie-custom-prompt.png" alt="" width="684" height="132"></p><h2>ほかのpromptも日本語化しておくと便利</h2>
<pre><code>"genieai.promptPrefix.addTests": "次のコードに対するテストを実装してください",
"genieai.promptPrefix.findProblems": "次のコードの問題点を見つけてください",
"genieai.promptPrefix.optimize": "次のコードを最適化してください",
"genieai.promptPrefix.explain": "次のコードを説明してください",
"genieai.promptPrefix.addComments": "次のコードにコメントを追加してください",
"genieai.promptPrefix.completeCode": "次のコードを完成させてください",
</code></pre>
<h2>参考</h2>
<p><a href="https://qiita.com/masakinihirota/items/27ef33b9edf4aa58fabd">VSCode 拡張機能 ChatGPT - Genie AI を使用するための下準備。モデル選択や日本語化等（Windows版 gpt-4対応) - Qiita</a></p>
<h2>まとめ</h2>
<p>copilotやchatgptの進化も早いので、今後この辺りもサクッと気軽にできる時代になってくるとは思います。
現状の一つのやり方の提案として。</p>]]></content:encoded>
<webfeeds:cover image="https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/c040e35d6bbd49e0b990d2a4dc15ac65/vscode-chatgpt-genie-commit-message.png" />
<image>
	<url>https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/c040e35d6bbd49e0b990d2a4dc15ac65/vscode-chatgpt-genie-commit-message.png</url>
	<title>VScode ChatGPT genieでコミットメッセージ作成やレビューをしてもらう</title>
	<link>https://kame.blog/entry/vscode-chatgpt-genie-commit-message</link>
	<width>1440</width>
	<height>864</height>
</image>
</item>

<item>
<title>modalはdialogを使えばいい</title>
<link>https://kame.blog/entry/dialog-modal</link>
<description>ブラウザも主要な最新は対応してるので、inertやroleなどの考慮もブラウザ任せにできるので  modal系にはdialogを使っていくのが良いかなと思います。</description>
<pubDate>2023-08-03T06:15:44.111Z</pubDate>
<content:encoded><![CDATA[<p><br></p><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodepen.io%2Fkame%2Fembed%2Fpreview%2FwvQNmej%3Fdefault-tabs%3Dhtml%252Cresult%26height%3D600%26host%3Dhttps%253A%252F%252Fcodepen.io%26slug-hash%3DwvQNmej&display_name=CodePen&url=https%3A%2F%2Fcodepen.io%2Fkame%2Fpen%2FwvQNmej&image=https%3A%2F%2Fshots.codepen.io%2Fusername%2Fpen%2FwvQNmej-512.jpg%3Fversion%3D1691029263&key=94335756f04b424b8ce3ce71cbe3de0a&type=text%2Fhtml&schema=codepen" width="800" height="600" scrolling="no" title="CodePen embed" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe><p><br><br>modalを作るときは、dialogタグで作ると良さそうです。<br>いろいろなことを考慮してくれます。<br></p><h2 id="ha8f5135fc5">dialogの特徴</h2><ul><li><code>dialog.showModal();</code>で開く。<code>dialog.close();</code>で閉じる<ul><li>showModalを使った場合<ul><li>aria-modal="true"を考慮してくれる</li><li><a style="background-color:#ffffff" href="https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/inert" target="_blank" rel="noopener noreferrer"><code>inert</code></a>の実装はブラウザが提供しているため、気にしなくて良い。</li><li><code>esc</code>を押したら閉じる</li><li>:modal 擬似クラスを使える</li></ul></li><li><span style="color:#1b1b1b">一方&nbsp;</span><code>&lt;dialog&gt;</code><span style="color:#1b1b1b">&nbsp;が&nbsp;</span><code>show()</code><span style="color:#1b1b1b">&nbsp;、または&nbsp;</span><code>open</code><span style="color:#1b1b1b">&nbsp;属性を使用して表示されたり、</span><code>&lt;dialog&gt;</code><span style="color:#1b1b1b">&nbsp;の既定の&nbsp;</span><code>display</code><span style="color:#1b1b1b">&nbsp;を変更した場合は&nbsp;</span><code>aria-modal="false"</code><span style="color:#1b1b1b">&nbsp;として表示されます。</span></li></ul></li><li><a style="background-color:#ffffff" href="https://developer.mozilla.org/ja/docs/Web/Accessibility/ARIA/Roles/dialog_role" target="_blank" rel="noopener noreferrer">role="dialog"</a>と同じ仕様でブラウザが提供する</li><li><a href="https://developer.mozilla.org/ja/docs/Web/CSS/::backdrop" target="_blank" rel="noopener noreferrer">::backdrop</a>を使って背景色を変更できる。</li></ul><p><br></p><h3 id="hc298b758d1">dialog内のformの特徴</h3><ul><li><code>&lt;form method="dialog"&gt;</code>を使うと良い<ul><li>typeなしの<code>&lt;button&gt;</code>は基本閉じられる、<code>type="button"</code>は閉じないその場合は<code>formmethod="dialog"</code>をつけておいても閉じる。</li></ul></li><li><code>dialog.close();</code>時に、引数に値を渡すと<code>dialog</code>の<code>close</code>の<code>event</code>で<code>dialog.returnValue</code>を取得できる。</li><li><a style="background-color:#ffffff" href="https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/autofocus" target="_blank" rel="noopener noreferrer">autofocus</a>なるべく指定しておく<ul><li>指定しない場合はブラウザ判断で、最初のform要素にfocusされる</li></ul></li><li><code>tabindex</code><span style="color:#4e4e4e">&nbsp;属性を&nbsp;</span><code>&lt;dialog&gt;</code><span style="color:#4e4e4e">&nbsp;要素で使用してはいけない</span></li></ul><p><br></p><h3 id="hee966a5d9a">ARIA: dialog ロールについて</h3><p><a href="https://developer.mozilla.org/ja/docs/Web/Accessibility/ARIA/Roles/dialog_role" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/ja/docs/Web/Accessibility/ARIA/Roles/dialog_role</a></p><ul><li><code>aria-labelledby</code>、<code>aria-describedby</code>については「<a href="https://developer.mozilla.org/ja/docs/Web/HTML/Element/dialog" target="_blank" rel="noopener noreferrer">&lt;dialog&gt;: ダイアログ要素</a>」で記述を見つけられなかった。</li></ul><p><br>引用元: <a style="background-color:#ffffff" href="https://developer.mozilla.org/ja/docs/Web/HTML/Element/dialog" target="_blank" rel="noopener noreferrer">https://developer.mozilla.org/ja/docs/Web/HTML/Element/dialog</a><br></p><h2 id="h1f1b5f4ae2">dialogの背景をクリックで閉じるための工夫</h2><ul><li><code>dialog.getBoundingClientRect</code>を使うことで、modalの領域外を判断して閉じる方法。</li><li><code>event.target.closest</code>をつかって<code>null</code>かどうかを判断して閉じる方法</li></ul><p><br>具体的には下記サイトに記載しています。</p><h3 id="h3de35099b3">参考</h3><ul><li><a href="https://qiita.com/TAAARRRO/items/66b495dd40f35275ba07" target="_blank" rel="noopener noreferrer">HTMLのdialog要素の背景をクリックしてdialog要素を閉じる方法 - Qiita</a></li><li><a href="https://zenn.dev/de_teiu_tkg/articles/96a46374655e56" target="_blank" rel="noopener noreferrer">&lt;dialog&gt;要素に「ダイアログの外側クリックで閉じる」処理の追加</a></li></ul><p><br></p><h2 id="h88bbbc9a40">modalを開いてる時にstyleを当てる</h2><pre><code>body:has(dialog:modal)</code></pre><p>hasを使うとmodalが開いてるかどうかでstyleを指定できる</p><blockquote><code>:modal</code><span style="color:#14171a">&nbsp;擬似クラスと&nbsp;</span><code>:has</code><span style="color:#14171a">&nbsp;擬似クラスを使用することで、モーダルが表示されているときにだけスタイルを指定することが可能になります。</span></blockquote><ul><li><a href="https://dev.classmethod.jp/articles/dialog-element-and-modal-pseudo-class/ " target="_blank" rel="noopener noreferrer">dialog 要素と :modal 疑似クラスでモーダルを作る | DevelopersIO</a></li></ul><p><br></p><h2 id="h82f028ce2e">使えるブラウザ</h2><ul><li><a href="https://caniuse.com/dialog" target="_blank" rel="noopener noreferrer">Dialog element | Can I use... Support tables for HTML5, CSS3, etc</a></li></ul><p><br></p><h2 id="h3de35099b3">参考</h2><ul><li><a style="color:#bc670f" href="https://zenn.dev/dqn/articles/36045bb89d5d69" target="_blank" rel="noopener noreferrer">実装しながら理解するモーダルのアクセシビリティ with React</a></li><li><a style="color:#bc670f" href="https://azukiazusa.dev/blog/dialog-accessibility/" target="_blank" rel="noopener noreferrer">アクセシブルなダイアログに必要なこと</a></li><li><a style="color:#bc670f" href="https://reffect.co.jp/html/html-dialog/" target="_blank" rel="noopener noreferrer">Dialogタグの使い方をしっかり理解モーダルを作成してみよう</a></li><li><a href="https://accessible-usable.net/2021/06/entry_210606.html" target="_blank" rel="noopener noreferrer">モーダルウィンドウのコンテナ要素に aria-modal 属性を適用する | Accessible &amp; Usable</a></li></ul><p><br></p><h2 id="ha214098e44">まとめ</h2><p><strong>ブラウザも主要な最新は対応</strong>してるので、<code>inert</code>や<code>role</code>などの考慮もブラウザ任せにできるので<br>modal系にはdialogを使っていくのが良いかなと思います。<br></p>]]></content:encoded>
<webfeeds:cover image="undefined" />
<image>
	<url>undefined</url>
	<title>modalはdialogを使えばいい</title>
	<link>https://kame.blog/entry/dialog-modal</link>
	<width>undefined</width>
	<height>undefined</height>
</image>
</item>

<item>
<title>gridでよくあるヘッダーの作り方</title>
<link>https://kame.blog/entry/grid-header-gnav</link>
<description>gridをタイトル中央寄せ、ナビゲーションを右にするような配置をabsoluteを使わなくても作れます。</description>
<pubDate>2023-07-31T05:15:45.144Z</pubDate>
<content:encoded><![CDATA[<p>gridを使うと、今までposition: absoluteを使わないと作りずらかったレイアウトや、<br>divで囲わないと工夫しないと、配置しずらかったレイアウトなどが作りやすいです。<br><br>レイアウトする際のやり方の候補して、覚えておくと良いかなと思います。<br></p><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodepen.io%2Fkame%2Fembed%2Fpreview%2FPoxxrex%3Fdefault-tabs%3Dcss%252Cresult%26height%3D600%26host%3Dhttps%253A%252F%252Fcodepen.io%26slug-hash%3DPoxxrex&display_name=CodePen&url=https%3A%2F%2Fcodepen.io%2Fkame%2Fpen%2FPoxxrex&image=https%3A%2F%2Fshots.codepen.io%2Fusername%2Fpen%2FPoxxrex-512.jpg%3Fversion%3D1690775145&key=ef481becf9fd4c17aa243190ea33aa20&type=text%2Fhtml&schema=codepen" width="800" height="600" scrolling="no" title="CodePen embed" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe><p><br></p><h2 id="h24a527ff89">共通HTML</h2><pre><code>&lt;div class="header"&gt;
&nbsp;&lt;h1 class="title"&gt;Title&lt;/h1&gt;
&nbsp;&lt;ul class="gnav"&gt;
&nbsp;&nbsp;&lt;li class="gnav-item"&gt;&lt;a href=""&gt;menu1&lt;/a&gt;&lt;/li&gt;
&nbsp;&nbsp;&lt;li class="gnav-item"&gt;&lt;a href=""&gt;menu2&lt;/a&gt;&lt;/li&gt;
&nbsp;&nbsp;&lt;li class="gnav-item"&gt;&lt;a href=""&gt;menu3&lt;/a&gt;&lt;/li&gt;
&nbsp;&lt;/ul&gt;
&lt;/div&gt;</code></pre><p><br></p><h2 id="h7a80795ee0">共通gnav CSS</h2><pre><code>.gnav {
&nbsp; grid-area: gnav;
&nbsp; display: flex;
&nbsp; gap: 12px;
&nbsp; justify-content: end;
&nbsp; width: 100%;
}
.gnav-item {
&nbsp; list-style-type: none;
}
.gnav a {
&nbsp; padding: 16px;
&nbsp; display: grid;
&nbsp; height: 100%;
&nbsp; align-items: center;
&nbsp; background-color: rgba(255,255,255, 0.2);
&nbsp; transition: background-color 0.1s ease-in;
&nbsp; border-radius: 8px;
&nbsp; cursor: pointer;
}
.gnav a:hover {
&nbsp; background-color: rgba(255,255,255, 0.1);
}</code></pre><p><br></p><h2 id="h46fb4ae3ba">共通ヘッダーCSS</h2><pre><code>.header {
&nbsp; margin: 0 0 16px 0;
&nbsp; padding: 16px;
&nbsp; background-color: #333;
&nbsp; color: #fff;
&nbsp; display: grid;
}</code></pre><p><br></p><h2 id="hd4a246928b">タイトル中央寄せのCSS</h2><pre><code>.header {
&nbsp; grid-template:
&nbsp;&nbsp; ". title gnav" auto /&nbsp;
&nbsp;&nbsp; 1fr auto 1fr;
}

.title {
&nbsp; grid-area: title;
&nbsp;&nbsp;padding: 16px;
&nbsp;&nbsp;place-self: center;
&nbsp; font-size: 20px;
}</code></pre><p><br><code>grid-template</code>を使い、<strong>1行3列</strong>のgridを作成しています。<br><code>grid-area</code>を使い真ん中にtitle、右側に<code>gnav</code>を表示するようにしています。<br><br>このようにすることで、<code>title</code>の配置を画面の中央寄せにしつつ<code>gnav</code>を右側に持ってくることができます。<br>従来では、<code>gnav</code>を<code>position: absolute;</code>で右上に持ってくるなど、工夫する必要がありました。<br></p><h2 id="hb6ed65c679">タイトルとナビゲーションを合わせて最大幅をきめて中央寄せ</h2><pre><code>.header {
  grid-template:
    ". header gnav ." auto / 
    1fr minmax(auto, 700px) minmax(auto, 300px) 1fr;
  place-items: center start;
}

.title {
&nbsp; grid-area: header;
  padding-right: 16px;
&nbsp; font-size: 20px;
}</code></pre><p><br>titleとgnavを合わせて中央寄せにしたい場合HTMLを変更して、<code>title</code>と<code>gnv</code>をdivで囲ってあげれば、工夫せずともできるかとは思いますが。<br>わざわざdivで囲わずとも、<strong>1行4列のgridを作成</strong>して、<strong>真ん中二つの足した値を最大幅になるように設定</strong>することでレイアウトを再現することができます。<br></p><h2 id="h3de35099b3">参考</h2><ul><li><a style="color:#bc670f" href="https://prograshi.com/design/css/align-and-justify/" target="_blank" rel="noopener noreferrer">alingとjustifyのプロパティ一覧と概要</a></li><li><a href="https://m-kenomemo.com/grid-template/" target="_blank" rel="noopener noreferrer">gridレイアウトについて調べました【CSS/grid-template/auto-fit/auto-fill】 | えむ家のメモ帳</a></li></ul><p><br></p><h4 id="hbdb6c89070">Gridについてはこちらの記事を参考に勉強させていただきました。</h4><ul><li><a href="https://junzou-marketing.com/css-grid-property" target="_blank" rel="noopener noreferrer">[詳説] CSSグリッドレイアウトで使うプロパティ一覧</a></li></ul><p><br></p><h2 id="ha214098e44">まとめ</h2><p>grid使うと今まで苦労していたレイアウトが、作りやすくなるのでよいですね。<br>gridはまだまだ今後進化していきそうなので、さらにどんどんレイアウトしやすくなってくるので楽しみですね！</p>]]></content:encoded>
<webfeeds:cover image="undefined" />
<image>
	<url>undefined</url>
	<title>gridでよくあるヘッダーの作り方</title>
	<link>https://kame.blog/entry/grid-header-gnav</link>
	<width>undefined</width>
	<height>undefined</height>
</image>
</item>

<item>
<title>bunについて少しだけ、つまづいたところなど</title>
<link>https://kame.blog/entry/little-about-bun</link>
<description>bunとかnodeとかdenoとかあるけど今回はbunについて少しだけ</description>
<pubDate>2023-07-27T02:42:14.179Z</pubDate>
<content:encoded><![CDATA[<h2 id="h82eaa1f0e3">NodeとかDenoとかBunについて</h2><p>下記記事あたりを参考にさせていただきました。<br><a href="https://qiita.com/access3151fq/items/2466126b612fad1c084a" target="_blank" rel="noopener noreferrer">Node.js と Deno と Bun のどれを使えばいいのか</a><br><a href="https://zenn.dev/k41531/articles/dbedb88f06898a" target="_blank" rel="noopener noreferrer">【Bun】新しいJavaScriptランタイムについてふわっとまとめた</a><br></p><h3 id="hd8d793506b">インストール</h3><p>インストールについては下記<br><a href="https://bun.sh/docs/installation" target="_blank" rel="noopener noreferrer">https://bun.sh/docs/installation</a><br><a href="https://github.com/oven-sh/bun#install" target="_blank" rel="noopener noreferrer">https://github.com/oven-sh/bun#install</a><br>手法は下記</p><ul><li>curl</li><li>npm</li><li>homebrew</li><li>docker</li><li>proto</li></ul><p><br></p><h2 id="h526933d812">Nextアプリを作る</h2><p><a href="https://dev.to/ashirbadgudu/lets-create-a-nextjs-app-with-bun-48l6" target="_blank" rel="noopener noreferrer">bunを使ってnext.jsアプリを作ってみましょう</a><br>下記のように実行するとnextのアプリを作成することができます。</p><pre><code>bun create next ./app_next</code></pre><p><br></p><h3 id="h81c70f5a50">下記でアプリを立ち上げる</h3><pre><code>cd ./app_next
bun dev</code></pre><p><br>なぜかこれを実行すると、下記のようなエラーがでて動きませんでした。。</p><pre><code>fallback.development.tsx:1&nbsp; &nbsp; &nbsp;Failed to load resource: the server responded with a status of 404 (Not Found)
localhost/:1&nbsp; &nbsp; &nbsp;Failed to load resource: the server responded with a status of 500 (ERR)</code></pre><p><br>下記にヒントになりそうな内容がありましたがうまく動きませんでした..<br><a href="https://zenn.dev/laiso/articles/438a9d1177ad52" target="_blank" rel="noopener noreferrer">bun devでNext.jsが実行される仕組みを調べる</a><br></p><h3 id="h1f0d76e9db">Bun x Nextだと使えない機能がありそう？</h3><p><a href="https://github.com/softwarearchitect817/Bun-fast-JavaScript-runtime#using-bun-with-nextjs" target="_blank" rel="noopener noreferrer">https://github.com/softwarearchitect817/Bun-fast-JavaScript-runtime#using-bun-with-nextjs</a><br>少し古いものですが、使えない機能があるかもしれません。<br></p><h3 id="h649ba79005">とりあえず動くようにしてみる<br>package.jsonに下記を追加してnext devで実行する。</h3><pre><code>  "scripts": {
    "dev": "next dev",
    "start": "next start",
    "build": "next build"
  },</code></pre><p><br></p><pre><code>bun run dev</code></pre><p><br>この形で実行すると動作しました。（これでよいのかなぁ。。）<br></p><h2 id="h4f07bd3669">Reactアプリを作る</h2><pre><code>bun create next ./app_react</code></pre><p><br></p><pre><code>cd app_react
bun run dev</code></pre><p><br>reactの場合はすんなり動かすことができました。<br></p><h2 id="hc9bec060fe">bun createを実行して、createできる一覧を表示</h2><pre><code>Welcome to bun! Create a new project by pasting any of the following:&nbsp; 
bun create apollo-server ./apollo-server-app
bun create bun-bakery ./bun-bakery-app
bun create discord-interactions ./discord-interactions-app
bun create elysia ./elysia-app
bun create elysia-buchta ./elysia-buchta-app
bun create hono ./hono-app
bun create kingworld ./kingworld-appapp
bun create preact ./preact-app
bun create react ./react-app
bun create react-ssr ./react-ssr-app
bun create svelte-kit ./svelte-kit-app
bun create websi ./websi-app</code></pre><p><br></p><h2 id="h20f5321080">svelte-kitアプリを作る</h2><pre><code>bun create svelte-kit ./svelte-kit-app</code></pre><p><br>実行すると下記のように言われますが、なぜかこれを実行しても立ち上がりませんでした。</p><pre><code># To get started, run:
&nbsp; cd svelte-kit-app
&nbsp; bun run main.ts</code></pre><p><br></p><pre><code>bun run dev</code></pre><p>と実行すると立ち上げることができました。<br></p><h2 id="hf130090d56">bun createについて</h2><p><a href="https://bun-docs.pages.dev/en/bun_create/" target="_blank" rel="noopener noreferrer">https://bun-docs.pages.dev/en/bun_create/</a><br><code>bun create</code>については、用意されているものに加えて、自分で用意したテンプレートも作ることができるようです。<br>この辺り自分用にやりやすいようにできるのは便利そうです。<br></p><h2 id="ha214098e44">まとめ</h2><p>bunを使ったら、サクッと実行速度早く、簡単にアプリの実装開始できるのかなーと思ったのですが<br>まだバージョンが1になっていないというところもあって、不安なところ少しあるかなと思いました。<br><br>脳死で開発にすぐ入れる状態が作れたら嬉しいなぁと思いつつ。<br>今後のバージョンアップにも期待したいですね。<br></p><h2>追記</h2>
<p>下記をtwitterでつぶやいたところ、開発者の方から返信いただきました。<br>
どうやら非推奨のようです。現在より良い改善を行う予定とのこと！<br>
9月にはどうやら1系のバージョンがでるようなので楽しみにしておこうと思います！<br>
そのときにまたガッツリ触ってみる予定。</p>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://t.co/RfjJsUv33k">https://t.co/RfjJsUv33k</a><br><br>動かないんだけど..<br><br>bun create next ./app<br>で作れるところまではいけるのに<br>bun devで色々怒られる..<br><br>bun create react ./app<br>bun ./dev.tsxでおいてあるdevファイルを読みに行ったら動いたけども..nextの場合はそれがどこに。。<br><br>そもそもbun devの挙動なんなん。。<br><br>謎</p>&mdash; kame (@kamem) <a href="https://twitter.com/kamem/status/1684146388194693121?ref_src=twsrc%5Etfw">July 26, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">We will do another revision of it that is much better</p>&mdash; Jarred Sumner (@jarredsumner) <a href="https://twitter.com/jarredsumner/status/1684555765062029314?ref_src=twsrc%5Etfw">July 27, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>]]></content:encoded>
<webfeeds:cover image="undefined" />
<image>
	<url>undefined</url>
	<title>bunについて少しだけ、つまづいたところなど</title>
	<link>https://kame.blog/entry/little-about-bun</link>
	<width>undefined</width>
	<height>undefined</height>
</image>
</item>

<item>
<title>iColudでMarkdownファイルを管理してメモアプリとして使う</title>
<link>https://kame.blog/entry/icloud-vscode-markdown-memo</link>
<description>気軽にメモアプリを使いたい時に、何のアプリを使おうと迷うのでiCloudでMarkdownファイルを共有して使う提案</description>
<pubDate>2023-07-23T06:41:02.503Z</pubDate>
<content:encoded><![CDATA[<h2 id="h47c9e38eab">ターミナルからVScodeを起動するようにしておく</h2><p>iCloudの保存先は、<code>~/Library/Mobile\ Documents/com~apple~CloudDocs/</code>こちらのようなので、下記のようにaliasを設定してターミナルからすぐにメモを開けるようにしました。<br>今回はmemoというフォルダをiCloudに作ったので<code>memo</code>フォルダを直接開くようにしています。<br><a style="color:#000000;font-family: Monaco, Courier New, monospace" href="https://qiita.com/naru0504/items/c2ed8869ffbf7682cf5c" target="_blank" rel="noopener noreferrer">ターミナルからVisual Studio Codeを起動する方法【公式の方法】 - Qiita</a></p><pre><code>alias memo="code ~/Library/Mobile\ Documents/com~apple~CloudDocs/memo"</code></pre><p>ターミナルから<code>memo</code>とうつことでVScodeが開くようになります。</p><h2 id="hcb56c85fa0">code-workspaceを用意しておく</h2><h3 id="h30ccdceaad">settings.code-workspace</h3><p><code>memo/.vscode/settings.code-workspace</code>に下記のようなファイルを用意しました。</p><pre><code>{
&nbsp; "folders": [
&nbsp; &nbsp; {
&nbsp; &nbsp; &nbsp; "path": "../"
&nbsp; &nbsp; },
&nbsp; ],
&nbsp; "settings": {
&nbsp; &nbsp; "workbench.colorCustomizations": {
&nbsp; &nbsp; &nbsp; "titleBar.activeBackground": "#3b3b3b",
&nbsp; &nbsp; &nbsp; "titleBar.activeForeground": "#fff",
&nbsp; &nbsp; &nbsp; "activityBar.background": "#415c7d",
&nbsp; &nbsp; &nbsp; "activityBar.foreground": "#fff",
&nbsp; &nbsp; &nbsp; "activityBarBadge.background": "#00008B",
&nbsp; &nbsp; }
&nbsp; }
}</code></pre><p>このファイルをクリックすると<code>path</code>で指定したフォルダをvscodeで開くようにすることができます。<br><code>.vscode</code>の中に入れているので、一つ上のフォルダを開くようにしています。</p><h3 id="hf5025706dd">エイリアスを制作しておく</h3><p><code>memo/.vscode/settings.code-workspace</code>を右クリックしてエイリアスを作っておき、開きやすいようにショートカットを作っておくことができます。<br></p><h3 id="h3de35099b3">参考</h3><p><a href="https://zenn.dev/hyodoblog/articles/76efb0ed295dcc" target="_blank" rel="noopener noreferrer">【VSCode】code-workspaceファイルのエイリアスをデスクトップに置くと開発速度が上がった</a><br></p><h2 id="h11a397c236">VScodeでマークダウンを使いやすくするプラグインなど</h2><p><a style="color:#000000;font-family: Monaco, Courier New, monospace" href="https://maasaablog.com/integrated-development-environment/visual-studio-code/1762/" target="_blank" rel="noopener noreferrer">VsCodeで快適なマークダウンライフを送るためのTips | masayanblog</a><br></p><h2 id="ha214098e44">まとめ</h2><p>メモする時、下記のようなアプリを使っていたのですが、さくっと気軽にメモしたいときにブラウザを開いたり専用のアプリを開いたり迷うことが多かったので<br>いっそvscodeでMarkdownでメモするようにしちゃえばいいんじゃないかなと思いiCloudで管理するやり方にしてみました。</p><ul><li><a href="https://www.dropbox.com/ja/paper" target="_blank" rel="noopener noreferrer">Paper - Dropbox</a></li><li><a href="https://www.notion.so/" target="_blank" rel="noopener noreferrer">Your connected workspace for wiki, docs &amp; projects | Notion</a></li></ul><p><br>ほかにも色々とメモはあると思いますが、なんだかんだでMarkdownファイルでの管理がいいんじゃないかなと思ってきました。</p>]]></content:encoded>
<webfeeds:cover image="https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/3c1ffe1ede3b4e9db27a51c899a875f8/icloud-vscode.png" />
<image>
	<url>https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/3c1ffe1ede3b4e9db27a51c899a875f8/icloud-vscode.png</url>
	<title>iColudでMarkdownファイルを管理してメモアプリとして使う</title>
	<link>https://kame.blog/entry/icloud-vscode-markdown-memo</link>
	<width>1441</width>
	<height>864</height>
</image>
</item>

<item>
<title>Stable Diffusionのプロンプトをスプレッドシートで管理、Google Colabで連携する方法</title>
<link>https://kame.blog/entry/stable-diffusion-google-colab-spreadsheet</link>
<description>英語でバーっと書いていくと、どういうプロンプト使っているのかわかりづらくなるので、スプレッドシートを使って管理するようにしてみました。</description>
<pubDate>2023-03-14T00:00:04.088Z</pubDate>
<content:encoded><![CDATA[<p>プロンプト(prompt)を色々いじっていると、だんだんどんなプロンプトだったかわからなくなってきたりするのでスプレッドシートでぽちぽちとできたら便利だなと思ったので作ってみました。<br></p><h2 id="hf25612335c">使うスプレッドシートとGoogle Colabのファイル</h2><ul><li><a style="background-color:#ffffff" href="https://docs.google.com/spreadsheets/d/1sDCA1I2xPYbgv2Tsbyp4-vFnhSTScThVE2ws0nCQpFM/edit?usp=sharing" target="_blank" rel="noopener noreferrer">スプレッドシート「StableDiffusionPrompt」</a></li><li><a style="background-color:#ffffff" href="https://colab.research.google.com/drive/1sqz84g432ORUiiCjTBF5itwRxFruRkFo?usp=share_link" target="_blank" rel="noopener noreferrer">Google Colab 「StableDiffusion and Spreadsheet.ipynb」</a></li></ul><h2 id="h5f9714e973">プロンプトをスプレッドシートで管理する</h2><ul><li><a href="https://docs.google.com/spreadsheets/d/1sDCA1I2xPYbgv2Tsbyp4-vFnhSTScThVE2ws0nCQpFM/edit?usp=sharing" target="_blank" rel="noopener noreferrer">スプレッドシート「StableDiffusionPrompt」</a></li></ul><p>左上のファイルから、「フ<span style="color:#000000">ァイル→コピーを作成</span>」を自分のドライブにコピーします。<br><br>スプレッドシートについては下記を参考にさせていただきました。<br><a style="color:#000000;font-family: Monaco, Courier New, monospace" href="https://note.com/ryon3/n/n5c5c2f79c596" target="_blank" rel="noopener noreferrer">Stable DiffusionやNovelAIなどで使う呪文を集めたスプレッドシート（またはテキスト）｜火月@ryon3kag｜note</a><br></p><h2 id="h1dc38d3ba1">スプレッドシートの使い方の説明</h2><h3 id="h9bd5637378">入力シート</h3><p><strong>主にこのシートを触ってプロンプトを調整します。</strong><br><strong>描写を選択すると単語の欄に英語表記がが表示されます。</strong><br><strong>注目度を大きくすると、その単語が強調されます。</strong><br>（多くても1.3ぐらいまでにしておきましょう。<br>それ以上に増やしすぎると、絵が崩れてしまいがちです。）<br><br>下記のStable Diffusionの構文に合わせて、promptを生成しています。<br><a href="https://qiita.com/nyanko5656/items/c2cf537d4d3b46b279a7" target="_blank" rel="noopener noreferrer">stable-diffusionでの作成ポイントまとめ</a><br><br><img src="https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/306db8b345ac4792a7b936df6ef1aeed/stable-diffusion-spreadsheet1.png" alt="" width="1096" height="530"><br>入力の右側の下記に<strong>promptとnegativeが</strong><br><strong>Google Colabに読み込まれるセル</strong>になっています。<br><img src="https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/546fbfae9cbc4b95a90243fec708ca15/stable-diffusion-spreadsheet4.png" alt="" width="884" height="239"><br>お試ししたい場合はbasic_tagに書き込むとpromptの最初に追加されるので、単語に追加するほどでもないものなどはここに追加すると良いかなと思います。<br></p><h3 id="h03c4f3bb64">デフォルト</h3><p>デフォルトに入れる<strong>「プロンプト」と「ネガティブプロンプト」を管理</strong>しています。<br><strong>基本的に入れておきたい、プロンプトはここで管理</strong>しましょう。<br><br><img src="https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/433cf785094b49cba5413c32d1a6b42e/stable-diffusion-spreadsheet2.png" alt="" width="1741" height="1112"></p><h3 id="h4bac637395">描写マスタ</h3><p><strong>プロンプトの元となる、項目を管理しています。</strong><br><strong>描写を追加したい場合はこのシートに追加</strong>していってください。<br>英語がわからない場合は、下記を使うと良いかなと思います。<br><a style="color:#000000;font-family: Monaco, Courier New, monospace" href="https://www.deepl.com/ja/translator" target="_blank" rel="noopener noreferrer">DeepL翻訳：高精度な翻訳ツール</a><br><br>ちょっと大人なpromptもあるので、使わないって方は消したり<br>自由に追加したり自分好みのリストを作ってください。<br></p><h3 id="h29138a5305">ネガティブマスタ</h3><p>描写マスタのネガティブ版。<br>ネガティブプロンプトの元となる、項目を管理しています。<br>追加したい場合は、描写マスタのやり方と同じです。<br></p><h3 id="h0101aaa8d0">ジャンルマスタ</h3><p>プロンプトの元となる、ジャンルを管理しています。<br><strong>描写マスタと、ネガティブマスタの「ジャンル」を管理しています。</strong><br><strong>これを管理することでカテゴリが分かりやすくなるようにしています。</strong><br></p><h2 id="h2270a09c82">Google Colabから上のスプレッドシートをつなげる</h2><ul><li><a href="https://colab.research.google.com/drive/1sqz84g432ORUiiCjTBF5itwRxFruRkFo?usp=sharing" target="_blank" rel="noopener noreferrer">Google Colab 「StableDiffusion and Spreadsheet.ipynb」</a></li></ul><p>左上のファイルから「ドライブにコピーを保存」で自分のドライブに保存して使ってください。<br></p><h3 id="h847e977de3">下記を修正してください</h3><p>自分で立ち上げた<strong>アプリのURL</strong>と、<strong>上でコピーしたスプレッドシートのURL</strong>の部分を変更してください。</p><pre><code>## アプリURL
url = "https://test.gradio.live"
## スプレッドシートURL
spreadsheetUrl = "https://docs.google.com/spreadsheets/d/1Rd0nulTYnnCJ-01gUp4KcBbE-_qsTAEiDpjFEnoU7FQ"</code></pre><h4 id="h4f64d2805f"><br>立ち上げているアプリはapiモードで立ち上げておく必要があるので注意</h4><p>下記記事にapiモードでの立ち上げ方は書いています。<br><a href="https://kame.blog/entry/about-stable-diffusion/#hc5d64b2ec8" target="_blank" rel="noopener noreferrer">Stable DiffusionをM1 Macで使ったりGoogle Colabで使ったり</a><br><br>Google Colabでapiモードで立ち上げたい場合は、前回記事にしたのでそちらを参考にしてください。<br><a href="https://kame.blog/entry/stable-diffusion-google-colab/" target="_blank" rel="noopener noreferrer">Stable DiffusionをGoogle Colabでモデルを選んでダウンロードしたり使いやすくする</a><br></p><h3 id="hdc0fe7e48c">あとは下記に従って上から順番に実行してください</h3><p><img src="https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/fa82bcdd640f4468a3739c4ca7cb94e3/stable-diffusion-spreadsheet3.png" alt="" width="1466" height="1511"></p><h3 id="hf6955c599e">GoogleDriveとつなげます</h3><p>outputsフォルダに日付のフォルダをつくって保存するようにしています。<br>好みで変更してください。画像生成後は、ここで指定したドライブにどんどん保存されていくので容量が圧迫されていくので注意です。</p><pre><code>from google.colab import drive
drivePath = '/content/drive'
drive.mount(drivePath)

## 自分のドライブの好きなフォルダを指定
dirName = 'outputs'

from datetime import datetime
date = datetime.now().strftime("%Y%m%d")

OUTPUT_DIR = drivePath + '/MyDrive/' + dirName + '/' + date
!mkdir -v $OUTPUT_DIR

import os
os.chdir(OUTPUT_DIR)</code></pre><p><br></p><h3 id="hd982aa7aa5">スプレッドシートの認証</h3><pre><code># スプレッドシート認証
from google.colab import auth
auth.authenticate_user()
import gspread
from google.auth import default
creds, _ = default()
gc = gspread.authorize(creds)</code></pre><p><br></p><h3 id="h50c1a0d2b0">アプリURLとスプレッドシートURLを自分のものに変更したあと実行してください。</h3><p>（変更したあとに実行するのを忘れがちなので注意です。左からコードの実行を押してください。）</p><pre><code>## アプリURL
url = "https://test.gradio.live"

## スプレッドシートURL
spreadsheetUrl = "https://docs.google.com/spreadsheets/d/1sDCA1I2xPYbgv2Tsbyp4-vFnhSTScThVE2ws0nCQpFM"

seed = -1
width = 600
height = 900
steps = 25
count = 1

latest_seed = -1</code></pre><p><br></p><h3 id="h7d0b57c612">画像を生成する</h3><p><strong>最後に「画像を生成する」をクリックするとスプレッドシートから読み取ったpromptで生成が始まります。</strong><br><br><strong>Google Colabは使用制限があるので、このファイルを高スペックで立ち上げても、動作に影響はないため最低スペックで起動しましょう。</strong><br></p><h2 id="h86c1eb6dfa">注意点</h2><ul><li>モデル（checkpoint）やvaeは画面から選択する必要があります。</li><li>アプリが落ちた場合はアドレスが変わってしまうので再度アプリのアドレスを書き換えて実行してください。</li></ul><p><br></p><h2 id="ha214098e44">まとめ</h2><p>少しめんどくさい部分もありますが<br>この仕組みにしておくとスマホからもぽちぽち遊べたりするので便利です！<br><br>Aiの進化は毎日すごく早いので、色々と試しながら<br>どんどん取り入れていきたいですねー。<br><br>引き続き楽しいことがあれば共有していきます。<br></p>]]></content:encoded>
<webfeeds:cover image="https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/88dc1ee6632147c5b63c734f72ea383b/stable-diffusion-spreadsheet.jpg" />
<image>
	<url>https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/88dc1ee6632147c5b63c734f72ea383b/stable-diffusion-spreadsheet.jpg</url>
	<title>Stable Diffusionのプロンプトをスプレッドシートで管理、Google Colabで連携する方法</title>
	<link>https://kame.blog/entry/stable-diffusion-google-colab-spreadsheet</link>
	<width>968</width>
	<height>576</height>
</image>
</item>

<item>
<title>Stable DiffusionをGoogle Colabでモデルを選んでダウンロードしたり使いやすくする</title>
<link>https://kame.blog/entry/stable-diffusion-google-colab</link>
<description>Google Colabで便利にStabule Diffusionを使いこなす。モデル（checkpoint）選択したり。</description>
<pubDate>2023-03-01T00:00:03.841Z</pubDate>
<content:encoded><![CDATA[<h2 id="h2f930c3b1b">この記事で実現できること</h2><ul><li>Google ColabでStable diffusionを立てる</li><li>開始時にモデル（checkpoint、safetensors）を選択してダウンロードできる<ul><li>Chilloutmix-Ni</li><li>CCCmix</li><li>pastelmix-fp32</li><li>AbyssOrangeMix""AbyssOrangeMix2_hard</li><li>BloodOrangeMix</li><li>EerieOrangeMix"&nbsp;"EerieOrangeMix2</li><li>ElyOrangeMix</li><li>AbyssOrangeMix3"&nbsp;"7th<em>anime</em>v1.1</li><li>7th<em>anime</em>v3_A</li><li>7th_anime_v3_B</li><li>7th_anime_v3_C</li><li>SukiyakiMix-v1.0</li></ul></li><li>Google Driveにあらかじめダウンロードしておいたモデルを起動時に読み込むようにする</li><li>画像をGoogleドライブにダウンロードできる</li></ul><p><br>ファイルは下記に置いてありますのでファイルを自分のドライブにコピーしてお使いください。</p><ul><li><a href="https://colab.research.google.com/drive/1yE9GW5Xfj3CFMAFdwkswCmw2b0NQallR?usp=sharing" target="_blank" rel="noopener noreferrer">Google Colab StableDiffusionUI.ipynb</a></li></ul><p><br></p><h2 id="h4d849f4362">使い方</h2><h3 id="hdd80ac4349">左上ファイル → ドライブにコピーを保存</h3><p>コピーしたファイルを開いて上から順番に矢印を押していきます。<br><img src="https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/68043e1844384dac800a54ff40d5585b/stable-diffusion-google-colab1.jpg" alt="" width="416" height="680"><br></p><h3 id="h923214a2a4">コピーしたファイルを開いて</h3><p>基本的には上から順番に実行していきます。<br><img src="https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/3846650e1ba24ca08d4ce817fcf41f52/stable-diffusion-google-colab2.jpg" alt="" width="1075" height="1026"></p><h4 id="h09eca679b1">GoogleDriveとつなげる</h4><p>実行すると、「このノートブックにGoogleドライブのファイルへのアクセスを許可しますか？」と表示されます。<br>「Googleドライブに接続」をクリックすると別ダブで、許可したいアカウントを選択して、権限の許可をしてください。</p><pre><code>from google.colab import drive
drive.mount('/content/drive')</code></pre><h4 id="hf0e294ee4d"><img src="https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/c67e2a4839f346588a6dbfc1d71a5f2f/stable-diffusion-google-colab5.jpg" alt="" width="877" height="237"><br>Githubからstable-diffusion-webuiをダウンロード</h4><p>ダウンロードした後にstable-diffusion-webuiフォルダに移動します。</p><pre><code>!git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
!pip install --upgrade fastapi==0.90.1
%cd stable-diffusion-webui</code></pre><p><strong>3/30日現在バージョンによってcolabで起動できなくなっているようです。</strong><br><strong>いったん</strong><strong><code>!git checkout&nbsp;9377092</code></strong><strong>を</strong><strong><code>%cd stable-diffusion-webui</code></strong><strong>の下に追記して、過去のバージョンを使用するようにすると動くようになります。</strong><br><a style="background-color:#ffffff" href="https://github.com/AUTOMATIC1111/stable-diffusion-webui/issues/9046#issuecomment-1487874711" target="_blank" rel="noopener noreferrer">https://github.com/AUTOMATIC1111/stable-diffusion-webui/issues/9046#issuecomment-1487874711</a><br><span style="background-color:#ffffff">バージョンによって動かなくなることはありそうなので、また進展があり次第記事更新していきます。</span></p><h4 id="h92eb305bae">セレクトボックスから使いたいモデルを選択して準備</h4><p>選択しただけでは選んだことにならないので左の矢印をクリックしてください<br><a style="color:#000000" href="https://fls.hatenablog.com/entry/2023/01/22/155247" target="_blank" rel="noopener noreferrer">OrangeMixsをGoogle colabで使う (AUTOMATIC1111 webui ) - game snap</a><br>こちらを参考にさせていただきました。</p><h4 id="h2d29d7a14d">上で選択したモデルをダウンロードします</h4><pre><code># モデルデータを取得
!wget "$selected_url" -O "$local_model_name"</code></pre><h4 id="h2483553c9f">vaeが必要な場合はこちらを実行してください。上のModel選択時にvueのダウンロードurlが表示された場合</h4><p>モデルと同じ名前で入れることでモデルが選ばれている場合に、そのvaeを一緒に使うようにしています。</p><pre><code># vaeを取得して同じ名前で入れる vaeがなかったらダウンロードしなくて良い
vaeFile = webui_model_dir + selected_model_name + ".vae.pt"
!wget "$selected_vae_url"  -O "$vaeFile"</code></pre><h4 id="h573ccd43a5">Stable Diffusionサーバーを立てます</h4><p>初回起動時には少し時間がかかる場合があります。</p><pre><code>!COMMANDLINE_ARGS="--share --gradio-auth me:qwerty" REQS_FILE="requirements.txt" python launch.py --ckpt-dir="/content/drive/MyDrive/StableDiffusion/model" --lora-dir="/content/drive/MyDrive/StableDiffusion/lora" --embeddings-dir="/content/drive/MyDrive/StableDiffusion/embeddings" --api</code></pre><p>実行が完了すると下記のような状態になると思うので<br><a style="background-color:#ffffff;font-family: Monaco, Courier New, monospace" href="https://f556eab0-a725-49d4.gradio.live/" target="_blank" rel="noopener noreferrer">gradio.live</a>がついているアドレスをクリックするとUIが開きます。<br><img src="https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/ad74f0089d9a4b10b519cba8394bba59/stable-diffusion-google-colab3.jpg" alt="" width="1075" height="315"><br>パスワード画面が開くのでID: <code>me</code>とPassword:<code>qwerty</code>と入力してください。<br><br>ランダイムを削除すると、今までの設定や画像は全てリセットされてしまうのでモデルやloraなど、次回もダウンロードせずに使いたい場合は自分のdriveに入れ直しておくと、次回からはのフォルダに接続して使うようにしています。</p><pre><code>--ckpt-dir="/content/drive/MyDrive/StableDiffusion/model" 
--lora-dir="/content/drive/MyDrive/StableDiffusion/lora"
--embeddings-dir="/content/drive/MyDrive/StableDiffusion/embeddings"</code></pre><p><br></p><h4 id="h3f96269b62">無料でGoogle Colabを使っている場合制限があるので注意</h4><p>ランタイムの接続を削除してしまうと、上で行った操作がリセットされてしまい、<br>生成した画像も消えてしまうのでラインタイム削除する前に、作った画像は移行しておくようにしましょう。<br>下記をクリックで、生成した画像フォルダ（outputs）を、自分で接続したdriveにいれることができます。<br>コマンドを実行せずとも、左のファイル一覧から自分で移動する形でも大丈夫です。<br><img src="https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/6171d249314d4a1eae53e3486b9a14eb/stable-diffusion-google-colab4.jpg" alt="" width="1075" height="518"><br>一度ランタイムを削除した場合は、環境がリセットされますのでこの工程を最初からやる必要があります。<br></p><h2 id="hd6e013c726">選択するモデルを増やしたい場合</h2><p>モデル選択したの「コードを表示」をクリックしてください。<br>下記のようなコードが出てきますので。<br>Modelの名前と、モデルのダウンロード先のURLとvueのサウンロード先URLを下記の形で追加してください。<br>追加すると、セレクトボックスから選ぶことができるようになります。</p><pre><code>    [
        "Modelで追加した名前",
        "safetensorsのダウンロードの先URL",
        "vaeのダウンロード先URL"
    ],</code></pre><p><br></p><pre><code>Model = "AbyssOrangeMix3" #@param ["Chilloutmix-Ni", "basilmix", "Counterfeit-V2.5", "CCCmix", "pastelmix-fp32", "AbyssOrangeMix","AbyssOrangeMix2_hard", "BloodOrangeMix", "EerieOrangeMix",  "EerieOrangeMix2", "ElyOrangeMix", "AbyssOrangeMix3",  "7th_anime_v1.1", "7th_anime_v3_A", "7th_anime_v3_B", "7th_anime_v3_C", "SukiyakiMix-v1.0", "doll774"]

# modelの行列を作成する
matrix = [
# 追加したい場合はここに追加していきます。
    [
        "Chilloutmix-Ni",
        "https://huggingface.co/TASUKU2023/Chilloutmix/resolve/main/Chilloutmix-Ni.safetensors"
    ],
]</code></pre><h2 id="h08c02a860d">Google Colabで使う方法の参考にさせていただいたサイト</h2><ul><li><a style="color:#000000" href="https://murasan-net.com/index.php/2023/02/10/automatic1111-colab/" target="_blank" rel="noopener noreferrer">AUTOMATIC1111をGoogle Colabで使用する方法 ｜ Stable Diffusion高機能Web UIの活用法 | Murasan Lab</a></li><li><a style="color:#000000" href="https://fls.hatenablog.com/entry/2023/01/22/155247" target="_blank" rel="noopener noreferrer">OrangeMixsをGoogle colabで使う (AUTOMATIC1111 webui ) - game snap</a></li></ul><p><br></p><ul><li><a href="https://colab.research.google.com/drive/1yE9GW5Xfj3CFMAFdwkswCmw2b0NQallR?usp=sharing" target="_blank" rel="noopener noreferrer">Google Colab StableDiffusionUI.ipynb</a></li></ul><h2 id="ha214098e44">まとめ</h2><p>Google Colabで立てると、自分のパソコンの環境に関係なくサクッと立てることができるので便利ですね。<br>制限などは決まっているので、気にして使えば便利かなと思います！</p>]]></content:encoded>
<webfeeds:cover image="https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/c04084aa25824ebdab8522b3ac47fcbc/stable-diffusion-google-colab.jpg" />
<image>
	<url>https://images.microcms-assets.io/assets/8d63ea55db89496cbf00ccb8c6bf8880/c04084aa25824ebdab8522b3ac47fcbc/stable-diffusion-google-colab.jpg</url>
	<title>Stable DiffusionをGoogle Colabでモデルを選んでダウンロードしたり使いやすくする</title>
	<link>https://kame.blog/entry/stable-diffusion-google-colab</link>
	<width>1440</width>
	<height>864</height>
</image>
</item>

     </channel>
  </rss>