<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>なすびブログ</title>
	<atom:link href="https://blog.nasbi.jp/feed/index.xml" rel="self" type="application/rss+xml" />
	<link>https://blog.nasbi.jp/</link>
	<description></description>
	<lastBuildDate>Thu, 29 Oct 2026 07:37:01 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>会社のディスプレイ全種使ってみた</title>
		<link>https://blog.nasbi.jp/try-all-displays-in-nasbi-2026/</link>
		
		<dc:creator><![CDATA[ozawa]]></dc:creator>
		<pubDate>Fri, 26 Jun 2026 11:00:34 +0000</pubDate>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[ハードウェア]]></category>
		<guid isPermaLink="false">https://blog.nasbi.jp/?p=1184</guid>

					<description><![CDATA[会社の現役ディスプレイを全部使ってみたので、その感想をまとめる。 ラインナップ 順序は基本的に試した順（一部例外あり） メーカー 製品 解像度@fps 給電能力 公式サイト 備考 AOC AG274UXP/11 4k 6 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">会社の現役ディスプレイを全部使ってみたので、その感想をまとめる。</p>



<h2 class="wp-block-heading">ラインナップ</h2>



<p class="wp-block-paragraph">順序は基本的に試した順（一部例外あり）</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>メーカー</th><th>製品</th><th>解像度@fps</th><th>給電能力</th><th>公式サイト</th><th>備考</th></tr></thead><tbody><tr><td>AOC</td><td>AG274UXP/11</td><td>4k</td><td>65W</td><td><a href="https://www.aoc.com/jp/gaming/monitors/ag274uxp_11">AG274UXP/11</a></td><td>AGONはブランド</td></tr><tr><td>CUNPU</td><td>S270ES</td><td>4k@144Hz(HDMI) 4k@120Hz(Type-C) 4k@160Hz(DP)</td><td></td><td><a href="https://www.cunpu.net/jp/index.jsp">CUNPU</a> (製品ページが見当たらない)</td><td></td></tr><tr><td>4AM</td><td>4Z40QW</td><td>5k2k@120Hz</td><td>最大96W (2025年モデルの場合は最大65W給電)</td><td>[4Z40QW</td><td>4AM](<a href="https://4am.co.jp/products/4z40qw">https://4am.co.jp/products/4z40qw</a>)</td></tr><tr><td>Huawei</td><td>MateView</td><td>3840 x 2560@60Hz</td><td>65W</td><td><a href="https://web.archive.org/web/20210713020444/https://consumer.huawei.com/jp/monitors/mateview/">HUAWEI MateView &#8211; HUAWEI 日本</a> (WaybackMachine)</td><td>マイク・スピーカー付き</td></tr><tr><td>ALIENWARE</td><td>AW2725Q</td><td>3840&#215;2160@240Hz</td><td>15W</td><td>[Alienware 27インチ4K QD-OLEDゲーミング モニター</td><td>Dell 日本](<a href="https://www.dell.com/ja-jp/shop/alienware-27-4k-qd-oled%E3%82%B2%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0-%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC-aw2725q/apd/210-bqfk/%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC-%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC%E7%94%A8%E5%91%A8%E8%BE%BA%E6%A9%9F%E5%99%A8">https://www.dell.com/ja-jp/shop/alienware-27-4k-qd-oled%E3%82%B2%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0-%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC-aw2725q/apd/210-bqfk/%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC-%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC%E7%94%A8%E5%91%A8%E8%BE%BA%E6%A9%9F%E5%99%A8</a>)</td></tr><tr><td>不明</td><td>不明</td><td>WQHD@165Hz</td><td></td><td></td><td>2560 x 1440（QHD/WQHD &#8211; Wide Quad High Definition）</td></tr><tr><td>Apple</td><td>Macbook Pro内蔵</td><td>3024 x 1964 Retina</td><td>&#8211;</td><td></td><td></td></tr></tbody></table></figure>



<h2 class="wp-block-heading">それぞれのモニタについての感想</h2>



<h3 class="wp-block-heading">AOC AG274UXP/11</h3>



<p class="wp-block-paragraph">初めて実用した60fpsをこえるリフレッシュレートのモニタ。画面上で一番よく動き回るものがポインタなためあまり利点を感じなかったが、確かに家に帰って私物の60fpsモニタを使うと確かに違うとはなった。</p>



<p class="wp-block-paragraph">画面の周囲にフードがついている。脚が立体的な形をしているためどうしても着座位置から近くなり、目が疲れる。輝度を思い切り下げるとよいのかもしれない。</p>



<h3 class="wp-block-heading">CUNPU S270ES</h3>



<p class="wp-block-paragraph">ESの文字を見るとEnginnering Sampleのように見えてしまうが、大々的に売られているようなのでおそらく違う。</p>



<p class="wp-block-paragraph">AOC AG274UXP/11などと比べて目の疲れは抑えられていた。また、脚が特徴的な形をしていないため壁に向かった机であっても問題なく距離を取ることができた。文字なども読みやすかったように思う。</p>



<h3 class="wp-block-heading">4AM 4Z40QW</h3>



<p class="wp-block-paragraph">浅学ながらこのメーカーを知らず、初めはLAAと読むと思っていた。</p>



<p class="wp-block-paragraph">ウルトラワイド＋湾曲のため人を選ぶ。私には合わなかったが、使いこなすことができれば広い作業スペースを得ることができよう。私にとっては縦の物理的な広さがほしかった。解像度は足りているものの、dpiが大きくスケーリングをしっかりかけないと文字が小さくなりすぎてしまう。そのため、得られる縦方向の作業スペースは数字ほど大きくない。</p>



<p class="wp-block-paragraph">M5 Macbook Proを用いて確認しているが、HDRを有効にすると灰がかかったような表示になってしまう。公式サイト曰く一定のHDRには対応しているようだが、互換性の問題だろうか。使用しているMacbook Proはグラフィックに関して不思議な挙動をすることがあるため、それが原因かもしれない。</p>



<h3 class="wp-block-heading">Huawei MateView</h3>



<p class="wp-block-paragraph">以前から気になっていた機種であり、本企画で試した社内モニタの中で最も使いやすかった。縦方向に余裕があるのは正義である。ただし、最大輝度のスペックが相当高いため、文字入力をメインに行う場合は50%から高くても75%程度の輝度で十分である。</p>



<p class="wp-block-paragraph">OSDのレスポンスがディスプレイとしては異常に良いため、輝度調整などもノンストレスで行うことができる。可能であればHDRを付けていないときでもmac側から制御できるとありがたいのだが……それをせずとも問題ない程度にサクサクと動く。社外品キーボードを使っている場合は輝度調整キーが無いことがあるため、本体での操作がしやすいことはとても歓迎できる。</p>



<p class="wp-block-paragraph">M5 Macbook Proを接続し、クラムシェルモードにせずに使うことでHDRを選ぶことができる。選べないときはmacを再起動すると現れることがある。</p>



<p class="wp-block-paragraph">充電は65Wまで。私の使い方ではM5Pro Macbook Proがこのモニタからの充電のみでバッテリ残量が100%に張り付いていた。</p>



<h3 class="wp-block-heading">ALIENWARE AW2725Q</h3>



<p class="wp-block-paragraph">3DCGを見ると世界に穴が開いたように感じられるほどのディスプレイ。実際に穴はないのにそう見えるのは良いことなのかはわからない。少なくとも平文テキストを書くにはいろいろな部分があまりにオーバースペックに感じた。ALIENWARE好きはテンションが上がるかもしれない。</p>



<h3 class="wp-block-heading">謎のモバイルモニタ</h3>



<p class="wp-block-paragraph">ディスプレイ自体に回転機能がついていたり、商品説明ページよりもリフレッシュレートが高かったりと高性能さについても謎が多いモニタ。モバイルモニタなので当たり前だが、持ち運びに便利そうである。</p>



<p class="wp-block-paragraph">確認時に使ったM5 Macbook Pro では画面出力を色々試しているうちに出力されなくなってしまったが、それまでは元気に使えていた。</p>



<p class="wp-block-paragraph">前述のALIENWAREの下に設置されていたが、そうするとDockを画面下に表示している環境においては⌘tabのアプリ切り替えがメインではなくこちらに出てきてしまい、設置位置は論理的な環境と設定も合わせて考える必要があると気づいた。デスクトップを拡張するよりは何らかのアプリのウィンドウを飛ばしておいたほうが使いやすいかもしれない。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">以上より、MateViewがとても気に入ったため、出社するたびに占拠している。使いたい人はどくので遠慮なく言ってください。<br>MateViewを除いた４枚（もしくは社長のデスクを除いた３枚）の中では、4AM 4Z40QWが割と人気なように見える。慣れれば使いやすいのかもしれない。</p>



<p class="wp-block-paragraph">以上</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>スタンフォード大学 &#8211; AI時代のエンジニアのための無料講義資料「CS146S: The Modern Software Developer」</title>
		<link>https://blog.nasbi.jp/スタンフォード大学-ai時代のエンジニアのための/</link>
		
		<dc:creator><![CDATA[mine]]></dc:creator>
		<pubDate>Thu, 15 Jan 2026 09:00:31 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[その他]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://blog.nasbi.jp/?p=1149</guid>

					<description><![CDATA[始めに 今IT業界では、生成AIによってかつてないほどの大きな変動が起きています。「AIがコードを書く時代」において、私たちWEBエンジニアには何が求められるのでしょうか？ 単にAIにコードを書かせるだけではなく、AIを [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">始めに</h2>



<p class="wp-block-paragraph">今IT業界では、生成AIによってかつてないほどの大きな変動が起きています。<br>「AIがコードを書く時代」において、私たちWEBエンジニアには何が求められるのでしょうか？</p>



<p class="wp-block-paragraph">単にAIにコードを書かせるだけではなく、AIをツールとして使いこなし、<br>開発速度や精度を劇的に向上させるための「新しいスキルセット」が必要とされています。</p>



<p class="wp-block-paragraph">この記事では、スタンフォード大学が無料公開している講義資料について紹介します。</p>



<p class="wp-block-paragraph"><a href="https://themodernsoftware.dev/" target="_blank" rel="noopener">公式サイト（https://themodernsoftware.dev）/</a></p>



<p class="wp-block-paragraph">サイト内の**「Syllabus」**タブをクリックすると、各週の講義スライドやおすすめの関連記事を閲覧できます。<br>無料公開されているのはスライドと記事のみですが、非常に参考になる内容のため、今回紹介いたしました。</p>



<h2 class="wp-block-heading">CS146S: The Modern Software Developer とは？</h2>



<p class="wp-block-paragraph">このコースは、スタンフォード大学で2025年秋学期に開講される「現代のソフトウェア開発者」のための授業です。</p>



<p class="wp-block-paragraph">従来のプログラミング教育が「ゼロからコードを書く力」に重点を置いていたのに対し、<br>このコースではAIツールを前提とした開発ワークフローへと完全にシフトしています。<br>「これからの時代に必須となるスキルを身につけたい」というエンジニアの方は必見の内容です。</p>



<p class="wp-block-paragraph">各週のテーマを日本語でまとめてみました：<br>Week 1: Introduction to Coding LLMs and AI Development<br>（コーディングLLMとAI開発への導入）<br>Week 2: The Anatomy of Coding Agents<br>（コーディング・エージェントの解剖学）<br>Week 3: The AI IDE<br>（AIネイティブなIDE）<br>Week 4: Coding Agent Patterns<br>（コーディング・エージェントのパターン）<br>Week 5: The Modern Terminal<br>（モダンなターミナル環境）<br>Week 6: AI Testing and Security<br>（AIによるテストとセキュリティ）<br>Week 7: Modern Software Support<br>（モダンなソフトウェア・サポート / レビュー・ドキュメント）<br>Week 8: Automated UI and App Building<br>（UIとアプリ構築の自動化）<br>Week 9: Agents Post-Deployment<br>（デプロイ後のエージェント活用 / 運用監視）<br>Week 10: What&#8217;s Next for AI Software Engineering<br>（AIソフトウェアエンジニアリングの未来）</p>



<h2 class="wp-block-heading">最後</h2>



<p class="wp-block-paragraph">今回の紹介は以上です。<br>サイトは英語のみですが、講義資料はスライド形式なので、翻訳ツールなどを使いながら読むだけでも非常に勉強になると思います。<br>また時間が取れたときに、それぞれの講義内容をまとめ記事も書くかもしれません。</p>



<p class="wp-block-paragraph">参照リンク<br>公式サイト： <a href="themodernsoftware.dev">themodernsoftware.dev</a><br>コースの課題：<a href="https://github.com/mihail911/modern-software-dev-assignments/tree/master">https://github.com/mihail911/modern-software-dev-assignments/tree/master</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>IntelliJ IDEA（JetBrains製IDE）でChromeのリモートデバッグ</title>
		<link>https://blog.nasbi.jp/chrome-remote-debugging-with-intellij-idea/</link>
		
		<dc:creator><![CDATA[otto]]></dc:creator>
		<pubDate>Wed, 31 Dec 2025 10:00:02 +0000</pubDate>
				<category><![CDATA[その他]]></category>
		<guid isPermaLink="false">https://blog.nasbi.jp/?p=1133</guid>

					<description><![CDATA[IntelliJ IDEAでChromeのリモートデバッグ console.logデバッグはもう辛い！IntelliJ IDEA（などのJetBrains製IDE）でもちゃんとChromeのリモートデバッグの設定をして、 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">IntelliJ IDEAでChromeのリモートデバッグ</h1>



<p class="wp-block-paragraph">console.logデバッグはもう辛い！IntelliJ IDEA（などのJetBrains製IDE）でもちゃんとChromeのリモートデバッグの設定をして、良いデバッグライフを送りましょう</p>



<h2 class="wp-block-heading">基本的な手順</h2>



<ol class="wp-block-list">
<li><code>/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222 --user-data-dir="/path/to/user-data"</code> でChromeを起動します（<code>/path/to/user-data</code> は任意のディレクトリ）</li>



<li>IDEAの「実行」→「構成の編集&#8230;」から「Node.js/Chromeへの接続」を設定します</li>



<li>接続するタブを指定します</li>
</ol>



<p class="wp-block-paragraph">これでブレークポイントを使った本格的なデバッグができるようになります！</p>



<h2 class="wp-block-heading">もう少し詳細な手順</h2>



<p class="wp-block-paragraph">まずChromeでリモートデバッグできるようにするには、</p>



<ul class="wp-block-list">
<li><code>--remote-debugging-port</code> リモートデバッグのポート</li>



<li><code>--user-data-dir</code> ユーザーディレクトリの位置</li>
</ul>



<p class="wp-block-paragraph">の2つの起動オプションが必須です。</p>



<p class="wp-block-paragraph"><code>--remote-debugging-port</code> はリモートデバッグ接続用のポート設定です。適当なポート番号を指定すればOKです。<br><code>--user-data-dir</code> はChromeのプロファイルデータを保存するディレクトリです。通常使用しているChromeとは別のプロファイルで起動することで、既存のChromeセッションと競合せずにリモートデバッグ用のインスタンスを立ち上げることができます。</p>



<p class="wp-block-paragraph">ディレクトリ自体は任意の場所で良いですが、<code>/tmp</code> 以下など揮発性のディレクトリに設定すると、再起動した場合にプロファイルが消えてしまいます。プロファイルが消えるとChromeの初回起動のメッセージが表示されたりログインセッションが切れたりします。これは煩わしいので、ユーザーディレクトリ（<code>~/</code>）などに適当なディレクトリを作って、必要に応じて消す方が使い勝手が良いです。</p>



<h2 class="wp-block-heading">IntelliJ IDEAの設定</h2>



<p class="wp-block-paragraph">実行の構成にChromeの起動コマンドも登録してしまいましょう！</p>



<pre class="wp-block-code language-bash"><code>/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222  --user-data-dir="/path/to/user-data"</code></pre>



<p class="wp-block-paragraph">そうすれば、「実行&#8230;」からChromeをリモートデバッグのオプション付きで起動できます。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://blog.nasbi.jp/wp-content/uploads/2025/12/ss1.png"><img fetchpriority="high" decoding="async" width="1024" height="337" src="https://blog.nasbi.jp/wp-content/uploads/2025/12/ss1-1024x337.png" alt="" class="wp-image-1140" srcset="https://blog.nasbi.jp/wp-content/uploads/2025/12/ss1-1024x337.png 1024w, https://blog.nasbi.jp/wp-content/uploads/2025/12/ss1-300x99.png 300w, https://blog.nasbi.jp/wp-content/uploads/2025/12/ss1-768x252.png 768w, https://blog.nasbi.jp/wp-content/uploads/2025/12/ss1-1536x505.png 1536w, https://blog.nasbi.jp/wp-content/uploads/2025/12/ss1.png 1856w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">次にリモートデバッグの設定を行います。この時「自動的に再接続」のチェックを入れておきましょう。<br>また「起動前(B)」に先程設定したChromeの実行を登録すると便利そうですが、起動タイミングの問題なのかうまく行かないので、個別に起動することをおすすめします。</p>



<p class="wp-block-paragraph">Chromeを起動してリモートデバッグを開始すると、少々見づらいですが接続するタブが選択肢として表示されるので選択しましょう</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://blog.nasbi.jp/wp-content/uploads/2025/12/1e5d986e7c17f9a80d33858cccbc8a9b.png"><img decoding="async" width="1024" height="124" src="https://blog.nasbi.jp/wp-content/uploads/2025/12/1e5d986e7c17f9a80d33858cccbc8a9b-1024x124.png" alt="" class="wp-image-1135" srcset="https://blog.nasbi.jp/wp-content/uploads/2025/12/1e5d986e7c17f9a80d33858cccbc8a9b-1024x124.png 1024w, https://blog.nasbi.jp/wp-content/uploads/2025/12/1e5d986e7c17f9a80d33858cccbc8a9b-300x36.png 300w, https://blog.nasbi.jp/wp-content/uploads/2025/12/1e5d986e7c17f9a80d33858cccbc8a9b-768x93.png 768w, https://blog.nasbi.jp/wp-content/uploads/2025/12/1e5d986e7c17f9a80d33858cccbc8a9b-1536x185.png 1536w, https://blog.nasbi.jp/wp-content/uploads/2025/12/1e5d986e7c17f9a80d33858cccbc8a9b.png 1840w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">これでリモートデバッグが開始できます！良いデバッグライフを！</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>package-lock.jsonがコンフリクトした場合の正しい解消方法</title>
		<link>https://blog.nasbi.jp/true-resolve-package-lock-json/</link>
		
		<dc:creator><![CDATA[suganuma]]></dc:creator>
		<pubDate>Fri, 11 Jul 2025 08:26:01 +0000</pubDate>
				<category><![CDATA[開発環境]]></category>
		<guid isPermaLink="false">https://blog.nasbi.jp/?p=1127</guid>

					<description><![CDATA[ここにブランチが3つあります featureAとBそれぞれpackage.jsonにアプデがあり、featureAを先にmainにマージ済みの状態 main←featureBでpackage.jsonないしpackage [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">ここにブランチが3つあります</p>



<ul class="wp-block-list">
<li>main</li>



<li>featureA</li>



<li>featureB</li>
</ul>



<p class="wp-block-paragraph">featureAとBそれぞれpackage.jsonにアプデがあり、featureAを先にmainにマージ済みの状態</p>



<p class="wp-block-paragraph">main←featureBでpackage.jsonないしpackage-lock.jsonにコンフリクトが発生する。</p>



<p class="wp-block-paragraph">普通に考えたらfeatureB←mainして <code>npm install</code> すれば解決するが、パッケージのマイナーバージョンを変えたくない場合はこの方法だとNG。package-lock.jsonが更新されて依存パッケージのマイナーバージョンが変更されてしまう。</p>



<p class="wp-block-paragraph">そんなときは、mainをmainBとしてフォークして、mainBにfeatureBで追加したパッケージを改めてインストール。 <code>npm install hogehoge@1.2.3</code></p>



<p class="wp-block-paragraph">featureB←mainBするとやっぱりpackage-lock.jsonがコンフリクトするのでmainBのものを使う <code>git checkout --theirs package-lock.json</code></p>



<p class="wp-block-paragraph">で、 <code>npm ci</code> などすれば正常化できるのだ</p>



<p class="wp-block-paragraph">mainも取り込み済みなので、main←featureBがコンフリクトすることもない。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>我々はいつからimportをファイルの先頭に書かなければいけないと勘違いしていたのか</title>
		<link>https://blog.nasbi.jp/import-is-not-require-at-start-of-file/</link>
		
		<dc:creator><![CDATA[suganuma]]></dc:creator>
		<pubDate>Fri, 16 Aug 2024 03:06:19 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://blog.nasbi.jp/?p=1115</guid>

					<description><![CDATA[自分だけかもしれないのだが、 import はファイルの先頭に書かなければシンタックスエラーになるのだと勝手に勘違いをしていた。 下記のソースコードはエラーではないのだ。 ただし import をファイルの途中に書くメリ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">自分だけかもしれないのだが、 <code>import</code> はファイルの先頭に書かなければシンタックスエラーになるのだと勝手に勘違いをしていた。</p>



<p class="wp-block-paragraph">下記のソースコードはエラーではないのだ。</p>



<pre class="wp-block-code language-javascript"><code>import hoge from 'hoge';

export function hogefuga() {
  hoge();
  fuga();
}

import fuga from 'fuga';

export function fugahoge() {
  fuga();
  hoge();
}</code></pre>



<p class="wp-block-paragraph">ただし <code>import</code> をファイルの途中に書くメリットはまったく思いつかないので、先頭に書いたほうが良いだろうね</p>



<p class="wp-block-paragraph">なぜこんな勘違いをしていたのかと考えてみたけど</p>



<ul class="wp-block-list">
<li>トップレベルに書かなければいけないという仕様をファイルの先頭と勘違いしていた</li>



<li>importはエディタが勝手にファイルの先頭に書いてくれるものだから</li>



<li>ES Modules 覚え始めのころのプロジェクトで、eslintで禁止されていた</li>
</ul>



<p class="wp-block-paragraph">こういう理由があったのかもしれない。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>各種ブラウザのフレームレートを調べた</title>
		<link>https://blog.nasbi.jp/research-browser-framerate/</link>
		
		<dc:creator><![CDATA[suganuma]]></dc:creator>
		<pubDate>Wed, 26 Jun 2024 12:36:16 +0000</pubDate>
				<category><![CDATA[開発環境]]></category>
		<guid isPermaLink="false">https://blog.nasbi.jp/?p=1092</guid>

					<description><![CDATA[ちょっと気になることがあって各主要ブラウザのフレームレートを調べてみたのでその結果をメモ。 調べ方 PCのChromeであれば、DevToolsで下記のようにリアルタイムのフレームレートを表示する事が可能です。 今回はC [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">ちょっと気になることがあって各主要ブラウザのフレームレートを調べてみたのでその結果をメモ。</p>



<h2 class="wp-block-heading">調べ方</h2>



<p class="wp-block-paragraph">PCのChromeであれば、DevToolsで下記のようにリアルタイムのフレームレートを表示する事が可能です。</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="564" src="https://blog.nasbi.jp/wp-content/uploads/2024/06/screenshot-2024-06-26-200324-1024x564.png" alt="" class="wp-image-1093" srcset="https://blog.nasbi.jp/wp-content/uploads/2024/06/screenshot-2024-06-26-200324-1024x564.png 1024w, https://blog.nasbi.jp/wp-content/uploads/2024/06/screenshot-2024-06-26-200324-300x165.png 300w, https://blog.nasbi.jp/wp-content/uploads/2024/06/screenshot-2024-06-26-200324-768x423.png 768w, https://blog.nasbi.jp/wp-content/uploads/2024/06/screenshot-2024-06-26-200324.png 1210w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">今回はChrome以外のブラウザや、スマホでも調べたかったので下記のようなコードを用意してみました。</p>



<p class="wp-block-paragraph"><code>requestAnimationFrame()</code> を１秒間回して、その回数を調べる単純なコードです。</p>



<pre class="wp-block-code language-js"><code>async function measureFPS() {
    return new Promise((resolve) =&gt; {
        let count = 0;
        const start = performance.now();
        function frame() {
            if (performance.now() - start &gt;= 1000) {
                resolve(count);
                return;
            }

            count = count + 1;
            requestAnimationFrame(frame);
        }
        frame();
    });
}</code></pre>



<p class="wp-block-paragraph">それをHTML上に実装したものが <a href="https://playground.nasbi.jp/framerate-test/">こちらのページ</a> で確認できます</p>



<p class="wp-block-paragraph">Macに144Hzのディスプレイを繋いでChromeで試した結果がこちら</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="304" height="154" src="https://blog.nasbi.jp/wp-content/uploads/2024/06/screenshot-2024-06-26-201449.png" alt="" class="wp-image-1098" srcset="https://blog.nasbi.jp/wp-content/uploads/2024/06/screenshot-2024-06-26-201449.png 304w, https://blog.nasbi.jp/wp-content/uploads/2024/06/screenshot-2024-06-26-201449-300x152.png 300w" sizes="auto, (max-width: 304px) 100vw, 304px" /></figure>



<p class="wp-block-paragraph">どうやら1〜2fpsほど大きい数字が出てしまうようです。<br>コードの問題かもしれませんが、まあいいでしょう。なんとなく測れればよいのです。</p>



<p class="wp-block-paragraph">このHTMLを使って各ブラウザで計測していきます。</p>



<h2 class="wp-block-heading">計測環境</h2>



<p class="wp-block-paragraph">結果発表の前に、計測した環境について書いておきます</p>



<ul class="wp-block-list">
<li>Macbook Pro M1 Max
<ul class="wp-block-list">
<li>内蔵ディスプレイ（<a href="https://support.apple.com/ja-jp/102297">ProMotion</a>の120Hz）</li>



<li>外部ディスプレイ：AG274UXP/11（144Hzで接続）</li>



<li>Sidecar の iPad Pro （ProMotion対応だが、Sidecar接続のため60Hz）</li>
</ul>
</li>



<li>iPad Pro 11インチ 第4世代 M2チップ
<ul class="wp-block-list">
<li>内蔵ディスプレイ（ProMotion 120Hz）</li>



<li>外部ディスプレイ：AG274UXP/11（ステージマネージャ有効）</li>
</ul>
</li>



<li>Xiaomi 13T Pro
<ul class="wp-block-list">
<li>内蔵ディスプレイ（最高144Hzまでの動的フレームレート設定）</li>



<li>内蔵ディスプレイ（固定144Hz）</li>



<li>内蔵ディスプレイ（固定60Hz）</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">AG274UXP/11が長いので以下AGONと表記します</p>



<h2 class="wp-block-heading">計測した結果</h2>



<h3 class="wp-block-heading">Macbook Pro M1</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>ブラウザ</th><th>ディスプレイ</th><th>FPS</th></tr></thead><tbody><tr><td>Chrome</td><td>内蔵</td><td>122</td></tr><tr><td>Chrome</td><td>AGON</td><td>145</td></tr><tr><td>Chrome</td><td>Sidecar</td><td>62</td></tr><tr><td>Safari</td><td>内蔵</td><td>62</td></tr><tr><td>Safari</td><td>AGON</td><td>74</td></tr><tr><td>Safari</td><td>Sidecar</td><td>62</td></tr><tr><td>Firefox</td><td>内蔵</td><td>145</td></tr><tr><td>Firefox</td><td>AGON</td><td>146</td></tr><tr><td>Firefox</td><td>Sidecar</td><td>144</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">この結果から、Chromeはディスプレイのリフレッシュレートに合わせてレンダリングのフレームレート制限を可変させることがわかった。</p>



<p class="wp-block-paragraph">Safariも基本的にはChromeと同じくディスプレイのリフレッシュレートを最大値としてフレームレート制限をかけるようだが、</p>



<ul class="wp-block-list">
<li>最高でも72FPS（？）までに制限される</li>



<li>ProMotionの下では60FPSに制限される</li>
</ul>



<p class="wp-block-paragraph">という条件がつくようだ。</p>



<p class="wp-block-paragraph">Firefoxだけ理解できなかったのでAGONを物理的に切断して、MacとSidecarだけ繋がってる状態で再計測</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>ブラウザ</th><th>ディスプレイ</th><th>FPS</th></tr></thead><tbody><tr><td>Firefox</td><td>内蔵</td><td>61</td></tr><tr><td>Firefox</td><td>Sidecar（プライマリ）</td><td>62</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">なるほど、どうやらプライマリディスプレイのリフレッシュレートでレンダリングされるらしい。（↑の計測時はSidecarがプライマリになっていた）</p>



<p class="wp-block-paragraph">今度は内蔵をプライマリにしてみる</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>ブラウザ</th><th>ディスプレイ</th><th>FPS</th></tr></thead><tbody><tr><td>Firefox</td><td>内蔵（プライマリ）</td><td>120</td></tr><tr><td>Firefox</td><td>Sidecar</td><td>120</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">なるほどね</p>



<h3 class="wp-block-heading">iPad Pro 11インチ</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>ブラウザ</th><th>ディスプレイ</th><th>FPS</th></tr></thead><tbody><tr><td>Safari</td><td>内蔵</td><td>61</td></tr><tr><td>Safari</td><td>AGON</td><td>62</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ステージマネージャの外部ディスプレイはブラウザの外側でリフレッシュレートがどのくらいなのか調べられなかったのだけど、マウスポインターをグルグル動かしたときの軌跡がProMotionな内蔵ディスプレイと比べると明らかに少ないので、おそらく60Hzで接続されてるのだと思う。</p>



<p class="wp-block-paragraph">ちなみにAGONを接続せずにiPad単体で測っても62FPSでした。</p>



<h3 class="wp-block-heading">Xiaomi 13T Pro</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>ブラウザ</th><th>ディスプレイ</th><th>FPS</th></tr></thead><tbody><tr><td>Chrome</td><td>内蔵・動的Hz</td><td>122</td></tr><tr><td>Chrome</td><td>内蔵・固定144Hz</td><td>121</td></tr><tr><td>Chrome</td><td>内蔵・固定60Hz</td><td>62</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Mac+Chromeと同じ結果を予想していたけど、144Hz固定にしても120相当しか出なかったのは予想外。この端末の特有な現象の可能性もある。</p>



<p class="wp-block-paragraph">もしかしたらAndroidのChromeは上限120FPSで制限されているのかもしれない。</p>



<h2 class="wp-block-heading">結論</h2>



<p class="wp-block-paragraph">今回iPhone実機では調査しなかったけど、まあ間違いなくiPadと同じで60FPSに制限されていると思います。</p>



<p class="wp-block-paragraph">フロントエンド界隈では「ヌルサクアニメーションにするために60FPSを死守すべし！」というのはよく聞く話ですが、実際に調べてみた結果Safariをターゲットとするならばやはり60FPSがひとつの基準になるのは間違いないようです。<br>ただ、Safari以外はハードウェアさえ対応していれば少なくとも120FPSでレンダリングできるので、これからは120FPSを基準にしていくべきなのかもしれません。</p>



<p class="wp-block-paragraph">iPhoneだってハードウェア的には120Hzなわけで、Apple的にハイリフレッシュレートに対して否定的な立場ではないハズ。<br>OS/Safariのアップデートで突然60FPS制限を引き上げるのも時間の問題なのでは？と思いました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>スタイルを隔離してHTMLを埋め込むにはShadowDOMを使うとスマートかもしれない</title>
		<link>https://blog.nasbi.jp/isolate-style-to-embedded-html/</link>
		
		<dc:creator><![CDATA[suganuma]]></dc:creator>
		<pubDate>Thu, 16 May 2024 16:00:01 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://blog.nasbi.jp/?p=1071</guid>

					<description><![CDATA[管理画面があるようなWebサイト・Webアプリを作るとき、稀によくHTMLテキストを値として入力したいという要件があります。 Webサイトの運用者がある程度自由に内容を書き換えられる必要があるコンテンツ、例えばWordP [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">管理画面があるようなWebサイト・Webアプリを作るとき、稀によくHTMLテキストを値として入力したいという要件があります。</p>



<p class="wp-block-paragraph">Webサイトの運用者がある程度自由に内容を書き換えられる必要があるコンテンツ、例えばWordPressの記事本文などがそうですが、管理画面ではWYSIWYGエディタのようなものだったり、場合によってはmarkdownを書く仕様だったりすると思います。</p>



<p class="wp-block-paragraph">これを表示する側の実装ではその部分にも当然スタイルを当てなければなりませんが、多くの場合は出力されるHTMLに自由にクラス名などを付与することができないため、 <code>&lt;h1></code> や <code>&lt;p></code> など、クラス名のついていない素のタグに対してスタイルを適用することになります。</p>



<p class="wp-block-paragraph">例えば、下記のような。</p>



<pre class="wp-block-code language-html"><code>&lt;div class="post_content"&gt;
  &lt;h1&gt;見出し１&lt;/h1&gt;
  &lt;p&gt;ほげほげ&lt;/p&gt;
  &lt;h2&gt;見出し２&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;リスト１&lt;/li&gt;
    &lt;li&gt;リスト２&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;</code></pre>



<pre class="wp-block-code language-css"><code>.post_content h1 {
  font-size: 24px;
  font-weight: bold;
}
.post_content h2 {
  font-size: 20px;
  font-weight: bold;
}

.post_content p {
  margin-top: 12px;
  margin-bottom: 12px;
}

.post_content ul {
  list-style: disc;
}

...
</code></pre>



<p class="wp-block-paragraph">私はこういうスタイルを書くとき、このサイトがベースのスタイルとしてtailwindやリセットCSSを使っているとしたら、わりと気を使うんですよね。</p>



<p class="wp-block-paragraph">h1やpのようなよく使うタグはもちろんデザインに合わせてスタイルを書いておきますが、 <code>&lt;blockquote></code> みたいな普段使わないような、デザインの想定にもないようなタグを使われた場合、スタイルを用意できておらず見た目ではdivと同じになってしまいます。</p>



<p class="wp-block-paragraph">normalize.cssをベースにしていれば少なくともデフォルトのスタイルが存在するので、スタイルがないよりマシだと思いますが、ベースがリセットCSSだと前後の余白すらなくなってしまって酷い見た目になります。</p>



<p class="wp-block-paragraph">上記の例で言うところの <code>.post_content</code> 以下だけCSS的に隔離ができて、normalize.cssもしくは独自のCSSを適用できるのだとしたら、外からの影響を受けずに堅牢なスタイルが作れるのではないかと思いました。</p>



<p class="wp-block-paragraph">親要素からの隔離だったら <code>ShadowDOM</code> が使えるのでは？ というのが今回の話の趣旨になります。</p>



<h2 class="wp-block-heading">ShadowDOMとは？</h2>



<p class="wp-block-paragraph">詳しい説明はみんなだいすき <a href="https://developer.mozilla.org/ja/docs/Web/API/Web_components/Using_shadow_DOM">MdN</a> を見てもらうとして、一言でいうならばDOMツリーの中に独立したDOMツリーを構築する機能のこと。</p>



<p class="wp-block-paragraph">その影響としてCSSのスコーピングが可能になります。</p>



<p class="wp-block-paragraph">ShadowDOMの外はtailwind、中はnormalizeができるわけですね。</p>



<pre class="wp-block-code language-html"><code>&lt;div class="js-dom-prison"&gt;
  &lt;h1&gt;見出し１&lt;/h1&gt;
  &lt;p&gt;ほげほげ&lt;/p&gt;
  &lt;h2&gt;見出し２&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;リスト１&lt;/li&gt;
    &lt;li&gt;リスト２&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;</code></pre>



<p class="wp-block-paragraph"><code>.js-dom-prison</code> をShadowDOMのrootにして、内容物をすべてShadowDOMの中に配置し直します。</p>



<pre class="wp-block-code language-javascript"><code>const container = document.querySelector('.js-dom-prison');
const children = container.childNodes;
const shadowRoot = container.attachShadow({mode: 'open'});
shadowRoot.append(...children);</code></pre>



<p class="wp-block-paragraph">ShadowDOMの中にnormalize.css（もちろん、独自のCSSでも可）を適用したい場合は、こう↓</p>



<pre class="wp-block-code language-javascript"><code>const container = document.querySelector('.js-dom-prison');
const children = container.childNodes;
const shadowRoot = container.attachShadow({mode: 'open'});
const stylesheet = document.createElement('link');
stylesheet.setAttribute('href', 'https://necolas.github.io/normalize.css/8.0.1/normalize.css');
stylesheet.setAttribute('rel', 'stylesheet');
shadowRoot.append(stylesheet, ...children);</code></pre>



<p class="wp-block-paragraph">これをDevToolsでみるとこうなります↓</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="345" src="https://blog.nasbi.jp/wp-content/uploads/2024/05/screenshot-2024-05-17-005507-1024x345.png" alt="" class="wp-image-1082" srcset="https://blog.nasbi.jp/wp-content/uploads/2024/05/screenshot-2024-05-17-005507-1024x345.png 1024w, https://blog.nasbi.jp/wp-content/uploads/2024/05/screenshot-2024-05-17-005507-300x101.png 300w, https://blog.nasbi.jp/wp-content/uploads/2024/05/screenshot-2024-05-17-005507-768x258.png 768w, https://blog.nasbi.jp/wp-content/uploads/2024/05/screenshot-2024-05-17-005507.png 1076w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">あえてinnerHTMLなどを使わずに最初から <code>.js-dom-prison</code> にHTMLを展開しておくことで、たぶんSEO的にも問題にならない。（たぶん）</p>



<p class="wp-block-paragraph">querySelector等で探せなくなるなど、デメリットがないわけではないので使い所が選ぶ必要がありそうですが、iframeなどと違ってオーバーヘッドも小さいですし、もののJS数行でCSS的に隔離ができるので、ハマる状況ならとてもスマートなんじゃいかと思ってます</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Alpine.jsの$storeはいつ使うのか？</title>
		<link>https://blog.nasbi.jp/when-to-use-store-in-alpine-js/</link>
		
		<dc:creator><![CDATA[suganuma]]></dc:creator>
		<pubDate>Fri, 19 Apr 2024 02:37:34 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://blog.nasbi.jp/?p=1058</guid>

					<description><![CDATA[Alpine.jsでは x-data="{open: false}" というように x-data 属性を付与することで、その要素の内側で x-show="open" のように参照することができます。 とまあこれはAlpi [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Alpine.jsでは <code>x-data="{open: false}"</code> というように <code>x-data</code> 属性を付与することで、その要素の内側で <code>x-show="open"</code> のように参照することができます。</p>



<pre class="wp-block-code language-html"><code>&lt;div x-data="{open: false}"&gt;
  &lt;button @click="open = !open"&gt;開閉するよ&lt;/button&gt;
  &lt;div x-show="open"&gt;
    開いてるね
  &lt;/div&gt;
&lt;/div&gt;</code></pre>



<p class="wp-block-paragraph">とまあこれはAlpine.jsを知っている人なら全員知ってることなんですが、 <code>x-data</code> でなくても <code>$store</code> で同じようなことができます。</p>



<p class="wp-block-paragraph">例えばこんな感じですね</p>



<pre class="wp-block-code language-html"><code>&lt;button x-data @click="$store.menu.open = !$store.menu.open"&gt;開閉するよ&lt;/button&gt;

&lt;div x-data x-show="$store.menu.open"&gt;
  開いてるね
&lt;/div&gt;

&lt;script&gt;
  document.addEventListener('alpine:init', () =&gt; {
    Alpine.store('menu', {
      open: false,
    })
  })
&lt;/script&gt;</code></pre>



<p class="wp-block-paragraph">コードでみると結構違いますが、やってることは一緒で、openという変数の定義場所が違うだけなんですよね。</p>



<p class="wp-block-paragraph"><code>$store</code> はコンポーネントを跨いで参照することができます。便利。</p>



<p class="wp-block-paragraph">ただし、v3から <code>x-data</code> は<a href="https://alpinejs.dev/upgrade-guide#x-data-scope">入れ子になっていても変数名がカブらない限り祖先の変数も参照できる</a>という仕様なので、</p>



<pre class="wp-block-code language-html"><code>&lt;body x-data="{open: false}"&gt;
  ...
  &lt;button @click="open = !open"&gt;開閉するよ&lt;/button&gt;
  ...
  &lt;div x-show="open"&gt;
    開いてるね
  &lt;/div&gt;
  ...
&lt;/body&gt;</code></pre>



<p class="wp-block-paragraph">このように <code>&lt;body></code> で <code>x-data</code> しちゃえばどこからでも参照できるグローバル変数を定義できちゃうんですよね。これでは$storeの立場がありません。</p>



<p class="wp-block-paragraph">じゃあ <code>$store</code> っていつ使うの？って話なんですが、おそらく主に下記2点に注目すべきポイントがあります</p>



<h3 class="wp-block-heading">外部のJSと連携したい！</h3>



<p class="wp-block-paragraph">UI系のライブラリを利用する場合など、Alpine.js外のJSとステートの共有をしたい場合は往々にしてあると思います。</p>



<p class="wp-block-paragraph">そんな場合には <code>x-data</code> や <code>Alpine.data</code> で頑張るより素直にstoreを使ったほうが良いでしょう。</p>



<pre class="wp-block-code language-html"><code>&lt;script&gt;
    Alpine.store('menu').open = true;
&lt;/script&gt;</code></pre>



<h3 class="wp-block-heading">パフォーマンスへの影響</h3>



<p class="wp-block-paragraph"><code>x-data</code> を付与すると <code>Alpine.start()</code> を実行したときに、その要素以下がコンポーネントとして初期化されます。</p>



<p class="wp-block-paragraph">もしその要素が巨大なツリーだった場合、初期化にかかるコストが大きいものになるため、できる限りコンポーネントは小さくするのがベター。</p>



<p class="wp-block-paragraph">ちょっとした状態管理のためだけにbodyで <code>x-data</code> をしてしまうのはコストに見合わないので、$storeを使うのがよいでしょう。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Figmaの「マルチ編集」はズボラデザイナーの救世主となるか</title>
		<link>https://blog.nasbi.jp/figma-multi-edit/</link>
		
		<dc:creator><![CDATA[cindy]]></dc:creator>
		<pubDate>Fri, 29 Mar 2024 10:59:10 +0000</pubDate>
				<category><![CDATA[デザイン]]></category>
		<guid isPermaLink="false">https://blog.nasbi.jp/?p=970</guid>

					<description><![CDATA[Figmaのアップデートで「マルチ編集」機能が追加されました。 編集したいオブジェクト（またはテキストなど）を選択したあとにCommand+Option+Aを押すとフレーム間をまたいで一括で選択されるという、今までありそ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Figmaのアップデートで「マルチ編集」機能が追加されました。</p>



<p class="wp-block-paragraph">編集したいオブジェクト（またはテキストなど）を選択したあとに<br><code>Command+Option+A</code>を押すとフレーム間をまたいで一括で選択されるという、<br>今までありそうでなかった代物です。</p>



<p class="wp-block-paragraph">フレームをまたげると、たくさんのフレームを置いてるデザインファイルの作業時には特に便利そうです。</p>



<p class="wp-block-paragraph">↓公式のFigmaファイルはこちら<br><a href="https://www.figma.com/community/file/1343991048099728924/multi-edit-playground">Multi-edit playground</a></p>



<p class="wp-block-paragraph">まずは選択したいオブジェクトを選ぶ</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="494" src="https://blog.nasbi.jp/wp-content/uploads/2024/03/cmd_1-1024x494.jpg" alt="" class="wp-image-1050" srcset="https://blog.nasbi.jp/wp-content/uploads/2024/03/cmd_1-1024x494.jpg 1024w, https://blog.nasbi.jp/wp-content/uploads/2024/03/cmd_1-300x145.jpg 300w, https://blog.nasbi.jp/wp-content/uploads/2024/03/cmd_1-768x371.jpg 768w, https://blog.nasbi.jp/wp-content/uploads/2024/03/cmd_1-1536x742.jpg 1536w, https://blog.nasbi.jp/wp-content/uploads/2024/03/cmd_1.jpg 1922w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><code>Command+Option+A</code>を押すと、<br>フレームをまたいで同じオブジェクトが選択される<br>その後は任意で色変えたり色々できる</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="512" src="https://blog.nasbi.jp/wp-content/uploads/2024/03/cmd_2-1024x512.jpg" alt="" class="wp-image-1051" srcset="https://blog.nasbi.jp/wp-content/uploads/2024/03/cmd_2-1024x512.jpg 1024w, https://blog.nasbi.jp/wp-content/uploads/2024/03/cmd_2-300x150.jpg 300w, https://blog.nasbi.jp/wp-content/uploads/2024/03/cmd_2-768x384.jpg 768w, https://blog.nasbi.jp/wp-content/uploads/2024/03/cmd_2-1536x768.jpg 1536w, https://blog.nasbi.jp/wp-content/uploads/2024/03/cmd_2.jpg 1908w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">オブジェクトを選択して<code>Shift</code>を押すと<br>どこにあるかが青色のボックスで表示される<br>確認するだけならこれでもいいかも</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="486" src="https://blog.nasbi.jp/wp-content/uploads/2024/03/shift-1024x486.jpg" alt="" class="wp-image-1048" srcset="https://blog.nasbi.jp/wp-content/uploads/2024/03/shift-1024x486.jpg 1024w, https://blog.nasbi.jp/wp-content/uploads/2024/03/shift-300x143.jpg 300w, https://blog.nasbi.jp/wp-content/uploads/2024/03/shift-768x365.jpg 768w, https://blog.nasbi.jp/wp-content/uploads/2024/03/shift-1536x730.jpg 1536w, https://blog.nasbi.jp/wp-content/uploads/2024/03/shift.jpg 1924w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">これコンポーネントでよくね？</h3>



<p class="wp-block-paragraph">しかし、この機能を知ったFigmaユーザーはこう思うでしょう。</p>



<p class="wp-block-paragraph"><em>「これ編集するなら最初からコンポーネントにてしおけばよくね？」</em></p>



<p class="wp-block-paragraph">…私も、最初はそう思いました。<br>コンポーネント化しとけば編集も楽じゃん？　と。</p>



<p class="wp-block-paragraph">しかし使い所がちょっと違うのです、こいつは…</p>



<h3 class="wp-block-heading">コンポーネント化する前に役立つんだ</h3>



<p class="wp-block-paragraph">このマルチ機能、私のようなズボラデザイナーの活用方法としては<br>このような場面で役立つと思っています</p>



<p class="wp-block-paragraph">このアイコンこのページでしか使わないから<br>コンポーネント化しなくていっか！<br>↓<br>なんだかんだ複数ページに使用することになるが、<br>そのまま複製して使う<br>↓<br>やっぱコンポーネントにしとけばよかったと後悔しつつ<br>置き換え作業をする</p>



<p class="wp-block-paragraph">こういった雑なデザインファイルを作った時に役立つのです。</p>



<p class="wp-block-paragraph">一括で選択できるから、同じオブジェクトがどこに置いてあるかかすぐにわかるのです<br>ズボラデザイナー（主に私）にとっては、救世主のような存在になるかもしれません</p>



<p class="wp-block-paragraph">後々困るのは自分だとはめちゃくちゃ分かっているんですが、<br>勢いでガーッと作ってる時はコンポーネント化めんどい！後でやろう！と、<br>ついその場のライブ感を優先してしまうこと、ありますよ…ね？</p>



<p class="wp-block-paragraph">ファイルやコンポーネント管理をきっちりしている方も、<br>マルチ機能に救われる場面があるとおもいます。</p>



<p class="wp-block-paragraph">あなたもFigmaを信じましょう。Figma is GOD.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Google Map APIの高度なマーカーのクリックイベントに関するリファレンスが間違ってる</title>
		<link>https://blog.nasbi.jp/google-map-api-reference-to-click-events-for-advanced-markers-is-wrong/</link>
		
		<dc:creator><![CDATA[otto]]></dc:creator>
		<pubDate>Thu, 07 Mar 2024 09:00:49 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://blog.nasbi.jp/?p=942</guid>

					<description><![CDATA[下記はリファレンスのイベントから抜粋したもの。 イベント 説明 click （前略） addEventListener() では使用できません（代わりに gmp-click を使用してください）。 gmp-click （ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">下記はリファレンスの<a href="https://developers.google.com/maps/documentation/javascript/reference/advanced-markers?hl=ja#AdvancedMarkerElement-Events">イベント</a>から抜粋したもの。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>イベント</th><th>説明</th></tr></thead><tbody><tr><td>click</td><td>（前略） addEventListener() では使用できません（代わりに gmp-click を使用してください）。</td></tr><tr><td>gmp-click</td><td>（前略） （addListener() ではなく）addEventListener() で使用することをおすすめします。</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">これを見ると <code>addEventListener('gmp-click')</code> とするのが正しそうだが、これは動かない。<br><a href="https://developers.google.com/maps/documentation/javascript/advanced-markers/overview?hl=ja#make_markers_respond_to_click_and_keyboard_events">ドキュメント</a>を見ると <code>addListener('click')</code> か <code>addListener('gmp-click')</code> で良さそう。（欲しい引数の型でどちらか好きな方を選ぶ）</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
