<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title><![CDATA[ タグ「Ｃ言語」を含む投稿［80件］ - 電装工芸日記 - 舞台照明機器の製作とか - ]]></title>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi</link>
	<description><![CDATA[ 今年は開発案件を進めたい ]]></description>
	<language>ja</language>
	<copyright>Copyright 2026</copyright>
	<lastBuildDate>Mon, 20 Apr 2026 06:10:27 +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[ 　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>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　少し時間が空いたので ArtNet-Patch を考えてい… ]]></title>
	<description><![CDATA[ 　少し時間が空いたので ArtNet-Patch を考えていました。<br />　部分はなんとなく出来ているので、全体の構造をどうするか。<br />　まずプロセスを分けます。シングルプロセスではたぶんダメ。画面やキーボード操作を親プロセスにし、Art-Net の受信、パッチ処理、送信などを子プロセスとしようかと。子プロセスはタイムアウトする様にし、親プロセスからのリフレッシュが一定時間無ければ自動的に閉じることにします。こうしておけば親プロセスが飛んでも子プロセスがゾンビにならずいいかなと。操作が飛んでも Art-Net は生きている方がいいとする考え方もありますが、タイムアウト処理をコメントにすればそうなります。少なくとも開発中はタイムアウトした方がいいでしょう。<br />　プロセス間は mmap や Pipe で繋ぎます。データには mmap を用い、コマンドには Pipe を用いるイメージです。<br />　子プロセスの Art-Net 処理をイメージしながら表示画面やキーボード操作を考えてみましょう。<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 電装工芸 〔460文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=961</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=961</guid>
	<category>tegalog</category>
	<pubDate>Sat, 16 Nov 2024 15:58:30 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　ncurses はウィンドウも定義出来ます。 ]]></title>
	<description><![CDATA[ 　ncurses はウィンドウも定義出来ます。<br />　今時のウィンドウとは違い、画面の中に子領域を作るイメージです。この領域内で文字位置が指定出来ます。子領域の左上を文字位置の 0,0 として扱えます。<br />　ダイアログウィンドウを描くことも出来ますし、画面の区分けにも使えます。<br />　今ネタになっている ArtNet-Patch では、すべてのレイアウトに共通する要素をメイン画面に描き、機能ごとの要素をウィンドウにして描こうかなと。表示位置のオフセット管理が楽になりますし、複数のレイアウトで共通する要素は使いまわしがしやすくなります。<br />　ncurses はキー入力も受け取れますので、ユーザーの相手にする部分は ncurses で全て作れそうです。<br />　後は string の使い方を頭に刷り込めば画面は作れるかなと。Ｃ言語の欠点は文字列の扱い難さですが、文字列は char の配列であることを頭に染み込ませてから string を勉強しなおしましょう。<br /><br />　アホかと思うくらいＣ言語について検索してきたので、これまで ncurses を知らなかったのは何故だろう。<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 電装工芸 〔497文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=959</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=959</guid>
	<category>tegalog</category>
	<pubDate>Thu, 14 Nov 2024 11:44:02 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　Ｃ言語のライブラリである ncurses を勉強しています… ]]></title>
	<description><![CDATA[ 　Ｃ言語のライブラリである ncurses を勉強しています。ANSIエスケープシーケンスを簡単に使える様にしたライブラリです。<br />　コマンドで全て描画するので今時の画面作りツールに比べたら面倒ですが、ANSIエスケープシーケンスを直接触ると思えば超簡単。歴史の長いライブラリのためか、奇妙な変化球がなくシンプルなのが私好み。<br />　x-windowベースのグラフィカルな画面にしてもいいのですが、リソースの節約をしたいし、あえてレガシーな風味がいいかなと思っております。<br />　Art-Netを受信して処理して送信する機能は一応出来ているので、まずは画面作りのお勉強をしましょう。データのモニターが出来ないと見えない部分の動作のチェックもし難いですしね。<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 電装工芸 〔340文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=958</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=958</guid>
	<category>tegalog</category>
	<pubDate>Wed, 13 Nov 2024 10:46:56 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　こんなん欲しいなぁ～と思っていた RaspberryPiC… ]]></title>
	<description><![CDATA[ 　こんなん欲しいなぁ～と思っていた RaspberryPiCM4 用のマザーボードを発見！CM4-Dual-Eth-Base です。<br /><img class="embeddedimage" src="https&#58;//www.densokogei.jp/tegalog/images/20241109224720-admin.jpg" alt="20241109224720-admin.jpg"><br />　<a class="url" href="https&#58;//ja.aliexpress.com/item/1005008035494303.html?spm=a2g0o.order_list.order_list_main.4.fa59585aMzBLXA&amp;gatewayAdapt=glo2jpn" target="_blank" title="https&#58;//ja.aliexpress.com/item/1005008035494303.html?spm=a2g0o.order_list.order_list_main.4.fa59585aMzBLXA&amp;gatewayAdapt=glo2jpn">中華電機のサイト</a> <br />　EtherNet が２系統、RTC、電源入力がUSB-Cでなく裏側にある、etc.<br />　PCI-Ex1 もあれば満点ですが、USB-3.0 が３系統あるので十分です。<br />　これが入荷したら ArtNet-Patch の開発を再開しようかと。晩酌の肴ですけどね。<br />　画面作りに ncurses を使えばと思っていましたが、ふと思いついて調べ直したらこれは便利。ネットにも man にもわかり易く整理された情報がないので、お試ししながらオレオレマニュアルを作成して本体ページにアップしましょう。自分の為にですけどね。<br />　最近、RaspberryPi の価格も下がってきました。CM4 が 中華電機で１万円せずに買えます。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%52%61%73%70%62%65%72%72%79%50%69" class="taglink" title="RaspberryPi">#RaspberryPi</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=%41%72%74%2d%4e%65%74" class="taglink" title="Art-Net">#&#91;Art-Net&#93;</a> -- Posted by 電装工芸 〔416文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=956</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=956</guid>
	<category>tegalog</category>
	<pubDate>Sat, 09 Nov 2024 22:47:20 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　Ｃ言語ネタです。 ]]></title>
	<description><![CDATA[ 　Ｃ言語ネタです。<br />　<a class="url" href="https&#58;//iww.hateblo.jp/entry/20180822/semaphore" target="_blank" title="https&#58;//iww.hateblo.jp/entry/20180822/semaphore">セマフォを使ったプロセス間での排他制御</a><br />　セマフォは異なるプロセスが共有メモリへ同時に読み書きをしないために使おうを思っています。この記事だけではどう使ったらいいか見えませんが、セマフォの機能についてはシンプルに要点を突いて分かりやすい。こういう蛇足が無い説明は好きです。<br />　ここでは他のプロセスの挙動は説明されていませんが、同じ名前のセマフォ(この記事では&quot;/unko&quot;)を開いて同じ様に使います。同じセマフォを持った二つのプロセスがあるとして、後から sem_wait(sem) を実行した側は先に sem_wait(sem) を実行した側が sem_post(sem) を実行するまでブロック(動作を一時停止)します。sem_trywait(sem) を用いればブロックせずに戻りますので戻り値を見て処理を続行出来ます。<br />　自力でセマフォを作ろうと思っていましたが、この方法でいいんでないかなと。<br /><br />　セマフォの方針が決まれば必要なことが一通りまとまったことになるので書き始められそうです。<br />　まずは Art-Net を丁寧に受信する処理から進めます。ネットワーク上のすべての ArtDMX(スロットデータが列挙されたパケット) と存在する送信機の一覧を取得し、別プロセスから読み出して階層的に表示することを当面の目標とします。一種の Art-Net モニタでしょうか。画面を横に３分割し、左に送信機の一覧、中間に選択された送信機が扱うユニバース、右にスロットデータといった構成です。送信機とユニバースをキーボード(カーソル)操作で選択することも習作の一部となります。<br />　これが作れなければ ArtNetPatch など作れませんし、最終的なパッケージでも欲しい機能です。　<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 電装工芸 〔757文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=846</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=846</guid>
	<category>tegalog</category>
	<pubDate>Sun, 31 Mar 2024 13:46:34 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　コンソールの画面操作では「ＡＮＳＩエスケープシーケンス」を… ]]></title>
	<description><![CDATA[ 　コンソールの画面操作では「ＡＮＳＩエスケープシーケンス」を使うイメージでいましたが、「ncurses」と呼ばれる便利なライブラリがあることを今更知りました。これを使えばコンソール画面作りが楽になりそうです。<br />　キー操作の扱いを調べていたのですが、<a class="url" href="https&#58;//jp-seemore.com/iot/11222/" target="_blank" title="https&#58;//jp-seemore.com/iot/11222/">「C言語で矢印キーの入力を完璧に検出する5つのステップ」</a>を読んでいたら「ncurses」が便利とのこと。ここから調べを進めたところナルホドが連発。<a class="url" href="https&#58;//www.kushiro-ct.ac.jp/yanagawa/curses/about.html" target="_blank" title="https&#58;//www.kushiro-ct.ac.jp/yanagawa/curses/about.html">「cursesライブラリの超てきとー解説」</a>を読むと概要がわかるような。<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 電装工芸 〔238文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=839</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=839</guid>
	<category>tegalog</category>
	<pubDate>Wed, 20 Mar 2024 19:29:59 +0900</pubDate>
</item>

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

