<?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>JavaScript | ウダ2Blog</title>
	<atom:link href="https://uda2.com/blog/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>https://uda2.com/blog</link>
	<description>大阪でフリーランスとしてWEB制作している管理人が気になった技術をメモったり、作ったツールの紹介などを綴っているブログです。</description>
	<lastBuildDate>Thu, 13 Nov 2025 10:48:22 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>PDFからコピペした文字が微妙に変になったら</title>
		<link>https://uda2.com/blog/jpnormalizer/</link>
					<comments>https://uda2.com/blog/jpnormalizer/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Thu, 13 Nov 2025 06:59:41 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2867</guid>

					<description><![CDATA[<p>PDF内のテキストをコピペすると一部の漢字が「⾯」のように少し小さくひしゃげてしまう事がある。これは康熙部首やCJK部首補助という本来は部首を示す漢字に誤変換（？）されるらしい。過去に書いたUTF-8-MAC（NFD）の</p>
The post <a href="https://uda2.com/blog/jpnormalizer/">PDFからコピペした文字が微妙に変になったら</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>PDF内のテキストをコピペすると一部の漢字が「⾯」のように少し小さくひしゃげてしまう事がある。<br>これは<a href="https://ja.wikipedia.org/wiki/%E5%BA%B7%E7%85%95%E9%83%A8%E9%A6%96" target="_blank" rel="noopener" title="康熙部首">康熙部首</a>や<a href="https://ja.wikipedia.org/wiki/CJK%E9%83%A8%E9%A6%96%E8%A3%9C%E5%8A%A9" target="_blank" rel="noopener" title="">CJK部首補助</a>という本来は部首を示す漢字に誤変換（？）されるらしい。<br>過去に書いた<a href="https://uda2.com/blog/mac_filename/" title="">UTF-8-MAC（NFD）の問題</a>も含めて対策した日本語をノーマライズするライブラリを作ってみました。<br><a href="https://github.com/uda2/jpnormalizer" target="_blank" rel="noopener" title="">https://github.com/uda2/jpnormalizer</a></p>



<span id="more-2867"></span>



<p>いづれも「読め無いわけでは無いからそのままでええやん」って感想の人も多いかもしれないですがWindowsのファイル名にUTF-8-MACを使うと一部のソフトで不都合が起きたりスクリプトで検索の際に別の文字なのでヒットしないという問題が発生しますので、マックユーザー向けにファイルアップロード機能を付けるときやPDFの内容をコピペする可能性の高いフォームでは有用かと思います。</p>



<p>言語はJavascript版とPHP版を用意しています。<br>中味はWikipedia等で情報を集めて置換してるだけですが、最初にテキストに該当箇所が無ければ変換処理をしないので負荷は低いかと思います。</p>



<p>Javascriptの方はnormalizeという関数が用意されていて<br>UTF-8-MAC問題だけなら.normalize(&#8220;NFC&#8221;)、康熙部首も変換したいなら.normalize(&#8220;NFKC&#8221;)と実行すると変換可能でネイティブな分処理的には速いのですが<br>多言語用の不必要な文字も変換されてしまうのに、CJK部首補助が変換されないという<br>濁音半濁音だけでなく全ての言語を正規化するので結果負荷が多めなので自前で用意しています。</p>



<p>PHPの方もNormalizer::normalize()があり、php-intlをインストールするか有効化すると使えるが<br>Javascriptnormalize関数と同様に多言語対応のライブラリで冗長なので自前で変換テーブルを用意して変換しています。</p>



<p>Githubとかいいから使ってみたいって方のためにお試し版も用意してます。<br><a href="https://uda2.com/github/jpnormalizer_sample.php">https://uda2.com/github/jpnormalizer_sample.php</a></p>



<p>※UTF-8-MAC（NFD）の問題はMacのファイルシステムがHFS+からAPFSになってかなり減ってます。<br>※NFCの変換するなら半角→全角も組み込んでも良さそうですがAA（アスキーアート）とかで使うので敢えて入れてません。</p>



<p></p>The post <a href="https://uda2.com/blog/jpnormalizer/">PDFからコピペした文字が微妙に変になったら</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/jpnormalizer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQLをMarkdownに変換</title>
		<link>https://uda2.com/blog/sql2md/</link>
					<comments>https://uda2.com/blog/sql2md/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Sun, 24 Aug 2025 13:44:53 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[markdown]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2853</guid>

					<description><![CDATA[<p>共同制作をあまりしてこなかったのでドキュメントが散らかりがちでだったのですがAIの力で過去に作ったものもドキュメント化していってます。データベースの構造をドキュメント化するにあたり、今まではエクセルなどの表計算ソフトでデ</p>
The post <a href="https://uda2.com/blog/sql2md/">SQLをMarkdownに変換</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>共同制作をあまりしてこなかったのでドキュメントが散らかりがちでだったのですがAIの力で過去に作ったものもドキュメント化していってます。<br>データベースの構造をドキュメント化するにあたり、今まではエクセルなどの表計算ソフトでデータベースの構造を残してたのですが、AIによると下記の3つに残すのが小規模な一般的な個人開発の一般的な方法らしい。</p>



<ul class="wp-block-list">
<li>schema.sql（CREATE TABLEを全部書いたDDL（最終仕様のソース））</li>



<li>tables.md（テーブル定義書（上記の表形式でMarkdown化））</li>



<li>erd.png（ER図のスクショ）</li>
</ul>



<p>schema.sqlは｀<code>mysqldump -u ユーザー名 -p --no-data データベース名 > schema.sql</code>｀でみたいな形で簡単に書き出せる。<br>erd.pngはtables.mdがあれば<a href="https://dbdiagram.io" target="_blank">dbdiagram.io</a>のようなWEBツールで作成できる。</p>



<p>あとはschema.sqlをtables.mdに変換しできれば最低限の形が整うのですが変換ツールが見つからなかったので作ってみた。<br><a href="https://tools.uda2.com/sql2md.html" target="_blank" rel="noopener" title="">https://tools.uda2.com/sql2md.html</a></p>



<p>とはいえ、コアな部分はAI（Claude）に作ってもらったので特に書くことは無い。<br>（しかも、今回のこの記事はカバー画像もAI（chatGPT）に作ってもらった。）<br>私がしたのは軽い修正とウダツールスのパッケージに収めただけです。<br></p>



<p></p>The post <a href="https://uda2.com/blog/sql2md/">SQLをMarkdownに変換</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/sql2md/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Webp変換 with AVIF</title>
		<link>https://uda2.com/blog/webpconv/</link>
					<comments>https://uda2.com/blog/webpconv/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Fri, 25 Jul 2025 13:57:33 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[AVIF]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[WEBP]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2843</guid>

					<description><![CDATA[<p>WebP画像を作るたびにいちいちPhotoshopを立ち上げるのが面倒なのでChatGPTに相談しながら変換ツールを作成しました。WebpだけでなくAVIFにも対応して、ブラウザ上で変換し、複数ファイルはzipファイルに</p>
The post <a href="https://uda2.com/blog/webpconv/">Webp変換 with AVIF</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>WebP画像を作るたびにいちいちPhotoshopを立ち上げるのが面倒なのでChatGPTに相談しながら変換ツールを作成しました。<br>WebpだけでなくAVIFにも対応して、ブラウザ上で変換し、複数ファイルはzipファイルにまとめてダウンロードもできます。<br><a href="https://tools.uda2.com/webpconv.html" target="_blank" rel="noopener" title="">https://tools.uda2.com/webpconv.html</a></p>



<span id="more-2843"></span>



<p>大抵のブラウザでWebpの表示はできるようになったが流石に生成は無理だろうからPythonでもいいから作ってくれないかと思ってChatGPTに聞いたらさくっとブラウザで動作するものを作ってくれた。昨今のブラウザは表示はもちろんで作成もできるるらしい。<br>そこから、見た目を他のツールと統一感を持たせて、操作感をいい感じに整えるのに半日ほどかけて調整。AIのおかげで個人的に使う分にはすぐに作成できるけど、公開するレベルのものとなるといまだ時間はかかってしまう。</p>



<p>そんな中、ChatGPTが「AVIF形式にも対応できますよ」と提案してきたので試してみた。けれど、いざ実行するとPNGに変換されたり、拡張子だけAVIFに変えて実体はPNGのままだったりと、おかしな挙動が出てきた。修正を頼んでもうまくいかず、Geminiにも相談してみた。</p>



<p>Geminiの方は「canvas.toBlob(…, &#8216;image/avif&#8217;)」によるAVIF出力の対応状況を尋ねても、「Safari以外の主要ブラウザではサポートされています」と返ってくる。けれど、実際にはうまく動かない。出力対応と表示対応を混同していたり、ソースを出しても「表示」対応の話ばかり。Geminiとは1時間近くやり取りしてもハレーションがひどくなる一方で埒が開かない。</p>



<p>結局もう一度ChatGPTに戻って聞き直してみたところ、「現時点では、主要ブラウザはAVIFの表示には対応しているが、canvas.toBlob(…, &#8216;image/avif&#8217;)による出力には未対応」との結論に。真偽は不明だけど、自分の環境でも正常に出力できなかったので「現時点でAVIFの出力に対応したブラウザは無い」という事にした。</p>



<p>代替手段としてChatGPTが提示してきたのが、avif.js（@jsquash/avif）というライブラリ。これはGoogle製のAVIFエンコーダー「libavif」をWebAssembly（WASM）化したもので、クライアントサイドだけでAVIF変換を行うことが可能らしい。</p>



<p>ただし、これも一筋縄ではいかない。最初に提案されたCDNバージョンはすでに開発が終了していたようで見つからず、現行のNPMパッケージの方にはCDN版が用意されていない。ChatGPTがjsDelivrにある古いバージョンを勧めてきたが、CORS（クロスオリジン）の制限や外部依存が気になり、最終的に自分のサーバーにインストールすることに。</p>



<p>ところが、パッケージはNode.js用のモジュール形式（CommonJS/ESM）で、そのままではブラウザでは動かせない。ChatGPTの指示に従ってビルド済みのJS（avif.min.js）を生成したが、WASMファイル（avif_enc.wasm）は自動で出力されなかった。インストールフォルダ内にあったWASMを手動でコピーしたところ、なんとか動作するようになった。</p>



<p>とはいえWASMはネイティブアプリではないため、AVIFへの変換処理は正直言って遅い。それでも、クライアントだけでAVIFを生成できる手段としては現状これが一番実用的かもしれない。</p>



<p></p>The post <a href="https://uda2.com/blog/webpconv/">Webp変換 with AVIF</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/webpconv/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>URLエンコーディングの違い</title>
		<link>https://uda2.com/blog/urlencodevariation/</link>
					<comments>https://uda2.com/blog/urlencodevariation/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Mon, 15 Apr 2024 04:54:39 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2768</guid>

					<description><![CDATA[<p>URLエンコードはその名の通りURLに使えない文字をエスケープする記述ですが言語や関数によって若干ぶれがあるのですが実際に比較検証した事がなかったのでやってみました。まずURLはURL Standardに定義されていてP</p>
The post <a href="https://uda2.com/blog/urlencodevariation/">URLエンコーディングの違い</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>URLエンコードはその名の通りURLに使えない文字をエスケープする記述ですが言語や関数によって若干ぶれがあるのですが実際に比較検証した事がなかったのでやってみました。<br>まずURLは<a href="https://url.spec.whatwg.org/" target="_blank" rel="noreferrer noopener">URL Standard</a>に定義されていて<br>PHPの世界ではurlencode()とrawurlencode()があってurlencode()は半角スペースを「+」に変換したり「~」も変換したりします。<br>Pythonはurllib.parse.quote()とurllib.parse.quote_plus()があってurllib.parse.quote_plus()は半角スペースを「+」に変換したり「/」も変換したりします。<br>JavaScriptはencodeURI()とencodeURIComponent()があってencodeURIComponentはURI予約語「#$&amp;+,/:;=?@」も変換するという違いがあります。</p>



<span id="more-2768"></span>



<p>差異のある文字をピックアップしたアスキー表を作成しました。（<a href="https://uda2.com/testbox/test_urlencode.php" target="_blank" rel="noopener" title="">全文字コードはコチラ</a>）</p>



<figure class="wp-block-table"><table><thead><tr><th>10進数</th><th>16進数</th><th>実体</th><th>PHP1</th><th>PHP2</th><th>PY1</th><th>PY2</th><th>JS1</th><th>JS2</th></tr></thead><tbody><tr><th>32</th><th>U+0020</th><th></th><td>+</td><td>%20</td><td>+</td><td>%20</td><td>%20</td><td>%20</td></tr><tr><th>33</th><th>U+0021</th><th>!</th><td>%21</td><td>%21</td><td>%21</td><td>%21</td><td>!</td><td>!</td></tr><tr><th>35</th><th>U+0023</th><th>#</th><td>%23</td><td>%23</td><td>%23</td><td>%23</td><td>#</td><td>%23</td></tr><tr><th>36</th><th>U+0024</th><th>$</th><td>%24</td><td>%24</td><td>%24</td><td>%24</td><td>$</td><td>%24</td></tr><tr><th>38</th><th>U+0026</th><th>&amp;</th><td>%26</td><td>%26</td><td>%26</td><td>%26</td><td>&amp;</td><td>%26</td></tr><tr><th>39</th><th>U+0027</th><th>&#8216;</th><td>%27</td><td>%27</td><td>%27</td><td>%27</td><td>&#8216;</td><td>&#8216;</td></tr><tr><th>40</th><th>U+0028</th><th>(</th><td>%28</td><td>%28</td><td>%28</td><td>%28</td><td>(</td><td>(</td></tr><tr><th>41</th><th>U+0029</th><th>)</th><td>%29</td><td>%29</td><td>%29</td><td>%29</td><td>)</td><td>)</td></tr><tr><th>42</th><th>U+002a</th><th>*</th><td>%2A</td><td>%2A</td><td>%2A</td><td>%2A</td><td>*</td><td>*</td></tr><tr><th>43</th><th>U+002b</th><th>+</th><td>%2B</td><td>%2B</td><td>%2B</td><td>%2B</td><td>+</td><td>%2B</td></tr><tr><th>44</th><th>U+002c</th><th>,</th><td>%2C</td><td>%2C</td><td>%2C</td><td>%2C</td><td>,</td><td>%2C</td></tr><tr><th>47</th><th>U+002f</th><th>/</th><td>%2F</td><td>%2F</td><td>%2F</td><td>/</td><td>/</td><td>%2F</td></tr><tr><th>58</th><th>U+003a</th><th>:</th><td>%3A</td><td>%3A</td><td>%3A</td><td>%3A</td><td>:</td><td>%3A</td></tr><tr><th>59</th><th>U+003b</th><th>;</th><td>%3B</td><td>%3B</td><td>%3B</td><td>%3B</td><td>;</td><td>%3B</td></tr><tr><th>61</th><th>U+003d</th><th>=</th><td>%3D</td><td>%3D</td><td>%3D</td><td>%3D</td><td>=</td><td>%3D</td></tr><tr><th>63</th><th>U+003f</th><th>?</th><td>%3F</td><td>%3F</td><td>%3F</td><td>%3F</td><td>?</td><td>%3F</td></tr><tr><th>64</th><th>U+0040</th><th>@</th><td>%40</td><td>%40</td><td>%40</td><td>%40</td><td>@</td><td>%40</td></tr><tr><th>126</th><th>U+007e</th><th>~</th><td>%7E</td><td>~</td><td>~</td><td>~</td><td>~</td><td>~</td></tr></tbody></table><figcaption class="wp-element-caption">PHP1：PHPの関数「urlencode()」<br>PHP2：PHPの関数「rawurlencode()」<br>PY1：Pythonの関数「urllib.parse.quote_plus()」<br>PY2：Pythonの関数「urllib.parse.quote()」<br>JS1：Pythonの関数「encodeURI()」<br>JS2：Pythonの関数「encodeURIComponent()」</figcaption></figure>



<p>デコードは概ね問題無いが「+」を絡めると誤変換が起こる。<br>例えばサーバー側でrawurlencode()やurllib.parse.quote_plus()を使ってエンコードした文字列をブラウザのrawurlencodeでデコードすると誤変換が起こる。<br>なのでサーバーでもクライアントでも使うなら「+」を使わないdecodeURIComponent()・urllib.parse.quote()・rawurldecode()がオススメです。</p>



<p>なお変換するなら<a href="https://tools.uda2.com/urlencode.html" target="_blank" rel="noreferrer noopener">URLエンコードとデコード -UDA TOOL-</a>を用意しております。</p>The post <a href="https://uda2.com/blog/urlencodevariation/">URLエンコーディングの違い</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/urlencodevariation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cookieの有効期限調査</title>
		<link>https://uda2.com/blog/cookie_lifetime/</link>
					<comments>https://uda2.com/blog/cookie_lifetime/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Tue, 09 Apr 2024 04:52:18 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[Cookie]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2759</guid>

					<description><![CDATA[<p>EUのGDPR（一般データ保護規則）とかカリフォルニアのCCPA（消費者プライバシー法）が策定されても当時は海外の話しだしサードパーティ系の話しはマーケッターじゃないので直接的な影響は無かったのですが、Appleがファー</p>
The post <a href="https://uda2.com/blog/cookie_lifetime/">Cookieの有効期限調査</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>EUのGDPR（一般データ保護規則）とかカリフォルニアのCCPA（消費者プライバシー法）が策定されても当時は海外の話しだしサードパーティ系の話しはマーケッターじゃないので直接的な影響は無かったのですが、AppleがファーストパーティーCookieに制限がかかったITP2.1（Intelligent Tracking Prevention）をwebkitに実装してからはWEB制作にも影響が出てきました。<br>数年前ならいざ知らず、レンダリングエンジンはBlink一強の現状でITPに合わせる必要無さそうですが、それはPCの話しでスマホのシェアの大きいiPhoneのSafariを無視することは出来ずITPに従わざるを得ない状況です。（WEBもアプリもしてるGoogleはWEBに先進な技術を採用してますがAppleはアプリのみなので個人情報を盾にWeb技術には後進的です。）</p>



<p>サードパーティは切り捨てるしか無いけどクッキーは一週間あるからまあいいかと思ってたら、一部のブログ等でITP2.2からクッキーの有効期限が1日になったという記事を散見したので調査することにしました。</p>



<span id="more-2759"></span>



<p>公式の文章を辞書を見ながら確認したところトラッキングの為に他のサイトにデータを送ったりしてる場合は1日なだけでそれ以外はITP2.1から変更無し（1週間）のままのようでした。<br><a href="https://webkit.org/blog/8828/intelligent-tracking-prevention-2-2/" target="_blank" rel="noopener" title="">https://webkit.org/blog/8828/intelligent-tracking-prevention-2-2/</a></p>



<p><a href="https://webkit.org/blog/9521/intelligent-tracking-prevention-2-3/" target="_blank" rel="noreferrer noopener">ITP2.3</a>からlocalstrageに7日の制限がかかってるのも実際試した事はないし、サーバーサイドで保存されたクッキーは規制がかからないとかいう噂も聞くのでこれらを実験してみました。</p>



<p><a href="https://uda2.com/testbox/ipt/" target="_blank" rel="noreferrer noopener">クッキーやセッションやlocalstrageやindexDBの保存期間チェック</a></p>



<p>JavascriptのファーストパーティクッキーもlocalstrageもindexDBも実際は一週間で消えることは無かったですが一ヶ月ほど放置したら消えてました。localstrageの仕様的にはアクションがあったら保持期間が伸びるようなので検証の際にリロードしたのをアクションとして保存期間が伸びたのかと思われます。<br>一方、サーバーサイドクッキーは一ヶ月経っても残ってましたが三ヶ月ほど放置したら消えてました。<br>サーバーを再起動したら消えるとの書き込みを見たのでサーバーソフトの再起動してみたが消えることは無かったしサーバーOSごと再起動しても消えなかったのでサーバーサイドクッキーが消えた原因が時間的なものか別の要因があるのかは分からないけど永遠に保持されるという訳では無いようだ。</p>



<p>数年前には「ブラウザに長く情報を残したいときはクッキーでは無くlocalstorageを使ってね」みたいな流れでしたが諸条件にもよりますが現時点ではlocalstorageよりサーバーサイドのクッキーの方が長く情報を保持できる可能性が高いです。</p>



<p>※アイキャッチ画像は<a href="https://www.photo-ac.com/main/detail/23976149" target="_blank" rel="noreferrer noopener">クッキーとコーヒー &#8211; No: 23976149</a>を使っています。</p>The post <a href="https://uda2.com/blog/cookie_lifetime/">Cookieの有効期限調査</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/cookie_lifetime/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>操作説明「くるんなび」</title>
		<link>https://uda2.com/blog/curunavigate/</link>
					<comments>https://uda2.com/blog/curunavigate/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Wed, 23 Aug 2023 12:50:53 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[CDN]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2707</guid>

					<description><![CDATA[<p>スマホゲームとかによくある画面上にポップアップして「ココを押して下さい」といった操作手順を描画するツール「くるんなび」をGithubに公開いたしました。使い方がわかりにくいWEBツールにおすすめです。 https://g</p>
The post <a href="https://uda2.com/blog/curunavigate/">操作説明「くるんなび」</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>スマホゲームとかによくある画面上にポップアップして「ココを押して下さい」といった操作手順を描画するツール「くるんなび」をGithubに公開いたしました。<br>使い方がわかりにくいWEBツールにおすすめです。</p>



<p><a href="https://github.com/uda2/curunavigate">https://github.com/uda2/curunavigate</a></p>



<span id="more-2707"></span>



<p>前回（<a href="https://uda2.com/blog/numpointer/" target="_blank" rel="noreferrer noopener">丸数字ポインター</a>）と同じく矢印ですが「丸数字ポインター」は画像に矢印を載せ「くるんなび」はWEBページに矢印を載せるので使用目的が違い、「丸数字ポインター」は一般的ユーザーも使うと想定していますが「くるんなび」はWEB制作者向けなのでターゲットも違います。下記にサンプルのURLを書いておきますのでお試しいただければ分かるかと思います。</p>



<p><a href="https://tools.uda2.com/curunavigate/">https://tools.uda2.com/curunavigate/</a></p>



<p>穴あきの処理を<a href="https://qiita.com/rahhi555/items/b58f973fff7fdbbf594b" target="_blank" rel="noreferrer noopener">@rahhi555</a>さんの記事の前半のようにクリッピングするしか無いかなーと思って読んでると記事の最後の例に矩形の周りをbox-shadowで塗ってしまうという逆転の発想な手法が書かれてました。これを参考に実装いたしました。</p>



<p>2つの説明方法が可能です、<br>先に一通り説明：画面全体がボタンになっていて操作はできず先に一通り説明する方法<br>操作をしながら説明：説明と同時に実際の操作をしながら説明していく方法（スマホゲーム等に最適）</p>



<p>ブラウザに閲覧履歴を記録してるので特に指定しなくともlocalstrageを使ってざっくりと一回だけの表示になりますが、しっかりとデータベースで管理したい場合も考慮してオプションを用意しております。</p>



<p>今回CDNとかも使えたらいいかなと調べてたのですが、Githubにアップすると下記の様にURLを書く事でjsDelivrさんが勝手に拾ってキャッシュしてくれるらしいです。</p>



<p><a href="https://cdn.jsdelivr.net/gh/uda2/curunavigate/curunavigate.min.js">https://cdn.jsdelivr.net/gh/uda2/curunavigate/curunavigate.min.js</a></p>The post <a href="https://uda2.com/blog/curunavigate/">操作説明「くるんなび」</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/curunavigate/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>丸数字ポインター</title>
		<link>https://uda2.com/blog/numpointer/</link>
					<comments>https://uda2.com/blog/numpointer/#comments</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Fri, 18 Aug 2023 00:20:40 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2702</guid>

					<description><![CDATA[<p>10年近く前にオンラインソフトの紹介の為にスクショに矢印（数字付き）や矩形を描くWEBツールを使ってたのですが、先日オンラインソフトの紹介記事が古くなってので一掃してこのWEBツールも葬られる予定だったのですが。誰かに使</p>
The post <a href="https://uda2.com/blog/numpointer/">丸数字ポインター</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>10年近く前にオンラインソフトの紹介の為にスクショに矢印（数字付き）や矩形を描くWEBツールを使ってたのですが、先日オンラインソフトの紹介記事が古くなってので一掃してこのWEBツールも葬られる予定だったのですが。<br>誰かに使ってもらえればとブラッシュアップし「丸数字ポインター」としてGitubに公開する事にしました。</p>



<p><a href="https://github.com/uda2/numpointer">https://github.com/uda2/numpointer</a></p>



<p>画像編集ソフトで直接描くのと違い、同じ画像に矢印だけが違う場合は容量の節約になりますし、再圧縮しないので何度編集しても画像の劣化も無いというメリットもありますのでよろしければお使い下さい。</p>



<span id="more-2702"></span>



<p>元々のはjQueryでimgの画像を読み込んでimgを非表示にし代わりにcanvasを追加しそこで編集＆出力する形でしたが、今回は生JavaScriptでimgの画像を読み込んでcanvasで編集しimgに戻す形にしました。<br>これによって軽量かつCSSなどの属性も引き継がれますし悪影響は起きづらいかと思います。</p>



<p>編集用のツール「<a href="https://tools.uda2.com/numpointer.html" target="_blank" rel="noopener nofollow" title="">丸数字ポインターエディター</a>」もjQueryでインターネット上に公開されてる画像に対して矢印の位置や矩形を編集するツールでしたが、今回はJavaScriptでローカルの画像を読み込み可能にしツールバーを付けたりファイルのドラッグ＆ドロップを付けて使いやすくしました。<br>今回のツールはメインターゲットがWEBクリエーター向けなので細かい説明は省いてますが「JSONて何？」という一般の方も画像に矢印を付けれるように画像ファイルに保存する機能も付けております。</p>The post <a href="https://uda2.com/blog/numpointer/">丸数字ポインター</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/numpointer/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>事務所サイトのリニューアル</title>
		<link>https://uda2.com/blog/tenhp/</link>
					<comments>https://uda2.com/blog/tenhp/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Thu, 22 Jun 2023 04:38:14 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2611</guid>

					<description><![CDATA[<p>補修を繰り返しごまかしごまかし運用してた事務所用サイトtenhp.comも13年も経ってるのでリニューアルいたしました。 https://tenhp.com/ 制作当時はそれほどスマホも浸透しておらず、スマホの前身である</p>
The post <a href="https://uda2.com/blog/tenhp/">事務所サイトのリニューアル</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>補修を繰り返しごまかしごまかし運用してた事務所用サイトtenhp.comも13年も経ってるのでリニューアルいたしました。</p>



<a href="https://tenhp.com/" target="_blank" rel="noopener">https://tenhp.com/</a>



<p>制作当時はそれほどスマホも浸透しておらず、スマホの前身であるWindows mobileなどが不人気だったことから「日本ではスマホよりもモバイルゲーム機でネットを見る時代が来るのでは？」と謎な発想でモバイルゲーム機でも見れる横幅で作成してましたのですが、一般的なサイズにしました。</p>



<p>公式サイトではあるので奇抜にはしたくないですが技術的デモンストレーションという面もありますので要所で変態的なコーディングになっています。</p>



<span id="more-2611"></span>



<p>前回謎に一番力を入れてた「制作所について」の名前の部分は元々canvasにJavascriptでゴリゴリに描画していました、今回、デザインはそのままにCSSで動かしています。<br>ちなみにコレは大昔にパソコンショップで展示してたCD-ROM（木原庸佐さん？）の動きをパクってます。（うろ覚えですが）</p>



<p>トップページのメインビジュアルはクリップされた背景が幅100％になって影を落としています。あまり無いレイアウトになってるかと思います。</p>



<p>ページ遷移のアニメーションはよく使われるのが上に絵や色を被せて一端見えなくするのが一般的ですがそれだとイージーなのでディゾルブしてます。</p>



<p>テキストはChatGPTさんの協力のもと作成しております。</p>



<p>下の方にあるお問い合わせボタンはホバー時にグラデーションを回転させています。（線が細いのでほぼ視認できませんが）</p>



<p>フッターの看板犬はCSSに追加されたが使い道の難しい三角関数を使って扇状に並べています。</p>



<p>あと余り好きでは無いのですが今カーソルに追随する円形のオブジェクトが流行ってるみたいなので付けておきました。普通に追随しても面白くないので3段階で追随する感じにしています。</p>



<p>他の場所も作り直してはいるのですが元々個人的に気に入ってるので基本的なデザインの方向性は残したままにしています。</p>The post <a href="https://uda2.com/blog/tenhp/">事務所サイトのリニューアル</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/tenhp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>画像一括リサイズ</title>
		<link>https://uda2.com/blog/resize/</link>
					<comments>https://uda2.com/blog/resize/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Fri, 04 Nov 2022 16:57:57 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2575</guid>

					<description><![CDATA[<p>昨今のスマホやデジカメは高解像度でWEBにちょっとアップするだけなのにすごく重い。特に引っ越してからアップ速度が下がったので毎度リサイズしてからアップしてるので簡単にリサイズできるツールを作ってみた。画像一括リサイズ W</p>
The post <a href="https://uda2.com/blog/resize/">画像一括リサイズ</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>昨今のスマホやデジカメは高解像度でWEBにちょっとアップするだけなのにすごく重い。<br>特に引っ越してからアップ速度が下がったので毎度リサイズしてからアップしてるので簡単にリサイズできるツールを作ってみた。<br><a href="https://tools.uda2.com/resize.html">画像一括リサイズ</a></p>



<span id="more-2575"></span>



<p>Windows用ソフトでよくあるタイプのあらかじめサイズを決めておけば画像をドロップしたら即リサイズされた画像が生成されるよう構想したが「ファイルのドロップ処理やcanvasのリサイズ処理はちょいちょい使うのでいいとして、画像を自動でダウンロードってJavascriptで出来るのか？」と調べてくと画像（base64やBLOB）をリンク（href）に埋め込んでクリックのイベントを発火させると自動でダウンロード出来るらしい。<br>PCはブラウザによっては警告が出るが複数ファイルを入れても一応ダウンロード出来た。続いてスマホでも検証すると複数読み込んでも一枚しかダウンロード出来なかった。<br>あったらいいなレベルで検索したらjavascript上でZIP圧縮するライブラリ<a href="https://stuk.github.io/jszip/" target="_blank" rel="noreferrer noopener">JSZip</a>を見つけた。<br>Zipファイルも同じようにリンクに埋め込めば自動ダウンロードできるようになりました。<br>ちなみに標準の画像サイズは画像系SNSの雄インスタに倣って1080pxにしております。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>公開後、実務に耐えるか試した見たところ解像度がすごく高い画像をいきなり小さくするとジャギー（荒れ荒れ画像）が目立ってしまう事が分かったネットで検索してみるとCSSの「-ms-interpolation-mode: bicubic;」みたいにアルゴリズムが選択は出来ないらしくやるなら自前で用意する必要があるらしい。流石にバイキュービックを自前での実装はしんどいしおそらくかなり重い処理になってしまうが海外の掲示板「<a href="https://stackoverflow.com/questions/18922880/html5-canvas-resize-downscale-image-high-quality" target="_blank" rel="noopener" title="">Stack Overflow</a>」に対策が色々書かれてて、どうやら段階的に小さくするとキレイになるらしいので実装してみたら荒れは無くなったが今度はぼんやりしてる。<br>対処法はシャープネスを掛ける事にしたがこれも自前で用意する必要があるらしい。「<a href="https://imagingsolution.blog.fc2.com/blog-entry-114.html" target="_blank" rel="noopener" title="">画像処理ソリューション</a>」によるとlaplacian filterというアルゴリズムを適用したらなんとかなりそうな感じなので実装してみるといい感じに仕上がった（8近傍でk値は1にしました）。<br>ただ処理は重くなったので負荷が増えたので古いパソコンで複数枚処理するとしんどいかもしれない。</p>The post <a href="https://uda2.com/blog/resize/">画像一括リサイズ</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/resize/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WEBで音声操作</title>
		<link>https://uda2.com/blog/speechme/</link>
					<comments>https://uda2.com/blog/speechme/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Thu, 06 Oct 2022 14:46:45 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Speech Recognition API]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2555</guid>

					<description><![CDATA[<p>昔、「しゃべる！DSお料理ナビ」というゲームがあって調理中でも音声でレシピの手順を進める事が出来た。今やDSは使わないけどiPadとかで音声操作できるブラウザがあったら便利かもと検索したら「Speech Recognit</p>
The post <a href="https://uda2.com/blog/speechme/">WEBで音声操作</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>昔、「しゃべる！DSお料理ナビ」というゲームがあって調理中でも音声でレシピの手順を進める事が出来た。<br>今やDSは使わないけどiPadとかで音声操作できるブラウザがあったら便利かもと検索したら「<a href="https://developer.mozilla.org/ja/docs/Web/API/SpeechRecognition" target="_blank" rel="noopener">Speech Recognition API</a>」というJavaScriptのAPIが見つかったので試して見ることにした。</p>



<span id="more-2555"></span>



<p>「Speech Recognition API」は昔は限られた環境でしか利用できなかったようですが最近はiOSでも使えるみたいなので試して見ました。<br><a href="https://uda2.com/speechme/">https://uda2.com/speechme/</a><br>右上のマイクボタン（音声操作START）を押すと音声操作が開始します。（非対応なブラウザではボタンが現れません。）<br>「次へ」で次のステップに進んで「戻る」で前のステップに戻って「終了」で音声認識を終了します。<br>recognition.interimResultsをtrueにする事で聞きながら音声解読するので反応が早くなります。<br>resultイベント（音声が確認できたら）の最後に毎度停止再開をしてるのはコマンドが短いのに「まだ何か言うかも」と待機するのを抑止する為です。<br>上の方法で永続化はされてるのですがスタートしてから5分間と任意でストップするまで永続化したかったのでタイマーを仕掛けて状態を維持するようにしています。<br>他に誤認識を考慮してワードをセレクトしています。<br>「戻る」は何度か「本」「婆」「保存」と謎な誤認識をされたので入れてます。</p>



<pre><code>var speechme = () => {
  const recbtnObj = document.getElementById('recbtn');
  const recognition = new webkitSpeechRecognition() || new SpeechRecognition();
  if (typeof recognition === 'undefined') return;
  recbtnObj.style.display = "block";
  var recognizing = false;
  var rectime = 0;
  recognition.interimResults = true;
  recognition.maxAlternatives = 10;
  recognition.addEventListener('result', function(event) {
    const results = event.results;
    let strs = [];
    let command = "";
    paragraph: for (let i = event.resultIndex; i < results.length; i++) {//文節（今回は0だけ）
      for (let j = 0; j < results[i].length; j++){//候補
        const result = results[i][j].transcript;
        if (results[i].isFinal) {
          recognition.stop();
          recognizing = false;
        }
        strs.push({c: results[i][j].confidence, s: result});
        if (result == "ストップ" || result == "止めて" || result == "停止" || result == "終了") command = "stop";
        if (result == "次へ" || result == "次" || result == "月" || result == "進む" || result == "進んで" || result == "そんで" || result == "そして" || result == "それから" || result == "オッケー") command = "next";
        if (result == "戻る" || result == "本" || result == "婆" || result == "保存" || result == "戻って" || result == "バック") command = "back";
        if (command != "") break paragraph;
      }
    }
    if (command == "stop") return recStop();
    if (command == "next") stepxstep(1);
    if (command == "back") stepxstep(-1);
    //console.log(JSON.stringify(strs));
    document.getElementById('debug').innerText = JSON.stringify(strs);
    recognition.stop();
    recognition.start();
  });
  recbtnObj.addEventListener('click', () => {
    if (recbtn.textContent == 'START') {
      rectime = Date.now(); 
      recStart();
    } else {
      recStop();
    }
  });
  recognition.addEventListener('start', () => {
    recbtnObj.className = "online";
  });
  recognition.addEventListener('end', () => {
    recbtnObj.className = "offline";
    recognizing = false;
  });
  function recStop() {
    recognition.stop();
    recognizing = false;
    recbtn.textContent = 'START';
  }
  function recStart() {
    recognition.start();
    recognizing = true;
    recbtn.textContent = 'STOP';
  }
  setInterval(() => {
    if (recbtn.textContent == 'STOP' && recognizing === false) {//録音状態なのにAPI停止
      const mysec = Math.floor((Date.now() - rectime) / 1000);
      if (mysec < 60*5) {
        recognition.start();
        recognizing = true;
      } else {
        recStop();
      }
    }
  }, 1000);
};
speechme();
</code></pre>The post <a href="https://uda2.com/blog/speechme/">WEBで音声操作</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/speechme/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
