<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title><![CDATA[ タグ「Ｃ言語」を含む投稿［86件］ - 電装工芸日記 - 舞台照明機器の製作とか - ]]></title>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi</link>
	<description><![CDATA[ 今年は開発案件を進めたい ]]></description>
	<language>ja</language>
	<copyright>Copyright 2026</copyright>
	<lastBuildDate>Fri, 17 Jul 2026 17:46:49 +0900</lastBuildDate>
	<generator><![CDATA[ <!-- てがろぐ Version: -->Powered by <a href="https://www.nishishi.com/cgi/tegalog/" target="_top">てがろぐ</a> Ver 3.4.0 ]]></generator>
	<!-- BEGIN ENTRIES -->
	<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　Nim はＣ言語でやれることを全て出来るのに凄くシンプルな… ]]></title>
	<description><![CDATA[ 　Nim はＣ言語でやれることを全て出来るのに凄くシンプルな記述です。Python と同じではないけど近い感覚で書けるのがいいですね。<br />　中間言語的にＣ言語に吐き出(トランパイル)してから gcc などでバイナリまで作る構成ですが、Ｃ++ や JavaScript にもトランスパイル出来るのだそうです。Ｃ++ も JavaScript も知らない自分にとってはＣ言語として保存出来るならそれでいいのですけどね。<br />　Ｃ言語を経由するのでＣ言語を知っていた方がいいみたいです。Ｃ言語で作れる低レイヤー(ハードウェアにより近い部分)の処理を Python みたいな記述で比較的簡単に書けることがメリットですが、途中でＣ言語になるのですからそれを知らずに使えるかと問われればどうなんでしょう。Ｃ言語の概念が刷り込まれてしまった私の脳ミソではそれを外した評価など出来ません。<br />　今日勉強していた内容ではポインタの概念が必要でした。Ｃ言語の要素の中で最も理解し難いと言われるポインタです。わかってしまえば大したことではなく、私の場合は長く書いてきた PIC16 のアセンブラに置き換えながら抽象化の意味を探ってみたら解決しましたが、アセンブラの概念が無い人にポインタをわかってもらう説明ってどうやったらいいんだろうって考えるとなーんにもイメージ出来ませんでした。<br />　他人に Nim を教えようなんて思ってもいませんが、Ｃ言語を全く知らずに低レイヤーのプログラミングをするのは無茶だと思った今日の休憩時間でした。<br />　Nim と共にＣ言語の勉強も継続した方が良さそうです。Rust の世界からは退場することにします。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%4e%69%6d" class="taglink" title="Nim">#Nim</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a>  -- Posted by 電装工芸 〔713文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1284</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1284</guid>
	<category>tegalog</category>
	<pubDate>Sun, 14 Jun 2026 20:36:32 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　Nim のことを少しかじってみましたがイイですね。 ]]></title>
	<description><![CDATA[ 　Nim のことを少しかじってみましたがイイですね。<br />　普及率が低い言語なので情報が少ないですし、個人レベルのコミュニティで開発されているので配布やメンテが突然終わってしまうかもしれませんが、Ｃ言語に変換してから gcc でコンパイルするってのがいいですね。Nim で書けなくなってもＣ言語としては残るのです。今やＣ言語は古代語みたいな存在感ですが、私が生きている間に消え去ることは無いでしょう。扱える言語として残せるなら問題なかろうと思います。<br />　それにも増して、初めて眺めた Nim のコードが何となく読めることがイイです。自分が勉強したのは Python3、Ｃ言語(ANSI)、Rust ですが、Pythonに他の言語の方言が少しずつ混じったと思えば済んでしまいそうです。変数の型指定が必須の Python と思えばいいようです。<br />　コード書きで飯を食おうなんて思っていませんし、自分で組んだハードウェアを動かすことが目的ですので、Nim の普及率が低くても問題はありません。少ない学習コストで短期間で書けるならそちらの方にメリットがあります。もちろん、RaspberryPi でも使えます。<br />　AI/Geminiさんにお聞きしたところ、コンパイルには注意が必要っぽいです。コンパイルにはデバックレベルとリリースレベルがありますが、リリースレベルは最適化が強いので、デバックレベルでは動いたコードがリリースレベルでは動かないことがあるそうです。これはメモリキャッシュに代表される挙動の違いらしいので、この辺りをキチンと追い込む必要はありそうです。<br />　何にしても、Python 並みに書きやすく読みやすく、Ｃ言語で出来ることはほぼ100%実現可能で、Ｃ言語やＣ＋＋並みの速度で動くなら願ったり叶ったりです。<br /><br />追記<br />　Nim の教科書をポチりました。明日入荷だそうです。<br />　まずは読んでみましょう。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%4e%69%6d" class="taglink" title="Nim">#Nim</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔812文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1280</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1280</guid>
	<category>tegalog</category>
	<pubDate>Wed, 10 Jun 2026 10:25:16 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　「Nim(ニム)」と呼ばれるプログラム言語があるそうな。 ]]></title>
	<description><![CDATA[ 　「Nim(ニム)」と呼ばれるプログラム言語があるそうな。<br />　Python に近い書き方でＣ言語並みの速度が出るそうな。<br />　Nim のコードをＣ言語に変換してから gcc でコンパイルする構成で、Python をＣ言語に変換する Cython が進化したような立ち位置らしい。<br />　Rust の勉強をしていますが自分の中に妙な違和感があります。嫌いって程じゃないのですがナンか違うなと。<br />　面白そうなので Nim の勉強もしてみます。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%4e%69%6d" class="taglink" title="Nim">#Nim</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔227文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1279</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1279</guid>
	<category>tegalog</category>
	<pubDate>Wed, 10 Jun 2026 07:57:03 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　Rust の教科書は「所有権」や「ライフタイム」で大騒ぎし… ]]></title>
	<description><![CDATA[ 　Rust の教科書は「所有権」や「ライフタイム」で大騒ぎしないモノがいいようです。大騒ぎする教科書はその厄介さを語って力尽きるのか「とどのつまり？」の説明が薄い傾向にあります。両方とも重要なことですが、これらが Rust の全てではありません。「cargo」と呼ばれるプロジェクト管理ツールを説明しない教科書は論外です。<br />　間違っても初めてのプログラム言語に Rust を選ぶのはお勧めできません。最終的に作りたいモノによりますが、html や Python あたりで成功体験を積み重ねて神エンジニアたちが目指したことを体に取り入れるのが良いと思います。Rust はＣ言語同様に理解するための前提というか基礎の裾野が広すぎるのです。<br />　私は回路設計とプログラミングの境界が曖昧な PIC16 で右往左往してきましたので脳ミソが少しおかしいのですが、Ｃ言語もそうですが、Rust を受け入れるにはこのコードでハードウェアが何をするかをイメージ出来るといいようです。両言語ともハードウェアを制御する傾向が強いからでしょうか。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%e5%99%a8%e5%85%b7%e3%81%ae%e8%a3%bd%e4%bd%9c" class="taglink" title="器具の製作">#器具の製作</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%52%75%73%74" class="taglink" title="Rust">#Rust</a> -- Posted by 電装工芸 〔480文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1246</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1246</guid>
	<category>tegalog</category>
	<pubDate>Thu, 07 May 2026 06:18:59 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　Art-Net 関連品の開発では「Rust」を使うことにし… ]]></title>
	<description><![CDATA[ 　Art-Net 関連品の開発では「Rust」を使うことにしました。<br />　Rust が持つ標準機能が Art-Net 関連品を作るのに絶大に有益なことがわかったからです。コレクションと呼ばれる機能です。<br />　新たな言語を勉強するのは大変ですが、Ｃ言語の方言と思えばゼロベースではありません。Ｃ言語を学んだことで Rust がすんなり自分の中に入ってくる実感があります。Rust を学ぶためにＣ言語を勉強するベキ！？ってことでもありますが、案外そんなもんかなと感じています。Ｃ言語でも Rust でもコードの裏側にあることは同じってことですかね。ハードウェアを動かすのがソフトウェアですから。<br />　あまりに便利なので Python みたいに遅くねーの？って疑問はありますが、コンパイルされたバイナリはＣ言語やＣ＋＋に匹敵するらしいのでその評価を信じましょう。<br />　言葉は優しいですが、AI/Geminiさんのお言葉を要約するなら基板を作ってPIC16アセンブラを書いて RaspberryPi と協調動作する装置を作る素人(アマチュア)は斜め上過ぎる存在らしいです。私にとっては日常感覚ですケド、その延長かプログラム言語に対するアプローチも少し変みたいです。私からしたらパチンコやスロットで確率数値を操って常に勝ち続けてる人の方がどうかしてますケド。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%e5%99%a8%e5%85%b7%e3%81%ae%e8%a3%bd%e4%bd%9c" class="taglink" title="器具の製作">#器具の製作</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%52%75%73%74" class="taglink" title="Rust">#Rust</a> -- Posted by 電装工芸 〔589文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1245</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1245</guid>
	<category>tegalog</category>
	<pubDate>Tue, 05 May 2026 18:53:06 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　DMX-Timer は終わりが見えてきました。次の課題はA… ]]></title>
	<description><![CDATA[ 　DMX-Timer は終わりが見えてきました。次の課題はArt-Net 関連機器と行きたいところです。<br />　これらは RaspberryPi 上でのプログラミングが主となりますが言語どうするか。Ｃ言語か Rust の二択ですけど、未だに迷っております。この２種はハードウェアを扱うのに適した言語ですから Art-Net 関連機器を組むにはよいと思われます。両方を使いこなせればいいのですが、年齢的に一つでも辛いのに二つは無理。。。少し前までＣ言語でいくつもりで勉強していましたが、 Rust の教科書を斜め読みしたところ自分がやりたいことには Rust が向いているような気がして困っているワケです。<br />　Rust の情報に接しますと「所有権がぁ、所有権がぁ」と脅しの様に書かれております。これはＣ言語での「ポインタがぁ、ポインタがぁ」や、Ｃ＋＋での「オブジェクト指向がぁ、がぁ」と同じです。身に着けないと使えないし身に着ければよりよいコードが書けるのですから身に着ければいい。簡単でないことは確かですが、言語をデザインした神エンジニアたちは苦労や混乱をさせたかったワケではありません。たぶん。<br />　開発には心の余裕とまとまった時間が必要です。なかなかそんな時間は取れませんので、引き続き妄想しながら勉強をしましょう。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%52%75%73%74" class="taglink" title="Rust">#Rust</a> -- Posted by 電装工芸 〔569文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1243</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1243</guid>
	<category>tegalog</category>
	<pubDate>Tue, 05 May 2026 15:34:40 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　AI/Geminiさんに聞いたところ、RaspberryP… ]]></title>
	<description><![CDATA[ 　AI/Geminiさんに聞いたところ、RaspberryPiでは4byte単位、4kB単位でキリ良く考えるとストレスが少ないのだそうな。1byte単位のデータでも4byteで扱った方が良いってことです。<br />　パディング対策して詰め々々がイイって話を振ってきたのもGeminiさんですが、知識のある年寄りに時間を開けて話を聞いた時のような困惑を感じたりしたり。。。<br /><br />追記<br />　4byte、64byte、4096byte区切りでメモリを扱う様に構造体などを定義すると良いのだそうです。更に、構造体のメモリ上のアドレスをアトリビュートで64の倍数値にするのもお勧めとのこと。<br />　4byteはCPUのレジスタの長さ、64byteはキャッシュの転送単位、4096byteはメモリページの扱い単位です。<br />　気にしなくても動きますが、CPUやOSの挙動において無駄を省くことに繋がるらしいです。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a>  -- Posted by 電装工芸 〔397文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1203</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1203</guid>
	<category>tegalog</category>
	<pubDate>Thu, 12 Mar 2026 19:15:58 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　Ｃ言語の共用体(union)ですが、教科書やら動画を見ます… ]]></title>
	<description><![CDATA[ 　Ｃ言語の共用体(union)ですが、教科書やら動画を見ますと「あまり使い道が無い」的な解説が多いような気がします。<br />　されど、今回のArt-Net系の装置では便利です。Art-Net のポート番号 0x1936(6454) の受信値をとりあえず突っ込むだけで要素毎に取り出すことも出来るからです。例えば ArtDMX は530バイトのパケットですが、受信値を uint8_t&#91;530&#93; (または unsigned char&#91;530&#93;) の配列として保存するだけで ArtDMX の構造体としても扱えます。パディングに注意は必要ですが、便利に使えると思うのです。ID、OpCode、ProVer をまとめて評価するのに先頭12バイトを uint8_t&#91;12&#93; としておいて memcmp で判別することも出来ます。AertDMX と別種の Art-Net パケットもシームレスに扱えそうです。<br />　天才を超越した神たちが何故 union を作ったのかを考えるとワクワクします。<br /><br />　とまぁ、最近Ｃ言語の理解が進んで一人笑いが止まらないアホの戯言でした。<br /><br />　オレメモです。<br />　gccで構造体のパディングを回避する書き方。struct に続いて「__attribute__((__packed__))」を入れるそうな。gcc独特の書式らしいので、コンパイラに合わせた書式を使ってください。<br /><br /><small class="decorationS"><span class="decorationF deco-code">typedef struct __attribute__((__packed__)) {<br />　uint8_t ID&#91;8&#93;;<br />　uint8_t OpCode&#91;2&#93;;<br />　uint8_t ProVerHi;<br />　uint8_t ProVerLow;<br />　uint8_t Sequence;<br />　uint8_t Physical;<br />　uint8_t SubUni;<br />　uint8_t Net;<br />　uint8_t LengthHi;<br />　uint8_t Length;<br />　uint8_t Data&#91;512&#93;;<br />} ad_t;<br /><br />ad_t ad_data;</span></small><br /><br />　ArtDMXを保存する構造体はこんな感じに書けばよいのでしょう。たぶん。<br />　この型を sizeof で見て530バイトならヨシです。<br /><br />　ついでに共用体の定義(案)です。<br /><br /><small class="decorationS"><span class="decorationF deco-code">// Art-Netの受信値を収める構造体<br />typedef struct __attribute__((__packed__)) {<br />　uint8_t resv&#91;530&#93;;<br />} an_t;<br /><br />// ArtDMXを取り出す構造体<br />typedef struct __attribute__((__packed__)) {<br />　uint8_t ID&#91;8&#93;;<br />　uint8_t OpCode&#91;2&#93;;<br />　uint8_t ProVerHi;<br />　uint8_t ProVerLow;<br />　uint8_t Sequence;<br />　uint8_t Physical;<br />　uint8_t SubUni;<br />　uint8_t Net;<br />　uint8_t LengthHi;<br />　uint8_t Length;<br />　uint8_t Data&#91;512&#93;;<br />} ad_t;<br /><br />// Art-Netの受信値を保存する共用体ループバッファ<br />union {<br />　an_t an_resv;<br />　ad_t ad_data;<br />} an_stack&#91;8192&#93;;</span></small><br /><br />　こういうことでいいのかな？<br />　共用体の書き方はまだよくわかってないのですけど。<br /><br />　共用体の配列を作って Art-Net のポートで受信したパケットを延々と保存します。8191番まで記録したら0に折り返すループバッファです。<br />　8192個あれば44fps、８センダー、各16ユニバースで最短でも1.45秒分の保存が出来るハズです。十進数で8192なのは２進数(16進数)でキリの良い数値のため折り返し評価が少ない処理で出来るからです。十進数8192は16進数0x2000でキリがよく処理しやすいのです。このあたりはアセンブリ言語だけでPICマイコンと会話をしてきた者にとって自然な着想です。10進数は人が日常的に使い慣れているだけで特筆するほど合理的な数体系ではありませんし、今どきのコンピュータ(論理回路)に合わせた方が便利です。<br /><br />　ヘッダーチェックは当該の配列要素(例えば an_stack&#91;1024&#93; )を示すポインタからmemcmpで12バイトをチェックすれば済みますので共用体には定義しません。<br />　ArtDMX以外のパケットにも使えるチェック方法です。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a>  -- Posted by 電装工芸 〔1896文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1202</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1202</guid>
	<category>tegalog</category>
	<pubDate>Thu, 05 Mar 2026 06:26:33 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　先日の現場はヒマな時間が長かったのでＣ言語の教科書を読みま… ]]></title>
	<description><![CDATA[ 　先日の現場はヒマな時間が長かったのでＣ言語の教科書を読みまくってみましたがかなり整理出来ました。<br />　昨今の教科書はポインタの説明が丁寧です。ハードウェアとしてのメモリの動作がアタマに入っていないと分かり難いことですが、私はPICのアセンブラで普通に扱ってきたことなので改めてではありますが素直に理解出来ました。わかってしまえばむしろ便利だなと。変数の読み書き方法が何種類もあることになるので混乱すると思いますが、どれもメモリへのアクセス手段だと捉え直せばいいだけでした。このあたりが整理できるとmmapも自然に理解出来ます。<br />　ヘッダーファイルはコピペでテキトウに書いていましたが、意味と書き方が整理できました。後はmakefileが整理出来れば良さそうです。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a>  -- Posted by 電装工芸 〔338文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1201</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1201</guid>
	<category>tegalog</category>
	<pubDate>Mon, 02 Mar 2026 15:51:50 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　Art-Net 切替＆パッチマシンを作るためにＣ言語を勉強… ]]></title>
	<description><![CDATA[ 　Art-Net 切替＆パッチマシンを作るためにＣ言語を勉強しなおしています。AI/Geminiさんから学んだことですが、Ｃ言語はいわゆる高級言語(PythonやJAVAなど)ではなくアセンブリ言語の一つと捉えて教科書を読み直したところわかるわかる、すっげーわかる。なんだ簡単じゃねーかってくらいです。高級言語ほど抽象化されていないけれど、「機械としてのコンピュータ」を操っている感じが強いのにマシンコード(PIC16アセンブリしか知りませんが)を直にさわる時ほどレジスタやメモリに気を配らなくてもいい。途方もなく膨大で広大なライブラリの世界を網羅するのは不可能ですが、基本的なライブラリを使ったＣ言語として定義された基本書式はPIC16アセンブリのちょっと上くらいです。もちろん、CPUは何をやっているのか、メモリとは何のためにあるのか、I/Oっちゃ何よって基本機構をわかっている必要はありますけど。<br />　教科書は買い直しました。所有しているのは2008年執筆が一番新しいのですが、20年近く経って書式が変わってきているようです。例えば1バイトを表すcharはint8_tとも書けるようです。コンパイルが通るならば古くても新しくてもいいのですが、どうせならこれからの書式に慣れた方がいいかなと思うのです。<br />　アセンブリ言語は愚直にベタに書くモノだと思っています。10年後の自分が楽しんで読める内容にしたいですね。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔612文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1197</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1197</guid>
	<category>tegalog</category>
	<pubDate>Wed, 18 Feb 2026 15:59:50 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　猛烈に忙しかった一か月でしたが、落ち着いてきたのでＣ言語の… ]]></title>
	<description><![CDATA[ 　猛烈に忙しかった一か月でしたが、落ち着いてきたのでＣ言語の勉強を再開しています。<br />　データ蓄積の話です。変数と呼ばれる入れ子に数値を代入して一時保存するのが普通のやり方です。ですが、その実体はメモリに保存するに他なりません。<br />　Ｃ言語は「高級アセンブリ言語」と呼ばれることもあり、派生の歴史はマシンコードが違うハードウェア間でソフトウェアの移植性を高めることにあったとか。AI/Geminiさんとやりとりをしてわかってきたことですが、Ｃ言語はソフトウェアを書きやすくするのとは少し違った方向性のようです。Pythonの様な言語に慣れてしまうと「どうしてこうなのか？」「不便だな」と思うことが多々ありますが、アセンブリ言語として捉えると「こりゃ便利だ」と思えます。この感覚はアセンブリ言語を書いたことがないとピンと来ないことかもれませんが、ハードウェアは何をしているのか、ＯＳは何をしているのか、コンパイラは何をしているか、この辺りをイメージ出来るとＣ言語の書式の意味が見えてくるように思います。<br />　変数はメモリ領域を確保しインデックス(ステータス・メタ情報)を関連付けることで成立します。確保しただけのメモリ領域を「Raw」とも呼ぶそうですが、「Raw」のアドレスを示すのがポインタです。変数という作法(インデックス)を使って読み書きしてもいいのですが、ポインタというメモリアドレスで直接読み書きすることも出来るようです。私が知るアセンブリ言語はPIC16のそれしかありませんが、変数とはどういう機構なのか？を理解出来るとポインタのイメージをすんなり受け止められました。typedefも「オレ専用の型」作っておくClassみたいな作法だと思えば自然と理解。<br />　ここまできたところ、構造体(Structure)と共用体(Union)の違いや使い方もすんなり理解。どちらもメモリ領域を確保してインデックスを関連付けることは同じですが、共用体は複数のインデックスを関連付けることが出来ることが違う。Art-NetでDMXのデータを扱うArtDMXパケットは受信した際は530バイトのバイナリですが、その何バイト目がどんな意味のデータかとなるので、同じデータ群であっても530バイトのバイト配列であったり構造体であったりするので、共用体として保存するが適当ぢゃないかと思ってきたところです。<br />　mmapも意味や作法がイマイチわからなかったのですが、Ｃ言語の深堀り出来てきた気がしています。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔1047文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1194</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1194</guid>
	<category>tegalog</category>
	<pubDate>Tue, 17 Feb 2026 07:07:53 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　ちょっと忙しい１月です。 ]]></title>
	<description><![CDATA[ 　ちょっと忙しい１月です。<br />　仕事があるのは喜ばしいことですが、妄想は出来ても工作の実作業は出来ません。設計という名の妄想をキッチリやらないといけませんのである意味いいのですけどね。<br />　最近の妄想はGoogle検索よりもAIさんたちに聞くことで進めることが多くなりました。AIさんから結論をもらうというより代わりに検索してもらってレポートを頂戴する感じです。<br />　そんなやりとりの中で「Ｃ言語は高級アセンブリ言語である」という言葉がありました。ハードウェアを隠蔽してサービスに特化するいわゆる高級言語ではなく、ハードウェアに依存しないアセンブラ言語を示すってことらしいです。自分はハードウェアを動かすことに趣向が向いています。自分のベースはPIC16のアセンブラですが、書いているウチに「Ｃ言語はCPUにごとに違うアセンブラを汎用化して書きやすくしたモノだと思えば自分にとって自然だな」と感じていたので妙に納得した言葉です。<br />　何をしたいかによるので「Ｃ言語が絶対正義」とは思いませんが、昨今流行りのプログラム言語の大半はＣ言語を基礎としてして作られていますので原典とも言える存在です。高級言語を書いているとＣ言語が見え隠れしますので、Ｃ言語を知っていた方が理解し易いように思います。今どきの高級言語はＣ言語の方言と言ってもいいのかもしれません。自分はPIC16アセンブラの後にPython3に行ったのですが、むしろPythonだけを見て煮詰まったことがＣ言語を習得することで解決したように思います。高級言語とはＣ言語を楽に使うためのマクロ言語と捉えることが自然な気すらします。FORTRAN・COBOL・BASICなどのＣ言語と同時期に研究・開発された高級言語は少し違う感じがしますが、今主流の開発言語の大半はＣ言語の方言なのでしょう。<br />　私のように「物理的な装置を作ること」に趣向を持つ方は少ないと思いますが、コンピュータはマシンコードで動くのですから、マシンコードを汎用的に表現するＣ言語はハードウェアを直接動かす存在なのでしょう。名前が似通ったＣ＋＋やＣ＃(Ｃ＋＋＋＋)はそれとは違った感じがしますけど。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔911文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1186</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1186</guid>
	<category>tegalog</category>
	<pubDate>Mon, 19 Jan 2026 08:34:13 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　珍しく年末年始休みですが、いざとなると暇すぎ。 ]]></title>
	<description><![CDATA[ 　珍しく年末年始休みですが、いざとなると暇すぎ。<br />　ならばとAIのGeminiさんと会話。Art-Net機器の開発に関してです。ぶっちゃけChatGPTより頼もしい回答。色々解決しました。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%41%72%74%2d%4e%65%74" class="taglink" title="Art-Net">#&#91;Art-Net&#93;</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a>  -- Posted by 電装工芸 〔112文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1181</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1181</guid>
	<category>tegalog</category>
	<pubDate>Thu, 01 Jan 2026 16:02:09 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　最近、現場の合間に「POSIX(ポジックス)」の勉強をして… ]]></title>
	<description><![CDATA[ 　最近、現場の合間に「POSIX(ポジックス)」の勉強をしています。UNIX互換OSの標準仕様を定義したもので、OSや言語の仕様の基です。それぞれについて学ぶことも大切ですが、そもそもを知ることに意味はあります。たぶん最初からPOSIXを学んでも迷宮を彷徨うだけですが、ある程度わかってから読むと「なるほどぉ〜」が沢山です。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a>  -- Posted by 電装工芸 〔169文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1178</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1178</guid>
	<category>tegalog</category>
	<pubDate>Sun, 14 Dec 2025 10:57:54 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　Art-Net切替器の構成メモ ]]></title>
	<description><![CDATA[ 　Art-Net切替器の構成メモ<br />・マザーボード：EtherNet-Portを２つ、Wi-fiを１つ持つ RaspberryPi (CM4 + Dual Ether Boardなど)<br />・Ether Hub：ごく普通の EtherNet-Hub × 2<br />・NICの設定：OEMコードとMACアドレスからIPv4アドレスを定義しこれを基本アドレスとする<br />・ネットワークの構成：ネットワークはArt-Net切替器を挟んで卓側とノード側の２ゾーン構築する。この２ゾーンは全く同じ構成とする。Wi-fiは操作用のスマホやタブレットなどを接続するアクセスポイントとする。<br />・IPアドレスの工夫：手打ちやArtPollを用いてネットワーク上のArt-NetデバイスのIPアドレスを取得し、卓側ゾーンのArt-NetデバイスのIPアドレスをノード側ゾーンのエイリアスとして設定し、ノード側ゾーンのArt-NetデバイスのIPアドレスを卓側ゾーンのエイリアスとして設定する。<br /><br />追記<br />　必要になりそうなコードをChatGPTに聞いたところそれらしいモノが出てきました。これで動いたらこの上なく便利ですね。雛形であってもChatGPTと10分もやりとりするだけで得られるのは生産性が無茶苦茶いい。IPアドレスのエイリアスを一覧の状態にするコードを尋ねたのですが自分ですべて書いたら何日かかったでしょう。<br />　こういった手段でＣ言語の関数ライブラリを増やしていけばいいのかもしれません。<br />　ただ、概要を理解して質問しないと求める答えに近づくには時間が掛かるようです。<br /><br />追記の２<br />　「IPv4アドレスの配列から「0.0.0.0」と重複を削除する」とか<br />　「４バイトのchar配列からIPv4アドレスの文字列配列を作る」とか<br />　「IPv4アドレスの文字列配列から４バイトのchar配列を作る」などの一見地味だけど絶対必要になる処理は chatGPT で一発解決。先人が作った関数ライブラリがあれば簡単ですが、自作するには案外時間がかかったりする代物かもしれません。得られたコードを整理して関数ライブラリ化しヘッダーファイルまで作っておけば便利に使えそうです。この他にも使いそうなローレベルの関数を chatGPT に質問してコレクションしています。IPv4アドレスの一覧からIPアドレスのエイリアスをNICに定義する処理も得ましたが、Google検索だけで自作するには数週間かかったかもしれません。これは本当に凄い。Google検索で先人たちの成果を参考に書いていた時とやっていることは同じですが、より答えに近いところに短時間で到達出来るので生産性は良さそうです。別にＣ言語を身に着けたいのではなく、Ｃ言語でないと処理速度を確保出来ないから仕方なくＣ言語で書いているだけですからね。<br />　ただ、やってて思ったのですが、全体のアルゴリズムを chatGPT にまとめてもらうにはプロの設計さん並みの知識と説明力が必要かもしれません。求める結果と状況を適切な言葉で簡潔に表さないといけないからです。AIはこちらの求めていることを推測しようとしてくれますが、説明が足りなければ、AIからの提案を理解出来なければ、その先に進むことは出来ません。いや、無料で得られる範囲では限度があると思うべきでしょう。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%e5%99%a8%e5%85%b7%e3%81%ae%e8%a3%bd%e4%bd%9c" class="taglink" title="器具の製作">#器具の製作</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%41%72%74%2d%4e%65%74" class="taglink" title="Art-Net">#&#91;Art-Net&#93;</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔1407文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1142</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1142</guid>
	<category>tegalog</category>
	<pubDate>Sat, 27 Sep 2025 09:50:42 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　ChatGPT に Art-Net を受信するC言語のコー… ]]></title>
	<description><![CDATA[ 　ChatGPT に Art-Net を受信するC言語のコードを聞いたところ、これまでに勉強したことが簡潔にまとまったコードが出てきました。<br />　欲しいすべてが出て来るワケではありませんが、これはスゲー。<br />　出てきたコードを理解・評価するにはある程度の基礎が必要ですが、細かい質問にも丁寧に答えてくれますし、何よりもヘッダーファイルを読んだり検索しないと理解出来なかったライブラリ関数の使い方も詳しく解りやすく教えてます。Google 検索で先達の成果から学ぶのも大事だと思いますが、AIエージェントを検索と同じ感覚で使うのは効率的だと思った次第。<br />　アプリの製作代行まで求めるには質問の仕方を工夫して課金しなければならないでしょうけど、イメージとしては教科書から求める情報を抜き出してくれる補助ツールとして有効だなって感じ。<br /><br />追記<br />　他にも重要となる処理を ChatGPT に聞きましたが簡潔でわかりやすいお答え。<br />　先達の書き込みはありがたいものの奇妙な応用を含めた物が多く知りたいことが読み取りにくいことがあります。<br />　シンプルな質問を心がければ AI はとても便利に使えそうです。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%41%49" class="taglink" title="AI">#AI</a> -- Posted by 電装工芸 〔504文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1080</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1080</guid>
	<category>tegalog</category>
	<pubDate>Tue, 24 Jun 2025 06:48:40 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　現地照明でしたが、シュートが終わったらバラシまで待機という… ]]></title>
	<description><![CDATA[ 　現地照明でしたが、シュートが終わったらバラシまで待機という名の休憩。直しとトラブルシュートに対応出来ればいいのでまとまった空き時間です。こんな時は設計という名の妄想が一番です。<br /><br />　課題は毎度おなじみ「ArtNetPatch」です。主にソフトウェアの構成が課題です。<br />　受けたデータを一時保存、加工、出力しますので、機能は映像ストリーミングに近いかもしれませんが、自分のイメージはデータベースです。<br />　その昔ファイルメーカーを母体に機材の稼働管理システムを作って今も使っていますが、データを動的に仕分けて加工する感覚が今回活用出来ています。<br />　アルゴリズムと言えばそうなんですが、データを保管する構造体の設計が主な作業です。可能か不可能かを確認しながらになりますが、最終的にまとめる構造体が決まれば仕分けて加工するアルゴリズムはおのずと決まってくるので私にはこの感覚で進めるのが性に合っているようです。処理の全体像が見えてきました。<br /><br />　アセンブラではないので構想の段階で処理時間の見込みを付けることは難しいのですが、そもそもRaspberryPiのCPUにおけるマシンコードの動作速度はどうだと計算したら恐ろしい数字。ARMの2.4GHzですが、PICの感覚で単純計算したら１クロック当たりの時間は0.42nsec。PICに比べたら桁違いというか単位違い。OSを介するので単純には比べられないもののマシンコードのイメージで書けばかなり速くなりそう。例えば、積や商を求めるために四則演算をするかビットシフトをするかってことです。2倍や1/2などの2の乗数に関わる積や商ならビットシフトの方が速いハズです。この辺りが「C言語はアセンブラを汎用化したもの」ってイメージであり、Pythonとは違い、C言語はアセンブラの感覚で使うベシってのが私個人の感覚になりつつあります。出来るだけ単純な計算方法を目指してデータ構造を考えるのです。Ｃ言語の難解さがアセンブラ傾向のアプローチで軽くなった気分です。普通は逆なんでしょうけど。<br />　Ｃ言語を作った神達はアセンブラをマクロ化して手間を減らすところから始まってますので、世代を経ても底辺はアセンブラなんでしょう。同時代のCOBOLやFORTRANは意味付けが違うようですけど。<br /><br />　勝手な妄想はともかく、どんなデータをどう変換・加工するかを明らかにすればおのずと見えてくるようです。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%41%72%74%2d%4e%65%74" class="taglink" title="Art-Net">#&#91;Art-Net&#93;</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%e5%99%a8%e5%85%b7%e3%81%ae%e8%a3%bd%e4%bd%9c" class="taglink" title="器具の製作">#器具の製作</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔1034文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1074</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1074</guid>
	<category>tegalog</category>
	<pubDate>Sat, 14 Jun 2025 22:44:01 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　Ｃ言語のポインタには面白い機能(使い方？)がありました。 ]]></title>
	<description><![CDATA[ 　Ｃ言語のポインタには面白い機能(使い方？)がありました。<br />　関数の呼び出しをポインタ化するのです。なんのこっちゃ？って話ですねぇ～。<br />　ソースコードの大半はそのままに、条件分岐で関数を差し替えるイメージです。オブジェクト指向の一歩手前？<br />　もちろん、構造体を含む変数もポインタを介して差し替えられます。<br />　DMXの場合、受信中のスタックから読み出すことは避けなければなりません。パケットの中身に不整合が起こるからです。例えばアドレス100までは最新の受信内容、101以降は１フレーム前の受信内容や全てゼロになるのです。２スロット構成のアトリビュートがアドレス100と101にまたがったらよろしくないことが起こります。リトルエンディアンだったら目も当てられません。<br />　この対策は２つのスタックを交代しながら使います。片方は受信に、１フレーム前のデータを持ったもう片方を出力処理に使い、条件が整えば役割を交代するのです。この場合どちらをどちらに使うかをポインタで指定出来れば全体の処理はスマートになります。ピンと来る方が少ないのはわかっていますが、ソースコードを書く上ではとても合理的な方法です。今の常識からしたら万分の一の処理能力のハードウェアしかなかった時代にC言語をデザインした人は本当の天才だと思います。勉強すればするほど「天才」って言葉が身に沁みます。自分はその成果に甘えるだけで感謝々々です。<br /><br />　Ｃ言語を学ぶ上でポインタは難解な要素の筆頭ですが、自分の様にアタマの半分がPICマイコンのアセンブラで占められている者には案外すんなりと理解出来ました。メモリのアドレスを直接扱う方法だからです。当初は高級言語でメモリのアドレスを直接扱うなんてイメージはありませんでしたので躓きましたが、C言語が値渡ししか出来ない(参照渡しが出来ない)ことも含めるとポインタは合理的であり、C言語は高級言語ではなく汎用化を目指したアセンブラ言語と思えばイイらしいと思った次第。正しくはなくても私にはこの理解が自然でした。<br /><br />　自分は PC8001(PC6001)-BASIC → Z80アセンブラ(当時小学生、挫折しました) → (20年空いて) → PICアセンブラ → Python → C言語(今) と進んできました。小学生の時分に論理演算、16進数、2進数を本能に焼き付け、成果は出せずともZ80アセンブラに挑んだことが今に活きているようです。小学生当時、戦前産まれの父母は数百円の漫画本は買ってくれませんでしたが高価な技術書やその筋の雑誌(月刊マイコンやBASICマガジンなど)は買ってくれました。100歳まであと数年のカウントダウンなのに林業を生業とし登山やスキーを楽しむ父と米寿間近で父の３倍は元気な母に絶大な感謝をする今日この頃。<br />　自分の今の最大の不安は三途の川の向こう岸で父母をお迎えすることです。あと100年くらいは部下や後輩に迷惑をかけずに現役をやってやろうと思っていますけど(笑<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%e9%9b%91%e8%a8%98" class="taglink" title="雑記">#雑記</a> -- Posted by 電装工芸 〔1257文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1067</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1067</guid>
	<category>tegalog</category>
	<pubDate>Tue, 10 Jun 2025 22:39:25 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　現場ですが、簡単なひな壇を組むだけの現地道具なので終演まで… ]]></title>
	<description><![CDATA[ 　現場ですが、簡単なひな壇を組むだけの現地道具なので終演までヒマです。<br />　ArtNetPatch の ap_transmitter の構造を構造体配列を元に整理したのですが、割り切って構成したら案外軽い処理になりました。メモリの節約など考えず、条件分岐や計算を出来るだけ減らし繰り返しをヒトまとめにする方針だからでしょうか。<br />　実際に組んで実行時間を計測しなければなりませんが、パッチ処理の後にもディレイやプロファイルカーブの処理を入れられそうな予感がします。<br /><br />　receive(受信)、bind(入力ユニバースを内部Bus(ユニバース)にパッチ、ここで数値をマージしてHTPミキサーとします)、pre-delay、pre-profile-curve、patch、post-delay、post-profile-curve、transmit といった流れで考えています。<br /><br />　ついてはモジュール構成を少し変えます。<br />　ap_transmitter の中の数値操作と Art-net の出力を分割します。<br />　fps はともかく、すべてのユニバースを連続して送るのは避けた方がいいかなと思うので、ユニバース毎にインターバルを持たせるためです。<br /><br />１）アプリの起動部とし、共有物を設定して以下のモジュールを呼ぶ「ap_main」<br />２）画面表示やユーザー操作を司る「ap_console」<br />３）Art-Netを受信する「ap_receiver」<br />４）受信値や設定値から出力値をまとめる「ap_effect」<br />５）Art-Net を出力する「ap_transmitter」<br />６）データのタイムアウト管理をする「ap_timeout」<br /><br />　今後はタイムラグを減らす工夫を考えてみましょう。<br />　出力の目標は 30fps 以上、出来れば 36fps ですが、1/36秒以内に処理を一巡出来るなら遅れても1フレームとなります。無理ならスレッド的なアプローチで考えて出来るだけ遅れを少なくしましょう。<br />　何にしても、試作をして処理時間と処理負荷の計測が必要です。<br />　こんな複雑なシステムは10回くらい書き直すつもりで試すしかありません。素人の私が結果を完全に予測するなんで無理ですもん。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%41%72%74%2d%4e%65%74" class="taglink" title="Art-Net">#&#91;Art-Net&#93;</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%e5%99%a8%e5%85%b7%e3%81%ae%e8%a3%bd%e4%bd%9c" class="taglink" title="器具の製作">#器具の製作</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a>  -- Posted by 電装工芸 〔959文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1066</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1066</guid>
	<category>tegalog</category>
	<pubDate>Tue, 10 Jun 2025 17:53:28 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　子プロセスを使う場合は親プロセスが落ちたらこれらも落とさな… ]]></title>
	<description><![CDATA[ 　子プロセスを使う場合は親プロセスが落ちたらこれらも落とさないといけません。ゾンビとして残ってしまうからです。<br />　一般的にはメインから「終わりにしなさい」って指示を受けて落としますが、開発途中ではそうもいかないことがあります。<br />　ならば、「続けなさい」って指令が無ければタイムアウトすることにしましょう。親の存在確認をする方法もありますが、この方法なら管理が楽かも。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a>  -- Posted by 電装工芸 〔190文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1065</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1065</guid>
	<category>tegalog</category>
	<pubDate>Tue, 10 Jun 2025 07:22:53 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　Art-Netの扱いにアイデアを一つ。 ]]></title>
	<description><![CDATA[ 　Art-Netの扱いにアイデアを一つ。<br />　送信元を識別するにはIPv4アドレスがキーになると思います。運が悪くなければ送信元毎にユニークなハズです。これの扱い。<br /><br />　IPv4アドレスは4バイト長(32bit)で構成され、文字列で表しても7～15文字です。<br />　これを一つの整数にまとめてしまうアイデアです。一般的にint型は4バイト長ですから、丸めてしまえばint型にしても情報は欠落しません。<br />　こうすれば、4つの数字や7～15文字のテキストよりも扱いが簡単で軽くなると思うのです。IPアドレスとしての情報は別途残すとして、識別IDにこれを使うのです。<br />　ユニバースも同じ考え方でいいでしょう。15bit長ですからshort型でも収まりますが、噂に聞くところではint型の方が処理が軽いらしいのでこの型にしておこうかなと。<br />　この両者を合わせた8バイトのlong型もしくはLongLong型を併記しておいてもいいかもしれません。なぜこの様なことを考えるかと言いますと、複数のユニバースを保管する配列から特定のものを探し出す処理を軽くしたいからです。処理の方針にもよりますが、受信したものを一旦スタックして一定の時間間隔で取り出そうというのが今の考え方ですので、クエリに相当するインデックスを作るのは当然としてもキーワードが簡素なことは重要だと思うのです。一定の時間間隔で作れらたLoop配列ならばその並びが時間情報となりますので、Delay を求めても受信日時と現在日時を比較する必要がありません。<br /><br />　Art-Netのモニターも兼ねたいので、使う使わないはともかく、受信したデータを全て一時保管するつもりです。<br />　かといってモニターのための保管とパッチのための保管を別々にするのは気に入らないので、受信をすべて保管してそこから必要なモノを取り出したいのです。<br />　仮に、送信元８、それぞれ８ユニバースとするなら、最大44fpsとして１秒間に2,816件のスタックをしなければなりません。１パケット当たりのデータ長は540バイトくらいですから1.5MB/秒くらいです。2秒分のスタックをしても3MBです。動画の１フレーム当たりのデータ長は640x480の16bitカラーで1.8MBくらいですので55MB/秒です。動画に比べたらArt-Netの情報量は余裕っしょ。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%41%72%74%2d%4e%65%74" class="taglink" title="Art-Net">#&#91;Art-Net&#93;</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔999文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1060</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1060</guid>
	<category>tegalog</category>
	<pubDate>Sat, 07 Jun 2025 06:21:33 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　しばらく前に書いた Art-Net を扱うコードです。 ]]></title>
	<description><![CDATA[ 　しばらく前に書いた Art-Net を扱うコードです。<br />　今だったらこうするのにってところは多いですが、これをたたき台にしようかなと。<br />　表示の都合で一部の文字を全角にしています。コピペしてお使いになる際はご注意ください。オレオレライブラリーやオレオレヘッダーが必要なのでこのソースだけでは動きませんけど、要点の参考になれば幸いかと。<br /><br /><small class="decorationS"><span class="decorationF deco-code">/*　--------------<br />　　Art-Net Engine<br />　　ae_main.c<br />　　-------------- */<br /><br />// 汎用ライブラリをインクルード<br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%69%6e%63%6c%75%64%65" class="taglink" title="include">#include</a> &lt;stdio.h&gt;<br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%69%6e%63%6c%75%64%65" class="taglink" title="include">#include</a> &lt;string.h&gt;<br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%69%6e%63%6c%75%64%65" class="taglink" title="include">#include</a> &lt;unistd.h&gt;<br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%69%6e%63%6c%75%64%65" class="taglink" title="include">#include</a> &lt;time.h&gt;<br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%69%6e%63%6c%75%64%65" class="taglink" title="include">#include</a> &lt;sys/types.h&gt;<br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%69%6e%63%6c%75%64%65" class="taglink" title="include">#include</a> &lt;sys/socket.h&gt;<br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%69%6e%63%6c%75%64%65" class="taglink" title="include">#include</a> &lt;arpa/inet.h&gt;<br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%69%6e%63%6c%75%64%65" class="taglink" title="include">#include</a> &lt;sys/ioctl.h&gt;<br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%69%6e%63%6c%75%64%65" class="taglink" title="include">#include</a> &lt;sys/shm.h&gt;<br />//#include &lt;netinet/in.h&gt;<br />//#include &lt;sys/ipc.h&gt;<br /><br />// 自作ライブラリをインクルード<br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%69%6e%63%6c%75%64%65" class="taglink" title="include">#include</a> &quot;ae_main.h&quot;<br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%69%6e%63%6c%75%64%65" class="taglink" title="include">#include</a> &quot;std_inkey.h&quot;<br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%69%6e%63%6c%75%64%65" class="taglink" title="include">#include</a> &quot;std_dump.h&quot;<br /><br />// Main<br />int main( int argc, char *argv〔〕 ) {<br />　　// 汎用変数<br />　　// int i ;<br />　　// int ret = 0 ;<br />　　// 共有メモリ変数<br />　　ae_sharemem_t *ae_sharemem ;<br />　　int ae_sharememsize = sizeof( ae_sharemem_t ) ;<br />　　int ae_sharememID ;<br />　　//【開発用】共有メモリ領域の確保 上位モジュールが出来たらそちらで作る<br />　　ae_sharememID = shmget( IPC_PRIVATE, ae_sharememsize, SHM_R|SHM_W ) ;<br />　　// 共有メモリ定義<br />　　ae_sharemem = shmat( ae_sharememID, 0, SHM_R|SHM_W ) ;<br />　　// nsec時変数<br />　　struct timespec now ;　　　　　　　　　　　 // 現在POSIX時を得る構造体<br />　　unsigned long long int start_nsec ;　　　　 // 処理開始nsec時を保存<br />　　//【開発用】処理時間変数<br />　　unsigned long long int lap_nsec ;　　　　　 // 処理終了nsec時<br />　　static unsigned long long int max_nsec = 0 ; // 経過したnsecの最大値<br />　　// Art-Net 受信変数<br />　　int an_rx ;　　　　　　　　　　　　　　　　 // 受信socket番号<br />　　struct sockaddr_in an_rx_addr ;　　　　　　 // 受信先指定構造体<br />　　int an_rx_length ;　　　　　　　　　　　　　// recvfromで得たデータ長<br />　　char an_rx_nic〔〕 = { &quot;eth0&quot; } ;　　　　　　 // 受信NICの名称<br />　　char an_rx_buf〔 ADMX_BUF_SIZE 〕 ;　　　　　 // 受信バッファ ArtDMXの最大バイト長で設定<br />　　socklen_t an_rx_sin_size = ADMX_BUF_SIZE ;　// recvfromに渡す受信バッファサイズ<br />　　struct sockaddr_in an_rx_from_addr ;　　　　// 送信元情報の構造体<br />　　artdmx_t artdmx_rx ;　　　　　　　　　　　　// 受信したArtDMXを保存する構造体<br />　　// Art-Net 送信変数<br />　　int an_tx ;　　　　　　　　　　　　　　　　 // 送信socket番号<br />　　struct sockaddr_in an_tx_addr ;　　　　　　 // 送信先指定構造体<br />　　char an_tx_nic〔〕 = { &quot;eth1&quot; } ;　　　　　　 // 受信NICの名称<br />　　int yes = 1 ;　　　　　　　　　　　　　　　 // 送信をブロードキャストに設定する際のフラグ変数<br />　　artdmx_t artdmx_tx〔 ADMX_TX_UNIVRESES 〕 ;　 // 送信するArtDMXを保存する構造体配列<br />　　char an_tx_buf〔 ADMX_BUF_SIZE 〕 ;　　　　　 // 送信バッファ Art-DMXの最大バイト長で設定<br />　　int an_tx_count = 0 ;　　　　　　　　　　　 // 送信ユニバースカウンタ<br />　　unsigned long long int an_tx_nsec = 0 ;　　 // 送信nsec時を保存<br />　　float an_tx_fps = 29.97 ;　　　　　　　　　 // 送信フレームレート<br />　　unsigned int an_tx_interval =<br />　　　　　　( unsigned int )( 1e9 / ADMX_TX_UNIVRESES / an_tx_fps ) ;<br /><br />　　// Art-Netの受信ソケットを作成<br />　　an_rx = socket( AF_INET, SOCK_DGRAM, 0 ) ;　　　　　　　　　　　　　// 受信ソケットのインスタンスを作成<br />　　setsockopt( an_rx, SOL_SOCKET, SO_BINDTODEVICE,　　　　　　　　　　 // 受信NICを指定する <br />　　　　　　　　&an_rx_nic, sizeof( an_rx_nic ) ); <br />　　an_rx_addr.sin_family = AF_INET ;　　　　　　　　　　　　　　　　　 // 受信をUDPに設定<br />　　an_rx_addr.sin_port = htons( AN_PORT ) ;　　　　　　　　　　　　　　// 受信ポート番号を設定<br />　　an_rx_addr.sin_addr.s_addr = INADDR_ANY ;　　　　　　　　　　　　　 // 送信元アドレスを無指定にする<br />　　bind( an_rx, ( struct sockaddr * ) &an_rx_addr,　　　　　　　　　　 // 上記をインスタンスに設定する<br />　　　　　　　　　　sizeof( an_rx_addr ) ) ;<br />　　// Art-Netの送信ソケットを作成<br />　　an_tx = socket( AF_INET, SOCK_DGRAM, 0 ) ;　　　　　　　　　　　　　// 送信ソケットのインスタンスを作成<br />　　an_tx_addr.sin_family = AF_INET ;　　　　　　　　　　　　　　　　　 // 送信をUDPに設定<br />　　an_tx_addr.sin_port = htons( AN_PORT ) ;　　　　　　　　　　　　　　// 送信ポート番号を設定<br />　　an_tx_addr.sin_addr.s_addr = inet_addr( &quot;255.255.255.255&quot; ) ;　　　 // 送信先アドレスを無指定にする<br />　　setsockopt( an_tx, SOL_SOCKET, SO_BINDTODEVICE,　　　　　　　　　　 // 送信NICを指定する <br />　　　　　　　　&an_tx_nic, sizeof( an_tx_nic ) ) ; <br />　　setsockopt( an_tx, SOL_SOCKET, SO_BROADCAST,　　　　　　　　　　　　// 送信をブロードキャストに設定<br />　　　　　　　　( char * )&yes, sizeof( yes ) ) ;<br />　　// std_inkey 用変数<br />　　int key_code_length = 0 ;<br />　　int key_code_length_st = 0 ;<br />　　char key_code〔 32 〕 = { 0x00 } ;<br />　　char key_code_st〔 32 〕 = { 0x00 } ;<br />　　// std_inkey を開始<br />　　set_inkey( SET ) ;<br /><br />　　// ***** Art-Netの受送信と表示 *****<br />　　printf( &quot;\e〔2J\e〔?25l&quot; ) ;　　　　　　　　 // 画面を消去 カーソル非表示　\e〔?25l カーソル非表示<br />　　while( strcmp( key_code, _KEY_F12 ) != 0 ) {<br />　　　　// ------ 開始nsec時を取得 ------<br />　　　　clock_gettime( CLOCK_REALTIME, &now ) ;　　　　　　　　　　 // 現在POSIX時間値取得<br />　　　　start_nsec = ( unsigned long long int )now.tv_sec * 1e9　　 // unsigned long long int型(8バイト長int)変数に<br />　　　　　　　　　　 + now.tv_nsec ;　　　　　　　　　　　　　　　　// 取得値をひとまとめにする(nsec)<br /><br />　　　　// --------- キー入力 ----------<br />　　　　key_code_length = get_inkey( key_code ) ;　　　　　　　　　 // キー入力を取得<br />　　　　if( strcmp( key_code, &quot;\x20&quot; ) == 0 ) max_nsec = 0 ;　　　　//【開発用】キー入力が〔SP〕なら実行時間計測の最大値をクリア<br />　　　　if( key_code_length &gt; 0 ) {　　　　　　　　　　　　　　　　 // キー入力を別関数に渡すためのスタック<br />　　　　　　key_code_length_st = key_code_length ;<br />　　　　　　memcpy( key_code_st, key_code, sizeof( key_code ) ) ;<br />　　　　}<br /><br />　　　　// --------- 受 信 -----------<br />　　　　memset( an_rx_buf, 0, ADMX_BUF_SIZE ) ;　　　　　　　　　　　　　　　　　　　　 // 受信バッファのクリア<br />　　　　an_rx_length = recvfrom( an_rx, an_rx_buf, ADMX_BUF_SIZE, MSG_DONTWAIT,　　　　 // an_rx_from_addrには送信元情報が入る<br />　　　　　　　　( struct sockaddr * )&an_rx_from_addr, &an_rx_sin_size ) ;<br />　　　　// 受信がある場合<br />　　　　if( an_rx_length &gt; 0 ) {　　　　　　　　　　　　　　　　　　　　　　　　　　　　// an_rx_lengthは受信値のバイト長<br />　　　　　　// 送信元IPアドレスとポートを抽出し、構造体artdmx_rxに保存<br />　　　　　　inet_ntop( AF_INET, &an_rx_from_addr.sin_addr,　　　　　　　　　　　　　　　// 受信データから送信元IPアドレスを抽出保存<br />　　　　　　　　　　　　artdmx_rx.senderip, sizeof( artdmx_rx.senderip ) ) ;<br />　　　　　　strcpy( artdmx_rx.senderip, inet_ntoa( an_rx_from_addr.sin_addr ) ) ;<br />　　　　　　artdmx_rx.senderport = ntohs( an_rx_from_addr.sin_port ) ;　　　　　　　　　// 受信データから送信元ポートを抽出保存<br />　　　　　　artdmx_rx.recv_nsec = start_nsec ;　　　　　　　　　　　　　　　　　　　　　// 受信日時を保存<br />　　　　　　// 受信したArtDMXをデコード<br />　　　　　　if( artdmx_decode( an_rx_buf, &artdmx_rx ) &gt;= 0 )　　　　　　　　　　　　　 // ArtDMXなら送信スタックに保存<br />　　　　　　　　memcpy( &artdmx_tx〔 artdmx_rx.universe 〕,　　　　　　　　　　　　　　　 // ArtDMX以外なら読み飛ばし<br />　　　　　　　　　　　　&artdmx_rx, sizeof( artdmx_t ) ) ;<br /><br />　　　　　　//【開発用】終了nsec時を取得<br />　　　　　　clock_gettime( CLOCK_REALTIME, &now ) ;　　　　　　　　　　　　　　 // 現在POSIX時間値取得<br />　　　　　　lap_nsec = ( unsigned long long int )now.tv_sec * 1e9　　　　　　　 // unsigned long long int型(8バイト長int)変数に<br />　　　　　　　　　　　　+ now.tv_nsec - start_nsec ;　　　　　　　　　　　　　　// 取得値をひとまとめにする(nsec)<br />　　　　　　if( max_nsec &lt; lap_nsec ) max_nsec = lap_nsec ;　　　　　　　　　　 // ここまでの最大処理時間を得る<br /><br />　　　　}<br /><br />　　　　// --------- 送 信 -----------<br />　　　　else if( start_nsec - an_tx_nsec &gt; ( unsigned int )( an_tx_interval ) ) {<br />　　　　　　artdmx_encode( an_tx_buf, &artdmx_tx〔 an_tx_count 〕 ) ;　　　　　　 // 送信データをエンコード<br />　　　　　　sendto( an_tx, an_tx_buf, ADMX_BUF_SIZE, MSG_DONTWAIT,　　　　　　　// 送信実行<br />　　　　　　　　　　( struct sockaddr * )&an_tx_addr, sizeof( an_tx_addr ) ) ;<br />/*<br />　　　　　　//【開発用】終了nsec時を取得<br />　　　　　　clock_gettime( CLOCK_REALTIME, &now ) ;　　　　　　　　　　　　　　 // 現在POSIX時間値取得<br />　　　　　　lap_nsec = ( unsigned long long int )now.tv_sec * 1e9　　　　　　　 // unsigned long long int型(8バイト長int)変数に<br />　　　　　　　　　　　　+ now.tv_nsec - start_nsec ;　　　　　　　　　　　　　　// 取得値をひとまとめにする(nsec)<br />　　　　　　if( max_nsec &lt; lap_nsec ) max_nsec = lap_nsec ;　　　　　　　　　　 // ここまでの最大処理時間を得る<br />*/<br />　　　　　　//【開発用】受信データの表示<br />　　　　　　artdmx_check_disp( &artdmx_tx〔 an_tx_count 〕,　　　　　　　　　　　 // 送信データの仮表示 <br />　　　　　　　　　　key_code_st, &key_code_length_st, &lap_nsec, &max_nsec ) ;<br />　　　　　　// 送信事後処理<br />　　　　　　an_tx_nsec = start_nsec ;　　　　　　　　　　　　　　　　　　　　　 // 送信インターバル・次回用のnsec取得<br />　　　　　　if( ++an_tx_count &gt; 7 ) an_tx_count = 0 ;　　　　　　　　　　　　　 // 送信ルートカウンタインクリメント<br />　　　　}<br />　　　　// 待ち時間 無駄にループしても処理負荷が増えるだけなので少しお休み<br />　　　　usleep( 1 ) ;<br />　　}<br />　　// --------- 終 了 ----------<br />　　set_inkey( RESET ) ;　　　　　　// std_inkeyを終了<br />　　close( an_rx ) ;　　　　　　　　// 受信ソケットをクローズ<br />　　close( an_tx ) ;　　　　　　　　// 送信ソケットをクローズ<br />　　printf( &quot;\e〔?25h\e〔0m\n&quot; ) ;　　// コンソール画面を戻す \e〔?25h カーソルの表示<br />　　shmdt( ae_sharemem ) ;　　　　　// 共有メモリの切り離し<br />　　//【開発用】上位モジュールが出来たらそちらで処理する<br />　　shmctl( ae_sharememID, IPC_RMID, 0) ; // 共有メモリ領域開放<br />　　return 0 ;<br />}<br /><br />// ArtDMXのデコード関数<br />int artdmx_decode( char *an_rx_buf, artdmx_t *artdmx_rx ) {<br />　　int i ;<br />　　char int_st〔 sizeof( int ) 〕 ;<br />　　// IDを抽出<br />　　for( i = 0; i &lt; 8; i++ ) {　　　　　　　　　　　　　// bufの先頭から８バイト<br />　　　　artdmx_rx-&gt;id〔 i 〕 = an_rx_buf〔 i 〕 ;　　<br />　　}<br />　　// OpCodeを抽出<br />　　int_st〔 0 〕 = an_rx_buf〔 8 〕 ;<br />　　int_st〔 1 〕 = an_rx_buf〔 9 〕 ;<br />　　int_st〔 2 〕 = 0x00 ;<br />　　int_st〔 3 〕 = 0x00 ;<br />　　artdmx_rx-&gt;opcode = *( ( int * )&int_st〔 0 〕) ;<br />　　if( ! (strcmp( artdmx_rx-&gt;id, &quot;Art-Net&quot; ) == 0　　　　　// ArtDMXかチェックし、そうでなければエラーを返して終了<br />　　　　　　　　&& artdmx_rx-&gt;opcode == 0x5000 ) ) {<br />　　　　return -1 ;<br />　　}<br />　　// ProVerを抽出<br />　　int_st〔 0 〕 = an_rx_buf〔 11 〕 ;<br />　　int_st〔 1 〕 = an_rx_buf〔 10 〕 ;<br />　　int_st〔 2 〕 = 0x00 ;<br />　　int_st〔 3 〕 = 0x00 ;<br />　　artdmx_rx-&gt;prover = *( ( int * )&int_st〔 0 〕) ;<br />　　// Sequenceを抽出<br />　　artdmx_rx-&gt;sequence = an_rx_buf〔 12 〕 ;<br />　　// Physicalを抽出<br />　　artdmx_rx-&gt;physical = an_rx_buf〔 13 〕 ;<br />　　// Universeを抽出<br />　　artdmx_rx-&gt;subnet = an_rx_buf〔 14 〕 / 0x10 ;<br />　　artdmx_rx-&gt;universe = an_rx_buf〔 14 〕 % 0x10 ;<br />　　artdmx_rx-&gt;net = an_rx_buf〔 15 〕 ;<br />　　// Lengthを抽出<br />　　int_st〔 0 〕 = an_rx_buf〔 17 〕 ;<br />　　int_st〔 1 〕 = an_rx_buf〔 16 〕 ;<br />　　int_st〔 2 〕 = 0x00 ;<br />　　int_st〔 3 〕 = 0x00 ;<br />　　artdmx_rx-&gt;length = *( ( int * )&int_st〔0〕) ;<br />　　// Dataを抽出<br />　　for( i = 0; i &lt; artdmx_rx-&gt;length; i++ ) {<br />　　　　artdmx_rx-&gt;data〔 i 〕 = an_rx_buf〔 i + 18 〕 ;<br />　　}<br />　　if( artdmx_rx-&gt;length &lt; 512 ) {<br />　　　　for( i = artdmx_rx-&gt;length; i &lt; 512; i++ ) {<br />　　　　　　artdmx_rx-&gt;data〔 i 〕 = 0x00 ;<br />　　　　}<br />　　}<br />　　return 0 ;<br />}<br /><br />// ArtDMXのエンコード関数<br />int artdmx_encode( char *an_tx_buf, artdmx_t *artdmx_tx ) {<br />　　int i ;<br />　　// IDを設定<br />　　for( i = 0; i &lt; 8; i++ ) {<br />　　　　an_tx_buf〔 i 〕 = artdmx_tx-&gt;id〔 i 〕 ;<br />　　}<br />　　// OpCodeを設定<br />　　an_tx_buf〔 8 〕 = (char)( artdmx_tx-&gt;opcode % 0x100 ) ;<br />　　an_tx_buf〔 9 〕 = (char)( artdmx_tx-&gt;opcode / 0x100 ) ;<br />　　// ProVerを設定<br />　　an_tx_buf〔 10 〕 = (char)( artdmx_tx-&gt;prover / 0x100 ) ;<br />　　an_tx_buf〔 11 〕 = (char)( artdmx_tx-&gt;prover % 0x100 ) ;<br />　　// Sequenceを設定<br />　　an_tx_buf〔 12 〕 = (char) artdmx_tx-&gt;sequence ;<br />　　// Physicalを設定<br />　　an_tx_buf〔 13 〕 = (char) artdmx_tx-&gt;physical ;<br />　　// SubUniを設定<br />　　an_tx_buf〔 14 〕 = (char)( artdmx_tx-&gt;subnet * 0x100 + artdmx_tx-&gt;universe ) ;<br />　　// Netを設定<br />　　an_tx_buf〔 15 〕 = (char)artdmx_tx-&gt;net ;<br />　　// Lengthを設定<br />　　an_tx_buf〔 16 〕 = (char)( artdmx_tx-&gt;length / 0x100 ) ;<br />　　an_tx_buf〔 17 〕 = (char)( artdmx_tx-&gt;length % 0x100 ) ;<br />　　// Dataを設定<br />　　memcpy( an_tx_buf + 18, artdmx_tx-&gt;data, 512 ) ;<br />　　return 0 ;<br />}<br /><br />// ArtDMXのチェック用画面表示<br />int artdmx_check_disp( artdmx_t *artdmx, char *key_code_st, int *key_code_length_st,<br />　　　　　　　　　　unsigned long long int *val1, unsigned long long int *val2 ) {<br />　　// 汎用変数<br />　　//int i ;<br />　　// タイムカウント変数<br />　　struct timespec now ;　　　　　　　　　　　　　 // 現在POSIX時を得る構造体<br />　　unsigned long long int now_nsec ;　　　　　　　 // 現在nsecを保存<br />　　static unsigned long long int prev_nsec = 0 ;　 // 過去nsecを保存<br />　　// データ管理用<br />　　static artdmx_t artdmx_disp ;<br />　　// std_dump 用変数<br />　　static int first_line = 0 ;　　　　　　　　　　 // 表示開始行数<br />　　// 表示制御変数<br />　　struct winsize ws ;<br />　　static int col = 20 ;<br />　　static int row = 100 ;<br />　　static int net = 0 ;<br />　　static int subnet = 0 ;<br />　　static int universe = 0 ;<br /><br />　　// カーソルキー入力<br />　　if( *key_code_length_st &gt; 0 ) {<br />　　　　if( strcmp( key_code_st, _KEY_RIGHT ) == 0 ) {<br />　　　　　　if( ++universe &gt; 7 ) universe = 7 ;<br />　　　　}<br />　　　　if( strcmp( key_code_st, _KEY_LEFT ) == 0 ) {<br />　　　　　　if( --universe &lt; 0 ) universe = 0 ;<br />　　　　}<br />　　　　if( strcmp( key_code_st, _KEY_UP ) == 0 ) {<br />　　　　　　first_line-- ;<br />　　　　}<br />　　　　if( strcmp( key_code_st, _KEY_DOWN ) == 0 ) {<br />　　　　　　first_line++ ;<br />　　　　}<br />　　　　*key_code_length_st = 0 ;<br />　　}<br />　　// 対象ユニバースのデータをスタック<br />　　if( ( artdmx-&gt;net == net ) && ( artdmx-&gt;subnet == subnet ) && ( artdmx-&gt;universe == universe ) ) {<br />　　　　memcpy( &artdmx_disp, artdmx, sizeof( artdmx_t ) ) ;<br />　　}<br /><br />　　// タイムカウント<br />　　clock_gettime( CLOCK_REALTIME, &now ) ;　　　　　　　　　　　　 // 現在POSIX時間値取得<br />　　now_nsec = ( unsigned long long int )now.tv_sec * 1e9　　　　　 // unsigned long long int型(8バイト長int)変数に<br />　　　　　　　　+ now.tv_nsec ;　　　　　　　　　　　　　　　　　　 // 取得値をひとまとめにする(nsec)<br />　　if( now_nsec - prev_nsec &lt; 5e7) return -1 ;　　　　　　　　　　 // 経過時間が不足なら何もせずリターン<br />　　prev_nsec = now_nsec ;　　　　　　　　　　　　　　　　　　　　　// 過去nsecを現在値としておく<br />　　// 画面のテキスト表示サイズを取得<br />　　ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) ;　　　　　　　　　　　　 // 画面サイズを取得 幅=ws.ws_col 高=ws.ws_row<br />　　if( row + 4 &gt; ws.ws_row ) row = ws.ws_row - 4 ;　　　　　　　　 // dumpの行数制限<br />　　// artdmxを表示<br />　　printf( &quot;\e〔0;0H&quot; ) ;　　　　　　　　　　　　　　　　　　　　　　　　　 // カーソルを左上に　 <br />　　printf( &quot;Sender&#58; %s&#58;%d&quot;, artdmx_disp.senderip, artdmx_disp.senderport ) ;<br />　　printf( &quot;\e〔28GID&#58; %s&quot;, artdmx_disp.id ) ;<br />　　printf( &quot;\e〔41GOpCode&#58; 0x%04X&quot;, artdmx_disp.opcode ) ;<br />　　printf( &quot;\e〔57GProVer&#58; 0x%04X&quot;, artdmx_disp.prover ) ;<br />　　printf( &quot;\e〔0K\nSequence&#58; 0x%04X&quot;, artdmx_disp.sequence ) ;<br />　　printf( &quot;\e〔19GPhysical&#58; 0x%04X&quot;, artdmx_disp.physical ) ;<br />　　printf( &quot;\e〔37GLength&#58; %d&quot;, artdmx_disp.length ) ;<br />　　printf( &quot;\e〔50G&lt; Net&#58;%d SubNet&#58;%d Universe&#58;%d &gt;\e〔0K\n&quot;, artdmx_disp.net, artdmx_disp.subnet, artdmx_disp.universe ) ;<br />　　dump_print( artdmx_disp.data, artdmx_disp.length, col, row, &first_line, 0 ) ;<br />　　printf( &quot;%8lld /%8lld nsec&quot;, *val1, *val2 ) ;<br />　　//fflush( stdout ) ;<br />　　// 終了<br />　　return 0 ;<br />}</span></small><br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%41%72%74%2d%4e%65%74" class="taglink" title="Art-Net">#&#91;Art-Net&#93;</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔12336文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1059</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1059</guid>
	<category>tegalog</category>
	<pubDate>Fri, 06 Jun 2025 12:59:08 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　今年も師走です。 ]]></title>
	<description><![CDATA[ 　今年も師走です。<br />　現場は現地照明をもう１件やれば終わり。今期の年末年始は人並みにユックリ出来そうです。<br />　そんな時は机上の勉強を進めたいものです。物理的な加工や開発・設計ではなくお勉強。特にＣ言語の勉強です。<br />　一応書けるのですが、ポインタや構造体についてボンヤリしているところを整理したい。Art-Net関連には特に重要な基礎ですから抑えないといけません。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔187文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=982</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=982</guid>
	<category>tegalog</category>
	<pubDate>Sat, 28 Dec 2024 15:55:20 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　セマフォの使い方が見えたので構造の重要な要素は獲得出来まし… ]]></title>
	<description><![CDATA[ 　セマフォの使い方が見えたので構造の重要な要素は獲得出来ました。<br />　構成ですが、起動し mmap や pipe を定義し子プロセスの状態を監視する親プロセス「ArtNetPatch」、ユーザーの操作の相手やデータを画面表示をする子プロセス「ArtNetConsole」、Art-Netを送受信しパッチ処理やプロファイルカーブ処理を行う子プロセス「ArtNetEngine」の３本柱にしようと思います。<br />　子プロセスの生成は fork を使います。fork ならば mmap、pipe、semaqhoe を子プロセスに渡すのが楽です。メモリの消費は多くなるようですが、実体の複製ですからポインタ祭りにならずに済みます。メモリの消費が多いと言っても、私が作るソフトウェアの規模などたかが知れていますので RaspberryPiCM4 の８GBモデルなら楽勝でしょう。<br />　こういった構造は面倒な気もしますが、プロセス構造をシッカリ作っておけば開発が楽になると思いますし、何よりも「ArtNetEngine」の処理にリソースを集中したいのです。状態監視やユーザー相手は100msec毎で十分ですが、Art-Net の処理は5msec毎が欲しいのです。分散処理というより、求めるラップが違う処理を明確に分けたいのです。<br />　処理時間を意識してしまうのは PIC マイコンからのクセですが、RaspberryPiCM4 で８ユニバースのパッチ処理をするならダイエットが大事かと。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%41%72%74%2d%6e%65%74" class="taglink" title="Art-net">#&#91;Art-net&#93;</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔649文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=963</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=963</guid>
	<category>tegalog</category>
	<pubDate>Wed, 20 Nov 2024 19:25:06 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　ArtNet-Patch で共有メモリの mmap を使う… ]]></title>
	<description><![CDATA[ 　ArtNet-Patch で共有メモリの mmap を使うために セマフォ を勉強しています。mmap へのアクセスを排他的にするためです。<br />　ただ、プロセス間のセマフォを使うような人は上級者が多いのか解説ページを見てもわかりにくい。<br />　POSIX系のセマフォは物凄くシンプルな感じがしますが、とどのつまりがわからない。<br />　man もわかっている人向けなのか引数の記述があるだけ。<br />　もっと勉強です。<br /><br />追記<br />　なんて愚痴っていたらよい記事がありました。<br />　開始が sem_init だったり sem_open だったりするけど、同じことみたいですからヘッダファイルのプロトタイプ記述を読めば良さそう。<br /><a class="url" href="https&#58;//manpages.ubuntu.com/manpages/focal/ja/man7/sem_overview.7.html" target="_blank" title="https&#58;//manpages.ubuntu.com/manpages/focal/ja/man7/sem_overview.7.html">「sem_overview - POSIX セマフォの概要」</a> <br /><a class="url" href="https&#58;//manpages.opensuse.org/Tumbleweed/man-pages-ja/sem_init.3.ja.html" target="_blank" title="https&#58;//manpages.opensuse.org/Tumbleweed/man-pages-ja/sem_init.3.ja.html">「man-pages-ja sem_init(3)」</a> <br />　次の記事は、パーミッションにおける umask のことが主題ですが、セマフォの使い方がよくわかる。シンプルな記述を示してくれるこんな記事が嬉しい。<br /><a class="url" href="https&#58;//iww.hateblo.jp/entry/20240515/semaphore" target="_blank" title="https&#58;//iww.hateblo.jp/entry/20240515/semaphore">「sem_openで、Permission denied になる」</a> <br />　わかった気になった。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%41%72%74%2d%6e%65%74" class="taglink" title="Art-net">#&#91;Art-net&#93;</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔501文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=962</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=962</guid>
	<category>tegalog</category>
	<pubDate>Wed, 20 Nov 2024 18:00:29 +0900</pubDate>
</item>

	<!-- END ENTRIES -->
</channel>
</rss>

