<?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://www.kazuban.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.kazuban.com/blog</link>
	<description>なにかしら、皆さんの参考になれば幸いです！</description>
	<lastBuildDate>Mon, 27 Apr 2026 01:01:42 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.kazuban.com/blog/wp-content/uploads/2020/05/cropped-ICON-1-32x32.png</url>
	<title>じじぃの引出し</title>
	<link>https://www.kazuban.com/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>RockyLinux9.7で「WordPress環境構築「Vol-02」Apache設定と、HTTPS化</title>
		<link>https://www.kazuban.com/blog/wordpress-install-no2/</link>
					<comments>https://www.kazuban.com/blog/wordpress-install-no2/#respond</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Fri, 24 Apr 2026 23:49:17 +0000</pubDate>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Linux (CentOS、Rocky、Ubuntu)]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[RockyLinux]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[インストール]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=12446</guid>

					<description><![CDATA[前回、RockyLinux9.7をインストールし、WindowsターミナルでSSH接続できるようになりました今回は、Apache、MariaDB、PHPをインストールし、WordPressを起動させます筆者の環境ではすで [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>前回、RockyLinux9.7をインストールし、WindowsターミナルでSSH接続できるようになりました<br>今回は、Apache、MariaDB、PHPをインストールし、WordPressを起動させます<br>筆者の環境ではすでに自宅内で、Wordpress（このブログサイト）は起動しているのでテスト環境として、<span class="marker-under-red">仮に</span><strong>www2.hogehoge.com</strong> で設定を行っています<br>この仮ドメインは、<span class="marker-under-red">実際のドメインに変更</span>してご利用ください。</p>



<h2 class="wp-block-heading">Apache</h2>



<p>コピペで設定できるように、まとめます<br>詳細は、こちらを参照してください</p>


<a href="https://www.kazuban.com/blog/rokeylinux9-3-apache/" title="RockyLinux9.３で自宅サーバーを再構築V04・LAMPの「A」、Apache編" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2023/12/Apache-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2023/12/Apache-160x90.png 160w, https://www.kazuban.com/blog/wp-content/uploads/2023/12/Apache-120x68.png 120w, https://www.kazuban.com/blog/wp-content/uploads/2023/12/Apache-320x180.png 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">RockyLinux9.３で自宅サーバーを再構築V04・LAMPの「A」、Apache編</div><div class="blogcard-snippet internal-blogcard-snippet">LAMPの「A」のApacheの構築編です。インストール、セキュリティ対策、ファイヤーウォール、https化、HTTP2通信設定を説明します。さらに例では、CGIも動作できるような設定にしています。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.01.06</div></div></div></div></a>


<h3 class="wp-block-heading">Remi リポジトリのインストール</h3>



<p>ApacheやPHPの最新バージョンにも対応したいので、Remi リポジトリのインストールします<br>Remiのインストールには、「crb」や「epel」のインストールが必要なようです</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-c1631523513c4ac34ec9ea428186523a"><code>sudo dnf config-manager --set-enabled crb
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-next-release-latest-9.noarch.rpm</code></pre>



<h3 class="wp-block-heading">httpdインストール</h3>



<p>続いて、httpd関連をインストールし、自動起動するように設定します</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-f5ad29b00dd48de30294cc478ca39b60"><code>sudo dnf install httpd httpd-tools mod_ssl
sudo systemctl start httpd
sudo systemctl enable httpd
sudo systemctl is-enabled httpd
sudo systemctl status httpd</code></pre>



<pre class="wp-block-preformatted"><span class="bold-green">●</span> httpd.service - The Apache HTTP Server<br>     Loaded: loaded (/usr/lib/systemd/system/httpd.service; <span class="bold-green">enabled</span>; preset: <span class="bold-blue">disabled</span>)<br>     Active: <span class="bold-green">active (running)</span> since Sat 2026-04-18 17:24:47 JST; 54min ago</pre>



<p><span class="bold-green">active (running)</span>とservice; <span class="bold-green">enabled</span>で確認できます。</p>



<h3 class="wp-block-heading">Firewalld に許可</h3>



<p>「http」と「https」を許可します</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-6f3dea2f5fa02d25e76fb6b91992a2e4"><code>sudo firewall-cmd --add-service=http --zone=public --permanent
sudo firewall-cmd --add-service=https --zone=public --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all --zone=public</code></pre>



<p>「services: 」で確認できます</p>



<pre class="wp-block-preformatted">public (active)<br>  target: default<br>  icmp-block-inversion: no<br>  interfaces: wlp8s0<br>  sources:<br>  services: cockpit dhcpv6-client <strong>http https</strong> ssh</pre>



<p>ブラウザのアドレスバーにIPアドレス「http://192.168.*.*」をに入力すれば、テストページが表示されれば動作しています</p>



<h3 class="wp-block-heading">httpd.conf</h3>



<p>サーバー上のディレクトリや、ホスト名など、自分の環境に合わせて設定ファイルを編集します<br>筆者の場合、「DocumentRoot」を「/home/www/html」に変更します<br>「ServerName」は、バックアップ用なので本サーバーとの識別のためドメイン名は<br>「www2」とし「www2.hogehoge.com」に設定します<br>CGIスクリプトを使用する場合では、AddHandlerでスクリプトの拡張子を指定し、ScriptAlias以外のディレクトリにスクリプトを置く場合には、その指定ディレクトリに「Options ExecCGI」を追加します<br>まずは、設定ファイル「httpd.conf」はバックアップを取ってから作業します</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-6af31f7fc27de5819bdec68fed5c5b38"><code>cd /etc/httpd/conf/
sudo cp -p httpd.conf httpd.conf.org
sudo vi ./httpd.conf</code></pre>



<p><span class="inline-button-white-black">edhitor</span></p>



<pre class="wp-block-preformatted">#ServerAdmin root@localhost<br>ServerAdmin root@localhost<br><br>#ServerName www.example.com:80<br>ServerName www2.hogehoge.com:80<br><br>#DocumentRoot "/var/www/html"<br>DocumentRoot "/home/www/html"<br><br>#&lt;Directory "/var/www"&gt;<br>&lt;Directory "/home/www"&gt;<br><br>#&lt;Directory "/var/www/html"&gt;<br>&lt;Directory "/home/www/html"&gt;<br><br>#ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"<br>ScriptAlias /cgi-bin/ "/home/www/cgi-bin/"<br><br>#&lt;Directory "/var/www/cgi-bin"&gt;<br>&lt;Directory "/home/www/cgi-bin"&gt;<br><br>#Options Indexes FollowSymLinks<br>Options FollowSymLinks<br><br>#AddHandler cgi-script .cgi<br># --- 2026/04/19 add by kazuban<br>AddHandler cgi-script .cgi<br>&lt;Directory /home/www/html/script&gt;<br>  AllowOverride None<br>  Options ExecCGI FollowSymLinks<br>  Order allow,deny<br>  Allow from all<br>&lt;/Directory&gt;</pre>



<p>筆者の場合、デフォルトにディレクトリを変更したので、そのディレクトリを作成し、所有者をapacheに変更します</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-c4f3ef6056e7d1223f92e93bc534a783"><code>sudo mkdir /home/www
sudo mkdir /home/www/html
sudo mkdir /home/www/cgi-bin
sudo chown apache.apache /home/www/html/
sudo chown apache.apache /home/www/cgi-bin/
ls -la /home/www
httpd -t</code></pre>



<p>「Syntax OK」が出れば、正常に変更されています</p>



<h3 class="wp-block-heading">セキュリティ対策</h3>



<p>・テストページや「icons」一覧を非表示にする<br>・Apacheバージョン情報とＴRACEメソッドOFF<br>・X-Frame-Optionsの有効を確認<br>・設定したドキュメントルートにindex.htmlを作成</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-e110b38a9645384a6486be211ba04a0d"><code>cd /etc/httpd/conf.d
sudo cp -p welcome.conf welcome.conf.org
sudo cp -p  autoindex.conf  autoindex.conf.org
sudo vi ./welcome.conf</code></pre>



<p>表示させたくないので、削除や名前変更もできますが、自動的に復活するらしいので、&lt;Directory&gt;設定は、全てコメントにしました。<br>autoindex.confも同様です</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-3cbd35de13f3166934c7322fa29c69c6"><code>sudo vi autoindex.conf</code></pre>



<p>httpdを再起動すると、「http://192.168.*.*」は表示されなくなっていれば正常です</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-9f459a92461c6f58d5bb108024b4367d"><code>sudo systemctl restart httpd</code></pre>



<p>さらに、Apacheバージョン情報とＴRACEメソッドもOFFにします<br>/etc/httpd/conf/httpd.confを編集</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-c6e82f02e1f51781bb7e5f18d2624ebd"><code>sudo vi /etc/httpd/conf/httpd.conf</code></pre>



<p>最終行に、設定コードを追加</p>



<pre class="wp-block-preformatted">##--- kazuban added. 2026/04/19<br>ServerTokens ProductOnly<br>ServerSignature off<br>TraceEnable off</pre>



<p>構文チェックしOKであれば、再起動します</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-c4e776ada2235294bcc675456053ce5d"><code>httpd -t
sudo systemctl restart httpd</code></pre>



<p>X-Frame-Optionsは、Webサイトを不正な埋め込み（クリックジャッキング攻撃）から守るために非常に重要だと言うことなので、こちらも有効になっているか確認します<br>「/etc/httpd/conf.modules.d/00-base.conf」に、<strong>mod_headers.so</strong>の記載があればモジュールは入っています</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-511fa57254ff80702114303e0b2dfde4"><code>cat /etc/httpd/conf.modules.d/00-base.conf | grep mod_headers.so</code></pre>



<p>次に、「/etc/httpd/conf/httpd.conf」の最後に、<br>「 Header append X-FRAME-OPTIONS “SAMEORIGIN” 」<br>を追加して、apacheを再起動します</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-c6e82f02e1f51781bb7e5f18d2624ebd"><code>sudo vi /etc/httpd/conf/httpd.conf</code></pre>



<pre class="wp-block-preformatted">・<br>・<br>##--- kazuban added. 2026/04/19<br>ServerTokens ProductOnly<br>ServerSignature off<br>TraceEnable off<br><br><strong>Header append X-FRAME-OPTIONS "SAMEORIGIN"</strong></pre>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-a16cc5027e70e7b7bf71350c68e22c67"><code>sudo systemctl restart httpd
sudo systemctl status httpd</code></pre>



<p></p>



<h3 class="wp-block-heading">ドキュメントルートのトップページの表示</h3>



<p>上記<a href="#toc6">セキュリティ対策</a>でトップページが表示されなくなったので、「index.html」を作成し、簡単な表示が出るようにしておきます。</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-60da2fb269a22a13b545f334e6d3d5fe"><code>cd /home/www/html/
cat &lt;&lt;EOF | sudo tee index.html
&lt;html&gt;
  &lt;body&gt;
    &lt;h1&gt;This website is currently under maintenance.&lt;/h1&gt;
  &lt;/body&gt;
&lt;/html&gt;
EOF
sudo chown apache:apache ./index.html
httpd -t
sudo systemctl restart httpd</code></pre>



<p>これで、「http://192.168.*.*」でトップページが表示されるようになりました</p>



<h2 class="wp-block-heading">Let’s Encrypt証明書でhttps化</h2>



<p>https化を行う場合には、ファイヤーウォールでの許可が必要ですが、<a href="#toc4">上記ですでに許可してます</a>から、ここでは確認だけ行います</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-b4186ff6ba37c42bfbb26b64ba12e3fc"><code>sudo firewall-cmd --list-all --zone=public</code></pre>



<p>「services: 」に「https」があれば、許可済みです</p>



<h3 class="wp-block-heading">sslモジュール</h3>



<p>「mod_ssl」も、<a href="#toc3">上記でインストールされています</a>、確認してみます</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-ec1f5ece7dfc1a471acc9228f95931ce"><code>dnf list installed | grep mod_ssl
httpd -M | grep ssl</code></pre>



<h3 class="wp-block-heading">Certbot クライアントのインストール</h3>



<p>Let’s Encryptで証明書の取得には、「Certbot」と言うソフトを利用します<br>パッケージの状態を確認します</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-56f1a43f2bc22b0f47d390f0d007012c"><code>dnf list --all | grep certbot</code></pre>



<p>複数でてきますが、「certbot.noarch」「python3-certbot-apache.noarch」をインストールします</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-0fb8f7c4c018f90c747e3410515c195d"><code>sudo dnf install certbot
sudo dnf install python3-certbot-apache
dnf list installed | grep certbot</code></pre>



<h3 class="wp-block-heading">証明書発行</h3>



<p>すでにhttpdが動作している場合には、「webroot プラグイン」を使います<br>動作していない場合には、「Standaloneプラグイン」を使います<br>ただし、両方とも外部から対象のPCの80番ポートへ通信は必要です<br>したがって、<span class="marker-under-red">外部（インターネット側）から、対象のドメインのが名前解決が必要</span>です<br>私は、無料のサービス<a href="https://www.mydns.jp/">https://www.mydns.jp/</a>　を利用させてもらっています<br>80番ポートは「Standalone」の場合は、certbot が占有します<br>「webroot」は、apacheが使います<br>したがって、「webroot」はwebサーバーが動作している必要がありますが、「Standalone」では停止しておく必要があります</p>



<p>まず、外部からの80番へのリクエストが、対象のPCアドレスへ転送されるように設定します<br>自宅であれば、ルーターの「ポートマッピング」などの項目で設定できると思います<br>次に、httpdの起動状態を確認</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-a1296986e104f975827e0964cbcfbd00"><code>sudo systemctl status httpd</code></pre>



<p>80番と、httpdの起動が確認できたら、certbot を起動しましょう<br>確認はしていませんが、権限が必要なファイルに書き込むので、「su」での起動がいいと思います</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-4ba8ca881eeb9baf701d21cb71a7c981"><code>su
certbot certonly --webroot -w /home/www/html/ -d www2.hogehoge.com -d hogehoge.com</code></pre>



<p>対話での設定になります</p>



<pre class="wp-block-preformatted">Saving debug log to /var/log/letsencrypt/letsencrypt.log<br>Enter email address (used for urgent renewal and security notices)<br> (Enter 'c' to cancel): 　　　　　&lt;------自分のEメールアドレスを入力<br><br>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<br>Please read the Terms of Service at<br> https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must<br>agree in order to register with the ACME server. Do you agree?<br>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<br>(Y)es/(N)o: y　&lt;----- 利用規約を読んでください<br><br>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<br>Would you be willing, once your first certificate is successfully issued, to<br>share your email address with the Electronic Frontier Foundation, a founding<br>partner of the Let's Encrypt project and the non-profit organization that<br>develops Certbot? We'd like to send you email about our work encrypting the web,<br>EFF news, campaigns, and ways to support digital freedom.<br>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<br>(Y)es/(N)o: y  &lt;--------- 電子フロンティア財団からEメールが届いてもいいか？<br>Account registered.<br>Requesting a certificate for www2.hogehoge.com and hogehoge.com<br><br><strong>Successfully</strong> received certificate.<br>Certificate is saved at: /etc/letsencrypt/live/www2.hogehoge.com/fullchain.pem<br>Key is saved at:         /etc/letsencrypt/live/www2.hogehoge.com/privkey.pem<br>This certificate expires on 2026-07-18.<br>These files will be updated when the certificate renews.<br>Certbot has set up a scheduled task to automatically renew this certificate in the background.<br><br>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<br>If you like Certbot, please consider supporting our work by:<br> * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate<br> * Donating to EFF:                    https://eff.org/donate-le<br>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -</pre>



<p>「<strong>Successfully</strong>」になれば、証明書ファイルは保管されています</p>



<h3 class="wp-block-heading">証明書の設定</h3>



<p>証明書を「/etc/httpd/conf.d/ssl.conf」で反映させます<br>まずは、バックアップをとってから、編集します</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-c9f4f6792a24ebaf008c4f200f457825"><code>cd /etc/httpd/conf.d
sudo cp -p ssl.conf ssl.conf.org
sudo vi ./ssl.conf</code></pre>



<p><span class="inline-button-white-black">/etc/httpd/conf.d/ssl.conf</span></p>



<pre class="wp-block-preformatted">・<br>#SSLCertificateFile /etc/pki/tls/certs/localhost.crt<br>SSLCertificateFile /etc/letsencrypt/live/www2.hogehoge.com/fullchain.pem       <br>・<br>・<br>#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key<br>SSLCertificateKeyFile /etc/letsencrypt/live/www2.hogehoge.com/privkey.pem<br>・</pre>



<p>保存後、確認でOKなら、httpd再起動</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-fa9c318bd852eab09b6b9bedf753f887"><code>sudo httpd -t
sudo systemctl restart httpd
sudo systemctl status httpd</code></pre>



<h3 class="wp-block-heading">https:// でのアクセス確認</h3>



<p><a href="#toc11">証明書発行</a>では80番ポーとを通しましたが、httpsでは443ポートを通してておきます<br>ただし、筆者の環境のように、同じLAN上にWebサーバーとアクセスPCがある場合には外部DNSを使用しないので、アクセスできない場合があります<br>その場合、アクセス側PCの「hosts」ファイルで設定しておくと可能になります</p>



<p><span class="inline-button-white-black">C:\Windows\System32\drivers\etc\hosts</span>　(windows)<br><span class="inline-button-white-black">/etc/hosts</span> (Linux)</p>



<pre class="wp-block-preformatted">#Server <br>192.168.1.100 hogehoge.com<br>192.168.1.100 www.hogehoge.com<br><br>#TestServer<br>192.168.1.101 www2.hogehoge.com<br></pre>



<p>この設定後、「https://www2.hogehoge.com」で正常に<a href="#toc7">「index.html」画面</a>が表示されれば証明書は正常です</p>



<h3 class="wp-block-heading">HTTP/2を利用する</h3>



<p>詳細は、<a href="https://www.kazuban.com/blog/rokeylinux9-3-apache/#toc21">こちらを確認</a>してください<br>まず、eventMPMモジュールとhttp2モジュールが必要ですが、Rocky9では、デフォルトで有効になっているようです。<br>確認してみます</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-508dbc3f2d9b458b8bb4923dcd1ee1d7"><code>sudo httpd -M | grep mpm
sudo httpd -M | grep http2</code></pre>



<p>次に、「httpd.conf」で有効設定する予定ですが、設定前にhttp2の有効状態を確認してみました<br>確認は、Chromeで「https://www2.hogehoge.com」を表示後、F12キーで表示される開発ページの「Network」「Protocol」で確認できますが、筆者の環境ではすでに「h2」になっていて、http2が有効になっていました。<br>AIに聞いてみると、Apacheのバージョンによっては、有効になっている場合もあるが、明示的に設定をいれる事を推奨するの事なので、設定はしておこうと思います</p>



<p>設定は、「/etc/httpd/conf/httpd.conf」で行います</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-c6e82f02e1f51781bb7e5f18d2624ebd"><code>sudo vi /etc/httpd/conf/httpd.conf</code></pre>



<p>最終行に追加して、httpdを再起動</p>



<pre class="wp-block-preformatted">・<br>&lt;IfModule http2_module&gt;<br>    Protocols h2 http/1.1<br>    ProtocolsHonorOrder on<br>&lt;/IfModule&gt;<br>・</pre>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-9f459a92461c6f58d5bb108024b4367d"><code>sudo systemctl restart httpd</code></pre>



<h3 class="wp-block-heading">HTTP/2有効確認</h3>



<p>Chromeで「https://www2.hogehoge.com」を表示後、F12キーで表示される開発ページの「Network」「Protocol」で確認できますが、「Protocol」が表示されていない場合があります<br>・開発ページが表示された後、CTRL+R でページを更新<br>・もし、翻訳のダイアログが出た場合には、「日本語」にしてみます</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="343" height="159" src="https://www.kazuban.com/blog/wp-content/uploads/2026/04/http2-01.png" alt="" class="wp-image-12547" srcset="https://www.kazuban.com/blog/wp-content/uploads/2026/04/http2-01.png 343w, https://www.kazuban.com/blog/wp-content/uploads/2026/04/http2-01-300x139.png 300w" sizes="(max-width: 343px) 100vw, 343px" /></figure>



<p>・開発ページが更新されても、デフォルトでは「Protocol」が非表示になっている場合があります<br>・「Network」タブの、「Name」セル上でマウス右ボタンで、表示項目の選択ができるので「Protocol」をチェックする事で、表示されます</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="463" height="171" src="https://www.kazuban.com/blog/wp-content/uploads/2026/04/http2-02.png" alt="" class="wp-image-12548" srcset="https://www.kazuban.com/blog/wp-content/uploads/2026/04/http2-02.png 463w, https://www.kazuban.com/blog/wp-content/uploads/2026/04/http2-02-300x111.png 300w" sizes="(max-width: 463px) 100vw, 463px" /></figure>



<p>・表示された「Protocol」が、「h2」や「h3」になっていれば、HTTP/2で応答しています</p>



<hr class="wp-block-separator has-text-color has-indigo-color has-alpha-channel-opacity has-indigo-background-color has-background is-style-wide" style="margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50)"/>



<h4 class="wp-block-heading">WordPress環境構築まとめ</h4>



<div class="wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex">
<p><span class="inline-button-white-black"><a href="https://www.kazuban.com/blog/wordpress-install-no1/">１</a></span></p>



<p><span class="inline-button-white-blue"><a href="https://www.kazuban.com/blog/wordpress-install-no2/">２</a></span></p>



<p class="has-light-grey-color has-text-color has-link-color wp-elements-477ada9c1f96283b086f38ed5e6369e6">３</p>



<p class="has-light-grey-color has-text-color has-link-color wp-elements-6ce3209ddb562c893c8b9885d2eb5c87">４</p>



<p class="has-light-grey-color has-text-color has-link-color wp-elements-64d28bbad2e462aa8bc43af2c9a3cb3a">５</p>



<p class="has-light-grey-color has-text-color has-link-color wp-elements-6ffea2dacd2a225d010208a9488b8f07">６</p>



<p></p>
</div>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/wordpress-install-no2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>RockyLinux9.7で「WordPress環境構築「Vol-01」WindowsからのSSH接続でリモート管理</title>
		<link>https://www.kazuban.com/blog/wordpress-install-no1/</link>
					<comments>https://www.kazuban.com/blog/wordpress-install-no1/#respond</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sat, 18 Apr 2026 08:18:05 +0000</pubDate>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Linux (CentOS、Rocky、Ubuntu)]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[RockyLinux]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[インストール]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=12299</guid>

					<description><![CDATA[ひと昔以上前のノートに、「ubuntu」入れてみたのが、２年前 会社でもローカル環境にwordpressでのコミュニティサイトを検討しているので、wordpress環境構築作業に戸惑わないよう、コピペできるよう、まとめま [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>ひと昔以上前のノートに、「ubuntu」入れてみたのが、２年前</p>


<a href="https://www.kazuban.com/blog/ubuntu24-04lts-install/" title="Ubuntu24.04LTSでWorrPressを動作させる。インストール・SSH・ファイヤーウォール" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2024/06/Desktop-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2024/06/Desktop-160x90.png 160w, https://www.kazuban.com/blog/wp-content/uploads/2024/06/Desktop-120x68.png 120w, https://www.kazuban.com/blog/wp-content/uploads/2024/06/Desktop-320x180.png 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Ubuntu24.04LTSでWorrPressを動作させる。インストール・SSH・ファイヤーウォール</div><div class="blogcard-snippet internal-blogcard-snippet">「Ubuntu24.04LTS」に、「RHEL系、RockyLinux9」と同様の設定で、「WordPress」を動作させます。特に、「apache」の設定方法が違っているので戸惑いました。「RHEL」から移行の方には参考になると思います。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.06.29</div></div></div></div></a>


<p>会社でもローカル環境にwordpressでのコミュニティサイトを検討しているので、wordpress環境構築作業に戸惑わないよう、コピペできるよう、まとめました。<br>せっかくなので、RockyLinux10で試してみましたが、筆者の１０数年前のノートPCではインストーラさえ起動しませんでした<br>RockyLinux9.7であれば起動したので、クリーンインストールして再構築しました</p>



<h2 class="wp-block-heading">RockyLinux9.7 ダウンロード・インストール</h2>



<p>ダウンロード・インストールの詳細はこちらを確認してください</p>


<a href="https://www.kazuban.com/blog/rockylinux9-3-install/#toc1" title="RockyLinux9.3で自宅サーバーを再構築V01・インストール。記事最後のリンクをすべて実行すれば、WordPressサイトが作れます" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2023/11/rockylinux9-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2023/11/rockylinux9-160x90.png 160w, https://www.kazuban.com/blog/wp-content/uploads/2023/11/rockylinux9-120x68.png 120w, https://www.kazuban.com/blog/wp-content/uploads/2023/11/rockylinux9-320x180.png 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">RockyLinux9.3で自宅サーバーを再構築V01・インストール。記事最後のリンクをすべて実行すれば、WordPressサイトが作れます</div><div class="blogcard-snippet internal-blogcard-snippet">2023年、このサイトは、centOS7 で構築していますが、サポート終了が近づいてきました。centOS8のサポートも既に終了しています。今回、RockyLinux9.3で再構築した記録のインストール編です。記事最後のリンクをすべて実行すれば、WordPressサイトが作れます</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.01.05</div></div></div></div></a>


<h2 class="wp-block-heading">インストール直後の設定</h2>



<h3 class="wp-block-heading">ホームディレクトリの日本語表記を英語表記に変更</h3>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-989e0b2b47a876c70d3818e5d942e9cc"><code>LANG=C xdg-user-dirs-gtk-update</code></pre>



<h3 class="wp-block-heading">特定のユーザーにsudo を可能にする</h3>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-9c474bf7692b74cdd36e3b156951b4db"><code>su
visudo</code></pre>



<p>visudo で、コメント行になっている、下記の「#」を外し有効にします<br>%wheel  ALL=(ALL)       NOPASSWD: ALL</p>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-preformatted">・
・
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

・
## Same thing without a password
%wheel  ALL=(ALL)       NOPASSWD: ALL

</pre>



<p>その後、特定ユーザーを、「wheel」グループに追加すればそのユーザーはパスワードなしで「sudo」実行が可能になります</p>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-e66091ba4547686988def2a935003ee9"><code>usermod -aG wheel hogehoge</code></pre>



<h2 class="wp-block-heading">SSH利用状況の確認</h2>



<p>RockyLinux9では、ほとんどの選択でsshは自動起動している状態になっています。<br>動作は、「ssh」コマンドで確認できます</p>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-e210674ccc3e2c117da4c3dd2b01f946"><code>ssh</code></pre>



<p>usage: ssh [・・・・」のような<br>コマンドの使い方を示すヘルプメッセージが表示されれば動作しています<br>また、sshサービスはファイヤーウォールでの制限対象ですが、こちらも標準では許可されていますが、確認しておきます<br>詳細は、下記記事を参照してください</p>


<a href="https://www.kazuban.com/blog/rockylinux9-3-firewalld/" title="RockyLinux9.３で自宅サーバーを再構築V03・firewalldでアクセス制御" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2023/11/Firewall-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2023/11/Firewall-160x90.png 160w, https://www.kazuban.com/blog/wp-content/uploads/2023/11/Firewall-120x68.png 120w, https://www.kazuban.com/blog/wp-content/uploads/2023/11/Firewall-320x180.png 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">RockyLinux9.３で自宅サーバーを再構築V03・firewalldでアクセス制御</div><div class="blogcard-snippet internal-blogcard-snippet">firewalldを少し詳しく調べていました。一例として、sshサービスを、LAN内（指定アドレス）からのみ接続可能な設定にしました。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.01.06</div></div></div></div></a>


<p>ここでは、sshの許可状態だけ確認します</p>



<h3 class="wp-block-heading">firewalldでのsshの確認</h3>



<p>まず、「firewalld」の起動状態を確認してみます</p>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-264da623b30615bb5dff99a6b42c8751"><code>systemctl status firewalld</code></pre>



<p>これで、<span class="inline-button-white-green">active (running)</span>になっていれば、起動しています</p>



<p><br>ファイヤーウォールのアクセスルール対象となるのはアクティブゾーンになります<br>まずは、アクティブゾーンを確認します</p>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-5a31ac658536adf047471b954cf52c16"><code> sudo firewall-cmd --get-active-zones</code></pre>



<pre class="wp-block-preformatted">public<br>  interfaces: wlp8s0</pre>



<p>アクティブゾーンは「public」のみと言うのがわかりました<br>今回は「ssh」の許可状態は「public」の設定で確認すればわかります</p>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-b4186ff6ba37c42bfbb26b64ba12e3fc"><code>sudo firewall-cmd --list-all --zone=public</code></pre>



<pre class="wp-block-preformatted">public (active)<br>  target: default<br>  icmp-block-inversion: no<br>  interfaces: wlp8s0<br>  sources: <br>  services: cockpit dhcpv6-client <strong>ssh</strong><br>  ports: </pre>



<p>「services」に、「ssh」があるので、許可されています</p>



<h2 class="wp-block-heading">SSHでリモート操作</h2>



<p>上で確かめたように、RockyLinux9では、デフォルトでsshサービスもファイヤーウォールでの許可も利用可能な状態になっています。<br>「ssh」コマンドでアクセスしてみましょう。<br><span class="inline-button-white-black">windows</span><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-2c86f09525352778c57ccf824fbc896f"><code>ssh hogehoge@192.168.*.* -p 22</code></pre>



<p>ssh 「Linux側のユーザー@IPアドレス」 でパスワード入力で接続できます<br>「-p 22」は、ポート番号指定です。sshはデフォルトでは２２番ポートです。<br>デフォルトであれば、省略できます。<br>「-p 22」はオプションですが、違うポート番号の場合は、その番号を指定します。<br>また以前ポート番号などを変更していたなどで接続できない事もあります<br>その場合には、標準ポート番号「22」を指定する事で接続できるようになります<br>windowsターミナルでも同じコマンドです<br>接続ができれば、windowsから、Linuxマシンを殆どリモートで設定できます　<br>ローカル内だけでの運用であれば、この設定でもいいかもしれませんが、後ほどポート番号変更と鍵認証方式に変更しようと思います</p>



<h2 class="wp-block-heading">インストール後の設定２（SSHでも可）</h2>



<h3 class="wp-block-heading">まずは、パッケージのアップデート</h3>



<p>sshアクセスができれば、windowsターミナルからでも操作できまます<br>インストール初期のアップデートで、<strong>依存関係の競合</strong>とかでエラーが表示される事があります<br>エラーメッセージでは、「<strong><code>--skip-broken</code></strong>」の付加のアドバイスが出ますが、ついでに「&#8211;allowerasing」オプションも追加したほうがいいようです</p>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-dbf7b835c8d9beee855cf791b2820f27"><code>sudo dnf update --skip-broken --allowerasing
sudo reboot</code></pre>



<h3 class="wp-block-heading">SELinuxに強制させない設定</h3>



<p>SELinuxはセキュリティをより強固にする機能で、RockyLinuxなどRedHat系では標準で有効になっていますが、思うように動作しないトラブルも多いようです。<br>ポリシーを読み込まず、無効的な状態にする方法もありますが、警告のみでポリシーを強制しない「Permissiveモード」に設定にしようと思います</p>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-21ce97d967f607276247f2f467d51cd4"><code>su
vi /etc/selinux/config</code></pre>



<p><span class="inline-button-white-black">editor</span></p>



<pre class="wp-block-preformatted">・
・
#SELINUX=enforcing
SELINUX=permissive
・
・</pre>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-0da292311d89960f07dcab0d8a7f99f3"><code>reboot</code></pre>



<p>再起動後、確認</p>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-2d0d180678d16125e959d48fb08c170e"><code>sudo getenforce</code></pre>



<p>「Permissive」が返ってくれば、設定されています</p>



<h3 class="wp-block-heading">設定中に本体のGUIがクラッシュした</h3>



<p>外部PCからsshで操作していて、たまに戻ると、画面がクラッシュしている場合があります<br>これはGUIのディスプレイマネージャー（gdm）がロックやスリープ状態になっているか、セッションがクラッシュしている場合に起こるようです</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<h4 class="wp-block-heading">復旧方法：キーボードショートカットで復旧</h4>



<p>私の状況は、マウスカーソルだけが動く状態だったので、その画面で：</p>



<ul class="wp-block-list">
<li><code>Ctrl + Alt + F2</code>（または F3〜F6）を押す → テキストコンソールに切り替え</li>



<li>ログイン後、以下を実行：</li>
</ul>
</blockquote>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-242d59062325eee127c4667a28c54431"><code>systemctl restart gdm</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><code>Ctrl + Alt + F1</code>（または F7）でGUI画面に戻る</p>
</blockquote>



<h3 class="wp-block-heading">恒久対策として：スリープ・省電力設定を無効化する</h3>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-0a8f75a95b8934b186dc361edf762568"><code># GNOMEのスクリーンセーバー・自動サスペンドを無効化
sudo -u ユーザー名 gsettings set org.gnome.desktop.screensaver lock-enabled false
sudo -u ユーザー名 gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'nothing'</code></pre>



<p>このコマンドは、私の環境でSSH経由では、X11のDISPLAY環境変数がないとのエラーになりました<br>ssh経由の場合には、DISPLAY変数を指定して実行します</p>



<p><span class="inline-button-white-black">ssh</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-a65d404f71ba944ea071de0a2531ff44"><code>sudo -u ユーザー名 DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u ユーザー名)/bus gsettings set org.gnome.desktop.screensaver lock-enabled false
sudo -u ユーザー名 DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u ユーザー名)/bus gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'nothing'</code></pre>



<p>確認方法</p>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-e5ac6b0bd24ebadb90b5b2be5d764f06"><code>sudo -u ユーザー名 DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u ユーザー名)/bus gsettings get org.gnome.desktop.screensaver lock-enabled
sudo -u ユーザー名 DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u ユーザー名)/bus gsettings get org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type</code></pre>



<p>下記の結果がでれば、正常に反映されている</p>



<pre class="wp-block-preformatted">false
'nothing'</pre>



<h3 class="wp-block-heading">CUIモードをデフォルトにする</h3>



<p>SSH経由でのリモートがほとんどになれば、CUIモードのほうがトラブルは少なそうなので、CUIモードに設定します</p>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-c3178d498b5bb57fa97fd43b6d8c437a"><code>sudo systemctl set-default multi-user.target</code></pre>



<p>これで、再起動後はGUIなしで起動します。<br>もし、GUIが必要になったら、</p>



<p><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-d57fa7f501579522f9c93807506dcb59"><code>sudo systemctl start gdm</code></pre>



<h2 class="wp-block-heading">SSHのセキュリティ向上対策</h2>



<h3 class="wp-block-heading">SSHを鍵認証方式で運用</h3>



<p>「鍵認証方式」は、「秘密鍵」と「公開鍵」のペアの鍵を作成し、アクセスする側は「秘密鍵」が必要になり、アクセスされる（サーバー）側には、「公開鍵」を登録します<br>一般的には、アクセス側で鍵を生成し、「公開鍵」の登録をサーバーへお願いします<br>鍵生成は、windowsでもLinuxでも、「ssh-keygen」コマンドで生成できます<br>今回は、windowsターミナルで生成します</p>



<p><span class="inline-button-white-black">windows</span><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-f485f29dad86e220f0299c4721d2a893"><code>ssh-keygen -t ed25519</code></pre>



<pre class="wp-block-preformatted">Generating public/private ed25519 key pair.<br>Enter file in which to save the key (C:\Users\hogehoge/.ssh/id_ed25519):<br>Enter passphrase (empty for no passphrase):<br>Enter same passphrase again<br>Your identification has been saved in C:\Users\hogehoge/.ssh/id_ed25519<br>Your public key has been saved in C:\Users\hogehoge/.ssh/id_ed25519.pub<br>The key fingerprint is:<br>SHA256:o2ojnUu7UflR12VZq2yOcTY/Ky-VzibafGh/PJbPe6C hogehoge@hoge-Pc<br>The key's randomart image is:<br>+--[ED25519 256]--+<br>|             .+.o|<br>|               Oo|<br>|     o + o .   . |<br>|    . Z   . . o..|<br>|    . o     . *AC|<br>+----[SHA256]-----+</pre>



<h3 class="wp-block-heading">秘密鍵のアクセス権限を厳しく設定</h3>



<p>下記のアクセス権の設定は<span class="marker-under">、windowsターミナルでの操作コマンドです。</span><br><a href="https://www.kazuban.com/blog/rockylinux9-3-ssh/#toc6">Linuxでの操作は、こららを参考</a>にしてください</p>



<p><strong>継承の無効化と権限のクリア</strong></p>



<p><span class="inline-button-white-black">windows</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-55057d8137d3225f853cd8fbb2b997d1"><code>icacls "$HOME\.ssh\id_ed25519" /inheritance:r</code></pre>



<p><strong>ユーザーにのみ読み取り権限を付与</strong></p>



<p><span class="inline-button-white-black">windows</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-1fec2829fc7f6149c61f5520e00e7edb"><code>icacls "$HOME\.ssh\id_ed25519" /grant:r "$($env:USERNAME):R"</code></pre>



<p><strong>「自分自身」以外のユーザー権限を削除</strong></p>



<p><span class="inline-button-white-black">windows</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-fb9acaff7a71f8e5ab9e61371e31a6e4"><code>icacls "$HOME\.ssh\id_ed25519" /remove "SYSTEM"
icacls "$HOME\.ssh\id_ed25519" /remove "Administrators"
icacls "$HOME\.ssh\id_ed25519"</code></pre>



<p>エクスプローラの「プロパティ」⇒「セキュリティ」でも確認できます</p>



<h3 class="wp-block-heading">公開鍵をサーバー側へコピー</h3>



<p>作成した、「id_ed25519.pub」をサーバー側ユーザーの「.ssh」ディレクトリへコピー<br>・windowsの自分自身のホームの「.ssh」に移動<br>・scp コマンドへ、サーバー側ユーザーの「.ssh」へコピー</p>



<p><span class="inline-button-white-black">windows</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-77f112f24c6ea76369f385fb3a48c926"><code>cd $HOME\.ssh
scp .\id_ed25519.pub hogehoge@192.168.*.*:.ssh</code></pre>



<h3 class="wp-block-heading">サーバー側へsshでログインし操作</h3>



<p>windows側から、sshログインし、「.ssh」ディレクトリへ移動し確認</p>



<p><span class="inline-button-white-black">windows</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-cbb30455ff64f53a0a4d20201e381f9b"><code>ssh hogehoge@192.168.*.*</code></pre>



<p>ログイン後、コピーされているか、確認</p>



<p><span class="inline-button-white-black">ssh</span><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-d311e1c2cf25a2b1e3449f544dac3aae"><code>cd ./.ssh
ls -la</code></pre>



<h3 class="wp-block-heading">公開鍵を保存ファイル（authorized_keys）へ登録</h3>



<p>コピーされた公開鍵を、保存用のファイルへ登録し、そのファイルのアクセス権は厳しくします<br>持ってきて、公開鍵は削除しておきます</p>



<p><span class="inline-button-white-black">ssh</span><span class="inline-button-white-black">linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-5fa8cfde406b789b7eac31f01da73ff7"><code>cd ~/.ssh 
cat id_ed25519.pub &gt;&gt; authorized_keys 
chmod 600 authorized_keys
rm id_ed25519.pub
exit</code></pre>



<h3 class="wp-block-heading">再度、鍵を使って、SSHログイン</h3>



<p>ssh に「i」オプションで鍵指定</p>



<p><span class="inline-button-white-black">windows</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-1975d4201d15ea6f3a10809dd2ddff6c"><code>ssh -i .ssh/id_ed25519 hogehoge@192.168.*.*</code></pre>



<p>ログイン時、鍵生成時登録したパスフレーズを入力し、ログイン</p>



<h3 class="wp-block-heading">鍵認証以外ではログイン拒否</h3>



<p>鍵を使ってのログインが確認できたら、鍵以外でのログインは拒否する設定をしておきます<br>設定は、「/etc/ssh/sshd_config」ファイルの”PasswordAuthentication”を&#8221;no&#8221;に設定します<br>まずは、ファイルをバックアップして、編集します</p>



<p><span class="inline-button-white-black">ssh</span><span class="inline-button-white-black"> linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-07092de14441928c5bd57c322f761275"><code>sudo cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.org
sudo vi /etc/ssh/sshd_config</code></pre>



<p><span class="inline-button-white-black">editor</span></p>



<pre class="wp-block-preformatted">・<br>・<br>#PasswordAuthentication yes<br>PasswordAuthentication no<br>・<br>・<br></pre>



<h3 class="wp-block-heading">ついでにリモートからのROOTログインも拒否設定します</h3>



<p>「/etc/ssh/sshd_config」ファイルの”PermitRootLogin”も&#8221;no&#8221;に設定</p>



<p><span class="inline-button-white-black">editor</span></p>



<pre class="wp-block-preformatted">・<br>・<br>#PermitRootLogin prohibit-password<br>PermitRootLogin no<br>・<br>・</pre>



<h3 class="wp-block-heading">さらに、ポート番号を変更</h3>



<p>「ssh」のポートは「22番」が標準なので、自動スキャンなどのアタックが増えるので、違う番号に変更しておきます。<br>ポート番号も「/etc/ssh/sshd_config」ファイルの”Port”で設定します<br>ポート番号は登録済み番号などもあるので、49152–65535の範囲に設定します</p>



<p><span class="inline-button-white-black">editor</span></p>



<pre class="wp-block-preformatted">・<br>・<br>#Port 22<br>Port 55522<br>・<br>・</pre>



<p>「22番」は「ssh」サービスのデフォルトなので、firewalldの設定でsshは「22番」になります<br>firewalld設定は、ポート番号を直接設定する事もできますが、やはりsshのポート番号を変更する方法がfirewalldは再起動だけで、設定は不要なのでスマートだと思います<br>デフォルト設定は、「 /usr/lib/firewalld/services/ ssh.xml 」に保存されているので、<br>そのファイルを「 /etc/firewalld/services /」にコピーして編集します。</p>



<p><span class="inline-button-white-black">ssh</span><span class="inline-button-white-black"> linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-aea5200a7fb91738b5f94bf845a5468d"><code>sudo cp -p /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
sudo cd /etc/firewalld/services/
sudo ls /etc/firewalld/services/
sudo vi /etc/firewalld/services/ssh.xml</code></pre>



<p><span class="inline-button-white-black">editor</span></p>



<pre class="wp-block-preformatted">・<br>・<br>&lt;port protocol="tcp" port="22"/&gt;<br>↓<br>&lt;port protocol="tcp" port="55522"/&gt;<br>・<br>・</pre>



<p>sshとfirewall　サービスを再起動して、アクセスにはポート番号を明示します</p>



<p><span class="inline-button-white-black">ssh</span><span class="inline-button-white-black"> linux</span></p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-7ad2547c0964f6674c7bd7a39177265f"><code>sudo systemctl reload sshd.service
sudo firewall-cmd --reload
ssh  -p 55522 hogehoge@192.168.*.*</code></pre>



<p>ここまでで、RockyLinux9.7のインストールと、やっておきたい初期設定を解説しました<br>「ssh」の設定も完了しているので、windowsターミナルからでも実行できます</p>



<hr class="wp-block-separator has-text-color has-indigo-color has-alpha-channel-opacity has-indigo-background-color has-background is-style-wide" style="margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50)"/>



<h4 class="wp-block-heading">WordPress環境構築まとめ</h4>



<div class="wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex">
<p><span class="inline-button-white-blue"><a href="https://www.kazuban.com/blog/wordpress-install-no1/">１</a></span></p>



<p class="has-black-color has-text-color has-link-color wp-elements-f04e8d7fb6e2787b0f3d9b4d2d85c493"><span class="inline-button-white-black"><a href="https://www.kazuban.com/blog/wordpress-install-no2/">２</a></span></p>



<p class="has-light-grey-color has-text-color has-link-color wp-elements-477ada9c1f96283b086f38ed5e6369e6">３</p>



<p class="has-light-grey-color has-text-color has-link-color wp-elements-6ce3209ddb562c893c8b9885d2eb5c87">４</p>



<p class="has-light-grey-color has-text-color has-link-color wp-elements-64d28bbad2e462aa8bc43af2c9a3cb3a">５</p>



<p class="has-light-grey-color has-text-color has-link-color wp-elements-6ffea2dacd2a225d010208a9488b8f07">６</p>



<p></p>
</div>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/wordpress-install-no1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Python正規表現に挑戦 ― Fanuc系NCブロックをNCワードに分解させる</title>
		<link>https://www.kazuban.com/blog/python-regex/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Thu, 05 Feb 2026 00:40:01 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[NC]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[ＮＣデータ]]></category>
		<category><![CDATA[NCプログラム]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[正規表現]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=12021</guid>

					<description><![CDATA[このサイトでは、NCデータの解析・変換などの自作アプリを公開しています。これまでは C++Builder で自作ライブラリを作成し開発してきました。独学ゆえに効率や可読性など課題は沢山ありますが、いまさら見直す気にもなり [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>このサイトでは、<a href="https://www.kazuban.com/blog/free_soft/">NCデータの解析・変換などの自作アプリを公開</a>しています。<br>これまでは C++Builder で自作ライブラリを作成し開発してきました。<br>独学ゆえに効率や可読性など課題は沢山ありますが、いまさら見直す気にもなりません。<br>最近は Python の学習もかねてNCデータ解析ライブラリのpythonへの移行を考えています。<br>AI の登場で、素人でも高度なコードを得られる時代になりましたが、意味を理解せずに使うのはやはり危険ですし、プログラミングスキルは向上しません。<br>この記事を書くきっかけは<br>「Fanuc系NCブロックをNCワードに分割させる、pythonスクリプトをだして」<br>へのAIの回答に正規表現が使われていた事から始まりました<br>本記事では、「一見意味不明な呪文のような正規表現」を理解して行く過程を記事にしました。</p>



<h2 class="wp-block-heading">正規表現</h2>



<p>正規表現の情報は、ネット上に豊富にあると思うので、詳細は検索してみてください。<br>下記は「正規表現」の説明をAIに聞いてみた回答です</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<h3 class="wp-block-heading"><a>概要</a></h3>



<p>本チャットログでは、「正規表現（Regular Expression）」の基本要素について、最小限かつ代表的な機能に絞って説明している。主な用途は文字列の検索・置換・抽出であり、「文字列パターンを表現する小さな言語」として位置付けている。</p>



<h3 class="wp-block-heading"><a>1. </a>文字列とリテラル</h3>



<ul class="wp-block-list">
<li>abc
<ul class="wp-block-list">
<li>文字列「abc」にそのままマッチするパターン。</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><a>2. </a>メタ文字（特別な意味を持つ記号）</h3>



<ul class="wp-block-list">
<li>. : 任意の1文字</li>



<li>^ : 行頭</li>



<li>$ : 行末</li>



<li>* : 直前要素の0回以上の繰り返し</li>



<li>+ : 直前要素の1回以上の繰り返し</li>



<li>? : 直前要素の0回または1回</li>



<li>| : OR（または）</li>



<li>() : グループ化・キャプチャ</li>
</ul>



<h4 class="wp-block-heading"><a>具体例</a></h4>



<ul class="wp-block-list">
<li>a.*b
<ul class="wp-block-list">
<li>「a」で始まり「b」で終わる行全体にマッチ（間の文字列は任意長）</li>
</ul>
</li>



<li>colou?r
<ul class="wp-block-list">
<li>color または colour にマッチ（u がある/ない両方に対応）。</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><a>3. </a>繰り返し回数の指定（量指定子）</h3>



<ul class="wp-block-list">
<li>{n} : ちょうど n 回</li>



<li>{n,} : n 回以上</li>



<li>{n,m} : n〜m 回</li>
</ul>



<h4 class="wp-block-heading"><a>具体例</a></h4>



<ul class="wp-block-list">
<li>\d{3}-\d{4}
<ul class="wp-block-list">
<li>123-4567 のような「数字3桁-数字4桁」形式にマッチ。</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><a>4. </a>文字クラス</h3>



<ul class="wp-block-list">
<li>[abc] : a か b か c のいずれか1文字</li>



<li>[^abc] : a,b,c 以外の1文字</li>



<li>[0-9] : 数字</li>



<li>[A-Za-z] : 英字（大文字・小文字）</li>
</ul>



<h3 class="wp-block-heading"><a>5. </a>代表的なエスケープシーケンス</h3>



<p>多くの処理系で共通して使われるもの。</p>



<ul class="wp-block-list">
<li>\d : 数字 [0-9]</li>



<li>\w : 単語構成文字（英数字 + _）</li>



<li>\s : 空白文字（スペース・タブ・改行など）</li>



<li>\D : 非数字（\d 以外）</li>



<li>\W : 非単語構成文字（\w 以外）</li>



<li>\S : 非空白文字（\s 以外）</li>
</ul>



<h3 class="wp-block-heading"><a>6. </a>エスケープが必要な記号</h3>



<p>次の文字はメタ文字として特別な意味を持つため、そのままの記号として扱うにはバックスラッシュでエスケープする必要がある。</p>



<ul class="wp-block-list">
<li>対象文字
<ul class="wp-block-list">
<li>. * + ? ^ $ ( ) [ ] { } | \</li>
</ul>
</li>



<li>使用例<ul><li>\. : ドットそのものにマッチ</li></ul>
<ul class="wp-block-list">
<li>\? : 疑問符そのものにマッチ</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><a>補足</a></h3>



<p>ここまでが「基本の道具」としての正規表現の要素一式であり、今後はこれらを組み合わせて「メールアドレスの簡易チェック」など、実用的なパターン作成にも応用できると示唆している。</p>
</blockquote>



<p>個別でみれば、なんとなくわかる気もしますが、これが組み合わさると、まったく呪文です<br>ただ、いろんなパターンの質問とAIの回答を照らし合わせると、なんとなく理解できてくるので、正規表現にかぎらず、AIは言語学習資料としても本当に役立ちます。</p>



<h2 class="wp-block-heading">ファナック系、NCデータ構造</h2>



<p>NCデータの分析ソフトを検討する場合、NCデータ構造の知識は必須です<br>NCデータの知識がないまま、AIの回答だけで進めると、間違いなく後々苦労します<br>ファナック系のプログラム構造は、下記記事でも紹介しています</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/nc-gcode-01/#toc2" title="NCプログラム／プログラム構造" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="102" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1.png 879w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1-300x266.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1-768x681.png 768w" sizes="(max-width: 102px) 100vw, 102px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">NCプログラム／プログラム構造</div><div class="blogcard-snippet internal-blogcard-snippet">最近の投稿は、覚書きとしても残しておきたかったので、素人ながらLinux系の投稿が連続していましたが、今回は気分を変えて、今まで携わってきたＮＣ関連の記事を書こうと思います。ＮＣプログラムとは？ＮＣ工作機械のコントローラへの指令の集まりです。プログラムとありますが、ファナック系は基本的には命令コード...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2019.11.30</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading has-text-align-left">
「ワード」＝「アドレス」+「数字・数値」<br>
「ブロック」＝「ワード」の集まり<br>
「NCデータ」＝「ブロック」の集まり
</h3>



<p>NCブロックからNCアドレスを抽出する課題なので、NCコードを少し復習しておきます</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="262" src="https://www.kazuban.com/blog/wp-content/uploads/2019/11/図1-1024x262.png" alt="" class="wp-image-1338" srcset="https://www.kazuban.com/blog/wp-content/uploads/2019/11/図1-1024x262.png 1024w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/図1-300x77.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/図1-768x197.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/図1.png 1385w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>ブロックの末尾は制御器では「EOB」ですが、PC側では改行コードになります<br>改行コードはOSにより変わりますが、基本的にアスキー形式での転送で大丈夫だと思います<br>NCデータの最小単位は、「ワード」と呼ばれていて、<br>「アルファベット一文字」+「数字、符号、小数点」が一塊になっている要素です<br>例えば「G02」とか「X-12.345」の構成です。<br>先頭のアドレス文字で機械への指令の種類を表し、ワードで具体的な指令になります<br>この「ワード」が集まり、一行の構成になった文字列が「ブロック」と呼ばれます<br>さらに、「ブロック」が複数行あつまって、NCデータになります<br>CAM利用の場合、作成したNCデータファイルをNC機械へ転送し加工動作を制御します<br>分析ソフトを検討する場合、まずはNCデータをブロックに、ブロックをワードに分解したほうが整理しやすいです<br>今回の課題では、<span class="marker-under-red">正規表現</span>を利用して<span class="marker-under">「ブロック」を「ワード」に分解する</span>コードを作成します<br>やりたい事をAIに投げかけると、それなりの回答をもらえます。<br>ただ、ＮＣコードのように、機種依存や複雑な表現がある場合、AIへすべて完ぺきなコードを期待してもなかなか思うような回答は得られません。<br>また、最初は良くても開発を進めていくうちに、改造したくなる場合もあります<br>やはり、ある程度の理解は必要です。</p>



<h2 class="wp-block-heading">ブロックから正規表現でワードに分解する</h2>



<p>具体的に正規表現を書き、「ワード」に分解した結果と照らし合わせながら理解を進めようと思います<br>「ワード」＝「大文字アルファベット一文字」+「数字」なので、一番単純な正規表現のパターンは、&#8221;[A-Z]\d&#8221;になります<br>また、正規表現パターンで、文字列から部分文字列を抽出するのに、AIは「re.findall関数」を教えてくれました<br>（findall関数についての詳細は、ネット検索やAIに聞いてみてください）<br>サンプル文字列は複数のパターンを織り交ぜた、&#8221;G0G1G00 G03M3 T102M30&#8243;　でやってみます<br>（文字列並びのみのサンプルで、NCデータとしては意味ありません）</p>



<h3 class="wp-block-heading">アドレスと数字抽出</h3>



<pre class="wp-block-code"><code>import re

block = "G0G1G00 G03M3 T102M30" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]\d</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G0', 'G1', 'G0', 'G0', 'M3', 'T1', 'M3']</code></pre>



<p>ちょっと期待とは違いますが、とりあえずは、アドレスと数字がリストで取り出せました<br>たった一行で分解された文字列リストが作成されました、すごいですね～<br>一文字づつ文字列操作で処理させたら、結構なコード量になっていると思います<br>ただ、「\d」としたため、「数字は<strong>一文字</strong>」しか抽出してくれませんでした<br>ここで「\d{2}」としてみると、「数字二文字」のみ取り出してくれます<br>今回の例ですべて取り出すには「\d{1,3}」とすればすべてヒットします<br>「\d+」でも同様の結果になりますが、こちらの方は文字数制限はなくなります<br>今回のサンプルでは、&#8221;[A-Z]\d+&#8221;で行こうと思います<br>ちなみに、「\d{0}」とすると、アドレスのみ取り出せます。</p>



<pre class="wp-block-code"><code>import re

block = "G0G1G00 G03M3 T102M30" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]\d+</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G0', 'G1', 'G00', 'G03', 'M3', 'T102', 'M30']</code></pre>



<h3 class="wp-block-heading">さらに、アドレスと数字を分けて抽出したい場合</h3>



<p>グループ化と呼ばれる（丸括弧）でパターンを囲むと「tuple」として分離してくれます<br>抽出した後の処理内容によっては、こちらが便利かもしれません</p>



<pre class="wp-block-code"><code>import re

block = "G0G1G00 G03M3 T102M30" # サンプルNCブロック文字列
words = re.findall(r"<strong>(&#91;A-Z])(\d+)</strong>", block)
print(f"{words}")
for addr, val in words:
    print(f"addr={addr}:val={val}")

#---------- 結果 --------------
#&#91;('G', '0'), ('G', '1'), ('G', '00'), ('G', '03'), ('M', '3'), ('T', '102'), ('M', '30')]
#addr=G:val=0
#addr=G:val=1
#addr=G:val=00
#addr=G:val=03
#addr=M:val=3
#addr=T:val=102
#addr=M:val=30</code></pre>



<h3 class="wp-block-heading">軸（X,Y,Z・・）の小数点にも対応させる</h3>



<p>ここまでは、GやMコードでしたが、軸指令に対応するには、<span class="marker-under">符号や小数点</span>も考慮する必要があります<br>余談ですがプログラミング初心者の場合勘違いしやすいのが、<span class="marker-under-red"><strong>数字</strong>と<strong>数値</strong>の違い</span>です。<br>「12.23」の場合、<strong>数値</strong>としては「12 + 0.23」のように演算ができますが、<br><strong>数字</strong>の場合は、「1」「2」「.」「2」「3」と途中に「.」があるだけのただの数字文字の連続です<br>正規表現の場合も、数字・符号・小数点の<strong>文字の集まり</strong>として処理するので、数値で考えてしまうと期待と違う結果になり、悩む事になります<br>さて、文字を意識してサンプル文字列データに軸指令を追加して、上記のコードで実行してみます</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 <strong>X12.5Y+20.3Z-5.63</strong>F1000" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]\d+</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12', 'F1000']</code></pre>



<p>やはりこのコードでは、±符号と小数点が入るとマッチしないので、省かれてしまいますね<br>まず符号に対応するためにはアドレス「A-Z」の後に[+-]を追加します</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.5Y+20.3Z-5.63F1000" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]&#91;+-]\d+</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'Y+20', 'Z-5']</code></pre>



<p>これでは、符号「+-」が必須に判断され符号付の文字列しかヒットしませんでした<br>符号文字は<span class="marker-under">「無くてもいい」</span>の意味で<span class="marker-under"><strong>[+-]?</strong></span>としてみます</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.5Y+20.3Z-5.63F1000" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]&#91;+-]?\d+</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12', 'Y+20', 'Z-5', 'F1000']</code></pre>



<p>符号部分を<span class="marker">[+-]?</span> とすることで、符号がなくてもマッチするようになりました<br>次に小数点とそれ以下にも対応させてみましょう<br>NC制御器は、数値として扱いますが、文字としての小数点の扱いは結構面倒です。<br>小数点がある場合、ない場合、小数点から始まる場合、小数点で終わる場合・・など<br>まずは、小数点の有無に対応させるため、「<strong>\d+\.\d+</strong>」を考えましたが、<br>この場合、小数点がないとマッチしなくなります<br>そこで「？を付加」すれば「無くてもいい」にも対応できます</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.5Y+20.3Z-5.63F1000" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]&#91;+-]?\d+\.?\d+</strong>", block)
print(f"{words}")

#---------- 結果 --------------
&#91;'G90', 'G01', 'X12.5', 'Y+20.3', 'Z-5.63', 'F1000']
</code></pre>



<p>だいぶ理想に近づいてきましたが、「X.124」や「23.」など、小数点での始まりや終わりには対応できません<br>サンプル文字列に追加して確かめてみましょう</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.50Y+20.3Z-5.63 <span class="marker"><strong>I.5 J22.</strong></span>F1000" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]&#91;+-]?\d+\.?\d+"</strong>, block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', '<span class="marker-red">J22</span>', 'F1000</code></pre>



<p>やはり、「I.5」にはマッチせず「J22.」の「.」は省かれていますね<br>ここも余談ですが、NCで「<strong>22.</strong>」を「<strong>22</strong>」に変換してしまった場合、制御器によってはとんでもない事になりかねないので十分意識しておく必要があります。<br><br>整理してみると</p>



<ul class="wp-block-list">
<li>[A-Z]：NCコードのアドレス</li>



<li>[+-]?：必須ではない、符号</li>



<li>\d+：複数個の数字<br>ここまでで、「Gコード」「Mコード」には対応できている</li>



<li>\.?：小数点は必須でない</li>



<li>\d+：複数個の数字</li>
</ul>



<p>やはり、「小数点で終わる」場合「\.?」なので、省略されてしまいますね<br>ではどうすればいのか？<br>AIに聞いたところ、グループ化と言う方法があり、&#8221;( )&#8221;で囲む事で、一塊としてでマッチングのルール設定できるようです<br>ただし、&#8221;( )&#8221;では、囲みごとに分割されタプルのリストとして抽出されます<br>グループごとに分割させたくない場合には<span class="marker-under"><strong>&#8220;(?: )</strong>&#8220;で囲む</span>仕様があり<span class="marker-under">非キャプチャグループ</span>と呼ばれマッチングのルールには使用するが分割はされないようです。<br>今回の例では、分割させたくないので、&#8221;<strong>(?: )</strong>&#8220;を使ってみます<br>最後の「\d+：複数個の数字」をグループ化して、必須ではない複数個の数字として設定します</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.50Y+20.3Z-5.63 <span class="marker"><strong>I.5 J22.</strong></span>F1000" # サンプルNCブロック文字列
words = re.findall(r"&#91;A-Z]&#91;+-]?\d+\.?<strong>(?:\d+)?</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', '<span class="marker"><strong>J22.</strong></span>', 'F1000']</code></pre>



<p>これで、「22.」には対応できました。次は、小数点で始まる「.5」の場合です。<br>ここまででも、結構な呪文になっているのに、さらに複雑になりそうです。<br>ここもAIに相談すると、グループの中で（A | B）の書式で「AまたはB」とマッチング範囲の選択ができるようで、この書式での書き方を教えてくました</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.50Y+20.3Z-5.63 <span class="marker"><strong>I.5 J22.</strong></span>F1000" # サンプルNCブロック文字列
words = re.findall(r"&#91;A-Z]&#91;+-]?(?:<span class="marker-under-blue">\d+\.\d+</span><strong>|</strong><span class="marker-under">\d+\.</span><strong>|</strong><span class="marker-under-red">\.\d+</span><strong>|</strong>\d+)", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', <span class="marker"><strong>'I.5'</strong>, <strong>'J22.'</strong></span>, 'F1000']</code></pre>



<ul class="wp-block-list">
<li>[A-Z]：NCコードのアドレス</li>



<li>[+-]?：必須ではない、符号</li>



<li>&#8212; ここからグループ化 &#8212;</li>



<li>\d+\.\d+：数字+小数点+数字<br>または</li>



<li>\d+\.：数字+小数点<br>または</li>



<li>\.\d+:小数点+数字<br>または</li>



<li>\d+：複数個の数字のみ</li>
</ul>



<p>書き方は他にもあると思いますが、グループ化して、マッチさせたいパターンを一つ一つORで区切るこの方法は私には理解しやすかったです</p>



<h3 class="wp-block-heading">複雑な正規表現の可読性を高める</h3>



<p>いちおう動作はしましたが、ここまでくると、読みにくいですね～<br>可読性を高める方法として、さらにAIが「re.VERBOSE」を提案してくれました<br>具体的に、上記のコードを書き替えてみます<br>パターンを一行づつに分割できて、行ごとにコメントも追記できるので、複雑になってもわかりやすくなります</p>



<pre class="wp-block-code"><code>pattern = re.compile(
    r"""
    &#91;A-Z]        # A-Zアドレス
    &#91;+-]?         # 符号
    (?:           # 小数点処理、非キャプチャグループ
      \d+\.\d+      # 数字、小数点、数字
      |\d+\.        # または、数字、小数点
      |\.\d+        # または、小数点、数字
      |\d+          # または、数字のみ
    )
    """,
    re.VERBOSE,
)
words = pattern.findall(block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', 'I.5', 'J22.', 'F1000']</code></pre>



<h3 class="wp-block-heading">さらにちょっと特殊な、G や M　コードにも対応させてみます</h3>



<p>通常、NCワードは「アドレス＋数字」ですが、拡張されたワーク座標系指令やサブプロ呼び出しなどちょっと特殊な構成のコードもあります<br>全てに対応は難しいと思いますが、「G54.1P1」や「M98P100」などにも対応してみようと思います。<br>これら対応するためには、上記のパターンでは処理できないのでパターンを追加します<br>やはり、可読性が上がる、re.VERBOSE を利用します</p>



<pre class="wp-block-code"><code>block = (
    "G05P10000 G90G01 X12.50Y+20.3Z-5.63 I.5 J22.F1000 G54 G54.1P12 M98P1100 M198 P2299"
)
pattern = re.compile(
    r"""
    # --- 特殊構成、G54.1P12 / M98P1234　など---
    &#91;GM]          # G や M アドレス
    \d+(?:\.\d+)? # 54　や　54.1 
    \s*P\d+       # スペースとP文字と数字
    # --- 通常のアドレス+数字 ----
    |&#91;A-Z]        # A-Zアドレス
    &#91;+-]?         # 符号
    # --- 小数点対応 ----
    (?:           # 非キャプチャグループ
      \d+\.\d+      # 数字、小数点、数字
      |\d+\.        # または、数字、小数点
      |\.\d+        # または、小数点、数字
      |\d+          # または、数字のみ
    )
    """,
    re.VERBOSE,
)
words = pattern.findall(block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G05P10000', 'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', 'I.5', 'J22.', 'F1000', 'G54', 'G54.1P12', 'M98P1100', 'M198 P2299']</code></pre>



<p>どうにかできました。<br>次の課題は「G04X10.」とかにも対応したいと思っていますが、これ以上条件が増えると大変です<br>正規表現パターンを変数化できれば、もう少しわかりやすいと思います</p>



<h3 class="wp-block-heading">正規表現のraw文字列の変数化</h3>



<p>AIに聞いてみました。さすがAI、できますよ！との回答をもらいました<br>AIの回答を参考に上記コードを書き直してみました。</p>



<pre class="wp-block-code"><code>block = (
    "G05P10000 G90G01 X12.50Y+20.3Z-5.63 I.5 J22.F1000 G54 G54.1P12 M98P1100 M198 P2299"
)
num = r"&#91;+-]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)"  # +12.123|-24.|.56|30
g54_1 = r"&#91;GM]\d+(?:\.\d+)?\s*P\d+\.?"      # G54.1P1 M98P1122
nomal = r"&#91;A-Z]"  # 通常のアドレス
pattern = re.compile(
    rf"""     
    {g54_1}         # G54.1P1 , M98P1122
    #----------------------
    |{nomal}{num}   # G01 , X-12.356
    """,
    re.VERBOSE,
)
words = pattern.findall(block)
#---------- 結果 --------------
#&#91;'G05P10000', 'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', 'I.5', 'J22.', 'F1000', 'G54', 'G54.1P12', 'M98P1100', 'M198 P2299']</code></pre>



<p>なるほど、だいぶ見やすくなりました<br>今後の仕様変更にも対応しやすくなったと思います<br>興味ある方は是非、「G04X10.」への対応もやってみてください。</p>



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



<p>これまでも単純な正規表現に触れる機会はありましたが、複雑な記述はまるで「呪文」のようで、敬遠していました。 <br>しかし、正規表現は文字列操作において非常に強力な武器になります。<br>独学ではやる気なしでしたが、AIと対話する事で、ある程度は理解できてきました。<br> 今後もAIと対話しながら一歩ずつ分析していくことで、正規表現だけでなく、プログラミング言語全体の理解力も深めていけると感じています。</p>



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



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Fusion360 APIでTkinterを使ってみた。単純UIならこれでよくない？ボタンクリックでXYZ軸の基準線を作図するFusionスクリプトを実行させてみた</title>
		<link>https://www.kazuban.com/blog/python-api-tkinter01/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Fri, 09 Jan 2026 04:52:45 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=11788</guid>

					<description><![CDATA[少し前から、Python 学習の一環として AI に相談しながら Fusion 360 の API を触っており、その過程を以前の記事で紹介しました。 この記事では、Fusionの標準APIの2D スケッチで頻繁に使うオ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>少し前から、Python 学習の一環として AI に相談しながら Fusion 360 の API<strong> </strong>を触っており、その過程を以前の記事で紹介しました。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/fusion-python-api/" title="Fusion360  Python API 再挑戦！AIの力を借りて、sketchなど基本ライブラリを作ってみた。" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2025/07/fusion-python-api-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/07/fusion-python-api-160x90.png 160w, https://www.kazuban.com/blog/wp-content/uploads/2025/07/fusion-python-api-120x68.png 120w, https://www.kazuban.com/blog/wp-content/uploads/2025/07/fusion-python-api-320x180.png 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Fusion360  Python API 再挑戦！AIの力を借りて、sketchなど基本ライブラリを作ってみた。</div><div class="blogcard-snippet internal-blogcard-snippet">Aiと言う強い味方を得て、Fusion API に再挑戦しています。pythonの学習もかねて、skrtch関連の関数をライブラリ化しています。筆者の環境では、正常に動作しています。コピペで利用可。Aiに教えてもらわないと、作成できなかった実例をレポートしています。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.07.09</div></div></div></div></a>
</div></figure>



<p>この記事では、Fusionの標準APIの2D スケッチで頻繁に使うオブジェクトをカプセル化しライブラリとしてまとめてみました。<br>Fusion 360 はパラメトリックモデリングを前提としているため、まずラフに図形を描き、あとから寸法線や拘束を追加して形状を詰めていく、という作業フローが基本です。<br>試行錯誤しながら設計を煮詰めていく用途では非常に強力な手法ですが、CAM 作業のように、すでに図面や数値が確定している場合には、この手順がやや回りくどく感じることもあります。<br>またFusion 360 には原点の概念はありますが、原点を強く意識しないモデリング手法であるため、「図面ありき」の CAM 作業では、座標原点を通る中心線作図から始めるようにしています<br>ところが、この最初に描いた中心線も拘束や固定を忘れると、気づかないうちに移動させてしまい、後工程で大きなトラブルになることがあります。</p>



<p class="has-watery-red-background-color has-background has-medium-font-size" style="border-width:1px"><strong>固定された座標軸を、簡単かつ確実に作図したい</strong><br>　　──まずこれが、スクリプト作成を始めたきっかけです。</p>



<p>また、スケッチ平面に対して高低差のある傾いた線を引きたい場合や、<br>平面からの異なる高さに円を描きたい場合なども、標準操作では少し手間がかかります。<br>前回作成したライブラリでは、直線や円といったシンプルな作図であれば、<span class="marker-under-blue">数値を引数として渡す</span>だけで描画できるところまでは実現しています。<br>ただし、実用面を考えると、やはり <span class="marker-under-red">GUI ダイアログ形式で数値入力できる仕様にしたい</span>というのが今回の取り組みです。</p>



<h2 class="wp-block-heading">Fusion API標準機能のコマンド UIでダイアログ仕様</h2>



<p>Fusion API には、コマンドに付随する入力ダイアログ機能が標準で用意されており、テキストボックスやドロップダウンリスト、スライダーといった一般的な UI 要素を利用できます。<br>これらの UI 要素は <strong>Command Inputs </strong>オブジェクトを使って定義します。<br>コマンドが作成される際に呼び出される CommandCreated イベントハンドラ内で Command Inputs を作成し、コマンドの入力ダイアログに表示する入力フィールドを定義します。<br>その後、Execute イベントハンドラ内で、ユーザーがダイアログ上で入力した値を取得し、処理を実行します。<br>このように Fusion API のコマンドはイベント駆動で構成されており、各イベントハンドラを通して入力値を扱う必要があります。<br>とりあえずコード化してみましたが、初級者の私にとっては処理の流れを理解するのが難解でとりあえずネット情報やAIを参考に作成してみました<br>下記は、標準コマンドダイアログへの入力値を<a href="https://www.kazuban.com/blog/fusion-python-api/#toc16">上記で紹介している</a>「lib_2d.draw_center_line(x, y, z)スクリプトに取り込んでＸ，Ｙ，Ｚ座標軸線を作図させるスクリプトです</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="311" height="170" src="https://www.kazuban.com/blog/wp-content/uploads/2025/12/CommandDialog-e1767571988839.png" alt="" class="wp-image-11807" style="width:285px" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/12/CommandDialog-e1767571988839.png 311w, https://www.kazuban.com/blog/wp-content/uploads/2025/12/CommandDialog-e1767571988839-300x164.png 300w" sizes="(max-width: 311px) 100vw, 311px" /></figure>



<p>class CommonAddinFramework:<br>　&#8221;&#8221;&#8221;<br>　Fusion 360 アドインの共通フレームワーククラス。<br>　ダイアログの表示、入力値の取得および指定された描画コールバック関数の実行を管理<br>　&#8221;&#8221;&#8221;<br>　def __init__(<br>　　self,<br>　　command_id: str,<br>　　button_name: str,<br>　　description: str,<br>　　input_defaults: dict,<br>　　drawing_callback,<br>　):<br><br>・・・・<br>・・・・</p>



<p><a href="https://www.kazuban.com/blog/fusion-api-commandhandler/" target="_blank">コード全体を表示</a></p>
</blockquote>



<h2 class="wp-block-heading">単純入力フォームに、tkinter を使ってみる</h2>



<p>上記でFusion標準のコマンドUIを使って、寸法入力で座標軸線を作画できるようになりましたが、今後機能を増やしていくには、やはりイベント処理ではわかり辛く煩わしく感じますし、ネット上の情報も少ないです<br>そこで、Python標準のtkinterを使ってみました<br>tkinterはpython標準ライブラリなので、さすがにこちらは、情報豊富です</p>



<h3 class="wp-block-heading">中心線作図スクリプト</h3>



<p>かなりAIに助けてもらいましたが<br><a href="https://www.kazuban.com/blog/fusion-python-api/#toc16">上記記事内</a>で作成した中心線スクリプトに入力数値を渡すダイアログをtkinterを利用して作成してみました。<br>最初にメッセージ表示の「label」を配置して、「entry」で設定値入力ボックスを配置<br>さらに、固定とコンストラクション設定用の「Checkbutton」を配置して作成ボタンで、作図させる仕様です</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="372" height="282" src="https://www.kazuban.com/blog/wp-content/uploads/2025/12/tkinter-center-line.png" alt="" class="wp-image-11809" style="width:285px" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/12/tkinter-center-line.png 372w, https://www.kazuban.com/blog/wp-content/uploads/2025/12/tkinter-center-line-300x227.png 300w" sizes="(max-width: 372px) 100vw, 372px" /></figure>



<p># &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br># ダイアログクラス <br># &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br>class DialogPanel(tk.Tk):<br>　def __init__(<br>　　self,<br>　　input_defaults: Dict[str, float],<br>　　construction,<br>　　fixed,<br>　):<br><br>・・・・<br>・・・・</p>



<p><a href="https://www.kazuban.com/blog/draw-centerline-by-tkinter/" target="_blank">コード全体を表示</a></p>
</blockquote>



<p>この「DialogPanel」クラスをアレンジして、直線や円などを作図する入力ダイアログも追加作成していきます。<br>このスクリプトをFuisonの「スクリプトとアドイン」に登録すれば、作図スクリプトをダイレクト数値入力仕様で実行できるようになります。<br>私的には、FusionAPIのCommand Inputsよりもわかりやすいです。</p>



<h2 class="wp-block-heading">表示されたボタンをクリックして、関数を実行するスクリプト</h2>



<p>いくつかコマンドダイアログを作成していくと、いちいち「スクリプトとアドイン」へ登録するのも面倒になってきます。<br>FusionAPIでもFusionタスクバーにコマンド実行プルダウンを追加できるようですが、これもまた敷居が高いです。<br>今回は、tkinterでメニュー用パネルを作成し、そのメニューボタンで作図スクリプトを起動できれば、メニューだけの登録で済みます。</p>



<h3 class="wp-block-heading">ボタンクリックで起動させる、tk.Button　の　command　オプション</h3>



<p>ボタンクリックで関数を実行させるには「command」オプションに関数名を渡すと実行できます</p>



<pre class="wp-block-code"><code># 起動させたい関数
def <strong><span class="marker-red">cmd1()</span></strong>:
    print("Function is cmd1().")
・・・
・・・
# ボタンクリックで、「def cmd1()」関数を起動する
tk.Button(
        root,
        text="Execute_command01",
        <strong>command=<span class="marker-red">cmd1</span></strong>
)</code></pre>



<p>ここで初心者の筆者が疑問に感じたのが、「<strong>command=cmd1</strong>」の書き方です<br>関数名は「cmd1()」なのに、「commandオプション」には&#8221;( )&#8221;が付かないようです<br>この関数名の&#8221;( )&#8221;の有無について、AIに聞いてみました</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<h3 class="wp-block-heading">関数名の <code>()</code> の有無による違い</h3>



<h4 class="wp-block-heading">1. かっこがない場合 (<code>cmd1</code>)</h4>



<p>かっこがない場合、それは<strong>関数そのもの（オブジェクト）</strong> を指します。これは「<strong>関数というデータ</strong>」として扱われます。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>意味</strong></td><td><strong>関数そのものを指す（データ）</strong></td></tr></thead><tbody><tr><td>例</td><td><code>data = { "menu1": cmd1 }</code></td></tr><tr><td>目的</td><td>関数を<strong>変数に代入</strong>したり、<code>tk.Button</code> の <code>command</code> のように<strong>他の関数に引数として渡す</strong>とき。</td></tr><tr><td>動作</td><td><strong>処理はまだ実行されない</strong>。ただ関数の場所を渡すだけ。</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">2. かっこがある場合 (<code>cmd1()</code>)</h4>



<p>かっこがある場合、それは<strong>関数の実行（呼び出し）</strong> を意味します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>意味</strong></td><td><strong>関数の処理を今すぐ実行する</strong></td></tr></thead><tbody><tr><td>例</td><td><code>cmd1()</code></td></tr><tr><td>目的</td><td>関数に書かれている<strong>処理をすぐに実行</strong>し、その<strong>戻り値（結果）</strong> を受け取るとき。</td></tr><tr><td>動作</td><td><strong>すぐに処理が実行される</strong>。もし戻り値があれば、その結果が残る。</td></tr></tbody></table></figure>
</blockquote>



<p>なるほど～<br>&#8220;( )&#8221;がない場合には、C言語での<strong>ポインタ渡し</strong>のようなイメージですかね<br>&#8220;( )&#8221;を付けると、「すぐに実行される」との事なので、<br>クリック後実行させたい、「tk.Button」の「command」オプションには、使えないですね<br>したがってTkinterのcommand は、<strong><span class="marker-under-red">引数なし</span></strong><span class="marker-under-red">で呼び出せるものを要求</span>すると言うことになります<br>では、引数や戻り値を利用したい関数を実行するにはどうするか？</p>



<h3 class="wp-block-heading">lambda（ラムダ式）を使う</h3>



<p>lambda は、短い無名関数（名前のない一時的な関数）を簡単に作るためのPythonの機能ですが、デフォルト引数を設定できるけど、実行時には引数なしで呼び出されるようです<br>したがって、「tk.Button」の「command」に利用できます<br>具体的には、<mark style="background-color:#fdf2f2" class="has-inline-color">「lambda 引数1,引数2…：引数を使った処理」</mark>のように記述します</p>



<pre class="wp-block-code"><code>def exec(function, msg):
    function(msg)
・・・・・・
・・・・・・
command = lambda <strong>msg</strong>="button click!", <strong>func</strong>=cmd1: exec(<strong>func, msg</strong>)</code></pre>



<p>このように、関数：execに、func, msg　の引数を渡せば<br>「func名」の関数に「引数msg」を渡して実行できます<br>簡単な、サンプルコードを書いてみました</p>



<pre class="wp-block-code"><code>"""Execute a function on button click."""

import traceback
import adsk.core
import adsk.fusion

# import adsk.cam

import tkinter as tk


def disp_message(msg: str):
    app = adsk.core.Application.get()
    ui = app.userInterface
    ui.messageBox(f"{msg}")


def print_cmd1():
    disp_message("lambda is not used.")


def print_cmd2(msg: str):
    disp_message(msg)


def exec(function, msg):
    function(msg)


def run(context):
# def run():
    root = tk.Tk()
    label1 = tk.Label(
        root,
        text="Click the button.",
        bg="light cyan",
    )
    label1.pack()
    # ---------------------------------
    tk.Button(
        root,
        text="Execute1",
        command=<span class="bold-red">print_cmd1</span>,
    ).pack(side=tk.LEFT, padx=10, pady=10)
    # ---------------------------------
    tk.Button(
        root,
        text="Execute2",
        command=<span class="bold-red">lambda m="center button click!", f=print_cmd2: exec(f, m)</span>,
    ).pack(side=tk.LEFT, padx=10, pady=10)
    # ---------------------------------
    tk.Button(
        root,
        text="Execute3",
        command=<span class="bold-red">lambda m="right button click!", f=print_cmd2: exec(f, m)</span>,
    ).pack(side=tk.LEFT, padx=10, pady=10)
    root.mainloop()
</code></pre>



<p>こんな感じで、「ボタン」を並べれば、ボタンクリック仕様のコマンド実行メニューが作成できそうです</p>



<h2 class="wp-block-heading">Tkinterは、Autodesk 非公式</h2>



<p>「tk.Button」と「lambda」で、メニューダイアログが作れそうです<br><a href="#toc3">上記で紹介</a>した座標軸センターラインを作図するスクリプトを実行するダイアログを作成してみます<br>ところが、Tkinterの使用は、Autodeskは非公式のようなので注意が必要です</p>



<h3 class="wp-block-heading">Fusion API で、tkinter を使用する場合の注意点</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>・Tkinterの使用は、Autodesk 非公式<br>・Tkinter が <code>root.mainloop()</code> で動作中は Fusion 本体の操作は一切できなくなる <br>・Mac + Tkinter は挙動が不安定なことがある<br>・Tkinterウィンドウを閉じた時に不安定になる場合がある<br>・最悪、タスクマネージャーでFusion 強制終了</p>
</blockquote>



<p>やはり、Autodesk側としては、あまり推奨はしていないようです<br>常駐ツールやモーダルな本格的ダイアログはやめたほうがよさそうです<br>今回作成中も、閉じる時に「Script Error」が出たり、強制終了の必要に迫られたりしましたが、数値入力や条件入力の簡易パネルとして、<span class="marker-under-red">開いたら閉じて、Fusionに制御を返す</span>ような単純な処理であれば利用できると思っています。<br></p>



<h3 class="wp-block-heading">run(context) の context引数 は必須</h3>



<p>python学習もかねて、いろいろ簡単なコードを書きました。<br>コードが悪いと、Fusionを強制終了させざるを得ない場合もありましたが、普通に問題なく動作しているのに、パネルの「×ボタン」で終了時に、Fusionのコマンドエリアに「SCRIPT ERROR」が出た事もありました。<br>これの原因究明には結構時間がかかりました。<br>上記のサンプルコードでも、run(context)の「context」は使っていないからと、<br>省略すると（「def run():」）「SCRIPT ERROR」になり、なにも動作しない状態になります<br>やはり、FusionAPIがどこかで使っていて、必須なようです<br>「×」での「SCRIPT ERROR」は終了時の警告のみなので、無視しようとも思いましたが、気味が悪いので、とりあえずAIにもいろいろも相談しましたが、的確な回答はもらえませんでした。<br>例えば下記コードで終了時に「SCRIPT ERROR」になります。<br>引数に「tk.Tk()型」を渡しました。結局、この引数が原因でした</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>def run1(root):<br>　&nbsp; &nbsp; label1 = tk.Label(root , text=&#8221;Click the button.&#8221;)<br>　　・・・・<br>　　・・・・<br><br>master = tk.Tk()<br>run1(master)</p>
</blockquote>



<p>Fusionの「スクリプトとアドイン」で、「スクリプトまたはアドインを作成」を選択すると、自動的にサンプルスクリプトが作成されるので、そちらを参考にしてみました。<br>Fusionで自動作成された、run関数の中身は下記のようになっています</p>



<pre class="wp-block-code"><code>def run(_context: str):
    """This function is called by Fusion when the script is run."""

    try:
        # Your code goes here.
        ui.messageBox(f'"{app.activeDocument.name}" is the active Document.')
    except:  #pylint:disable=bare-except
        # Write the error message to the TEXT COMMANDS window.
        app.log(f'Failed:\n{traceback.format_exc()}')</code></pre>



<p>引数は「_context: str」となっています。<br>以前のサンプルコードには、「str」のような型ヒントはなかったように記憶していますが<br>「str」なので引数の型は「文字列型」を期待しているようです。<br>このサンプルでも「_context」はどこにも使われていないように見えますが、やはりFusionAPI側では必須なのでしょう<br>ちなみにデフォルトでは「_context: str」と、型ヒントでは「文字列型」となっていますが、下記コードを追加して調べてみました</p>



<pre class="wp-block-code"><code>    ui.messageBox(f"type={type(_context)}")
    ui.messageBox(f"{_context}")</code></pre>



<p>そのタイプと内容を表示させてみると</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>type=<strong>&lt;class &#8216;dict&#8217;&gt;</strong><br><strong>{&#8216;IsApplicationStartup&#8217;: False}</strong></p>
</blockquote>



<p>このように、「辞書型」になっていました。<br>詳細はわかりませんが、メイン関数の第一引数はFusionが使うので、別の引数を使いたい場合には、追加の形をとったほうがよさそうです<br>この部分を変更すると正常に終了するようになりました。<br>pythonのこういった型のあいまいな部分にも、まだまだ慣れないです</p>



<h2 class="wp-block-heading">数値入力ダイアログで、座標軸を作図するスクリプトをボタンで起動</h2>



<p>さて、上記で紹介した「中心線作図スクリプト」を、ボタンクリックで動作させるダイアログを作成してみようと思います。<br>ただし、このスクリプトは、<a href="https://www.kazuban.com/blog/fusion-python-api/">以前紹介した記事</a>内のライブラリ「<a href="https://www.kazuban.com/blog/fusion-python-api/#toc15">lib_util.py</a>」「<a href="https://www.kazuban.com/blog/fusion-python-api/#toc16">lib_2d.py</a>」を利用するので、もし試してみたい場合にはそちらも必要になります<br>下記に全部含まれたコードをダウンロードできるようにしておきますので、興味ある方がいらっしゃれば試してみてください。</p>



<pre class="wp-block-code"><code>"""Execute a function on button click."""

import adsk.core
import adsk.fusion
import os, sys, importlib, traceback
import tkinter as tk

import tkinter.font as tkFont
from typing import Optional, List, Dict, Any

current_dir = os.path.dirname(os.path.abspath(__file__))
script_dir = os.path.dirname(current_dir)  # C:\FusionAPI\Scripts
sys.path.append(script_dir)
# library import
"""
C:\FusionAPI\Scripts
│
├─library
│  ├─lib_util.py
│  ├─lib_2d.py
├─test
│  ├─menu.py (This script)
"""
from library import lib_util, lib_2d


##---------------------------
def disp_message(msg: str):
    lib_util.disp_message(msg)


# ------------------------------------------------------------------
# ダイアログクラス
# ------------------------------------------------------------------
class DialogPanel(tk.Tk):
    """センターライン作画ダイアログ"""

    def __init__(
        self,
        input_defaults: Dict&#91;str, float],
        construction,
        fixed,
    ):
        super().__init__()
        # self.my_font = None
        self.input_defaults = input_defaults
        self.x_width: float = 0.0
        self.y_width: float = 0.0
        self.z_width: float = 0.0
        self.construction: bool = construction
        self.fixed: bool = fixed
        self.widths: dict&#91;str, tk.DoubleVar] = {}
        self._create_widgets()

    def _simple_frame(self, **kwargs) -&gt; tk.Frame:
        # Fontインスタンスを作成
        self.my_font = tkFont.Font(family="Arial", size=10, weight="normal")
        """単純フレームを作成し、ウィンドウ全体に展開"""
        master = self
        frame = tk.Frame(master, **kwargs)
        master.title("Center Line")
        frame.pack(fill="both", expand=True, padx=5, pady=5)
        return frame

    def _create_widgets(self):
        """全てのUI要素を作成"""
        # 全体を包む単一のフレーム
        self.main_frame = self._simple_frame(relief="ridge", bd=5)

        # ------------------
        # 0. トップメッセージ
        # ------------------
        row_idx = 0
        top_frame = tk.Frame(self.main_frame)
        top_frame.grid(row=row_idx, column=0, columnspan=3, pady=10)
        tk.Label(
            top_frame,
            text="各軸の長さを指定してください。\n作成したくない軸は「0.0」にしてください",
            bg="light cyan",
            font=self.my_font,
        ).pack()
        # ------------------
        # 1～3 各軸幅入力ボックス
        # ------------------

        row_idx += 1
        # 事前設定のラベルとデフォルト値
        for label, default in self.input_defaults.items():
            tk.Label(
                self.main_frame,
                text=label,
                font=self.my_font,
            ).grid(
                row=row_idx,
                column=0,
                sticky="e",
            )
            var = tk.DoubleVar(value=default)
            ent = tk.Entry(
                self.main_frame,
                font=self.my_font,
                textvariable=var,
                width=10,
                bg="lightyellow",
                # bg="ivory",
            )
            ent.grid(row=row_idx, column=1)
            self.widths&#91;label] = var
            row_idx += 1
        # ------------------
        # 4. 要素固定チェック
        # ------------------
        row_idx += 1
        # self.fixed_check = tk.BooleanVar(value=True)
        self.fixed_check = tk.BooleanVar(value=self.fixed)
        check_button = tk.Checkbutton(
            self.main_frame,
            text="要素固定",
            variable=self.fixed_check,
            font=self.my_font,
        )
        check_button.grid(row=row_idx, column=0, padx=5, pady=5, sticky="w")
        # self.construction_check = tk.BooleanVar(value=True)
        self.construction_check = tk.BooleanVar(value=self.construction)
        check_button = tk.Checkbutton(
            self.main_frame,
            text="コンストラクション",
            variable=self.construction_check,
            font=self.my_font,
        )
        check_button.grid(row=row_idx, column=1, padx=5, pady=5, sticky="w")

        # ------------------
        # 5. 最終確定ボタン
        # ------------------
        row_idx += 1
        # ボタンを格納するボトムフレーム
        bottom_frame = tk.Frame(self.main_frame)
        bottom_frame.grid(row=row_idx, column=0, columnspan=3, pady=10)

        tk.Button(
            bottom_frame, text="作成実行", font=self.my_font, command=self.get_data
        ).pack(side=tk.LEFT, padx=10)
        tk.Button(
            bottom_frame, text="閉じる", font=self.my_font, command=self.destroy
        ).pack(side=tk.LEFT, padx=10)

    def get_data(self):
        """入力データを取り出す"""
        v: List = &#91;]
        for value in self.widths.values():
            v.append(value.get())
        self.x_width = float(v&#91;0])
        self.y_width = float(v&#91;1])
        self.z_width = float(v&#91;2])
        self.fixed = self.fixed_check.get()
        self.construction = self.construction_check.get()
        self.destroy()


##--------------------------------------------------------------
##--------------------------------------------------------------
def diarog_test(master):
    """センターライン作画"""
    if master:
        master.quit()  # mainloop を終了させる
        master.destroy()
    input_defaults = {
        "X軸長さ": 50.0,
        "Y軸長さ": 50.0,
        "Z軸長さ": 10.0,
    }
    # 線種指定
    construction = True
    fixed = True

    app = DialogPanel(input_defaults, construction, fixed)
    app.mainloop()
    wx = app.x_width
    wy = app.y_width
    wz = app.z_width
    construction = app.construction
    fixed = app.fixed
    try:
        lib_2d.draw_center_line(wx, wy, wz, construction, fixed)
    except:
        disp_message("Failed:\n{}".format(traceback.format_exc()))


# ---- Action command after button click ----------


def print_cmd1():
    disp_message("lambda is not used.")


def print_cmd2(msg: str):
    disp_message(msg)


def exec(function, msg):
    function(msg)


def on_closing(root):
    """Processing when the window's 'x' button is pressed"""
    disp_message("I'll close now!")
    root.quit()  # Terminate the mainloop
    root.destroy()  # Releases window resources.


def button(root: tk.Tk):
    # Window close action
    root.protocol("WM_DELETE_WINDOW", lambda: on_closing(root))
    label1 = tk.Label(root, text="Click the button you like.", bg="light cyan")
    label1.pack()
    tk.Button(root, text="Message1", command=print_cmd1).pack(
        side=tk.LEFT, padx=10, pady=10
    )
    tk.Button(
        root,
        text="Message2",
        command=lambda m="Lambda specification!", f=print_cmd2: exec(f, m),
    ).pack(side=tk.LEFT, padx=10, pady=10)
    tk.Button(
        root,
        text="Draw center line",
        command=lambda tk=root, f=diarog_test: exec(f, tk),
    ).pack(side=tk.LEFT, padx=10, pady=10)
    root.mainloop()


def run(context: dict):  # {'IsApplicationStartup': False}
    root = tk.Tk()
    root.attributes("-topmost", True)  # Bring Window To Top
    button(root)
</code></pre>



<h3 class="wp-block-heading">サンプルスクリプトのダウンロードと使い方</h3>



<p>ダウンロードと使用方法は下記を参考にしてください<br>この例では、展開されたトップフォルダ「FusinAPI_kazuban」を「Cドライブ」の直下に、コピーする方法で説明していますが、任意の場所でかまいません<br>ただし、<span class="marker-under">Fusionが立ち上がった状態</span>では、キャッシュの影響で「library」内のスクリプトがうまく読み込めない事があります<br><span class="marker-under-red">コピー後に、Fusionを起動する</span>方がトラブル少ないです。<br>そのトップフォルダ下の「Scripts」、その下の「library」「menyu01」内のスクリプトを使用します<br>全ての使用ライブラリも含めたZIPファイルは下記からのダウンロードできます</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="348" height="125" src="https://www.kazuban.com/blog/wp-content/uploads/2026/01/python-api-tkinter01.png" alt="" class="wp-image-11941" srcset="https://www.kazuban.com/blog/wp-content/uploads/2026/01/python-api-tkinter01.png 348w, https://www.kazuban.com/blog/wp-content/uploads/2026/01/python-api-tkinter01-300x108.png 300w" sizes="(max-width: 348px) 100vw, 348px" /></figure>



<div class="wp-block-file"><a id="wp-block-file--media-11c24981-b4de-424e-be88-7ef09c825cf3" href="https://www.kazuban.com/blog/wp-content/uploads/2026/01/FusinAPI_kazuban.zip">FusinAPI_kazuban</a><a href="https://www.kazuban.com/blog/wp-content/uploads/2026/01/FusinAPI_kazuban.zip" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-11c24981-b4de-424e-be88-7ef09c825cf3">ダウンロード</a></div>



<pre class="wp-block-preformatted">C:\FusinAPI_kazuban<br>└─Scripts<br>    ├─library<br>        └─lib_2d.py<br>        └─lib_util.py<br>    └─menyu01<br>        └─menu.py</pre>



<p>・ダウンロード後展開した「FusinAPI_kazuban」を適当なフォルダへコピー<br>・Fusionの「スクリプトとアドイン」から「menyu01」を選択する<br>・正常に登録されると、スクリプトが実行できます</p>



<figure class="wp-block-video"><video height="1028" style="aspect-ratio: 1496 / 1028;" width="1496" controls src="https://www.kazuban.com/blog/wp-content/uploads/2026/01/python-api-tkinter01.mp4"></video></figure>
</blockquote>



<h2 class="wp-block-heading">第一弾、終了</h2>



<p>とりあえず、Autodesk Fusion からtkinterオブジェクトのパネルを表示し、ボタンに割り当てられたスクリプト動作をさせる事ができました。<br>数値入力用ボタンでは、tkinterへの入力値をFusionAPIに渡し、作図させる事ができるようになりました<br>次回は、もう少し作図スクリプトとメニューを充実させていきたいと思います</p>





<p></p>
]]></content:encoded>
					
		
		<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2026/01/python-api-tkinter01.mp4" length="9464158" type="video/mp4" />

			</item>
		<item>
		<title>Snipping Tool の録画機能でFusion(360)のジョイントの説明ページを作ってみた</title>
		<link>https://www.kazuban.com/blog/fusion-joint/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sun, 02 Nov 2025 01:26:25 +0000</pubDate>
				<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[joint]]></category>
		<category><![CDATA[Snipping_Tool]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=11671</guid>

					<description><![CDATA[実はジョイントは以前にも記事にしたのですが、その時は別の録画アプリを使用しました 今更ですが、Windows標準のSnipping Tool でも録画できるのを知ったので、使ってみました画像も動画も簡単にキャプチャできる [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>実はジョイントは以前にも記事にしたのですが、その時は別の録画アプリを使用しました</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/assembly/" title="Fusion360 のアセンブリ機能を使ってみた。" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="128" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/vise.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2021/08/vise.png 984w, https://www.kazuban.com/blog/wp-content/uploads/2021/08/vise-300x212.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2021/08/vise-768x542.png 768w" sizes="(max-width: 128px) 100vw, 128px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Fusion360 のアセンブリ機能を使ってみた。</div><div class="blogcard-snippet internal-blogcard-snippet">筆者は、Fusion360はCAM機能を使用する場合が多いので、今まで「アセンブリ」機能は使っていませんでした。ただ、実際加工には加工素材を固定するのに、治具と呼ばれる装置を利用します。治具を設計する場合、アセンブリ機能が使えると便利そうだと思い使ってみました。前回紹介した、ボルトテンプレートもイン...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2021.08.12</div></div></div></div></a>
</div></figure>



<p>今更ですが、Windows標準のSnipping Tool でも録画できるのを知ったので、使ってみました<br>画像も動画も簡単にキャプチャできるので、とても便利です<br>このアプリを使って、Fusion360ジョイントを、多くの動画を使ってジョイントに限定して説明しています</p>



<h2 class="wp-block-heading">Snipping Tool でデスクトップを録画</h2>



<p>Snipping Tool は、スクリーンショットを撮るときに使っていますが、録画ができるのは知りませんでした。<br>録画は別のアプリを使っていたので、気にしていなくて気が付かなかったのだと思います<br>標準アプリとはいえ、使い方は簡単で使いやすいですね。<br>スクリーンショットは、「Windowsキー」＋「Shift」＋「s」キーで起動しますが、<br>録画は、「Windowsキー」＋「Shift」＋「ｒ」キーで録画領域選択モードで起動します<br>録画したい範囲を選択して「スタート」ボタンを押すと３・２・１とカウントダウンが始まり録画が開始されます。<br>「ストップボタン」で録画終了です。<br>ちょっと注意が必要なのは、デフォルトでは自動的に保存される事ですね<br>何度も実行していると、不要な動画が残ってしまうので、必要なければすぐに削除したほうがいいです。</p>



<h2 class="wp-block-heading">Fusion(360）のアセンブリ／ジョイント機能の説明</h2>



<p>では、Snipping Tool で録画した動画を使って、ジョイント機能の説明ページを作ってみます<br>モデルは、以前説明に使ったバイスモデルを使用して、組み立てていきます</p>



<h3 class="wp-block-heading">練習モデルダウンロード</h3>



<div class="wp-block-file" style="border-style:none;border-width:0px;border-radius:0px;margin-top:0;margin-bottom:0;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0"><a id="wp-block-file--media-f92c7086-09a6-4d78-91f3-8c8bb433aaa3" href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/joint-practice-model.zip">joint-practice-model</a><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/joint-practice-model.zip" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-f92c7086-09a6-4d78-91f3-8c8bb433aaa3">ダウンロード</a></div>



<h3 class="wp-block-heading">本体を固定（ピン止め）する</h3>



<figure class="wp-block-video"><video controls src="https://www.kazuban.com/blog/wp-content/uploads/2025/11/01_本体ピン止め.mp4"></video><figcaption class="wp-element-caption"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/11/01_本体ピン止め.mp4" target="_blank">画面いっぱいに表示</a></figcaption></figure>



<p>ブラウザツリーから「本体」コンポーネントを右クリックして、「ピン」で固定します</p>



<h3 class="wp-block-heading">ボールネジを「回転・ジョイント」</h3>



<p>ボールねじを本体へ組み込みますが、接続するボールねじの面と接続される本体の面を指定します<br><span class="marker-under">基本的に、接続パーツ側を先に指定します</span>。<br>この例では、接続する、ボールネジの先端の面と本体のザグリ面と選択します。<br>接続面をマウス選択する場合のコツは、面を触った時に<span class="marker-under-red">「CTLR」を押しながら</span>、接続基準点を設定する事です。</p>



<figure class="wp-block-video"><video controls src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/02_ボールネジ.mp4"></video><figcaption class="wp-element-caption"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/02_ボールネジ.mp4" target="_blank">画面いっぱいに表示</a></figcaption></figure>



<p>表示される「ジョイント」ダイアログの「モーション」「タイプ」は「回転」にします</p>



<h3 class="wp-block-heading">固定側の口金を「剛性・ジョイント」</h3>



<p>口金面のボルト穴位置と本体側のネジ位置を指定します<br>同様に接続面をマウス選択した際は「<span class="marker-under-red">CTLR」を押しながら、</span>穴位置を指示します</p>



<figure class="wp-block-video"><video controls src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/03_固定側口金.mp4"></video><figcaption class="wp-element-caption"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/03_固定側口金.mp4" target="_blank">画面いっぱいに表示</a></figcaption></figure>



<p>モーション・タイプは、「剛性」に設定</p>



<h3 class="wp-block-heading">ジョイントする時に、指定したジョイント点からオフセットできる</h3>



<p>今回、本体端面と可動駒後ろ面でジョイントし、ネジの止まり位置までオフセットします<br>後に可動範囲の設定を行う場合には、可動範囲でも設定できるので、ジョイント位置のオフセット操作は不要ですが、ジョイントのオフセット設定を行う場合にはオフセット距離の把握は必要です<br>ここでは、オフセット距離を事前に測定しておきます</p>



<figure class="wp-block-video"><video controls src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/04_可動駒の終点位置測定.mp4"></video><figcaption class="wp-element-caption"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/04_可動駒の終点位置測定.mp4" target="_blank">画面いっぱいに表示</a></figcaption></figure>



<h3 class="wp-block-heading">可動駒を「スライダ・ジョイント」</h3>



<p>可動駒がスライドする、可動駒と本体の面を設定します<br>接続点は、上記で測定した本体端面位置を指示します<br>こちらも同様に、接続面を選択した際、<span class="marker-under-red">「CTLR」を押しながら</span>、接続基準点を設定します</p>



<figure class="wp-block-video"><video controls src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/05_可動駒.mp4"></video><figcaption class="wp-element-caption"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/05_可動駒.mp4" target="_blank">画面いっぱいに表示</a></figcaption></figure>



<p>モーション・タイプは、「スライド」で「スライド方向」は「Y軸」に設定　基本位置は、「位置合わせ」で、前に測定しておいた距離だけ「Yオフセット」しますが、<span class="marker-under"><strong>符号</strong>には注意</span>してください</p>



<h3 class="wp-block-heading">可動側の口金を「剛性・ジョイント」</h3>



<p>可動側の口金をジョイントします<br>接続面と接続位置をよく確認し指定してください<br>接続面をマウス選択した際は「<span class="marker-under-red">CTLR」を押しながら、</span>穴位置を指示します</p>



<figure class="wp-block-video"><video controls src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/06_可動側口金.mp4"></video><figcaption class="wp-element-caption"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/06_可動側口金.mp4" target="_blank">画面いっぱいに表示</a></figcaption></figure>



<h3 class="wp-block-heading">ジョイントは、設定したモーションでマウス動作できる</h3>



<p>ジョイント直後は、設定したモーションでマウスで移動できますが制限は設定されていません</p>



<figure class="wp-block-video"><video controls src="https://www.kazuban.com/blog/wp-content/uploads/2025/11/07_可動駒は自由に移動.mp4"></video><figcaption class="wp-element-caption"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/11/07_可動駒は自由に移動.mp4" target="_blank">画面いっぱいに表示</a></figcaption></figure>



<p>「アセンブリ」⇒「接触セットを有効化」でボディを設定すれば、そのボディとの干渉が制限になります。<br>今回のサンプルの場合、「可動側口金」と「固定側口金」を新規接触セットで設定すれば、可動口金が固定口金に干渉するとそれ以上移動できなくなります<br>逆側の外開きの場合は「ボールねじの止まり座面」までが可動域になりますが、「ボールねじ」と「可動駒」を接触セットに設定すると、<span class="marker-under">ネジ部分とは常に接触している</span>ため、まったく可動できなくなってしまいます。<br>このような場合、接触セットではなく、「ジョイント」の「モーション制限」で可動範囲を設定します</p>



<h3 class="wp-block-heading">可動駒の可動範囲を設定するため、可動距離を測定</h3>



<p>まずは、モーション制限の最大値・最小値を設定するため、口金間の距離を測定しておきましょう</p>



<figure class="wp-block-video"><video controls src="https://www.kazuban.com/blog/wp-content/uploads/2025/11/08_可動駒の移動範囲測定.mp4"></video><figcaption class="wp-element-caption"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/11/08_可動駒の移動範囲測定.mp4" target="_blank">画面いっぱいに表示</a></figcaption></figure>



<p>「検査」⇒「計測」で測定しますが、必ず、符号も意識しておく事<br>設定時には、符号が重要になります</p>



<h3 class="wp-block-heading">可動駒の可動範囲を設定</h3>



<p>「モーション制限を編集」で可動範囲の「最小値」「最大値」を設定できます<br>「ブラウザツリー」⇒「関係」⇒「可動駒用に設定したスライダジョイント」右側の「<span class="badge">↓</span>」アイコンをクリックすると、「モーション制限を編集」ダイアログが開きます<br>「スライド」では「最小値」「最大値」で範囲を設定しますが<span class="marker-under-red">「±」の符号には注意</span><br>必ず、<span class="marker-under-red"><span class="marker-under">符号を意識して小さいほうを「最小値」</span></span>に設定します</p>



<figure class="wp-block-video"><video controls src="https://www.kazuban.com/blog/wp-content/uploads/2025/11/09_可動駒移動範囲設定.mp4"></video><figcaption class="wp-element-caption"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/11/09_可動駒移動範囲設定.mp4" target="_blank">画面いっぱいに表示</a></figcaption></figure>



<p><a href="#toc8">上記の可動駒ジョイント設定</a>で本体端面よりオフセットさせたの、「最大値=0.0」になります<br>オフセットさせていない場合には、「最大値=-5.0」「最小値=-5１.0」となります</p>



<h3 class="wp-block-heading">レンチをボールネジに剛性（スライド）・ジョイント</h3>



<p>ボールネジは回転ジョイントしていますが、レンチは剛性ジョイントにします<br>レンチの取り外しを考慮するなら、スライドジョイントにしてもいいと思います<br>また今回のモデルは、はめ込部六角形の位相を同じにしているので、お互い接触面の中心でジョイントしましたが、位相が違う場合には、頂点同士でジョイントします<br>ここも同様に、<span class="marker-under-red">接続面をマウス選択した際、「CTLR」を押しながら、</span>面中心を設定し<br>モーション・タイプは、「剛性」に設定します</p>



<figure class="wp-block-video"><video controls src="https://www.kazuban.com/blog/wp-content/uploads/2025/11/10_バイスレンチ.mp4"></video><figcaption class="wp-element-caption"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/11/10_バイスレンチ.mp4" target="_blank">画面いっぱいに表示</a></figcaption></figure>



<p>剛性にする事で、レンチを回転すれば、ボールネジも回転するようになります</p>



<h3 class="wp-block-heading">モーションリンク</h3>



<p>ボールネジとレンチは剛性ジョイントなので、レンチを回転すれば、可動駒がスライドするように設定します<br>逆に、可動駒を可動させれば、レンチが回転するようにもなります<br>まずリンクするジョイントを、ブラウザツリーの「関係」「ジョイント」で確認しておきます<br>ジョイントが多くなり、識別しにくい場合には、ジョイン名をわかりやすい名前に変更しておくと設定は楽になります<br>今回は、ボールねじの「回転」と可動駒の「スライダ」ジョイントをリンクさせます<br>「アセンブリ」「モーションリンク」でリンクさせたいジョイントを選択します<br>「モーションリンク」ダイアログで各ジョイントの関係を設定します</p>



<figure class="wp-block-video"><video controls src="https://www.kazuban.com/blog/wp-content/uploads/2025/11/11_モーションリンク.mp4"></video><figcaption class="wp-element-caption"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/11/11_モーションリンク.mp4" target="_blank">画面いっぱいに表示</a></figcaption></figure>



<p>今回は「回転」と「スライダ」なので、回転角度とその回転角度でのスライド距離を設定します<br>ネジの場合では、一回転(360°)でネジピッチ分の移動距離となるので、ネジピッチ2mmとして設定してみました</p>



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



<p>「Snipping Tool」で動画録画ができるのは、私は知りませんでした。<br>スクリーンショットは使っていましたが、今回たまたま気が付きました<br>Windows標準のアプリなので、気軽に使えるのもいいですね<br>自動保存やトリム機能もいいと思います<br>今回は、「Snipping Tool」で、Fusionのジョイントの説明ページを作ってみました<br>画像と動画のキャプチャが一つのアプリで簡単に切り替えられるのもいいですね<br>マニュアルなどの作成にも、重宝しそうです</p>



<p></p>
]]></content:encoded>
					
		
		<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2025/11/01_本体ピン止め.mp4" length="3921356" type="video/mp4" />
<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2025/10/02_ボールネジ.mp4" length="17673203" type="video/mp4" />
<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2025/10/03_固定側口金.mp4" length="19472013" type="video/mp4" />
<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2025/10/04_可動駒の終点位置測定.mp4" length="10529981" type="video/mp4" />
<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2025/10/05_可動駒.mp4" length="30866235" type="video/mp4" />
<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2025/10/06_可動側口金.mp4" length="20997370" type="video/mp4" />
<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2025/11/07_可動駒は自由に移動.mp4" length="3380402" type="video/mp4" />
<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2025/11/08_可動駒の移動範囲測定.mp4" length="8967043" type="video/mp4" />
<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2025/11/09_可動駒移動範囲設定.mp4" length="9088398" type="video/mp4" />
<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2025/11/10_バイスレンチ.mp4" length="25285809" type="video/mp4" />
<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2025/11/11_モーションリンク.mp4" length="11226349" type="video/mp4" />

			</item>
		<item>
		<title>Fusion(360)で、エラーになる大きいRや複合要素の特殊フィレットを作成する方法</title>
		<link>https://www.kazuban.com/blog/fusion360-special-fillet/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sun, 26 Oct 2025 05:54:46 +0000</pubDate>
				<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[スイープ]]></category>
		<category><![CDATA[フィレット]]></category>
		<category><![CDATA[フェイス]]></category>
		<category><![CDATA[モデリング]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=11583</guid>

					<description><![CDATA[フィレットを作成する場合、指定Rによっては、エラーになる事がありますフィレット作成順序を変更してみたり、徐辺機能で試行錯誤が必要ですそれでも、狭い箇所へ大きな幅のフィレットは簡単には作成できません。また、単純な単一Rでは [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>フィレットを作成する場合、指定Rによっては、エラーになる事があります<br>フィレット作成順序を変更してみたり、徐辺機能で試行錯誤が必要です<br>それでも、狭い箇所へ大きな幅のフィレットは簡単には作成できません。<br>また、単純な単一Rではなく、複合要素やスプライン形状のフィレットを作成したい場合、フィレットコマンドでは作成できません<br>断面形状をスケッチし、スイープする事になりますが、ここでも狭い領域には作成してくれません<br>今回は、筆者自身も必要になり、いろいろやってみて、どうにか描けた方法を紹介します<br>下記でサンプルモデルのダウンロードできます</p>



<h2 class="wp-block-heading">自動では大きいフィレットはエラーになる</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="588" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/org_scketch-800x588.png" alt="" class="wp-image-11585" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/org_scketch-800x588.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/org_scketch-500x368.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/org_scketch-300x221.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/org_scketch-768x565.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/org_scketch.png 1024w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>まずこのポケット輪郭に、普通にフィレットを作成してみましょう</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet_r3.png"><img loading="lazy" decoding="async" width="800" height="554" data-id="11600" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet_r3-800x554.png" alt="" class="wp-image-11600" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet_r3-800x554.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet_r3-500x346.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet_r3-300x208.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet_r3-768x532.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet_r3.png 1024w" sizes="(max-width: 800px) 100vw, 800px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet_r4.png"><img loading="lazy" decoding="async" width="800" height="458" data-id="11601" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet_r4-800x458.png" alt="" class="wp-image-11601" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet_r4-800x458.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet_r4-500x286.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet_r4-300x172.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet_r4-768x440.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet_r4-120x68.png 120w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet_r4.png 1024w" sizes="(max-width: 800px) 100vw, 800px" /></a></figure>
</figure>



<p>R3までは、問題ないですが、それ以上になるとエラーになってしまいます<br>輪郭の法線方向の幅が方側方向から指定R未満の距離になる箇所ではフィレットは作成できません<br>今回は、最小片側幅3mmの輪郭に片側10mm幅のフィレットを考えてみます<br>今回やってみた方法は、基本的には法線方向で綺麗なフィレットは作成できませんが、作成できる箇所は自動で作成し、それ以外は自由曲面でごまかして描きました。</p>



<h2 class="wp-block-heading">自動作成くれないフィレットRや複合形状はスイープを使用</h2>



<p>例えば、下図のようなポケット形状の上面にフィレットを作成する場合を考えてみます</p>



<figure class="wp-block-gallery has-nested-images columns-3 is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/bace_body.png"><img loading="lazy" decoding="async" width="800" height="548" data-id="11586" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/bace_body-800x548.png" alt="" class="wp-image-11586" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/bace_body-800x548.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/bace_body-500x342.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/bace_body-300x205.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/bace_body-768x526.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/bace_body.png 1024w" sizes="(max-width: 800px) 100vw, 800px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet-_section.png"><img loading="lazy" decoding="async" width="768" height="547" data-id="11591" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet-_section.png" alt="" class="wp-image-11591" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet-_section.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet-_section-500x356.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet-_section-300x214.png 300w" sizes="(max-width: 768px) 100vw, 768px" /></a></figure>
</figure>



<p><br>このポケットモデルの上面に平面幅10mm、深さ5mmの断面形状でフレットを作成してみたいと思います<br>フィレット幅が10mmなので、ポケット輪郭に対して、10mm以上の完全オフセット輪郭が描ければ、スイープコマンドで、簡単に作成できると思います。<br>しかし、ポケット輪郭を10mmオフセットさせてみた下図では、３か所の矢印部分では、要素が抜けてしまっていて、正常にオフセットされていません</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="538" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_ng-800x538.png" alt="" class="wp-image-11592" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_ng-800x538.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_ng-500x336.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_ng-300x202.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_ng-768x517.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_ng.png 1131w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>要素抜けなくオフセットされている箇所では問題ないとして、要素抜け部分にR10に編集します<br>まずは自動的にオフセットさせた輪郭の、オフセット拘束を解除し、要素が抜けた矢印部分にR10mm以上のフィレットを追加します。<br>R10フレットが作成できる場合には、平行拘束は自動的に解除されます。</p>



<figure class="wp-block-image size-large"><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_edit.png"><img loading="lazy" decoding="async" width="800" height="521" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_edit-800x521.png" alt="" class="wp-image-11595" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_edit-800x521.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_edit-500x325.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_edit-300x195.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_edit-768x500.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_edit.png 1248w" sizes="(max-width: 800px) 100vw, 800px" /></a></figure>



<p>凹部分が、フィレット幅以上のRになれば、その輪郭をパスにして、スイープコマンドで断面プロファイルと輪郭パスで簡単にボディを作成できます</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="497" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/create_fillet-800x497.png" alt="" class="wp-image-11609" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/create_fillet-800x497.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/create_fillet-500x311.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/create_fillet-300x187.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/create_fillet-768x478.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/create_fillet.png 1248w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>フィレット幅よりも小さい内Rは、フォレット幅よりも大きくしたRに編集すれば、スイープできます</p>



<h2 class="wp-block-heading">基本ポケットボディから引き算</h2>



<p><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/bace_body-800x548.png">基本のポケットボディ</a>から、<a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/fillet-_section.png">断面のプロファイル</a>を修正した輪郭でスイープしたボディで引き算すれば、輪郭編集した以外の箇所はフィレットモデルが作成されますが</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="589" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean-800x589.png" alt="" class="wp-image-11599" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean-800x589.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean-500x368.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean-300x221.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean-768x566.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean.png 1028w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_edit-800x521.png">上図</a>でR10を追加した部分は、引き算できなくて残ってしまっています<br>この部分は、邪魔なので取り除きます。<br>この部分は、<a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_edit-800x521.png">R10追加した輪郭を、逆にオフセットした<a href="https://www.kazuban.com/blog/wp-content/uploads/2025/10/offset_edit-800x521.png">輪郭</a>（赤線）</a>を深さ（5mm）だけ押し下げたボディで引き算する事で取り除けます</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="567" data-id="11606" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean02-800x567.png" alt="" class="wp-image-11606" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean02-800x567.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean02-500x354.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean02-300x213.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean02-768x544.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean02.png 1144w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="560" data-id="11607" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean03-800x560.png" alt="" class="wp-image-11607" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean03-800x560.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean03-500x350.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean03-300x210.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean03-768x537.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/boolean03.png 1248w" sizes="(max-width: 800px) 100vw, 800px" /></figure>
</figure>



<p>これで、シンプルな部分には、正常なフィレットが作成できました</p>



<h2 class="wp-block-heading">サーフェスモードで、穴埋めする</h2>



<p>ここで、Fusionを<span class="marker-under-red">「サーフェス」</span>モードにして、不要面を削除します<br>面選択で「Deleteキー」で削除できます。<br>「Shift」を押しながら選択すると、複数面選択できます。</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="568" data-id="11611" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/ng_face_select-800x568.png" alt="" class="wp-image-11611" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/ng_face_select-800x568.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/ng_face_select-500x355.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/ng_face_select-300x213.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/ng_face_select-768x545.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/ng_face_select.png 1248w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="534" data-id="11612" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/face_delete-800x534.png" alt="" class="wp-image-11612" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/face_delete-800x534.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/face_delete-500x334.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/face_delete-300x200.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/face_delete-768x513.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/face_delete.png 1248w" sizes="(max-width: 800px) 100vw, 800px" /></figure>
</figure>



<p>不要面の削除できたら、「サーフェイス」⇒「<span class="marker-under-red">パッチ</span>」で境界エッジをマウスカーソルで選択する事で境界が全周が選択されれば、自動的に曲面を作成してくれます</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="586" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/finish01-800x586.png" alt="" class="wp-image-11614" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/finish01-800x586.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/finish01-500x366.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/finish01-300x220.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/finish01-768x562.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/finish01.png 1248w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>ただし、作成した曲面部分は面属性になっています</p>



<h2 class="wp-block-heading">ステッチでボディ化して完成</h2>



<p>この状態では、まだ完全にボディにはなっていないので、「サーフェス」⇒「<span class="marker-under-red">ステッチ</span>」コマンドでフェイスの隙間を埋めてボディにしてくれます</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="500" data-id="11616" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/stitch-800x500.png" alt="" class="wp-image-11616" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/stitch-800x500.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/stitch-500x313.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/stitch-300x188.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/stitch-768x480.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/stitch.png 1024w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="550" data-id="11620" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/special_fillet-800x550.png" alt="" class="wp-image-11620" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/special_fillet-800x550.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/special_fillet-500x344.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/special_fillet-300x206.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/special_fillet-768x528.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/special_fillet.png 1248w" sizes="(max-width: 800px) 100vw, 800px" /></figure>
</figure>



<p>フィレットコマンドや、スイープだけでは描けない幅広いフィレットも、ソリッド化できました。<br>ただ、輪郭形状の法線方向の幅よりも大きいフィレットを作成しようとしているので、どこかに無理がでてしまいます。<br>今回は、サーフェスのパッチコマンドのデフォルト機能で描けない面を埋めてもらいましたが、この曲面が気に入らない場合に、さらにサーフェス機能を駆使して作成する事になりますがとりあえずボディ化できました</p>



<h3 class="wp-block-heading">サンプルダウンロード</h3>



<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-03627597 wp-block-buttons-is-layout-flex" style="border-width:1px;border-radius:28px">
<div class="wp-block-button has-custom-width wp-block-button__width-75"><a class="wp-block-button__link has-black-color has-amber-background-color has-text-color has-background has-link-color wp-element-button" href="https://www.kazuban.com/soft/special_fillet.zip">サンプルFusion 3dfデータをダウンロードできます</a></div>
</div>



<h2 class="wp-block-heading">パッチで作成した曲面の変形</h2>



<p>パッチで作成した曲面形状が気に入らない場合は、サーフェスモードで試行錯誤する事になると思います。<br>ただ、パッチ作成時に、ガイドカーブを指定する事で、ある程度簡単にカーブに添わせた形状に変形する事は可能です<br>一例としては変更した曲面の断面を取り出し、断面のスケッチにガイドカーブを描きます</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="609" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/surface_edit-800x609.png" alt="" class="wp-image-11644" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/surface_edit-800x609.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/surface_edit-500x380.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/surface_edit-300x228.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/surface_edit-768x584.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/surface_edit.png 1024w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>編集したい曲面を一度削除し、再度「パッチ」コマンドを指定します<br>パッチの境界線を設定し、「内部レールまたは点」で、作成したガイドカーブを指定します</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="598" src="https://www.kazuban.com/blog/wp-content/uploads/2025/10/guide_rail-800x598.png" alt="" class="wp-image-11645" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/10/guide_rail-800x598.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/guide_rail-500x374.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/guide_rail-300x224.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/guide_rail-768x575.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/10/guide_rail.png 1024w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>2025/10月から、自宅サーバーのPostFixからプロバイダー経由のメール送信ができなくなった！</title>
		<link>https://www.kazuban.com/blog/postfix_new_setting/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sat, 04 Oct 2025 06:36:58 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Linux (CentOS、Rocky、Ubuntu)]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[smtp]]></category>
		<category><![CDATA[生成Ai]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=11507</guid>

					<description><![CDATA[外部からのログイン時や、ブログのバックアップ時など自動的にEメールが届くように設定していますが、今月（2025/10）に入ってからメールが届かなくなっていました。既存設定は下記で記事にしましたが、送信メール専用の運用です [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>外部からのログイン時や、ブログのバックアップ時など自動的にEメールが届くように設定していますが、今月（2025/10）に入ってからメールが届かなくなっていました。<br>既存設定は下記で記事にしましたが、送信メール専用の運用です</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/rockylinux9-3-postfix/" title="RockyLinux9.３で自宅サーバーを再構築V08・postfix で送信専用メールサーバー構築" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2023/12/postfix-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2023/12/postfix-160x90.png 160w, https://www.kazuban.com/blog/wp-content/uploads/2023/12/postfix-120x68.png 120w, https://www.kazuban.com/blog/wp-content/uploads/2023/12/postfix-320x180.png 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">RockyLinux9.３で自宅サーバーを再構築V08・postfix で送信専用メールサーバー構築</div><div class="blogcard-snippet internal-blogcard-snippet">このサイトには「お問い合わせフォーム」を設定していますし、起動しているサーバーがエラーなどの連絡を発信する場合もあります。重要なメールもあるので、メインのメールアドレスへ配信させる設定を行います。今回は、サーバー側から、配信するのみの設定を行います</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.01.08</div></div></div></div></a>
</div></figure>



<p>この設定により、このブログサイトへの、「お問い合わせ」も設置できているのですが、この不具合では、「お問い合わせ」もこちらに届きません<br>う～ん、困った。</p>



<h2 class="wp-block-heading">こんな時ほど、Aiに相談だぁ！</h2>



<p>最初は、ググってみましたが、なかなか的確なサイトにぶち当たりません。<br>Aiに聞いてみよう！<br>ChatGPT と Gemini 2.5Flash に同じ質問をしてみましたが、ほぼ同じ回答内容でしたが<br>ChatGPTのほうが、みやすく感じます<br>ただ、ChatGPTは次から次に、逆質問をしてくるのが、ちょっとウザいかも・・・</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>rocky linux9 で自宅サーバーを運用していますが、2025/10月からサーバーからのメールが送信できなくなりました sudo cat /var/log/maillog | grep -i error を実行してみると、下記エラーがでます。原因はなんでしょう？ <br>sudo cat /var/log/maillog | grep -i error<br>（エラー内容）<br>・<br>・</p>
</blockquote>



<p>それにしても、エラー内容をそのまま突っ込めるのは、今までの検索では考えられないですね。</p>



<h3 class="wp-block-heading">Aiのエラー内容の整理</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>ログのエラー内容を整理すると：<br>Postfix が プロバイダ<strong> のメールサーバ (mx.hogehoge.com) に TCP ポート 25 で接続しようとしてタイムアウト</strong>しています。</p>



<h4 class="wp-block-heading">主な原因候補</h4>



<p><strong>１０月からであれば、原因とは考えにくいですが・・・</strong><br>Rocky Linux の <code>firewalld</code> やルーターで 25番ポートのアウトバウンドが塞がれた可能性。</p>



<p><strong>プロバイダ側のポート25ブロック</strong><br>2025年現在、多くの ISP（特に家庭向け回線）はスパム対策のため <strong>ポート25を塞いでいる</strong> ことが多いです。<br>それまでは通っていたけど、2025年10月から「送信ポリシー変更」でブロックされた可能性があります。</p>



<p><strong>プロバイダ 側の受信制限</strong><br>プロバイダ の受信サーバが外部からの直接SMTPを拒否するようになった可能性があります。</p>



<p><strong>ファイアウォール / サーバ側の設定</strong><br>個人宅サーバからの直接送信を受け付けない運用に切り替えた可能性。<br></p>
</blockquote>



<h3 class="wp-block-heading">確認方法</h3>



<p>自宅サーバーからプロバイダメールサーバーへ直接接続できるか試す</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-0eae8bd16b748755037f75239f8fa78c"><code>telnet mx.hogehoge.com 25</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>もしタイムアウトするなら → 回線側（ISPやプロバイダ）で遮断。<br>もし「220〜」の応答があれば → Postfixの設定やファイアウォールの問題。</p>
</blockquote>



<p>結果、telnet mx.hogehoge.com 25 が応答なし（タイムアウト）でした。<br>ということは、サーバー側(Postfix)の問題ではなく、回線側で25番ポートがブロックされている可能性が非常に高いと言うことのようです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<h4 class="wp-block-heading">状況まとめ</h4>



<ul class="wp-block-list">
<li>以前は送れた → 2025年10月から送れなくなった</li>



<li>ログでは「Connection timed out」</li>



<li>telnet も通らない</li>
</ul>



<p>👉 これは「ISP（プロバイダ 側）が <strong>自宅回線からの直接25番SMTP送信を禁止</strong> に切り替えた」ケースに一致します。<br>最近は迷惑メール対策で家庭向け回線ではほぼ標準でブロックされます。</p>
</blockquote>



<h3 class="wp-block-heading">解決方法</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>１．プロバイダのメールサーバ経由（SMTPリレー / smarthost）<br>　・Postfix の <code>relayhost</code> 設定でプロバイダの SMTP サーバ（587 or 465ポート）を使う<br>２．外部のメールリレーサービスを利用<br>　・SendGrid, Gmail SMTP relay, AWS SES など<br>３．自宅サーバではなく VPS 経由で送信<br>　・自宅サーバからVPSへ転送して、VPSから外へ送信。</p>
</blockquote>



<h3 class="wp-block-heading">解決策（おすすめ）</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<h4 class="wp-block-heading">プロバイダのSMTPサーバを経由する（最も現実的）</h4>



<p>Postfix で <strong>「スマートホスト」設定</strong>をして、<code>smtp.hogehoge.com:587</code> 経由で送信するのがベストです。（25番ではなく 587 番（Submission ポート）がベスト）</p>
</blockquote>



<p>まずは、 外部からの直接配送(mx) ではなく、 認証付きの送信サーバ(smtp) なら接続できるかの確認</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-d1ed62bd845bdfc34561e26dc69787d7"><code>telnet smtp.hogehoge.com 25
telnet smtp.hogehoge.com 587</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>結果、両方とも接続できました<br>telnet smtp.hogehoge.com 587<br> Trying 000.000.000.0… Connected to smtp.hogehoge.com. Escape character is &#8216;^]&#8217;. <br> 220 hogehoge.com ESMTP server ready Sat, 4 Oct 2025 15:42:22 +0900</p>
</blockquote>



<h3 class="wp-block-heading">整理すると</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>mx.hogehoge.com:25 → タイムアウト（接続できない）<br>smtp.hogehoge.com:25 → 接続できる（220応答あり）<br>smtp.hogehoge.com:587 → 接続できる（220応答あり）<br>つまり：<br>プロバイダ は 外部からの直接配送(mx) を制限している<br>代わりに 認証付きの送信サーバ(smtp) なら 25 でも 587 でも受け付けている<br>じゃあどっちを使うべき？<br>587（submission ポート） が推奨です（標準仕様で「認証あり専用の送信ポート」）<br>25番で smtp.nifty.com に直接送ることもできますが、将来的にブロックされる可能性が高いです。<br>なので、Postfixの relayhost を smtp.hogehoge.com:587 にして、SMTP認証を通す設定がベストです。</p>
</blockquote>



<h2 class="wp-block-heading">設定方法</h2>



<h3 class="wp-block-heading">認証情報ファイルを作成</h3>



<p>/etc/postfix/sasl_passwd　ファイルを作成し、アドレスとパスワードを追記：<br>「プロバイダのメールアドレス」：「アドレスパスワード」</p>



<ol class="wp-block-list">
<li></li>
</ol>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-cf5ee98bcd0014075216e4ea91b22a3d"><code>&#91;smtp.hogehoge.com]:587 myaddress@hogehoge.com:mypasswd</code></pre>



<h3 class="wp-block-heading">Postfix設定ファイルを修正</h3>



<p>/etc/postfix/main.cf の末尾あたりに下記追記：</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-13556aa4e80564c4f005081ef9c9d542"><code># hogehoge の SMTP サーバをリレーに指定
relayhost = &#91;smtp.hogehoge.com]:587

# SMTP認証を有効化
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous

# TLS を使用
smtp_use_tls = yes
smtp_tls_security_level = may
smtp_tls_note_starttls_offer = yes
</code></pre>



<h3 class="wp-block-heading">ハッシュ化して権限設定</h3>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-38c8a71e92c7c150706dc97f7dbaf633"><code>sudo postmap /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd*</code></pre>



<h3 class="wp-block-heading">Postfix再起動</h3>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-3c331cc5949776159db7c4e811fd490b"><code>sudo systemctl restart postfix</code></pre>



<h3 class="wp-block-heading">テスト送信</h3>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-c98fe1de8a8672232244379c1692715a"><code>echo "This is a test mail" | mail -s "Postfix smtp test" myaddress@hogehoge.com</code></pre>



<h3 class="wp-block-heading">確認</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>/var/log/maillog を確認して、status=sent になれば成功</p>
</blockquote>



<h3 class="wp-block-heading">後日、Gmailへの転送がNGになった</h3>



<p>後日、バックアップサーバーの立ち上げをやっていて、GmailへのテストメールがNGになった</p>



<pre class="wp-block-code"><code> echo "This is a test mail to gmail" | mail -s "Postfix smtp test2" hogehoge@gmail.com</code></pre>



<h4 class="wp-block-heading">ここも、AIに聞いてみる</h4>



<p>Gmailで該当メールを開いて <strong>「︙」→「メッセージのソースを表示」</strong> し、以下の行を確認してみてください：</p>



<pre class="wp-block-code"><code>Authentication-Results: mx.google.com;
   spf=pass  ← ここがfailだとアウト
   dkim=pass ← ここがfailだとアウト</code></pre>



<p>その結果を教えてもらえれば、どこが問題か特定できます！</p>



<pre class="wp-block-code"><code>Authentication-Results: nifty.com;
    dmarc=none header.from=kazuban.com;
    dkim=none;
    spf=fail smtp.mailfrom=kazuban.com;
    sender-id=Fail (pra) header.From=kazuban.com</code></pre>



<p>原因が明確になりました！</p>



<h3 class="wp-block-heading">AIが問題点指摘</h3>



<p><strong><code>spf=fail</code></strong> → <code>kazuban.com</code> のDNSにSPFレコードがないか、Niftyのサーバーが許可されていないNiftyのSMTP経由で送っているのに、Fromアドレスが <code>@kazuban.com</code> なので、<br>「kazuban.comのSPF的にNiftyは許可されてないよ」とGmailに判断されています。</p>



<h4 class="wp-block-heading">A. <strong>kazuban.com のDNSにSPFレコードを追加</strong>（推奨）</h4>



<pre class="wp-block-preformatted">種別     ホスト名          内容<br>TXT      @ （または空欄）<code>  v=spf1 include:nifty.com ~all</code></pre>



<p>設定後、反映に<strong>数分〜数時間</strong>かかる場合があります。確認コマンドはこちら：</p>



<pre class="wp-block-code"><code>dig TXT kazuban.com | grep spf</code></pre>



<p><code>v=spf1 include:nifty.com ~all</code> が表示されれば成功です。</p>



<h2 class="wp-block-heading">正常にもどった</h2>



<p>いまさらですが、Aiはすごいですね<br>ちょっと前までは、プロンプトが重要とか言われていましたが、最近ではあまり感じません<br>普通に個人の言葉で、質問すれば、かなり理解してくれます<br>もしかすると、サポート会社などへ、電話質問するよりも簡単かもしれません<br>理解力と分析力は、はるかに人間を超えているように思います</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ファナック・カスタムマクロの展開をAiにやってもらう！</title>
		<link>https://www.kazuban.com/blog/custom-macro-with-ai/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sat, 02 Aug 2025 02:50:55 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[NC]]></category>
		<category><![CDATA[カスタムマクロ]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[ファナック]]></category>
		<category><![CDATA[生成Ai]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=11441</guid>

					<description><![CDATA[最近は、CAMの充実もあって、カスタムマクロの利用もかなり減少しいていると思います。ただ、穴などの基本的な加工の場合、座標値入力だけで加工できるのでうまく使えば、かなり重宝します。マシニングセンターを、操作フライス盤的な [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>最近は、CAMの充実もあって、カスタムマクロの利用もかなり減少しいていると思います。<br>ただ、穴などの基本的な加工の場合、座標値入力だけで加工できるのでうまく使えば、かなり重宝します。<br>マシニングセンターを、操作フライス盤的な使い方で利用する事もできます。</p>



<h2 class="wp-block-heading">カスタムマクロの欠点</h2>



<p>Google で「カスタムマクロ欠点」で検索してみると、下記のAi概要が最上部に表示されました<br>話は変わりますが、最近では通常検索でもAi回答が出てくるようになりましたね。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>AI による概要</strong></p>



<p>カスタムマクロは、NCプログラムの効率化や自動化に役立つ一方で、いくつかの欠点も存在します。主な欠点としては、<mark>プログラミングの難易度、デバッグの複雑さ、互換性の問題、そして過度な依存によるリスク</mark>などが挙げられます。</p>



<p class="has-light-grey-background-color has-background"><strong>カスタムマクロの欠点</strong></p>



<ul class="wp-block-list">
<li><strong>プログラミングの難易度:</strong>カスタムマクロは、通常のNCプログラムよりも複雑なロジックを記述する必要があるため、習得に時間がかかり、プログラミングの難易度が高いです。特に、条件分岐やループ処理を多用する場合、複雑さが増し、エラーが発生しやすくなります。</li>



<li><strong>デバッグの複雑さ:</strong>カスタムマクロのデバッグは、通常のNCプログラムよりも難易度が高いです。変数の値の変化や処理の流れを追跡するのが難しく、エラーの原因特定に時間がかかることがあります。また、マクロプログラムが複雑になるほど、デバッグ作業はさらに困難になります。</li>



<li><strong>互換性の問題:</strong>カスタムマクロは、使用するNC工作機械や制御装置の種類によって、互換性の問題が発生する可能性があります。同じマクロプログラムでも、機械が異なると正しく動作しない場合や、エラーが発生する場合があります。そのため、マクロプログラムを作成する際には、互換性を考慮する必要があります。</li>



<li><strong>過度な依存によるリスク:</strong>カスタムマクロに過度に依存すると、マクロプログラムの変更や修正が必要になった場合に、他の作業に影響が出たり、生産性が低下する可能性があります。また、マクロプログラムの作成者が不在になった場合、保守や管理が困難になるというリスクもあります。</li>
</ul>



<p>その他の考慮事項</p>



<ul class="wp-block-list">
<li><strong>マクロプログラムの可読性:</strong>カスタムマクロは、可読性の高い書き方を心がける必要があります。コメントを適切に記述し、変数名や処理の流れを分かりやすくすることで、他の人がマクロプログラムを理解しやすくなります。</li>



<li><strong>マクロプログラムのバージョン管理:</strong>カスタムマクロは、バージョン管理を行うことで、変更履歴を把握し、必要に応じて以前のバージョンに戻すことができます。</li>



<li><strong>マクロプログラムのテスト:</strong>カスタムマクロは、実際に機械を動かす前に、シミュレーション環境などで十分にテストを行う必要があります。これにより、エラーの発生を未然に防ぎ、安全に運用することができます。</li>
</ul>



<p>これらの欠点や考慮事項を踏まえ、カスタムマクロの導入を検討する必要があります。</p>
</blockquote>



<p>なるほど・・<a href="https://www.kazuban.com/blog/category/nc/custom-macro/">ここのサイトでもいくつか取り上げていますが</a>、まさに同意見です。<br></p>



<h3 class="wp-block-heading"><strong>プログラミングの難易度</strong></h3>



<p>マクロは数多く作成してきましたが<br>機械の制御器に処理させる言語になるので、どうしても、一般的なプログラミング言語と比較すると、中途半端で可読性は悪くなってしまします。<br>ちなみに、レダース(Roeders）機は、独自開発されたプログラミング言語ライクな言語です。<br>加工動作のGコードのサブプロ部分と、その動作部分を管理するメインプロ部分を分離する事を基本で開発されているように感じています。<br>特にWindowsソフトウェアとして開発された言語なので、自動化や多数個など、複雑なメインプロを開発する場合でもかなり楽です。</p>



<h3 class="wp-block-heading"><strong>デバッグの複雑さ</strong></h3>



<p>このサイトでも、何度か書いていますが、一番は変数の制限が可読性を悪くしているように思います。<br>筆者は通常のGコードだけであれば、<a href="https://www.trycut.com/">TRYCUT</a> と言うシミュレーションソフトを使っていますが、TRYCUTにはマクロ展開機能が付いていません。<br>シミュレートできないので、マクロのデバッグはエディタやプリントアウトして目視で追っかけ確認ますがかなかな面倒で、リスクもあります。<br>社内設備機械で、一台だけマクロも含めたシミュレート機能がある制御器があるので、確認のためだけに、その機械を起動させる場合もあります。<br>大人しく、マクロ機能付きのシミュレータを購入したら・・・の意見もあると思いますが、マクロ利用頻度から検討すると、どうしても費用対効果の面で無理があります。</p>



<h2 class="wp-block-heading">そうだ、Aiに展開してもらおう！</h2>



<p>前回、Fusion python API を、Aiに教わったらすごかった・・を記事にしました</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/fusion-python-api/" title="Fusion360  Python API 再挑戦！AIの力を借りて、sketchなど基本ライブラリを作ってみた。" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2025/07/fusion-python-api-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/07/fusion-python-api-160x90.png 160w, https://www.kazuban.com/blog/wp-content/uploads/2025/07/fusion-python-api-120x68.png 120w, https://www.kazuban.com/blog/wp-content/uploads/2025/07/fusion-python-api-320x180.png 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Fusion360  Python API 再挑戦！AIの力を借りて、sketchなど基本ライブラリを作ってみた。</div><div class="blogcard-snippet internal-blogcard-snippet">Aiと言う強い味方を得て、Fusion API に再挑戦しています。pythonの学習もかねて、skrtch関連の関数をライブラリ化しています。筆者の環境では、正常に動作しています。コピペで利用可。Aiに教えてもらわないと、作成できなかった実例をレポートしています。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.07.09</div></div></div></div></a>
</div></figure>



<p>Fusion API は、一般的なpython言語構文やライブラリだけでなく、独自のオブジェクトを絡み合わせて開発していくので、そのパッケージの理解だけでも大変です。<br>それを、Aiに聞いたら、サンプルコードを出してくれたり、自作したコードを添削してくれたりと、驚きでした。<br>そこで上の記事を書いてたら、ピ～ンときました。<br>「そうだ、Fusion APIのパッケージを瞬時に解読できるなら、カスタムマクロなら簡単に解読してくれるかも！」</p>



<h3 class="wp-block-heading">課題データ</h3>



<p>課題NCデータは、以前記事にした、下記ページのデータをそのまま使ってみようと思います</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/chamfering-with-g66/" title="カスタムマクロ、G66モーダル呼び出しで固定サイクルを自作してみる。" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="114" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2022/05/Chamfer01.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2022/05/Chamfer01.png 878w, https://www.kazuban.com/blog/wp-content/uploads/2022/05/Chamfer01-300x237.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2022/05/Chamfer01-768x607.png 768w" sizes="(max-width: 114px) 100vw, 114px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">カスタムマクロ、G66モーダル呼び出しで固定サイクルを自作してみる。</div><div class="blogcard-snippet internal-blogcard-snippet">前回、カスタムマクロプログラムの例として、ハイデンハインサイクルをマクロ化する例を紹介しました。ハイデンハインサイクルに比べると、ファナック固定サイクルの機能は非常に貧弱ですが、カスタムマクロを自作する事で、無限に拡張する事が可能です。今回は、カスタムマクロのモーダル呼び出し「G66」を利用して、穴...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.05.30</div></div></div></div></a>
</div></figure>



<p>穴の面取りを輪郭加工で行うマクロです。<br>メインプロ「O1000」に加工条件や面取り条件を変数で定義して、G66モーダル呼び出しで「O6000」の面取り加工マクロを呼び出し、指定位置「O6100」で面取りを行うプログラムです<br>若干変数での計算式もあります。</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-ada81581cdb38d9e779798ad0caed857"><code>こちらのファナックマクロを展開してください
%
O1000
( Chamfering Program Ver1.0 By kazuban )&nbsp;
G90G00G17G40G80G49&nbsp;
(++++++++++++++++++++)&nbsp;
#1=54 (WORK ORIGIN)
#2=10 (Tool Number)
#3=#2 (H Number)
#4=0.5(Tool Diameter)
#5=2300 (Spindle Speed)
#6=200 (Feed)
#7=8 (Coolant)
#8=0.0(Surface Coordinat)
#9=50.0 (Initial Point)&nbsp;
#10=5.0 (R Point)
(++++++++++++++++++++)&nbsp;
#11=12.0 (Hole Diameter)
#12=1.0 (Chamfer)
#13=0.5 (Offset)
(++++++++++++++++++++)&nbsp;
#30=6000 (Macro program No)
#31=6100 (Position program No)
(++++++++++++++++++++)&nbsp;
N0001
G#1
T#2
M06
G90G00X0Y0&nbsp;
G43Z&#91;#8+#9]H#3
( Chamfer Process )
S#5M03&nbsp;
M#7
(----------------------------)
(B:#2=#8 : Surface Coordinat)&nbsp;
(C:#3=#9 : Initial Point)&nbsp;
(I:#4=#10 : R Point)&nbsp;
(J:#5=#12 : Chamfer)&nbsp;
(K:#6=#13 : Offset)
(D:#7=#4 : Tool Dia)
(E:#8=#11 : Hole Dia)
(F:#9=#6 : Feed)
(++++++++++++++++++++)&nbsp;
G66 P&#91;#30] B&#91;#8] C&#91;#9] I&#91;#10] J&#91;#12] K&#91;#13] D&#91;#4] E&#91;#11] F&#91;#6]
M98P&#91;#31]
G67
G90G00Z&#91;#8+#9]
M09
M05
G91G28Z0&nbsp;
G91G49Z0&nbsp;
G90M05&nbsp;
( End of Process )
M30
%
%
O6000
( Chamfering Macro Ver1.0 By kazuban )&nbsp;
(+++++++++++++++++++)
#1=&#91;#8/2-&#91;#6+#7/2]] (circle radius)
(+++++++++++++++++++)
(B:#2 : Surface Coordinat)&nbsp;
(C:#3 : Initial Point)&nbsp;
(I:#4 : R Point)&nbsp;
(J:#5 : Chamfer)&nbsp;
(K:#6 : Offset)
(D:#7 : Tool Dia)
(E:#8 : Hole Dia)
(F:#9 : Feed)
(+++++++++++++++++++)
G90G00G17
Z&#91;#2+#3]&nbsp;
Z&#91;#2+#4]&nbsp;
G01Z&#91;#2-&#91;#6+#5]]F&#91;#9]&nbsp;
G91X&#91;#1]
G03X-&#91;#1*2]I-&#91;#1]J0.&nbsp;
X&#91;#1*2]I&#91;#1]J0.
G01X-&#91;#1]&nbsp;
G90G00Z&#91;#2+#3]&nbsp;
M99
%
%
O6100
( Hole Position )
X-35.Y55.
X-50.Y55.
X10.Y10.&nbsp;
M99
%</code></pre>



<p>このデータをそのまま、「Gemini 2.5 Flash」に突っ込んで、展開をお願いしてみました。</p>



<h3 class="wp-block-heading">Aiの回答</h3>



<p>G66仕様で、G66への変数渡しが「#変数」そのままでないので、作者が見直す時も結構面倒ですが、Aiは瞬時に分析してくれました。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>提供されたFANUCマクロプログラムを解析し、その内容を以下に解説します。</p>



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



<h4 class="wp-block-heading"><strong>プログラム全体の概要</strong></h4>



<p>このマクロは、複数の穴の面取り加工を自動化するために設計されています。主プログラム (<code>O1000</code>) で加工条件を設定し、マクロプログラム (<code>O6000</code>) で実際の面取り動作を実行、そしてもう一つのプログラム (<code>O6100</code>) で穴の位置情報を呼び出す、という構成になっています。</p>



<h4 class="wp-block-heading"><strong>O1000: 主プログラム</strong></h4>



<p>このプログラムは、加工に必要な初期設定と、マクロ呼び出しを行います。</p>



<ul class="wp-block-list">
<li><strong>初期設定:</strong>
<ul class="wp-block-list">
<li><code>#1=54 (WORK ORIGIN)</code>: ワーク原点の位置を<code>#1</code>に設定。</li>



<li><code>#2=10 (Tool Number)</code>: 工具番号を<code>#2</code>に設定。</li>



<li><code>#4=0.5(Tool Diameter)</code>: 工具径を<code>#4</code>に設定。</li>



<li><code>#5=2300 (Spindle Speed)</code>: 主軸回転速度を<code>#5</code>に設定。</li>



<li><code>#6=200 (Feed)</code>: 送り速度を<code>#6</code>に設定。</li>



<li><code>#11=12.0 (Hole Diameter)</code>: 穴の直径を<code>#11</code>に設定。</li>



<li><code>#12=1.0 (Chamfer)</code>: 面取り量を<code>#12</code>に設定。</li>



<li><code>#13=0.5 (Offset)</code>: 工具のオフセット量を<code>#13</code>に設定。</li>
</ul>
</li>



<li><strong>マクロ呼び出し:</strong>
<ul class="wp-block-list">
<li><code>G66 P[#30] ...</code>: ここで、面取りマクロプログラム<code>O6000</code>（<code>#30</code>）を呼び出しています。</li>



<li><code>B[#8] C[#9]...</code>: マクロに渡す引数を設定しています。
<ul class="wp-block-list">
<li><code>B[#8]</code>: 面取り加工の開始基準となる<strong>ワーク表面座標</strong>。</li>



<li><code>C[#9]</code>: 加工前の待機位置である<strong>初期点</strong>。</li>



<li><code>I[#10]</code>: 加工開始前の<strong>退避点（R点）</strong>。</li>



<li><code>J[#12]</code>: <strong>面取り量</strong>。</li>



<li><code>K[#13]</code>: <strong>オフセット量</strong>。</li>



<li><code>D[#4]</code>: <strong>工具径</strong>。</li>



<li><code>E[#11]</code>: <strong>穴径</strong>。</li>



<li><code>F[#6]</code>: <strong>送り速度</strong>。</li>
</ul>
</li>



<li><code>M98 P[#31]</code>: 穴の位置情報を記述したプログラム<code>O6100</code>（<code>#31</code>）を呼び出します。これにより、<code>O6100</code>に記述された各座標で、<code>G66</code>で指定されたマクロが繰り返して実行されます。</li>
</ul>
</li>
</ul>



<h4 class="wp-block-heading"><strong>O6000: 面取りマクロプログラム</strong></h4>



<p>このプログラムは、<code>O1000</code>から渡された情報をもとに、実際の面取り加工を行います。</p>



<ul class="wp-block-list">
<li><strong>面取り加工の半径計算:</strong>
<ul class="wp-block-list">
<li><code>#1=[#8/2-[#6+#7/2]]</code>: この式は、面取り加工を行う円弧の半径を計算しています。
<ul class="wp-block-list">
<li><code>#8/2</code>: 穴の半径。</li>



<li><code>#6</code>: 面取り量。</li>



<li><code>#7/2</code>: 工具の半径。</li>



<li><strong>結果:</strong> <strong>面取り加工する円弧の半径 = (穴の半径) &#8211; (面取り量) &#8211; (工具の半径)</strong></li>
</ul>
</li>
</ul>
</li>



<li><strong>加工シーケンス:</strong>
<ol start="1" class="wp-block-list">
<li><code>G90G00G17</code>: 絶対指令、早送り、XY平面選択。</li>



<li><code>Z[#2+#3]</code>、<code>Z[#2+#4]</code>: Z軸を初期点、R点へと移動。</li>



<li><code>G01Z[#2-[#6+#5]]F[#9]</code>: Z軸を<strong>面取り深さ</strong>まで切り込みながら移動します。</li>



<li><code><strong>G91</strong>X[#1]</code>: <span class="marker-under-red">ワーク座標を基準</span>に、計算された半径分だけX軸を移動。円弧加工の開始位置に移動します。</li>



<li><code>G03X-[#1*2]I-[#1]J0.</code>: 半径<code>#1</code>の円弧で、左回りに<strong>180度円弧切削</strong>。</li>



<li><code>X[#1*2]I[#1]J0.</code>: さらに、半径<code>#1</code>の円弧で、左回りに<strong>180度円弧切削</strong>。これにより、1周分の面取り加工が完了します。</li>



<li><code>G01X-[#1]</code>: 円弧加工の開始位置から中心に戻ります。</li>



<li><code>G90G00Z[#2+#3]</code>: Z軸を初期点に戻します。</li>



<li><code>M99</code>: マクロプログラムの終了。主プログラム（<code>O1000</code>）に戻ります。</li>
</ol>
</li>
</ul>



<h4 class="wp-block-heading"><strong>O6100: 穴位置プログラム</strong></h4>



<p>このプログラムは、加工する穴のXY座標をリストアップしています。</p>



<ul class="wp-block-list">
<li><code>X-35.Y55.</code>: 1つ目の穴の座標。</li>



<li><code>X-50.Y55.</code>: 2つ目の穴の座標。</li>



<li><code>X10.Y10.</code>: 3つ目の穴の座標。</li>
</ul>



<p>これらの座標は、<code>O1000</code>の<code>M98 P[#31]</code>によって順番に読み込まれ、それぞれの位置で<code>O6000</code>の面取り加工が実行されます。</p>



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



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



<p>このプログラムは、以下のような処理フローで動作します。</p>



<ol start="1" class="wp-block-list">
<li>主プログラム<code>O1000</code>がスタートします。</li>



<li>工具交換、初期位置決め、主軸回転、クーラントONなど、準備が完了します。</li>



<li><code>O6100</code>に記述された最初の座標（X-35.Y55.）に移動します。</li>



<li><code>G66</code>によって<code>O6000</code>の面取りマクロが呼び出されます。</li>



<li>マクロ内で計算されたパスで、面取り加工が行われます。</li>



<li>面取り加工が完了すると、<code>O1000</code>に戻ります。</li>



<li><code>O6100</code>の次の座標（X-50.Y55.）に移動します。</li>



<li>再び<code>O6000</code>が呼び出され、面取り加工が行われます。</li>



<li>この繰り返し処理が<code>O6100</code>の最後まで行われます。</li>



<li>全ての加工が終了すると、クーラントOFF、主軸停止、安全位置への退避が行われ、プログラムが終了します。</li>
</ol>



<p>この構成は、複数の同じ形状の加工を効率的に行うための、NCプログラミングの典型的な手法です。プログラムを分割することで、位置情報や加工条件の変更が容易になります。</p>
</blockquote>



<p>丁寧な解説ですが、<strong>加工シーケンス:</strong>４．の<span class="marker-under-red">「ワーク座標を基準</span>」と言うのがちょっと間違っていますね・・<br>無料版だからでしょうか？<br>でも、きちんとGコードに展開してくれれば、問題ないですから<br>再度、一般的なGコードへの展開をお願いすると・・・</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>%<br>O1000_EXPANDED<br>( Chamfering Program Expanded Version )</p>



<p>G90 G00 G17 G40 G80 G49&nbsp;</p>



<p>( Tool and Spindle Setup )<br>T10 M06&nbsp;<br>G90 G00 X0 Y0&nbsp;<br>G43 Z[0.0+50.0] H10<br>S2300 M03&nbsp;<br>M08</p>



<p>( &#8212; Hole 1 at X-35. Y55. &#8212; )<br>G90 G00 X-35. Y55.<br>G00 Z[0.0+50.0]<br>G00 Z[0.0+5.0]<br>G01 Z[0.0-[1.0+0.5]] F200<br>G91 X[12.0/2-[1.0+0.5/2]]<br>G03 X-[[12.0/2-[1.0+0.5/2]]2] I-[12.0/2-[1.0+0.5/2]] J0. X[[12.0/2-[1.0+0.5/2]]2] I[12.0/2-[1.0+0.5/2]] J0.<br>G01 X-[12.0/2-[1.0+0.5/2]]<br>G90 G00 Z[0.0+50.0]</p>



<p>( &#8212; Hole 2 at X-50. Y55. &#8212; )<br>・<br>・<br>・以下省略</p>
</blockquote>



<p>G66呼び出しの部分も、きちんと、展開してくれました。<br>さらに、[]内で、変数を数値に置き換えた計算式で表現してくれています。<br>おそらく、[]を認識できるコントローラであれば、このまま動作すると思いますが、トライカットは動作してくれないので、再度、[]内の計算式部分を、実数値に変換をお願いしました。</p>



<h3 class="wp-block-heading">完成</h3>



<p>以下が完成したデータです</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-66754072bbded3ae612360f6496ca273"><code>%
O1000
( Chamfering Program Expanded Numeric Version )

G90 G00 G17 G40 G80 G49&nbsp;

( Tool and Spindle Setup )
T10 M06&nbsp;
G90 G00 X0 Y0&nbsp;
G43 Z50.0 H10
S2300 M03&nbsp;
M08

( Chamfering Path Calculation )
( Hole Diameter: 12.0 )
( Chamfer: 1.0 )
( Tool Diameter: 0.5 )
( Offset: 0.5 )
( Radius for cutting: 12.0/2 - 1.0 - 0.5/2 = 6.0 - 1.0 - 0.25 = 4.75 )
( Cutting Depth: 1.0 + 0.5 = 1.5 )

( --- Hole 1 at X-35. Y55. --- )
G90 G00 X-35. Y55.
G00 Z50.0
G00 Z5.0
G01 Z-1.5 F200
G91 X4.75
G03 X-9.5 I-4.75 J0.
X9.5 I4.75 J0.
G01 X-4.75
G90 G00 Z50.0

( --- Hole 2 at X-50. Y55. --- )
G90 G00 X-50. Y55.
G00 Z50.0
G00 Z5.0
G01 Z-1.5 F200
G91 X4.75
G03 X-9.5 I-4.75 J0.
X9.5 I4.75 J0.
G01 X-4.75
G90 G00 Z50.0

( --- Hole 3 at X10. Y10. --- )
G90 G00 X10. Y10.
G00 Z50.0
G00 Z5.0
G01 Z-1.5 F200
G91 X4.75
G03 X-9.5 I-4.75 J0.
X9.5 I4.75 J0.
G01 X-4.75
G90 G00 Z50.0

( End of Program )
M09
M05
G91 G28 Z0
G91 G49 Z0
G90 M05
M30
%
</code></pre>



<h3 class="wp-block-heading">シミュレーション</h3>



<p>さっそく、シミュレーションしてみましょう！</p>



<figure class="wp-block-video"><video height="852" style="aspect-ratio: 1032 / 852;" width="1032" controls src="https://www.kazuban.com/blog/wp-content/uploads/2025/08/macro-trycut.mp4"></video></figure>



<p>正常に動作しました。</p>



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



<p>やっぱり、Aiはすごいです。<br>座標値を変数で置き換えている程度のマクロであれば、エクセルやスクリプト言語などで、比較的簡単に変換できるかもしれませんが、計算式が入ってくると格段に難易度が上がります。<br>さらに、G66などのマクロ呼出しになると、引数への変数渡しに癖があるので、PC上での目視確認においても結構面倒です。<br>以前、マクロの変換ソフトの作成も考えた事もありますが、難易度高くで止めました。<br>今回のように、Aiに展開してもらえれば、手持ちのシミュレータで動作確認できるので、かなり気軽にマクロに取り組めると思います<br>それに、今回使用したAiは、「Gemini 2.5flash」で基本無料で利用できます。<br>ちょっと、間違った回答もありましたが、Fusion API の質問も含めて、制限が出ることはなかったです。「chatGPT」無料版では、制限に引っかかりました。</p>



<p></p>
]]></content:encoded>
					
		
		<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2025/08/macro-trycut.mp4" length="2284942" type="video/mp4" />

			</item>
		<item>
		<title>Fusion360  Python API 再挑戦！AIの力を借りて、sketchなど基本ライブラリを作ってみた。</title>
		<link>https://www.kazuban.com/blog/fusion-python-api/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Tue, 08 Jul 2025 20:01:00 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[AIとのやり取り]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=11250</guid>

					<description><![CDATA[数年前、Fusion360のPython APIに少しだけ触れたことがあります。当時はPython自体が初めてで、構文の違いに戸惑いました。C言語に慣れていた私には、インデントでブロックを作る点や、変数・関数に型の宣言が [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>数年前、Fusion360のPython APIに少しだけ触れたことがあります。<br>当時はPython自体が初めてで、構文の違いに戸惑いました。<br>C言語に慣れていた私には、インデントでブロックを作る点や、変数・関数に型の宣言が不要な点など、なかなか馴染めませんでした。<br>さらに、Fusion独自のオブジェクトや関数の使い方を調べる必要があり、作業のハードルは思った以上でした。<br><a href="https://qiita.com/reisyu/items/84aa97117439e4962bbf">こちらのブログ記事</a>や<a href="https://kantoku.hatenablog.com/archive/category/Fusion360API?page=20">「Kantoku」さんのサイト</a>を参考にしながら少しだけ進めてみたのですが、残念ながら長続きせず中断してしまいました。</p>



<p>ところが昨年、AI（生成AI）が大きく注目されるようになり、「これを使ってみるか？」と再び興味がわきました。<br>試しにFusion向けのコードをAIに聞いてみると、実際に動作するスクリプトを提案してくれて、少しやる気が復活…<br>しかしそれも一時的で、またもや放置状態に。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/generative-ai-for-fusion360/" title="話題の『生成Ai』に、Fusion360のPythonスクリプトをきいてみた" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2024/01/generative-ai-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2024/01/generative-ai-160x90.jpg 160w, https://www.kazuban.com/blog/wp-content/uploads/2024/01/generative-ai-120x68.jpg 120w, https://www.kazuban.com/blog/wp-content/uploads/2024/01/generative-ai-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">話題の『生成Ai』に、Fusion360のPythonスクリプトをきいてみた</div><div class="blogcard-snippet internal-blogcard-snippet">最近『生成Ai』を触り始めました。今までの、検索に比べても、非常に便利です。できる事の幅が広すぎて、ついていけませんが、プログラムコードも出力してくれるようです。いままで手を付けていなかった、Fusion360のPythonスクリプトを質問してみました。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.01.27</div></div></div></div></a>
</div></figure>



<p>そして今回！<br>AIもさらに進化してきた今こそ、もう一度挑戦してみようと思い立ちました。<br>本記事では、Fusion360 Python API に再び取り組み始めた記録と、コーディングへのAIの活用事例をレポートしています。<br>例題として、Fusion APIの基本ライブラリを作成しましたので、利用できそうであれば、利用していただければ幸いです。</p>



<p>なお、より高度なスクリプトや実践的な例に興味がある方は、<a href="https://kantoku.hatenablog.com/archive/category/Fusion360API?page=20">「Kantoku」さんのサイト</a>に素晴らしい資料が公開されていますので、ぜひチェックしてみてください。</p>



<h2 class="wp-block-heading">今回の目標：スケッチ関連の基本ライブラリを作る</h2>



<p>Python言語は、ほとんど初心者ですが、ネット情報やAiを参考にコードをコピペするだけでは、なかなか覚えられないと思っています。<br>そこで、基本的なコードをライブラリ化する事で、少しは理解も深まるかと思い、まずはスケッチ周りの基本コードをライブラリ化してみようと思います</p>



<h2 class="wp-block-heading">Aiの実力を試してみる</h2>



<p>さっそく、何種類かのLLMに質問してみました。</p>



<h3 class="wp-block-heading">fusionのpython API で直線を引くコード</h3>



<h4 class="wp-block-heading">ローカルLLM</h4>



<p>ローカルの場合、私の環境では、レスポンス的に30bぐらいが実用できる限界です。<br>そこで、「gemma-3-27b」「qwen3-32b」で試してみます</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>「fusionのpython API で直線を引くコードをだして」</p>
</blockquote>



<p>最初に、「import adsk.core, adsk.fusion, traceback」など<span class="marker-under">Fusion特有のパッケージをインポート</span>しするコードを出してくれるので、なかなかいいな！と思っていましたが、実際にFusionで実行してみても正常動作しませんでした。<br>特に、CAD画面上にメッセージを出力する場合、「ui.messageBox」を利用しますが、一般的なpythonの「print」文を使ったりしています。<br>また、私の環境で30bクラスのLLMでは、<span class="marker-under-blue">回答に５分以上</span>かかりました。<br>文章をまとめたり、翻訳したりの場合では、8bクラスでもいい回答をもらえますが、Fusion API のPython場合はちょっとマイナーなのかもしれません<br>参考にはなると思いますが、<span class="marker-under-red">私</span><span class="marker-under-red">の</span><span class="marker-under-red">環境</span><span class="marker-under-red">では</span><span class="marker-under-red">ちょっとレスポンスが悪いです</span>。</p>



<h4 class="wp-block-heading">オンラインLLM</h4>



<p>次に、オンラインの「chatGPT」と「gemini」で試してみました。<br><span class="marker-under">「chatGPT」も「gemini」も、正常に動作しました</span>。<br>ただし、ログインしないと、会話履歴や共有できないので、ログインしたほうがいいと思います。<br>制限がある場合がありますが、そこそこ無料利用できます。<br>やはり、さすがです。回答レスポンスも早いです。<br>今回の質問では、<a href="https://www.kazuban.com/blog/generative-ai-for-fusion360/#toc6">一年前に、出してくれたコードとほとんど同じコードをだしてくれました。</a><br>一年前は、「bard(gemini)」のコードは、正常動作しないコードでしたが、現在の「gemini」は問題ないコードを出してくれます。<br>個人的は、ローカルLLMを使いたい気持ちがあるのですが、開発作業では、やはりレスポンスは重要なので、今後の学習はオンラインLLMを利用しようと思います。<br>まずは「Gemini 2.5Flash」を利用してみて、いい回答が出なかった場合には、「chatGPT」や「Gemini 2.5Pro」を使おうと思います</p>



<h3 class="wp-block-heading">コンポネントやスケッチのアクティブな状態を把握</h3>



<p><a href="https://www.kazuban.com/blog/generative-ai-for-fusion360/#toc6">上記の直線を描くサンプルコード</a>では、ルートコンポネントに新しいスケッチを作成し、そのスケッチに直線を引いています。<br>もう少し、実践的な動作にしたいです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li>スケッチモードであれば、そのスケッチに・・</li>



<li>スケッチモードでない場合、ルートにこだわらず、アクティブなコンポネントに新しいスケッチを作成しそのスケッチに・・</li>
</ul>
</blockquote>



<p>これを実現させるには、まず<span class="marker-under">現状のアクティヴな状態を把握する</span>必要があります<br>アクティブなコンポーネントを見つける関数はすぐ見つかりましたが、<span class="marker-under-red">スケッチのモード判定方法はなかなか見つか</span><span class="marker-under-red">らず</span>Aiのお陰でどうにかなりそうです。<br>こういった汎用的だけど苦労した処理を、ライブラリ化しておくと、後々便利だと思います</p>



<h4 class="wp-block-heading">現状がスケッチモードかどうかの判定</h4>



<p>何度かgemini に聞いてみたところ、「<strong>activeEditObject」</strong>「<strong>activeEnvironment</strong>」を使用する方法があるとの回答をもらいました。<br>ただし、Ai としては、<span class="marker-under-red">「<strong>activeEditObject</strong>」を推奨</span>するとの事でした</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-461f21f5f0623461ac160a0a7c456f79"><code>import adsk.core
import adsk.fusion

def is_sketch_mode_active():
    """
    現在スケッチモード（いずれかのスケッチが編集中）かどうかを判定します。

    Returns:
        bool: スケッチモードであれば <strong>True</strong>、そうでなければ <strong>False</strong>。
        adsk.fusion.Sketch: アクティブなスケッチオブジェクト（スケッチモードの場合）。
    """
    try:
        app = adsk.core.Application.get()
        
        # 現在編集中のオブジェクトを取得
        active_object = app.activeEditObject

        # 編集中のオブジェクトがスケッチ（Sketch）であるかを確認
        if active_object and <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-yellow-color">isinstance(active_object, adsk.fusion.Sketch):</mark>
            return <strong>True</strong>, active_object
        else:
            return <strong>False</strong>, None

    except:
        return False, None

# --- 実行例 ---
def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui = app.userInterface

        is_active, active_sketch = is_sketch_mode_active()

        if is_active:
            ui.messageBox(f'はい、現在スケッチモードです。\nアクティブなスケッチ: {active_sketch.name}')
        else:
            ui.messageBox('いいえ、現在スケッチモードではありません。')

    except:
        if ui:
            ui.messageBox('エラーが発生しました。')</code></pre>



<p>判定で、「<span class="marker-under-red">isinstance()</span>」関数を使っています。<br>これは、自力では、なかなか探せなかったと思います。恐るべし、Aiです。</p>



<h2 class="wp-block-heading">python特有な構文</h2>



<p>Aiが出してくれた、サンプルコードを見ると、C言語とは違う書き方が結構出てきます<br>例えば</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>return<strong> True , active_object</strong></p>
</blockquote>



<p>のように、複数変数を返す事ができて、取り出しは、下記のように「,」で区切って利用できるのですね</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>is_active , active_sketch</strong> = is_sketch_mode_active()</p>
</blockquote>



<p>C++言語では、最近ではstd::tupleが利用できるみたいですが、それを知らない私は、classを使ったりしていますが、こちらのほうが、面倒ないですね。<br>「if文」も「<strong>三項演算子</strong>」と呼ばれている構文が結構使われていました。</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-6adc7d18a4400a93e3504e1accf22d81"><code>design = get_design()
return <strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-yellow-color">design.activeComponent if design else None</mark></strong></code></pre>



<p>C言語にも「三項演算子」はありますが、if文のほうが、分かりやすいかも・・<br>配列系も、多種類があるようで、Aiが出してくれたサンプルでも結構多用しています</p>



<pre class="wp-block-code"><code>plane = plane.lower()
planes_map = {
    "xy": component.xYConstructionPlane,
    "xz": component.xZConstructionPlane,
    "yz": component.yZConstructionPlane
}   
base_plane = planes_map.get(plane)</code></pre>



<p>この「<strong>.get(plane)</strong>」はなんだ？<br>と思いましたが、これもAiに聞くと、すぐに説明してくれました。<br><strong>planes_map[plane]</strong>でもアクセスできるようですが、<span class="marker-under-red"><strong>get()</strong>を使うと<strong>plane</strong>が存在しない場合安全に</span>デフォルト値（<code><strong>None</strong></code>または指定した値）を返してくれるようです。<br>本当にすぐに教えてくれるので、私のような独学の場合、参考書などをめくるよりも、言語の理解は数段速くなるでしょうね～</p>



<h2 class="wp-block-heading">Fusion スクリプトをライブラリ化する</h2>



<p>Fusion では、「ユーティリティ」⇒「アドイン」⇒「スクリプトとアドイン」⇒「+」で新規にスクリプトを作成できます</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="754" height="572" src="https://www.kazuban.com/blog/wp-content/uploads/2025/07/NewScript.png" alt="" class="wp-image-11300" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/07/NewScript.png 754w, https://www.kazuban.com/blog/wp-content/uploads/2025/07/NewScript-500x379.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/07/NewScript-300x228.png 300w" sizes="(max-width: 754px) 100vw, 754px" /></figure>



<p>このダイアログの「<strong>フォルダの場所</strong>」に「<strong>名前</strong>」に入力のフォルダを作成し、その中に「<strong>名前.py</strong>」で実行スクリプトが作成されます。<br>「フォルダの場所」はデフォルトでは、かなり深いので、私は「D:\Fusion360\Scripts」のようにシンプルな場所に変更しています。<br>また、この場所は、<span class="marker-under">「基本設定」⇒「一般」⇒「API」</span>でデフォルトを変更できます<br>ただし、ここでの設定箇所に<span class="marker-under-red">「Scripts」は自動作成</span>されるので、<span class="marker-under-red">「D:\Fusion360」</span>になります</p>



<p>Fusionスクリプトは、Fusionオブジェクトモデルを介して、利用したいオブジェクトのコマンドを記述します。<br>したがって、スクリプトを作成するには、各オブジェクトの情報が必要となり、かなり複雑です。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="677" height="437" src="https://www.kazuban.com/blog/wp-content/uploads/2025/07/Sketch-2.png" alt="" class="wp-image-11332" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/07/Sketch-2.png 677w, https://www.kazuban.com/blog/wp-content/uploads/2025/07/Sketch-2-500x323.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/07/Sketch-2-300x194.png 300w" sizes="(max-width: 677px) 100vw, 677px" /></figure>



<p><br>今回は、Pythonの学習も兼ねて、Fusionのスケッチ関連オブジェクトをカプセル化したライブラリを作成したいと思います。</p>



<h3 class="wp-block-heading">ライブラリの登録場所とpythonでの実装方法</h3>



<p>ライブラリフォルダは、Fusionが自動作成する、「Scripts」内の自作スクリプトと同じレベルに登録したいと思います</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>D:\Fusion360\Scripts<br>├── 新規スクリプト<br>├── CenterLine # 自作スクリプト<br>│ └── CenterLine.py # X,Y,Zの軸のセンターラインを作成する<br>│<br>├── library # 作成ライブラリ登録フォルダ<br>│ ├── <em>_init_</em>.py # 空ファイル（必要らしい）<br>│ ├── lib_util.py # Component &amp; Sketch 関連関数<br>│ └── lib_2d.py # 点や直線を作成（今後、円、円弧なども追加予定）<br></p>
</blockquote>



<p>私の環境では、このようなイメージです。<br>「library」フォルダ内に「lib_util.py」「lib_2d.py」スクリプトを作成<br>「lib_util.py」は、Component や sketch を提供する基本関数を記述します<br>「lib_2d.py」は、点や直線を扱う関数を作成しますが、<span class="marker-under">「<strong>lib_util.py</strong>」の関数も利用します</span><br>今回はこの二つのライブラリを利用して、 X,Y,Zの軸のセンターラインを作成する「CenterLine /CenterLine.py」スクリプトを作成します</p>



<h3 class="wp-block-heading">実行スクリプトと同じレベルのスクリプトをインポートするには？</h3>



<p>インポートするコードもわからないので、さっそくAiに聞いてみました<br>上記の構造をAiに渡して、実行スクリプト「CenterLine.py」から「lib_util.py」の関数を利用するコードを聞いてみました<br>この場合、正確なディレクトリ構造を取得する事が必要だと言うことで下記コードを教えてもらいました。</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-99ee604cd6fe96d6d4cf1c7e56b1ef5c"><code>current_dir = os.path.dirname(os.path.abspath(__file__))
script_dir = os.path.dirname(current_dir)</code></pre>



<p>この構成はよくライブラリや設定ファイルを<span class="marker-under">相対パスで読み込むときの定番のコード</span>のようです<br>もう少し、詳しく説明してもらいました。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>_file_：現在実行中のPythonスクリプトのファイルパス<br>os.path.abspath(__file__)：絶対パスに変換<br>os.path.dirname(…)：そのファイルが属するディレクトリを取得<br><br>D:/Fusion360/Scripts/<br>├── library/<br>│ └── __init__.py # モジュールの初期化用<br>│ └── lib_util.py<br>│ └── lib_2d.py<br>├── CenterLine/<br>│ └── CenterLine.py ← 実行スクリプト</p>



<p>__file__ → &#8220;./CenterLine/CenterLine.py&#8221;<br>abspath(__file__) → &#8220;D:/Fusion360/Scripts/library/CenterLine/CenterLine.py&#8221;<br>current_dir → &#8220;D:/Fusion360/Scripts/library/CenterLine&#8221;<br>script_dir → &#8220;D:/Fusion360/Scripts/library&#8221;</p>
</blockquote>



<p>このコードで、ライブラリのディレクトリを取り出し、<br>「sys.path.append(script_dir)」でpythonが内部でモジュール検索時に、指定ディレクトリを追加するの意味のようです<br>この設定後に、「from library import lib_util」コードで「library」ディレクトリ内の「lib_util.py」内の関数を使用できるようになります<br>具体的には、下記になります</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-8e2a343bbae44e922fe021104cc52319"><code>import os, sys

current_dir = os.path.dirname(os.path.abspath(__file__))
script_dir = os.path.dirname(current_dir)
sys.path.append(script_dir)
from <strong>library </strong>import <strong>lib_util</strong></code></pre>



<p>これで、新規作成したスクリプトに、このコードを追加すると、「lib_util」内の関数が使えます<br>さらに「lib_2d.py」ライブラリも、「lib_util.py」の関数も利用しますが、こちらは、<span class="marker-under">「lib_util.py」と同じディレクトリ内</span>なので、「script_dir = os.path.dirname(current_dir)」のコードは<span class="marker-under-red">不要</span>になりますね</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-6f026c1782e213cab59b1b4af17510bf"><code>import os, sys
current_dir = os.path.dirname(os.path.abspath(__file__))
<s><strong>#</strong> script_dir = os.path.dirname(current_dir)</s>
sys.path.append(current_dir)
import lib_util
</code></pre>



<p>実際には結構時間がかかったのですが、これで、やっとライブラリが使えるようになりました。<br>本当、Ai様様です。<br>Aiの進歩で、コーディングの勉強は不要だとの意見もありますが、やっぱりコードの意味の理解は必要だと思います。<br>たぶん、Aiもそう思っているのでしょう！詳しいコメントを日本語で追記してくれます。<br>「あなたの言葉でコメントつけるから、覚えてね！」と言ってる気がします。<br>Ai利用でプログラミングの学習速度は、以前よりも圧倒的に速くなると思います</p>



<h2 class="wp-block-heading">ライブラリ利用方法</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>./Scripts/<br>├── 新規スクリプト/ # &lt;&#8212;&#8212;&#8211; Fusion ダイアログで作成<br>│ └── 新規スクリプト.py<br>├── library/ #&lt;&#8212;&#8212;&#8212; Scripts/ 直下に作成<br>│ └── __init__.py # &lt;&#8212;&#8211; 空ファイル追加作成、モジュールの初期化用<br>│ └── lib_util.py # &lt;&#8212;&#8212;- ライブラリファイル<br>│ └── lib_2d.py # &lt;&#8212;&#8212;- ライブラリファイル<br>└── CenterLine/ # &lt;&#8212;&#8212;- 自作スクリプト用<br>│ └── CenterLine.py # &lt;&#8212;&#8212;- 自作スクリプトファイル<br>└─────── </p>
</blockquote>



<p>イメージ的には、このようになります。<br>Fusionで「スクリプトまたはアドイン作成」を実行すると、設定ダイアログが表示され、設定した「フォルダの場所」へ設定した名前のフォルダが自動作成され、さらにその中に、設定した名前.py の実行ファイルが作成されます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="558" height="224" src="https://www.kazuban.com/blog/wp-content/uploads/2025/07/add-ins.png" alt="" class="wp-image-11358" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/07/add-ins.png 558w, https://www.kazuban.com/blog/wp-content/uploads/2025/07/add-ins-500x201.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/07/add-ins-300x120.png 300w" sizes="(max-width: 558px) 100vw, 558px" /></figure>



<p>今回紹介のライブラリは、Fusionで設定した「フォルダの場所」の直下に「library」の名前でフォルダを作成し、さらに「library」の直下に、「__init__.py」「lib_util.py」「lib_2d.py」を作成します<br>「__init__.py」は、空ファイルですが、Aiが言うには、ライブラリを利用する際必要みたいです。<br>「lib_util.py」「lib_2d.py」も一旦空ファイルを作っておいて、下記コードをコピペして保存します</p>



<h2 class="wp-block-heading">ライブラリを利用して、X,Y,Zの座標軸にセンターラインを描く</h2>



<p>まずは、Fusion 「スクリプトとアドイン」で、新規スクリプトを作成します<br>ここでは「CenterLine」という名前にしました。<br>これで、「./Scripts」ディレクトリ内に、「CenterLine/CenterLine.py」が作成されています。<br>CenterLine.pyファイルの内容を、下記コードで上書きして保存します</p>



<h4 class="wp-block-heading">CenterLine.py</h4>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-669094fb191368c9558d98db4e1a51f8"><code>"""This file acts as the main module for this script."""

import traceback
import adsk.core
import adsk.fusion
# import adsk.cam

import os, sys, importlib
#library import
current_dir = os.path.dirname(os.path.abspath(__file__))
script_dir = os.path.dirname(current_dir)
sys.path.append(script_dir)
from library import lib_util,lib_2d

def run(context):
    try:
        lib_2d.draw_center_line(100,100,100)
 
    except:
        lib_util.disp_message('Failed:\n{}'.format(traceback.format_exc()))
</code></pre>



<p>下記が、ライブラリ用スクリプトファイルです</p>



<h4 class="wp-block-heading">lib_util.py</h4>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-e25baaca05132da85fad5d0dc35a19a0"><code>import adsk.core, adsk.fusion, adsk.cam, traceback
from typing import Tuple, Optional

#このライブラリは
#Fusionが作成するスクリプトと同じディレクトリに置かれる事を想定している
#使用する場合には、下記コードにより読み込みパスを追加する
"""
import os, sys, importlib
current_dir = os.path.dirname(os.path.abspath(__file__))
script_dir = os.path.dirname(current_dir)
sys.path.append(script_dir)
from library import lib_util
"""
# ---------------------
## Get Fusion object
# ---------------------
def get_app():
    return adsk.core.Application.get()
def get_design():
    app = get_app() 
    return adsk.fusion.Design.cast(app.activeProduct)
def get_ui():
    app = get_app() 
    return app.userInterface

# ---------------------
## メッセージ表示
# ---------------------
def disp_message(msg: str):
    """ユーザーにメッセージボックスを表示"""
    ui = get_ui()
    if ui:
        ui.messageBox(msg)

# ---------------------
## Component &amp; Sketch Functions
# ---------------------
# /////////////////////////////////////////////////////////////
def get_root_component() -&gt; Optional&#91;adsk.fusion.Component]:
    """ルートコンポーネントを返す"""
    design = get_design()
    return design.rootComponent if design else None

# /////////////////////////////////////////////////////////////
def get_active_component() -&gt; Optional&#91;adsk.fusion.Component]:
    """現在アクティブなコンポーネントを返す"""
    design = get_design()
    return design.activeComponent if design else None

# /////////////////////////////////////////////////////////////
def create_new_component(name: str = 'New_Component') -&gt; Optional&#91;adsk.fusion.Component]:
    """新しいコンポーネントを作成し、アクティブなコンポーネントの配下に追加"""
    component = get_active_component()
    if not component:
        component = get_root_component()
    
    if not component:
        disp_message('コンポーネントが見つかりません。デザインがアクティブか確認してください。')
        return None
    
    try:
        occurrences = component.occurrences
        new_occurrence = occurrences.addNewComponent(adsk.core.Matrix3D.create())
        new_component = new_occurrence.component
        new_component.name = name
        return new_component
    except Exception:
        disp_message(f'新しいコンポーネントの作成に失敗しました:\n{traceback.format_exc()}')
        return None

# /////////////////////////////////////////////////////////////
def get_parent_sketch(obj: any) -&gt; Optional&#91;adsk.fusion.Sketch]:
    """指定されたオブジェクトの親スケッチを取得"""
    return obj.parentSketch if hasattr(obj, 'parentSketch') else None

# /////////////////////////////////////////////////////////////
def create_new_sketch(name: str = 'New_Sketch', plane: str = 'xy') -&gt; Optional&#91;adsk.fusion.Sketch]:
    """指定された平面に新しいスケッチを作成"""
    component = get_active_component()
    if not component:
        component = get_root_component()
    
    if not component:
        disp_message('スケッチを作成するコンポーネントが見つかりません。')
        return None
    
    plane = plane.lower()
    planes_map = {
        "xy": component.xYConstructionPlane,
        "xz": component.xZConstructionPlane,
        "yz": component.yZConstructionPlane
    }
    
    base_plane = planes_map.get(plane)
    if not base_plane:
        disp_message(f"サポートされていない平面: '{plane}' 'xy', 'xz', 'yz' のいずれかを選択してください。")
        return None
        
    try:
        sketches = component.sketches
        sketch = sketches.add(base_plane)
        sketch.name = name
        return sketch
    except Exception:
        disp_message(f'新しいスケッチの作成に失敗しました:\n{traceback.format_exc()}')
        return None

# /////////////////////////////////////////////////////////////
def is_sketch_mode_active() -&gt; Tuple&#91;bool, Optional&#91;adsk.fusion.Sketch]]:
    """現在スケッチモードがアクティブであるかを確認し、スケッチオブジェクトを返す"""
    app = get_app()
    active_object = app.activeEditObject
    # is_instance() を使うことで、より安全に型チェックを行う
    if isinstance(active_object, adsk.fusion.Sketch):
        return True, active_object
    else:
        return False, None

# /////////////////////////////////////////////////////////////
def get_sketch() -&gt; Optional&#91;adsk.fusion.Sketch]:
    """アクティブなスケッチを返す、アクティブでない場合は新しいスケッチを作成"""
    is_active, sketch = is_sketch_mode_active()
    if not is_active:
        sketch = create_new_sketch()
    return sketch
</code></pre>



<h4 class="wp-block-heading">lib_2d.py</h4>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-be5884e5b0d369633af538947edd4e83"><code>import adsk.core, adsk.fusion, adsk.cam, traceback
from typing import Tuple, Optional

# 利用するlib_utilは、このライブラリと同じディレクトリ
import os, sys, importlib
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(current_dir)
import lib_util

# ---------------------
## カスタム、点基本クラス
# ---------------------
# /////////////////////////////////////////////////////////////
class kPoint:
    """3D空間の点を表す基本クラス"""
    def __init__(self, x: float, y: float, z: float = 0.0):
        self.x = x
        self.y = y
        self.z = z

# ---------------------
## カスタム、スケッチ点クラス
# ---------------------
# /////////////////////////////////////////////////////////////
class kSketchPoint(kPoint):
    """Fusion 360 のスケッチ点として使用される座標を、単位とスケッチ平面に応じて変換するクラス"""
    def __init__(self, x: float = 0.0, y: float = 0.0, z: float = 0.0, sketch: Optional&#91;adsk.fusion.Sketch] = None, unit: str = "mm"):
        unit = unit.lower()
        # 単位変換係数を辞書で管理
        scale_factors = {"mm": 0.1, "cm": 1.0, "m": 10.0}
        scale = scale_factors.get(unit, 1.0) # 存在しない単位は1.0 (cm) を使用

        if not sketch:
            sketch = lib_util.get_sketch() # スケッチが指定されていなければ、アクティブなスケッチを取得

        # スケッチ平面に応じて座標系を調整 (XZ平面はY軸が下向き)
        # 参照平面が'XZ'の場合は、y座標を反転させる
        # これはFusion 360の座標系の癖に対応
        direction_y = -1.0 if sketch and sketch.referencePlane.name == "XZ" else 1.0
        
        # 単位と座標系による方向を調整
        converted_x = x * scale
        converted_y = y * scale * direction_y
        converted_z = z * scale
        
        super().__init__(converted_x, converted_y, converted_z)
        self.sketch = sketch
        self.unit = unit
        
# ---------------------
## Sketch Geometry Creation Functions
# ---------------------
# /////////////////////////////////////////////////////////////
def is_equal_sketch_points(sp1: adsk.fusion.SketchPoint, sp2: adsk.fusion.SketchPoint, tolerance: float = 0.0001) -&gt; bool:
    """2つのスケッチ点が指定された許容差内で同じ位置にあるかどうかを判断"""
    # ジオメトリオブジェクトの距離を比較
    distance = sp1.geometry.distanceTo(sp2.geometry)
    return distance &lt; tolerance

# /////////////////////////////////////////////////////////////
def create_sketch_point(x: float = 0, y: float = 0, z: float = 0, sketch: Optional&#91;adsk.fusion.Sketch] = None) -&gt; Optional&#91;adsk.fusion.SketchPoint]:
    """指定された座標にスケッチ点を作成"""
    if not sketch:
        sketch = lib_util.get_sketch()
    
    if not sketch:
        lib_util.disp_message('スケッチがアクティブでないか、新しいスケッチの作成に失敗しました。')
        return None
        
    try:
        # kSketchPoint を使用して単位と平面を考慮した座標を取得
        converted_point = kSketchPoint(x, y, z, sketch)
        # adsk.core.Point3D オブジェクトを作成
        point3d = adsk.core.Point3D.create(converted_point.x, converted_point.y, converted_point.z)
        # スケッチに点を追加
        sketchPoint = sketch.sketchPoints.add(point3d)
        return sketchPoint
    except Exception:
        lib_util.disp_message(f'スケッチ点の作成に失敗しました:\n{traceback.format_exc()}')
        return None

# /////////////////////////////////////////////////////////////
def create_line_from_sketchpoints(sp1: adsk.fusion.SketchPoint, sp2: adsk.fusion.SketchPoint, construction: bool = False, fixed: bool = False) -&gt; Optional&#91;adsk.fusion.SketchLine]:
    """2つの既存のスケッチ点から直線を作成"""
    # 同じスケッチに属しているかチェック
    if lib_util.get_parent_sketch(sp1) != lib_util.get_parent_sketch(sp2):
        lib_util.disp_message('2つの点は異なるスケッチに属しています。')
        return None
        
    # 2つの点が同じ位置にあるかチェック
    if is_equal_sketch_points(sp1, sp2):
        lib_util.disp_message('2つの点が同じ位置にあります。直線を作成できません。')
        return None
        
    sketch = lib_util.get_parent_sketch(sp1)
    if not sketch:
        lib_util.disp_message('親スケッチが見つかりません。')
        return None
        
    try:
        line = sketch.sketchCurves.sketchLines.addByTwoPoints(sp1, sp2)
        line.isConstruction = construction
        line.isFixed = fixed
        return line
    except Exception:
        lib_util.disp_message(f'直線（スケッチ点から）の作成に失敗しました:\n{traceback.format_exc()}')
        return None

# /////////////////////////////////////////////////////////////
def create_line_from_coordinate(x1: float, y1: float, z1: float, x2: float, y2: float, z2: float, sketch: Optional&#91;adsk.fusion.Sketch] = None, construction: bool = False, fixed: bool = False) -&gt; Optional&#91;adsk.fusion.SketchLine]:
    """座標から直接、スケッチ直線を作成"""
    if not sketch:
        sketch = lib_util.get_sketch()

    if not sketch:
        return None

    # ヘルパー関数を利用して点を先に作成
    p1 = create_sketch_point(x1, y1, z1, sketch)
    p2 = create_sketch_point(x2, y2, z2, sketch)
    
    if p1 and p2:
        return create_line_from_sketchpoints(p1, p2, construction, fixed)
    else:
        lib_util.disp_message('直線を作成するための点の作成に失敗しました。')
        return None

# /////////////////////////////////////////////////////////////
def create_line_from_points(p1: kPoint, p2: kPoint, sketch: Optional&#91;adsk.fusion.Sketch] = None, construction: bool = False, fixed: bool = False) -&gt; Optional&#91;adsk.fusion.SketchLine]:
    """カスタム `kPoint` オブジェクトからスケッチ直線を作成"""
    if not sketch:
        sketch = lib_util.get_sketch()
    
    if not sketch:
        return None
        
    return create_line_from_coordinate(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, sketch, construction, fixed)

# /////////////////////////////////////////////////////////////
def draw_center_line(widthX=100,widthY=100,widthZ=100):
    """センターライン作成"""
    widthX = 100 if widthX == 0 else widthX
    widthY = 100 if widthY == 0 else widthY
    widthZ = 100 if widthZ == 0 else widthZ
    wx=widthX/2
    wy=widthY/2
    wz=widthZ/2
    sketch = lib_util.get_sketch()
    xp1 = kPoint(-wx,0)
    xp2 = kPoint(wx,0)
    yp1 = kPoint(0,-wy)
    yp2 = kPoint(0,wy)
    zp1 = kPoint(0,0,-wz)
    zp2 = kPoint(0,0,wz)
    create_line_from_points(xp1,xp2,sketch,True,True) #X Axis
    create_line_from_points(yp1,yp2,sketch,True,True) #Y Axis
    create_line_from_points(zp1,zp2,sketch,True,True) #Z Axis
</code></pre>



<h2 class="wp-block-heading">注意点</h2>



<p>実は、まだ解決できていない注意点があります<br>通常のライブラリ使用では問題ないと思いますが、Fusionでライブラリを利用したスクリプトを実行後、<span class="marker-under-red">ライブラリ内スクリプトを編集しても、編集内容が反映されません。</span><br>Aiに聞いてみると、Fusionの仕様でキャッシュが優先されているとの事です<br>キャッシュクリアのコードも教えてもらいましたが、現状では反映されません。<br><span class="marker-under-red">ライブラリの編集を反映させるには、Fusionを再起動</span>させるとキャッシュがクリアされ反映されます<br>ライブラリを試行錯誤している場合でも、ちょっと面倒です。<br>いい方法は、ないのかなぁ～？？</p>



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



<p>pythonはド素人なので、勉強もかねて、Ai にコーディングを教えてもらいながら、FusionのComponentやsketch、直線作成などの関数をライブラリ化してみました。<br>Fusionオブジェクトモデルは、広範囲で奥が深いので、探すのも大変です。<br>よく使いそうな関数を、まとめたので、少しは取り組みやすくなるのではないか？と思っています。<br>今後も進化させようと思っていますが、Aiがなかったら、ここまで完成できなかったと思います。<br>ここで紹介しているコードも、一旦自分なりに作成したスクリプトを、Aiに張り付けて、添削してもらったコードを再編集したものです。<br>関数名やコメントの書き方なども、pythonの慣習を教えてもらい参考にしています</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AIに教えてもらいながら、どうにかUbuntu上の Docker EngineでDifyをサーバー化できた。</title>
		<link>https://www.kazuban.com/blog/ubuntu-dockerengine-dify/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Mon, 05 May 2025 01:17:22 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[Linux (CentOS、Rocky、Ubuntu)]]></category>
		<category><![CDATA[AIとのやり取り]]></category>
		<category><![CDATA[Dify]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[ubuntu24]]></category>
		<category><![CDATA[wsl]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=11029</guid>

					<description><![CDATA[前回までで、「Docker Engine」の設定は完了しています。今回は、「Docker」で「Dify」を起動させサーバー化が目的です。実現するにあたって、かなりAIに助けてもらったので、そのやり取りも紹介しています。  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><a href="https://www.kazuban.com/blog/wsl-ubuntu-dockerengine/">前回までで、「Docker Engine」の設定は完了しています。</a><br>今回は、「Docker」で「Dify」を起動させサーバー化が目的です。<br>実現するにあたって、かなりAIに助けてもらったので、そのやり取りも紹介しています。</p>



<h2 class="wp-block-heading">Difyをクローン化</h2>



<h3 class="wp-block-heading">gitの確認</h3>



<p>difyをクローン化するのに、「git」を利用するので、「git」のインストール状況を確認します。<br>windows ターミナルを開き、wsl を起動し、「git -v」で状況を確認します。</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-6c280a658549c20db340281f1ee6bbdb"><code>PS C:\Users\hogehoge2&gt; wsl

$ git -v
git version 2.43.0
インストールされていない場合には、インストール
$ sudo apt update
$ sudo apt install git</code></pre>



<h3 class="wp-block-heading">Gitでdifyをクローン化する</h3>



<p>「git clone ・・」でクローン化を実行すると、カレントディレクト下「dify」ディレクトリへソースコードがクローン化されます。<br>windowsターミナルで、「wsl」を実行し、ubuntu環境へ入ると、デフォルトでは、winndowsユーザーのディレクトリへセットされた状態で起動します。<br>好みの問題だと思いますが、この場所へ「dify」環境を作成してもいいと思いますが、筆者はubuntuのユーザーホームディレクトリ下に作成しようと思います。<br>wsl、ubuntuプロンプトで、「cd」を実行すると、ユーザーのホームディレクトリへ移動します。<br>その場所で「git clone・・」すると、そのディレクトリ直下に「dify」さらにその下に「docker」ディレクトリが作成されています。<br>「ls」コマンドで確認できます。<br>「dify/docker」ディレクトリへ「cd」コマンドで移動しておきます。<br>「pwd」コマンドで、現在のディレクトリが確認できます。</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-ad68e176018c4225a713c543c2c82523"><code>hogehoge2@hoge-PC:/mnt/c/Users/hogehoge2$
$ cd
$ git clone https://github.com/langgenius/dify.git
Cloning into 'dify'...
remote: Enumerating objects: 153846, done.
remote: Counting objects: 100% (536/536), done.
remote: Compressing objects: 100% (359/359), done.
remote: Total 153846 (delta 396), reused 178 (delta 177), pack-reused 153310 (from 3)
Receiving objects: 100% (153846/153846), 87.73 MiB | 5.07 MiB/s, done.
Resolving deltas: 100% (111131/111131), done.
$ ls
dify
$ cd dify/docker/
$ pwd
/home/hogehoge2/dify/docker</code></pre>



<h2 class="wp-block-heading">Difyコンテナ起動</h2>



<p>「git clone」を実行したディレクトリに、「dify/docker」ディレクトリが作成されています。<br>その中に「.env.example」のサンプル環境変数ファイルが作成されています。<br>通常ファイルは「ls」コマンドで確認できますが。「.」で始まるファイルは表示されません。<br>その場合「ls -la」コマンドを実行すると、表示されます。<br>コピーは「cp &lt;オリジナルファイル名&gt;　&lt;複写ファイル名&gt;」で複写できます。<br>「.env.example」ファイルを、正式な環境変数「.env」としてコピーし、「docker compose」コマンドで、コンテナを起動させます。</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-69212d483fca0e2e7f0922dbf0b0ff47"><code>$ pwd
/home/hogehoge2/dify/docker
$ cp .env.example .env
$ docker compose up -d
&#91;+] Running 80/80    
✔ web Pulled             149.7s
✔ sandbox Pulled         221.1s
 ✔ ssrf_proxy Pulled      88.2s
 ✔ db Pulled             224.4s
 ✔ worker Pulled         402.2s
 ✔ plugin_daemon Pulled  404.6s
 ✔ nginx Pulled           36.4s
 ✔ weaviate Pulled       225.1s
 ✔ redis Pulled          221.2s
 ✔ api Pulled            402.2s
&#91;+] Running 12/12
 ✔ Network docker_default             Created    0.1s
 ✔ Network docker_ssrf_proxy_network  Created    0.0s
 ✔ Container docker-web-1             Started    3.7s
 ✔ Container docker-ssrf_proxy-1      Started    4.0s
 ✔ Container docker-sandbox-1         Started    3.7s
 ✔ Container docker-redis-1           Started    3.7s
 ✔ Container docker-weaviate-1        Started    3.7s
 ✔ Container docker-db-1              Healthy    10.7s
 ✔ Container docker-worker-1          Started    9.3s
 ✔ Container docker-plugin_daemon-1   Started    9.3s
 ✔ Container docker-api-1             Started    9.5s
 ✔ Container docker-nginx-1           Started    10.0s
</code></pre>



<h3 class="wp-block-heading">docker compose upでエラー発生！AIに聞いてみる。</h3>



<p>上記は正常な例ですが、古いPCをテストマシンとして利用した時、「docker compose up」で下記エラーがでた事がありました。</p>



<blockquote class="wp-block-quote has-vivid-red-color has-watery-red-background-color has-text-color has-background has-link-color wp-elements-663148c1df4e9167eb9abd3e83e97fcc is-layout-flow wp-block-quote-is-layout-flow">
<p>dependency failed to start: container docker-db-1 is unhealthy</p>
</blockquote>



<p>この時もgeminiに聞いてみたところ、「docker logs docker-db-1」でログを確認してくれとの事なので、ログを直接貼り付けると、</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-3 sbs-line sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon" style="--cocoon-custom-background-color:#fff7cc"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2025/04/Robot-icon.png" alt="Ai" class="speech-icon-image"/></figure><div class="speech-name">Ai</div></div><div class="speech-balloon has-background has-watery-yellow-background-color">
<p>ログを見る限り、データベースの初期化自体は正常に完了しています (<code>PostgreSQL init process complete; ready for start up.</code>)。 その後の起動プロセスも進んでいますが、<strong><code>2025-04-29 00:02:07.998 UTC [557] FATAL: the database system is starting up</code></strong> という致命的なエラーが出力されています。</p>



<p>このエラーは、PostgreSQLサーバーが起動してリカバリなどの内部処理を行っている最中に、外部からの接続要求（この場合はおそらくDockerのヘルスチェックや、依存するDifyコンテナからの初期接続試行）があった場合に発生することがあります。</p>



<p>つまり、データベースサーバー自体は最終的に <code>database system is ready to accept connections</code> の状態になりますが、Dockerのヘルスチェックがサーバーの準備が完全に整う前に接続を試み、上記の <code>FATAL</code> エラーを受け取ってしまい、それが原因でコンテナが <code>unhealthy</code> と判定されている可能性が高いです。<br><br><strong>解決策:</strong></p>



<p>Dockerのヘルスチェック設定を調整し、データベースが完全に起動して接続可能になるまで、チェックを待つように設定を変更するのが最も有効な対策です。</p>



<p><strong>データベースサービス (db または postgresql) の <code>healthcheck</code> 設定を見つける:</strong> <br><code>services</code> のセクションにある、データベースコンテナに対応するサービス定義（通常は <code>db</code> という名前）を探します。その中に <code>healthcheck</code> というブロックがあるはずです。<br><br><strong>YAML</strong><br><code>services: </code><br><br><code>db: # ... その他の設定 ...</code><br><code>  healthcheck: # ここに設定があります </code><br>　　・<br><code>    test: ["CMD-EXEC", "pg_isready -U &lt;db_user&gt; -d &lt;db_name&gt;"] # 例 </code><br><code>    interval: 10s </code><br><code>    timeout: 5s </code><br><code>    retries: 5 </code><br><code>    start_period: 30s # &lt;-- この値を調整します</code></p>



<p><strong><code>docker-compose.yml</code> を開く:</strong> Difyを起動するために使用している <code>docker-compose.yml</code> ファイルをテキストエディタで開きます。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-5 sbs-flat sbp-r sbis-cb cf block-box not-nested-style cocoon-block-balloon" style="--cocoon-custom-background-color:#dddddd"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/themes/cocoon-master/images/ojisan.png" alt="じじぃ" class="speech-icon-image"/></figure><div class="speech-name">じじぃ</div></div><div class="speech-balloon has-background has-light-grey-background-color">
<p>docker-compose.yamlを確認した所、「<code>start_period:</code>」の設定がありません。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-3 sbs-line sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon" style="--cocoon-custom-background-color:#fff7cc"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2025/04/Robot-icon.png" alt="Ai" class="speech-icon-image"/></figure><div class="speech-name">Ai</div></div><div class="speech-balloon has-background has-watery-yellow-background-color">
<p><code>start_period</code> が指定されていない場合、コンテナが起動を開始すると同時にヘルスチェックが始まります。今回のデータベースのログで見たように、起動直後の一時的な準備期間中に接続を試みると <code>FATAL: the database system is starting up</code> のようなエラーが発生することがあります。</p>



<p><code>interval: 1s</code> と非常に短い間隔でチェックが実行されるため、データベースが完全に準備できる前に多くのチェックが走ってしまい、すぐにリトライ回数（<code>retries: 60</code>）を使い果たして <code>unhealthy</code> と判定されてしまう可能性が高いです。</p>



<p><strong>解決策:</strong></p>



<p><code>start_period</code> を追加し、必要に応じて <code>interval</code> も調整しましょう。</p>



<ol class="wp-block-list">
<li><strong><code>healthcheck</code> 設定に <code>start_period</code> を追加する:</strong> データベースが起動して準備ができるまでの猶予期間として、<code>start_period</code> を設定します。<br>例えば <code>30s</code> または <code>60s</code> (30秒または60秒) を指定します。 <br><strong>YAML</strong><br><code>services: </code><br><code>db: # ... その他の設定 ... </code><br><br><code>  healthcheck: </code><br><code>    test: [ 'CMD', 'pg_isready', '-h', 'db', '-U', '${PGUSER:-postgres}', '-d', '${POSTGRES_DB:-dify}' ] </code><br><code>    interval: 5s # 例: 毎秒ではなく5秒ごとにチェックに緩和 </code><br><code>    timeout: 3s </code><br><code>    retries: 10 # 例: リトライ回数を調整 (intervalを長くすればretriesは少なくても良い) </code><br><code>    start_period: 60s # &lt;- この行を追加 (例: 60秒待つ)</code> <br><br><strong>ポイント:</strong> <code>start_period</code> の間は、ヘルスチェックが失敗してもコンテナは <code>starting</code> 状態のままとなり、<code>unhealthy</code> とは判定されません。<code>start_period</code> が経過した後に初めて、ヘルスチェックの失敗が <code>unhealthy</code> の判定に使われます。</li>



<li><strong><code>interval</code> も少し長めにすることをお勧めします:</strong> <code>interval: 1s</code> は開発時などに素早く確認したい場合には便利ですが、本番に近い環境や安定性を重視する場合は <code>5s</code> や <code>10s</code> に設定することが一般的です。これにより、データベースへの不要な負荷も軽減されます。</li>



<li><strong><code>docker-compose.yml</code> を保存する。</strong></li>



<li><strong>Docker Compose を再起動する:</strong> 変更を反映させるために、コンテナを再作成して起動します。</li>
</ol>
</div></div>



<p>アドバイス通りに、編集して再度「docker compose up -d」を実行すると、正常になりました。<br>いやぁ～、AIさまさま、ですね～<br>おそらく、ネット検索では、解決できなかったと思います。<br>ただし、古いPCだったのが、一番の原因かもしれません。<br>５年ほど前のPCでは、このエラーはでなかったので、レアなケースかもしれませんが、AIの利用例として紹介しました。</p>



<h2 class="wp-block-heading">Dify起動</h2>



<h3 class="wp-block-heading">初期画面</h3>



<p>「docker compose up」が正常に終了すると、Webブラウザで「http://localhost/install」へアクセスすると「dify」の初期設定が開きます</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="755" src="https://www.kazuban.com/blog/wp-content/uploads/2025/04/dify-localhost-800x755.png" alt="" class="wp-image-11052" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/04/dify-localhost-800x755.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/04/dify-localhost-500x472.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/04/dify-localhost-300x283.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/04/dify-localhost-768x725.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/04/dify-localhost.png 1200w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<h3 class="wp-block-heading">Difyの動作と試用</h3>



<p>とりあえず、起動しました。<br>以前このサイトでも説明していますが、<a href="https://www.kazuban.com/blog/dify-lmstudio/#toc1">簡単なチャットボットを作成</a>し試してみます。<br>LLMモデルはオンラインの「gemini」を登録し、動作を確認できました。<br>オンラインであれば、「LM Studio」や「Ollama」など、ローカルLLMを利用するアプリは必要ないので、すぐに確認できます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="571" src="https://www.kazuban.com/blog/wp-content/uploads/2025/04/dify-fist-try-800x571.png" alt="" class="wp-image-11056" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/04/dify-fist-try-800x571.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/04/dify-fist-try-500x357.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/04/dify-fist-try-300x214.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/04/dify-fist-try-768x548.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/04/dify-fist-try.png 1577w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<h2 class="wp-block-heading">Difyを自動起動</h2>



<p><span class="marker-under">Difyを動作させるには、Dockerが起動していなくてはいけません。</span><br>それには、WSL上で、ubuntuも起動している必要があります。<br>手動でやる場合、</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>・windowsターミナル起動<br>・wslコマンドで、ubuntuターミナル起動<br>・ubuntuターミナルでカレントディレクトリを、Difyのクローンディレクトリに移動<br>・「docker compose up -d」 コマンド実行</p>
</blockquote>



<p>このような手順が必要ですが、問題なのは、<span class="marker-under-red">ターミナルを閉じるとdockerも終了してしまう</span>ことです<br>Difyを使うには、dockerが起動していなくてはいけません。<br>windowsアプリの「docker desktop」であれば、標準で自動起動設定だったと思いますし、起動後もシステムトレイのアイコンで起動が確認できます。右ボタンで状態確認や終了も簡単です。<br>ubuntu経由の場合には、GUIでの確認ができないので、ここが面倒なところですね～。<br>自動起動方法をいろいろ調べると、windowsバッチファイルを作成し、スタートアップフォルダに登録する事で、windows起動時に、自動起動できそうです。<br>ただ、<br>「コマンドプロンプト　⇒　ubuntuターミナル　⇒　docker」<br>のタスクが必要で、<span class="marker-under-red">ターミナルは開いた状態にしておく</span>必要があります。<br>このようなバッチファイルを作りたいですが、どんなコードにすればいいのか・・？<br>うまいコードを考え付かなかったので、difyの試しもかねて起動しているチャットボットで設定しているgeminiに考えてもらいました。</p>



<pre class="wp-block-code has-black-color has-watery-yellow-background-color has-text-color has-background has-link-color wp-elements-28b6e40086f38030cefb644c1904cdfc"><code>@echo off
title Starting Dify via WSL

echo Starting WSL and navigating to ~/dify/docker...
echo Running 'docker compose up -d'...
echo WSL window will remain open after commands.

REM WSLを起動し、bashシェル内でコマンドを実行します。
REM cd ~          : ホームディレクトリに移動 (念のため)
REM cd ./dify/docker : dify/docker ディレクトリに移動
REM docker compose up -d : docker compose をバックグラウンドで起動
REM exec bash     : 上記コマンド実行後、インタラクティブなbashシェルを開始して終了させない
wsl.exe -e bash -c "cd ~/dify/docker &amp;&amp; docker compose up -d &amp;&amp; echo '--- Dify containers started (or attempted to start) ---' &amp;&amp; exec bash"

echo WSL window launched. This batch window can be closed if desired.
REM pause REM Optionally uncomment this line to keep the batch window open until a key is pressed</code></pre>



<p>すごいです。<br>ほとんど実際の起動には影響がない「REM」や「echo」文がほとんどですが、<br>「REM」文を使っての説明文や、「echo」での実行中のメッセージにも手抜きがないですね！<br>このコードをコピーしてエディターで、「start_dify.bat」というファイルで保存しました。<br>バッチファイルの単独実行では問題ありませんでした。<br>後はこのファイルのショートカットを、スタートアップフォルダへコピーするだけです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>・上記の作成したバッチファイルを、適当は場所へ保存します<br>　私は、ユーザーフォルダ「C:\Users\「ユーザー」」へ保存しました。<br>・次に、このファイルのショートカットを作成します。<br>・このショートカットを「スタートアップフォルダ」へ保存します。<br>　スタートアップフォルダは、エクスプローラーのアドレスバーへ「shell:startup」と入力すると開くことができます。</p>
</blockquote>



<div class="wp-block-media-text is-stacked-on-mobile is-vertically-aligned-top"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="622" height="989" src="https://www.kazuban.com/blog/wp-content/uploads/2025/04/startup-folder.png" alt="" class="wp-image-11070 size-full" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/04/startup-folder.png 622w, https://www.kazuban.com/blog/wp-content/uploads/2025/04/startup-folder-500x795.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/04/startup-folder-300x477.png 300w" sizes="(max-width: 622px) 100vw, 622px" /></figure><div class="wp-block-media-text__content">
<p>特に必須ではないですが、ターミナルは起動状態にさせるので邪魔になる場合、作成したショートカットファイルを、マウス右ボタンで「プロパティ」を開きます。<br>「プロパティ」の「ショートカット」タブの<span class="marker-under">「実行時の大きさ」を「最小化」</span>に設定すると、起動時にタスクバーに最小化状態で起動できます。</p>
</div></div>



<p>これで、再起動すると、自動起動したターミナルはタスクバーへ最小化状態ですが、環境によっては起動途中の場合があるので、すぐに使用したい場合には、一度開いてDockerの状態を確認したほうがいいと思います。<br>正常に起動できると、Webブラウザのアドレスバーに「http://localhost/install」でdifyが起動できます。<br>場合によっては、「http://localhost/signin」にリダイレクトされる場合もあります</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="732" src="https://www.kazuban.com/blog/wp-content/uploads/2025/04/localhost-signin-800x732.png" alt="" class="wp-image-11073" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/04/localhost-signin-800x732.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/04/localhost-signin-500x458.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/04/localhost-signin-300x275.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/04/localhost-signin-768x703.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/04/localhost-signin.png 875w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>この画面が開くと、ローカルPCでは、Difyを利用する事ができますが、<span class="marker-under">今回はサーバーとして利用したい</span>ので、<span class="marker-under-red">LAN上の別のPCからのアクセスも必要</span>です。</p>



<h2 class="wp-block-heading">Difyをサーバー化して、他のPCからもアクセスさせる</h2>



<p>同じLAN上であっても、「localhost」では、他のPCではアクセスできません。<br><a href="https://www.kazuban.com/blog/wsl-ubuntu-dockerengine/#toc15">前回後半で少し話題にしました</a>が、「windowsホスト」「WSL(ubuntu)」「Docker」と複雑な通信環境なので面倒です。</p>



<h3 class="wp-block-heading">DifyPCのIPアドレス調査</h3>



<p>IPアドレスは、windowsターミナルでは「ipconfig」コマンド<br>WSLターミナルでは、「ip addr」で確認できます。<br>この情報を、Aiに添付して聞いてみました。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-3 sbs-line sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon" style="--cocoon-custom-background-color:#fff7cc"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2025/04/Robot-icon.png" alt="Ai" class="speech-icon-image"/></figure><div class="speech-name">Ai</div></div><div class="speech-balloon has-background has-watery-yellow-background-color">
<p>詳細な情報ありがとうございます！ipconfig と ip a の結果から状況がより明確になりました。<br>原因の特定<br>・Windows ホスト:<br>　あなたの Windows PC の Wi-Fi アダプターには 192.168.0.94 という IP アドレスが割り当てられています。<br>　これはご自宅などの LAN 内の IP アドレスです。<br>・WSL (Ubuntu):<br>　Windows Subsystem for Linux (WSL) 環境内の Ubuntu には、eth0 インターフェースに 172.31.226.6 という IP アドレスが割り当てられています。<br>　これは WSL が使用する仮想ネットワーク内の IP アドレスです。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-3 sbs-line sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon" style="--cocoon-custom-background-color:#fff7cc"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2025/04/Robot-icon.png" alt="Ai" class="speech-icon-image"/></figure><div class="speech-name">Ai</div></div><div class="speech-balloon has-background has-watery-yellow-background-color">
<p>WSL2 環境で Docker コンテナを動かしている場合、Windows ホストからそのコンテナ内のサービスにアクセスするには、通常以下のいずれかのアドレスを使用します。<br>１．localhost: <br>　Windows ホストのブラウザで http://localhost/chat/&#8230;と入力する。<br>　WSL2 は localhost 経由でのポートフォワーディングをサポートしています。 <br>　（これが最も一般的な方法です）<br>２．WSL の IP アドレス: http://172.31.226.6/chat/&#8230;<br>　(今回アクセスできている方法)<br><br>・http://192.168.0.94/chat/&#8230; でアクセスできないのは、WSL2 と Docker のネットワークアーキテクチャ上、自然なことです。<br>サービスが Windows ホストの物理的な IP アドレスに直接公開されているわけではないためです。<br>・もし、LAN 内の他の PC (例: 192.168.0.100) からもこの Dify 環境にアクセスしたい場合は、追加の設定が必要になる可能性があります:<br><br>１．Windows ファイアウォールの設定: Windows のファイアウォールで、外部からのポート 80 (または Dify が使用しているポート) への着信接続を許可する必要があります。<br>２．ポートフォワーディング (状況による): WSL2 のネットワーク設定によっては、Windows ホストの 192.168.0.94 のポート 80 へのアクセスを、WSL の 172.31.226.6 のポート 80 へ転送する設定が必要になる場合があります。<br>これは 「netsh interface portproxy」 コマンドなどで設定できますが、まずは localhost や WSL の IP でアクセスできることを確認するのが先決です。<br><br>要約:<br>・Windows ホストからアクセスする場合: http://localhost/chat/… または http://172.31.226.6/chat/… を使用してください。<br>・http://192.168.0.94/chat/&#8230; でアクセスできないのは仕様であり、問題ではありません。<br></p>
</div></div>



<h3 class="wp-block-heading">Windowsのアドレスからは、アクセスできない。</h3>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-5 sbs-flat sbp-r sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/themes/cocoon-master/images/ojisan.png" alt="じじぃ" class="speech-icon-image"/></figure><div class="speech-name">じじぃ</div></div><div class="speech-balloon">
<p>http://localhost や http://172.31.226.6 からはアクセスできています。<br>今回は、LAN上の別のPCからhttp://192.168.0.94 にアクセスしたいため、自分PCで試したら、アクセスできませんでした</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-3 sbs-line sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon" style="--cocoon-custom-background-color:#fff7cc"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2025/04/Robot-icon.png" alt="Ai" class="speech-icon-image"/></figure><div class="speech-name">Ai</div></div><div class="speech-balloon has-background has-watery-yellow-background-color">
<p>なるほど、LAN上の他のPCからアクセスできるようにしたい、ということですね。承知いたしました。</p>



<p>ご自身のPC (<code>192.168.0.94</code>) から <code>http://192.168.0.94/chat/...</code> にアクセスできなかったのは、まさにその設定がまだされていないためです。Windowsホストのネットワーク(<code>192.168.0.x</code>) と WSL内部のネットワーク (<code>172.31.x.x</code>) は分離されており、外部（LANを含む）から直接WSL内のサービスにアクセスするには、「ポートフォワーディング（ポート転送）」という設定が必要になります。</p>



<p><strong>設定手順</strong></p>



<p>以下の手順を<strong>管理者権限</strong>で実行してください。</p>



<ol class="wp-block-list">
<li><strong>Difyが使用しているポートを確認 (重要):</strong>
<ul class="wp-block-list">
<li>まず、DifyがWSL内でどのポート番号で待ち受けているか確認します。HTTPなので通常は <strong>80番</strong> ですが、Dockerの設定によっては異なるポート（例: 3000番など）がホスト(WSL)に公開されている場合があります。</li>



<li>Docker Composeを使っている場合は <code>docker-compose.yml</code> ファイルの <code>ports:</code> セクションを確認してください。例えば <code>ports: - "80:80"</code> や <code>ports: - "3000:80"</code> のようになっています。左側の数字がWSL側で公開されているポート番号です。</li>



<li><code>docker ps</code> コマンドを実行しても確認できます。<code>PORTS</code> 列に <code>0.0.0.0:80-&gt;80/tcp</code> や <code>0.0.0.0:3000-&gt;80/tcp</code> のように表示されます。<code>0.0.0.0:</code> の後の数字がWSL側で公開されているポート番号です。</li>



<li><strong>以降の説明では、Difyがポート <code>80</code> を使用していると仮定します。もし異なるポート（例: 3000）だった場合は、コマンド内の <code>80</code> をその番号に読み替えてください。</strong></li>
</ul>
</li>



<li><strong>Windows ファイアウォールでポートを開放:</strong>
<ul class="wp-block-list">
<li>LAN内の他のPCからのアクセスを許可するために、WindowsのファイアウォールでDifyが使用するポート（ここでは80番）を開ける必要があります。</li>



<li><strong>管理者としてPowerShellを開き</strong>、以下のコマンドを実行します。<br><code>powershell New-NetFirewallRule -DisplayName "Allow Dify Access from LAN" -Direction Inbound -LocalPort 80 -Protocol TCP -Action Allow</code><br><em>(もしコマンドプロンプトを使いたい場合は、管理者として開き <code>netsh advfirewall firewall add rule name="Allow Dify Access from LAN" dir=in action=allow protocol=TCP localport=80</code> を実行)</em></li>
</ul>
</li>



<li><strong>ポートフォワーディングの設定:</strong>
<ul class="wp-block-list">
<li>Windowsホスト (<code>192.168.0.94</code>) のポート80に来た通信を、WSL (<code>172.31.226.6</code>) のポート80に転送するように設定します。</li>



<li><strong>管理者としてPowerShell（またはコマンドプロンプト）を開き</strong>、以下のコマンドを実行します。 <code>powershell netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=172.31.226.6</code>
<ul class="wp-block-list">
<li><code>listenport=80</code>: Windows側で外部からの接続を待ち受けるポート番号。</li>



<li><code>listenaddress=0.0.0.0</code>: Windowsの全てのIPアドレス（<code>192.168.0.94</code> を含む）で待ち受ける設定。特定のIP (<code>192.168.0.94</code>) だけを指定することも可能です。</li>



<li><code>connectport=80</code>: 転送先のWSL内でDifyが待ち受けているポート番号。</li>



<li><code>connectaddress=172.31.226.6</code>: 転送先のWSLのIPアドレス。</li>
</ul>
</li>
</ul>
</li>



<li><strong>動作確認:</strong>
<ul class="wp-block-list">
<li>設定後、まずご自身のPCのブラウザから <code>http://192.168.0.94/chat/84aj9r6azPSYjXt8</code> にアクセスできるか試してください。 (ポートが80以外の場合は <code>http://192.168.0.94:ポート番号/chat/...</code> のように指定)</li>



<li>アクセスできれば、LAN内の他のPCからも同じアドレス (<code>http://192.168.0.94/chat/...</code>) でアクセスできるはずです。</li>
</ul>
</li>
</ol>



<p><strong>注意点:</strong></p>



<ul class="wp-block-list">
<li><strong>WSLのIPアドレスの変動:</strong> WSLを再起動すると、WSLのIPアドレス (<code>172.31.226.6</code>) が変わる可能性があります。もしアクセスできなくなった場合は、<code>ip a</code> コマンドでWSLの新しいIPアドレスを確認し、手順3のポートフォワーディング設定を一度削除して再作成する必要があります。
<ul class="wp-block-list">
<li>削除コマンド: <code>netsh interface portproxy delete v4tov4 listenport=80 listenaddress=0.0.0.0</code></li>



<li>再作成コマンド: (新しい <code>connectaddress</code> を指定して再度実行)</li>
</ul>
</li>



<li><strong>管理者権限:</strong> ファイアウォールとポートフォワーディングの設定には管理者権限が必要です。</li>



<li><strong>ポート番号:</strong> Difyが使用しているポート番号を正確に確認し、コマンド内の <code>80</code> を適宜修正してください。</li>
</ul>



<p>この手順で、LAN内の他のPCからアクセスできるようになるはずです。試してみてください。</p>
</div></div>



<h3 class="wp-block-heading"><em>docker ps コマンドで実行中のコンテナーを提出</em></h3>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-5 sbs-flat sbp-r sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/themes/cocoon-master/images/ojisan.png" alt="じじぃ" class="speech-icon-image"/></figure><div class="speech-name">じじぃ</div></div><div class="speech-balloon">
<p>docker ps では下記になっています。<br>$ docker ps<br>・・<br>・<br>・</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-3 sbs-line sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon" style="--cocoon-custom-background-color:#fff7cc"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2025/04/Robot-icon.png" alt="Ai" class="speech-icon-image"/></figure><div class="speech-name">Ai</div></div><div class="speech-balloon has-background has-watery-yellow-background-color">
<p><code>docker ps</code> の出力結果、ありがとうございます。</p>



<p>コンテナ <code>docker-nginx-1</code> の <code>PORTS</code> 列にご注目ください。</p>



<pre class="wp-block-code"><code>PORTS
0.0.0.0:80-&gt;80/tcp, &#91;::]:80-&gt;80/tcp, 0.0.0.0:443-&gt;443/tcp, &#91;::]:443-&gt;443/tcp</code></pre>



<p>これは、以下のことを意味しています。</p>



<ul class="wp-block-list">
<li><code>0.0.0.0:80-&gt;80/tcp</code>: WSLホスト（<code>172.31.226.6</code> など）の <strong>ポート 80</strong> (HTTP) へのTCP接続を、<code>docker-nginx-1</code> コンテナ内部のポート 80 に転送する。</li>



<li><code>[::]:80-&gt;80/tcp</code>: 上記のIPv6版。</li>



<li><code>0.0.0.0:443-&gt;443/tcp</code>: WSLホストの <strong>ポート 443</strong> (HTTPS) へのTCP接続を、<code>docker-nginx-1</code> コンテナ内部のポート 443 に転送する。</li>



<li><code>[::]:443-&gt;443/tcp</code>: 上記のIPv6版。</li>
</ul>



<p><code>docker-web-1</code> コンテナ自体は内部的にポート 3000 を使っていますが、外部（WSLホスト）からのアクセスは <code>docker-nginx-1</code> コンテナがポート 80 (HTTP) と 443 (HTTPS) で受け付けています。Nginx がリバースプロキシとして動作し、リクエストを <code>docker-web-1</code> や <code>docker-api-1</code> などに振り分けている構成です。</p>



<p><strong>結論</strong></p>



<p>あなたが LAN 上の他の PC からアクセスしたい <strong>HTTP</strong> のポート番号は <strong>80</strong> です。</p>



<p>したがって、先ほどのポートフォワーディング設定のコマンドは、ポート番号 <code>80</code> を使って実行してください。</p>



<ol class="wp-block-list">
<li><strong>ファイアウォール開放 (ポート 80):</strong> <code>New-NetFirewallRule -DisplayName "Allow Dify Access from LAN (HTTP)" -Direction Inbound -LocalPort 80 -Protocol TCP -Action Allow</code></li>



<li><strong>ポートフォワーディング設定 (ポート 80):</strong><br><code>powershell netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=172.31.226.6</code></li>
</ol>



<p>これで、 <code>http://192.168.0.94</code> (ポート80は省略可能) でアクセスできるはずです。</p>



<p>もし将来的にHTTPS (<code>https://192.168.0.94</code>) でアクセスしたい場合は、同様にポート <code>443</code> 用のファイアウォールルールとポートフォワーディング設定を追加する必要があります。</p>
</div></div>



<h3 class="wp-block-heading">ファイヤーウォールとポートフォワーディング設定</h3>



<p><span class="marker-under-red">ファイアウォールを開放</span>し、<span class="marker-under-red">ポートフォワーディング設定をしろ</span>、のアドバイスです。<br>教わったコードを実行してみます。</p>



<h4 class="wp-block-heading">１．ファイアウォール開放 (ポート 80):</h4>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-2a1baa688c4d7f0081410424df4fffa6"><code>PowerShell
PS C:\Users\hoge2&gt;　New-NetFirewallRule -DisplayName "Allow Dify Access from LAN (HTTP)" -Direction Inbound -LocalPort 80 -Protocol TCP -Action Allow</code></pre>



<p>コントロールパネル→システムとセキュリティ→windows Defender ファイアウォール→詳細設定<br>受信の規則で<br>コマンドで指定したAllow Dify Access from LAN(HTTP)が設定されているのが、確認できます。<br>コマンドではなく、この画面で、GUI設定する事もできます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="638" src="https://www.kazuban.com/blog/wp-content/uploads/2025/05/defender-800x638.png" alt="" class="wp-image-11155" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/05/defender-800x638.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2025/05/defender-500x399.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2025/05/defender-300x239.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2025/05/defender-768x612.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2025/05/defender.png 1200w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<h4 class="wp-block-heading">2．ポートフォワーディング設定 (ポート 80):</h4>



<p>管理者権限のPowerShell の、「netsh」コマンドで設定します。</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-407ff20f71ed0d5d65d19b8abe74f839"><code>PowerShell（管理者）
PS C:\Users\hoge2&gt; netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=172.31.226.6</code></pre>



<p>「netsh interface portproxy show v4tov4」で確認できます。</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-3b28731fc08b3c287046ad304f896c2a"><code>PS C:\Users\hoge2&gt; netsh interface portproxy show v4tov4
ipv4 をリッスンする:         ipv4 に接続する:
Address         Port        Address         Port
--------------- ----------  --------------- ----------
0.0.0.0         80          172.31.226.6    80</code></pre>



<h4 class="wp-block-heading">アクセスできた～</h4>



<p>これで無事に「http://192.168.0.94/instal」でアクセスできました。<br>LAN上の別のPCからも、アクセス確認できました。<br>おそらく、ネット検索では、ここまで的確なアドバイスを見つけるのは至難の業だと思います。<br>ちょっと前までは、言語生成AIをうまく使うには、プロンプトが重要だと言われていましたが、最近の言語生成AIはかなり言語の理解力が向上していると感じます。<br>上記のじじぃの質問でもわかりますが、ほとんど「プロンプト」など意識していません。<br>とにかくわからない事やPCからの出力を、自分の言葉で質問しているだけです。<br>それでもかなり的確な回答をくれます。<br>たまには、間違った回答もありますが、それでエラーが発生した場合、<span class="marker-under">そのエラーやログをそのまま突っ込めば</span>、新たな回答をくれます。<br>すごい時代になりました。</p>



<h2 class="wp-block-heading">DifyにLLMを設定して、カスタムチャット環境を構築</h2>



<p>やっとDifyサーバーが起動できました。</p>



<div class="wp-block-media-text is-stacked-on-mobile"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="407" height="690" src="https://www.kazuban.com/blog/wp-content/uploads/2025/05/select-llm.png" alt="" class="wp-image-11167 size-full" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/05/select-llm.png 407w, https://www.kazuban.com/blog/wp-content/uploads/2025/05/select-llm-300x509.png 300w" sizes="(max-width: 407px) 100vw, 407px" /></figure><div class="wp-block-media-text__content">
<p>次に、このDifyにLLMモデルを設定することで、チャットボットをはじめカスタムLLMアプリを開発する事ができるようになります。<br>左図の例では、<br>一番上の「Gemini」はオンラインで公開されているLLMです。<br>二番目は、「LM Studio」でダウンロードしたローカルLLMです。<br>三番目は、「Ollama」で読み込んでいるローカルLLMです。<br>このように、「Dify」ではオンライン、ローカルあまり意識せず、使用するLLMを自由にカスタマイズできます。</p>
</div></div>



<h3 class="wp-block-heading">DifyにLLMの設定方法</h3>



<p>ネット上でも、多くの情報があると思いますが、このサイトでも以前の記事で紹介しています。</p>



<h4 class="wp-block-heading"><a href="https://www.kazuban.com/blog/dify-lmstudio/#toc3">オンラインLLMの登録</a></h4>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/dify-lmstudio/#toc3" title="ローカルでDifyとLM_Studio を連携させ、ローカルでチャットボットを作る。" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2025/03/Dify_LMStudio-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/03/Dify_LMStudio-160x90.png 160w, https://www.kazuban.com/blog/wp-content/uploads/2025/03/Dify_LMStudio-120x68.png 120w, https://www.kazuban.com/blog/wp-content/uploads/2025/03/Dify_LMStudio-320x180.png 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">ローカルでDifyとLM_Studio を連携させ、ローカルでチャットボットを作る。</div><div class="blogcard-snippet internal-blogcard-snippet">LM StudioとDifyをローカルで連携させたのでレポートします。記事を書いている時に、Dify設定にLM Studioのプラグインを発見したので、そちらの設定も追加してます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.03.23</div></div></div></div></a>
</div></figure>



<h4 class="wp-block-heading"><a href="https://www.kazuban.com/blog/dify-lmstudio/#toc6">LM Studio モデルの登録</a></h4>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/dify-lmstudio/#toc6" title="ローカルでDifyとLM_Studio を連携させ、ローカルでチャットボットを作る。" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2025/03/Dify_LMStudio-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/03/Dify_LMStudio-160x90.png 160w, https://www.kazuban.com/blog/wp-content/uploads/2025/03/Dify_LMStudio-120x68.png 120w, https://www.kazuban.com/blog/wp-content/uploads/2025/03/Dify_LMStudio-320x180.png 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">ローカルでDifyとLM_Studio を連携させ、ローカルでチャットボットを作る。</div><div class="blogcard-snippet internal-blogcard-snippet">LM StudioとDifyをローカルで連携させたのでレポートします。記事を書いている時に、Dify設定にLM Studioのプラグインを発見したので、そちらの設定も追加してます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.03.23</div></div></div></div></a>
</div></figure>



<h4 class="wp-block-heading"><a href="https://www.kazuban.com/blog/dify-ollama/#toc6">Ollama　モデルの登録</a></h4>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/dify-ollama/#toc6" title="DifyとOllamaを連携させ、ローカルチャットボット環境を作る" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2025/03/Dify_Ollama-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/03/Dify_Ollama-160x90.png 160w, https://www.kazuban.com/blog/wp-content/uploads/2025/03/Dify_Ollama-120x68.png 120w, https://www.kazuban.com/blog/wp-content/uploads/2025/03/Dify_Ollama-320x180.png 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">DifyとOllamaを連携させ、ローカルチャットボット環境を作る</div><div class="blogcard-snippet internal-blogcard-snippet">前回はLM StudioとDifyの連携でしたが、今回は、Ollamaと連携させてみました。どちらもそれぞれ特徴があるので、使い分けてもいいと思います。私的には、スタンドアローンで使うならLM Studio。Difyとの連携であればOllama かな？と思っています。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.03.30</div></div></div></div></a>
</div></figure>



<h2 class="wp-block-heading">あとがき</h2>



<p>Windowsアプリ「Docker Desktop」を使わず、「Ubuntu」にインストールした「Docker Engine」で「Dify」をサーバー化する方法を紹介しました。<br>「Docker Desktop」はWindows環境向けのツールであり、構築の手間は比較的少ないですが、Ubuntuサーバー上で動作させる際は、仮想化環境の設定やネットワーク通信の複雑さが生じるため、トラブルシューティングがやや難しくなります。<br>今回は、AIのアシストにより、Difyサーバーを構築することができました。<br>設定プロセスだけでなく、AIを活用した実践例として、このやり取りもご参考にしていただければ幸いです。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
