<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title><![CDATA[ 2023年1月の投稿［29件］ - 電装工芸日記 - 舞台照明機器の製作とか - ]]></title>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi</link>
	<description><![CDATA[ 今年は開発案件を進めたい ]]></description>
	<language>ja</language>
	<copyright>Copyright 2026</copyright>
	<lastBuildDate>Wed, 03 Jun 2026 15:33:11 +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[ 　てなわけで、socketの実験に入る下準備が整いました。P… ]]></title>
	<description><![CDATA[ 　てなわけで、socketの実験に入る下準備が整いました。Pythonで出来たことですからＣ言語(gcc)で出来ないことではないでしょう。<br />　Art-Netエンジンを構成するにはFIFOというか循環配列というかリングキャッシュというかQueueも勉強しないとけません。例えば1024個の配列を作ったとして、これがリング状に繋がったイメージで使います。1024で折り返すカウンタを使って配列の基点位置を表すだけですが、カウンタの計算モジュールだけでもライブラリ化しないと面倒かなと。<br />　これはDelayで必要な機能です。一定の時間間隔でDMXのデータを保存し続ければ配列サイズが許す範囲で過去情報を取り出せます。つまりDelayになります。受信毎の保存でないことが肝ですが、往年のテープエコーと要領は同じです。<br />　Ｃ言語はボチボチ書けるようになってきましたし、先達の情報も読み取れるようになってきました。パッチマシンとしての完成は先としても、この閑散期にArt-Netエンジンだけでも完成させたいです。<br /><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=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔603文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=492</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=492</guid>
	<category>tegalog</category>
	<pubDate>Tue, 31 Jan 2023 16:21:14 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　キー入力の処理を書き直してみました。 ]]></title>
	<description><![CDATA[ 　キー入力の処理を書き直してみました。<br />　ファンクションキーやカーソルキーなどの複数バイトでキーコードを出すキーも扱えます。shiftやAltなどの装飾キーは拾えませんケド。<br />　入力の待ち時間はありません。get_inkey()はすぐ戻ってきます。戻り値はキーコードの長さを表しますが、０なら入力が無かったと判別出来ます。<br />　得られるのは標準入力からのASCIIコードです。read()はキャッシュを読むだけでタイミング次第では取得値に複数のキーコードが混じることがありますが、これをキー単体のコードとして仕分けています。キャッシュの一番前のキーコードだけを取り出す単純な仕分けで、想定外のキーコードは読み飛ばしていますが十分でした。<br />　キーコードで何かをするにはswitch文やif文でそのコードを仕分ける必要があります。<br />　正常に動かすなら、100msec(1/10秒)毎以下でget_inkey()を読みに行く必要があります。<br />　定数設定とプロトタイプ宣言をヘッダーファイルに書けばincludeしてライブラリとして使えます。mainはコメント化して使った方がいいですけど。<br /><br /><small class="decorationT"><span class="decorationF deco-code">Raspberry Pi 4B / Rasbian11_32bit(blueseye) / OS標準gcc<br />/*　---------------------------------<br />　　リアルタイムにキー入力をチェックする<br />　　--------------------------------- */<br />/*　getcharはキー入力のキャッシュが空だと入力があるまで待つ。<br />　　キャッシュが無いなら無いでそのまま抜けたいが、タイムアウトを設定しても<br />　　抜けない。環境に寄るのかもしれないが、ioctl.hを用いることで<br />　　タイムアウトが実現できた。<br />　　get_inkeyの呼び出しは100msec(1/10秒)毎以下で繰り返し行うこと。短い方がいい。<br />*/<br /><br />/*　ライブラリ読み込み */<br />＃include &lt;stdio.h&gt;<br />＃include &lt;sys/ioctl.h&gt;<br />＃include &lt;termios.h&gt;<br />＃include &lt;unistd.h&gt;<br />＃include &lt;time.h&gt;<br /><br />/*　定数設定 */<br />＃define SET 1　　　　　　　 // ioctl.readのモードをRawにするフラグ<br />＃define RESET 0　　　　　　 // ipctl.readのモードをCanonicalに戻すフラグ<br />＃define LENGTH_STACK 32　　 // キー入力のスタック長 状況によるが、長めにしないと取り出しが半端になる<br />＃define ESC 0x1B　　　　　　// ASCIIコード ESC <br />＃define BRACKET 0x5B　　　　// ASCIIコード ［<br /><br />/* プロトタイプ宣言 */<br />int get_inkey( char *get_char ) ;　　　 // キー入力を取得する関数<br />　　// 戻り値　　　　　　　　　　　　　 // -1=エラー、0&gt;=取得したキーコードの長さ<br />　　// char *get_char　　　　　　　　　 // 取得したキーコードを返すポインタ<br />int set_inkey( int mode_flag ) ;　　　　// キー入力のモードを設定する関数<br />　　// int mode_flag　　　　　　　　　　// モードの設定フラグ 1(SET)=Rawモードにする / 0(CLR)=モードを戻す<br /><br />/*　テスト用main */<br />int main(void) {<br />　　int i ;　　　　　　　　　　　　　　 // for文用カウンタ<br />　　char get_char［ LENGTH_STACK ］ ;　　 // 入力されたキーコードを保存する変数<br />　　int ret_inkey　;　　　　　　　　　　// get_inkeyからの戻り値を保存する変数<br />　　/* コンソールの設定を初期化 */<br />　　set_inkey( SET ) ;<br />　　/* 無限ループで入力したキーを表示する */<br />　　for(;;) {<br />　　　　usleep( 1e5 ) ;<br />　　　　ret_inkey = get_inkey( get_char ) ;　　　　 // get_inkeyから文字取得<br />　　　　/* get_inkeyの戻り値を処理 */<br />　　　　if( ret_inkey == -1 ) break ;　　　　　　　 // 戻り値が-1ならエラーなのでループから抜けて終了<br />　　　　if( get_char［0］ == 0x0A ) break ;　　　　　 // エンターキーが押されたならループを抜けて終了<br />　　　　/* 入力された文字を出力する */<br />　　　　if( ret_inkey &gt; 0) {<br />　　　　　　for( i = 0; i &lt; ret_inkey; i++ ) {<br />　　　　　　　　if( get_char［i］ &gt;= 0x20 && get_char［i］ &lt;= 0x7E ) {　　　　　// 入力された文字を出力する・・・表示可能な文字<br />　　　　　　　　　　printf( &quot; %c&lt;%02X&gt;&quot;, get_char［i］, get_char［i］ ) ;<br />　　　　　　　　} else if( get_char［i］ &gt;= 0x00 && get_char［i］ &lt;= 0xFF ) {　 // 入力された文字を出力する・・・表示不可能な文字<br />　　　　　　　　　　printf( &quot;　&lt;%02X&gt;&quot;, get_char［i］ ) ;<br />　　　　　　　　}<br />　　　　　　}<br />　　　　　　printf( &quot;\n&quot; ) ;<br />　　　　}<br />　　　　fflush( stdout ) ;　// 画面表示のスタックを吐き出す　　　<br />　　}<br />　　/* 正常終了 */<br />　　printf( &quot;\n&quot; ) ;　　　　// 念のための改行<br />　　set_inkey( RESET ) ;　　// コンソールの設定を元に戻す<br />　　return 0 ;<br />}<br /><br />/* キー入力を取得する */<br />int get_inkey( char *get_char) {<br />　　// char *get_char　　　　　　　　　　　　　　　　　 // キーコードを返すためのchar配列のポインタ<br />　　int i ;　　　　　　　　　　　　　　　　　　　　　　 // for用変数<br />　　char in_char［ LENGTH_STACK ］ = { 0x00 };　　　　　　// 入力されたキーを取得<br />　　int read_length ;　　　　　　　　　　　　　　　　　 // read()戻り値 キーコードのバイト数<br />　　int put_length = 0 ;　　　　　　　　　　　　　　　　// 戻り値 キーコードのバイト数<br /><br />　　/* get_charの初期化 */<br />　　for( i = 0; i &lt; LENGTH_STACK; i++ ) {　　　　　　　 // すべての値を0x00にする<br />　　　　get_char［ i ］ = 0x00 ;<br />　　}<br />　　/* キー入力を読み取る */<br />　　read_length = read( 0, &in_char, LENGTH_STACK ) ;　 // read_lengthに取得バイト数、in_charにキーコードを得る<br /><br />　　/* 取得値の仕分け */<br />　　if( read_length &lt; 0 ) {　　　　　　　　　　　　　　 // 取得エラーなのでエラーを返して終了<br />　　　　return -1 ;<br />　　} else if( read_length == 0 ) {　　　　　　　　　　 // キーコードを得られなかったのでゼロを返す<br />　　　　return 0 ;<br />　　} else if( read_length == 1　　　　　　　　　　　　 // 取得が１バイトか先頭バイトがESC(0x1B)以外なら先頭バイトを返す<br />　　　　　　　|| in_char［ 0 ］ != ESC ) {<br />　　　　get_char［ 0 ］ = in_char［ 0 ］ ;　　　　　　　　　// 値コピー<br />　　　　return 1 ;<br />　　} else if( read_length &gt; 2　　　　　　　　　　　　　// 3バイト以上で先頭２バイトが0x1B(ESC)、0x5B(［)なら<br />　　　　　　　&& in_char［ 0 ］ == ESC　　　　　　　　　　// ファンクションキーまたはカーソルキー<br />　　　　　　　&& in_char［ 1 ］ == BRACKET ) {<br />　　　　get_char［ 0 ］ = ESC ;　　　　　　　　　　　　　 // 0バイト目<br />　　　　get_char［ 1 ］ = BRACKET ;　　　　　　　　　　　 // 1バイト目<br />　　　　put_length = 2;　　　　　　　　　　　　　　　　 // 戻り値設定<br />　　　　for( i = 2; i &lt; read_length; i++ ) {　　　　　　// 2バイト目以降をコピー<br />　　　　　　if( in_char［ i ］ == ESC ) break ;　　　　　 // 末尾にESCがあれば終了<br />　　　　　　　　get_char［ i ］ = in_char［ i ］ ;　　　　　// 値コピー<br />　　　　　　　　put_length++ ;　　　　　　　　　　　　　// 戻り値インクリメント<br />　　　　}<br />　　　　return put_length ;　　　　　　　　　　　　　　 // 戻り値送って終了<br />　　}<br />　　return 0 ;<br />}<br /><br />/* キー入力のモードを設定する */<br />int set_inkey( int mode_flag ) {<br />　　static struct termio tty_backup ;　　　　　　　 // 変更前の設定を保持<br />　　static struct termio tty_change ;　　　　　　　 // 変更後の設定を保持<br />　　/* モードを設定する */<br />　　if( mode_flag == SET ) {<br />　　　　ioctl( 0, TCGETA, &tty_backup ) ;　　　　　 // 現在の設定を読み出し<br />　　　　tty_change = tty_backup ;　　　　　　　　　 // 現在設定のスタック<br />　　　　tty_change.c_lflag &= ~( ECHO | ICANON ) ;　// エコーを止め、RAW モードへ変更<br />　　　　tty_change.c_cc［ VMIN ］= 0 ;　　　　　　　　// 0文字入力された時点で入力を受け取る<br />　　　　tty_change.c_cc［ VTIME ］ = 0.01 ;　　　　　 // 何も入力がない場合、1msec待つ (1 = 1/10sec)<br />　　　　ioctl( 0, TCSETAF, &tty_change ) ;　　　　　// ここで設定を反映<br />　　/* モードを戻す */<br />　　} else if( mode_flag == 0 ) {<br />　　　　ioctl( 0, TCSETAF, &tty_backup ) ;　　　　　// スタックしていた設定に戻す<br />　　}<br />　　return 0;<br />}</span></small><br /><small class="decorationS">　※ このブログシステムでは＃や［が機能文字扱いなので、上記ではこれらを全角文字で書いています。</small><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 電装工芸 〔4874文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=491</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=491</guid>
	<category>tegalog</category>
	<pubDate>Tue, 31 Jan 2023 14:20:06 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　本業は当面の課題を一通りやっつけました。 ]]></title>
	<description><![CDATA[ 　本業は当面の課題を一通りやっつけました。<br />　追われる感じが無いって幸せ。<br /><br />　そんぢゃ今夜はＣ言語の勉強！！、といきたいところですが、ここ数日、朝から晩まで１０時間以上図面書きをやりますと帰宅してからヤル気はおきません。今夜は脳味噌を休ませてアタマを切替えます。<br />　明日と明後日は急ぎの要件が無いので、キー入力の実験、これまでに実験したネタの整理、socketによるArt-Net処理の実験に手を付けましょう。<br /><br />　キー入力はioctl.hとtermios.hを用いて設定しread()で読み込む方法を用いていますが、これってデバイスドライバを書く基本なんだそうです。<br />　宛先を設定し、read()で取り込み、write()で送り出すという極めてシンプルな構成ですが、合理主義者の神達がローレベルの制御に対し案件毎に違ったやり方を定義するとは思えませんので納得です。<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 電装工芸 〔464文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=490</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=490</guid>
	<category>tegalog</category>
	<pubDate>Sun, 29 Jan 2023 20:03:12 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　キー入力はファンクションキーや矢印キーが複数バイトのデータ… ]]></title>
	<description><![CDATA[ 　キー入力はファンクションキーや矢印キーが複数バイトのデータなので、先のプログラムではこれらを正しく判別出来ません。0x1Bを得てもESCキーなのか矢印キーなのか区別できないからです。<br />　これらのデータが一度にキャッシュに入って連続した読み出しとなる(タイムアウト無しに連続して読み出せる)ならいいですが、そうでないと面倒です。いずれにしてもこの辺りの挙動をチェックする必要があります。今は１バイトのcharとして処理していますが、８バイトくらいのchar配列、つまり文字列として処理することになりそうです。<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 電装工芸 〔260文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=489</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=489</guid>
	<category>tegalog</category>
	<pubDate>Sat, 28 Jan 2023 14:37:31 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　キー入力の処理が出来ましたが、願わくば押し下げと解放も拾い… ]]></title>
	<description><![CDATA[ 　キー入力の処理が出来ましたが、願わくば押し下げと解放も拾いたいところではあります。<br />　ですが、ハードウェアが汎用ですし、キーボードが押されたことを検知しているのではなく、入力された文字コードを得る処理ですので、これ以上細かいことはもう少し勉強しないとダメかな。<br /><br />　socketの検証は場所も時間も潤沢に必要なので、もう少し本業を終わらせないと手を付けられませんが、キー入力によるコマンド処理をどうしようか考えています。<br />　入力されたアルファベットをコマンドショートカットとし、数字は数字として扱うことを基本にしようと思います。キーに対して処理を割り付けるのではなく、得たASCIIテキストに対して処理を割り付ければ標準入力だろうがUARTだろうがsocketだろうが何でも良く、ハードウェアに合わせた入口さえ作ればその先の処理は同じでいけます。こうするのは専用入力端末が壊れた時に汎用のキーボードでも対応したいからです。<br />　では、得たASCIIテキストをどう処理するかです。<br />　入力されたASCIIテキストは文字列として普通に扱えばいいでしょう。画面にコマンド列を表示したいならそれを変換すればいいし、コマンドを実行するなら関数に文字列として投げればいい。<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=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔710文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=488</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=488</guid>
	<category>tegalog</category>
	<pubDate>Sat, 28 Jan 2023 10:19:52 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　ANSI-CというかLinuxのＣ言語ではキー入力は「待ち… ]]></title>
	<description><![CDATA[ 　ANSI-CというかLinuxのＣ言語ではキー入力は「待ち」が基本です。何かキーが入力されるとか、Enterを押されるまで処理が一時停止します。それでも構わないこともありますが、ダメな時もあります。<br />　WindowsならDxLib.hを使って様々な入力を直に得ることが出来ますが、ANSI-Cの標準ライブラリには同様の物がありません。<br />　そこで、キー入力があれば受け付け、無いなら飛ばして次に行く処理を作ってみました。キー入力はOSがバッファしているので、これを覗く形です。<br /><br /><small class="decorationT"><span class="decorationF deco-code">Raspberry Pi 4B / Rasbian11_32bit(blueseye) / OS標準gcc<br />/*　---------------------------------<br />　　リアルタイムにキー入力をチェックする<br />　　--------------------------------- */<br />/*　getcharはキー入力のキャッシュが空だと入力があるまで待つ。<br />　　キャッシュが無いなら無いでそのまま抜けたいが、タイムアウトを設定しても<br />　　抜けない。環境に寄るのかもしれないが、ioctl.hを用いることで<br />　　タイムアウトが実現できた。<br />*/<br /><br />/*　ライブラリ読み込み */<br />＃include &lt;stdio.h&gt;<br />＃include &lt;sys/ioctl.h&gt;<br />＃include &lt;termios.h&gt;<br />＃include &lt;unistd.h&gt;<br /><br />/*　定数設定 */<br />＃define SET 1　　　　　　　 // ioctl.readのモードをRawにするフラグ<br />＃define RESET 0　　　　　　 // ipctl.readのモードをCanonicalに戻すフラグ<br /><br />/*　プロトタイプ宣言 */<br />int get_inkey( char *get_char ) ;　 // キー入力を取得する関数<br />　　// char *get_char　 取得したキーコードを返すポインタ<br />int set_inkey( int mode_flag ) ;　　// キー入力のモードを設定する関数<br />　　// int mode_flag　　モードの設定フラグ 1(SET)=Rawモードにする / 0(CLR)=モードを戻す<br /><br />/*　テスト用main */<br />int main(void) {<br />　　char in_char = 0 ;　　　// 入力されたキーコードを保存する変数<br />　　int ret_inkey = 0 ;　　 // get_inkeyからの戻り値を保存する変数<br />　　/* コンソールの設定を初期化 */<br />　　set_inkey( SET ) ;<br />　　/* 無限ループで入力したキーを表示する */<br />　　for(;;) {<br />　　　　// get_inkeyから１文字取得<br />　　　　in_char = 0x00 ;　　　　　　　　　　// 事前初期化<br />　　　　ret_inkey = get_inkey( &in_char ) ; // キー取得<br />　　　　/* get_inkeyの戻り値を処理 */<br />　　　　// 戻り値が-1ならエラーなのでループから抜けて終了<br />　　　　if( ret_inkey == -1 ) {<br />　　　　　　break ;<br />　　　　// エンターキーが押されたならループを抜けて終了<br />　　　　} else if( in_char == 0x0A ) { <br />　　　　　　break ;<br />　　　　// 入力された文字を出力する・・・表示可能な文字<br />　　　　} else if( in_char &gt;= 0x20 && in_char &lt;= 0x7F ) {<br />　　　　　　printf( &quot; %c&lt;%02X&gt;&quot;, in_char, in_char ) ;<br />　　　　// 入力された文字を出力する・・・表示不可能な文字<br />　　　　} else if( in_char &gt; 0x00 && in_char &lt;= 0xFF ) {<br />　　　　　　printf( &quot;　&lt;%02X&gt;&quot;, in_char ) ;<br />　　　　} <br />　　　　fflush( stdout ) ;　// 画面表示のスタックを吐き出す　　　<br />　　}<br />　　/* 正常終了 */<br />　　printf( &quot;\n&quot; ) ;　　　　// 念のための改行<br />　　set_inkey( RESET ) ;　　// コンソールの設定を元に戻す<br />　　return 0 ;<br />}<br /><br />/* キー入力を取得する */<br />int get_inkey( char *get_char) {<br />　　char in_char = 0 ;　　　　　// 入力されたキーを保持<br />　　char read_length = 0 ;　　　// 読み込んだバイト数<br /><br />　　// readを使って標準入力から１文字取得<br />　　read_length = read( 0, &in_char, 1 ) ;<br />　　// read_lengthが-1ならエラー、それ以外なら正常<br />　　if( read_length != -1 ) {　 // 正常なので取得値を返す<br />　　　　*get_char = in_char ;<br />　　} else {　　　　　　　　　　// エラーなので以上通知<br />　　　　*get_char = 0x00 ;<br />　　　　set_inkey( RESET ) ;<br />　　　　return -1 ;<br />　　}<br />　　return 0;<br />}<br /><br />/* キー入力のモードを設定する */<br />int set_inkey( int mode_flag ) {<br />　　static struct termio tty_backup;　　　　// 変更前の設定を保持<br />　　static struct termio tty_change;　　　　// 変更後の設定を保持<br />　　// モードを設定する<br />　　if( mode_flag == SET ) {<br />　　　　// 現在の設定をスタック<br />　　　　ioctl(0, TCGETA, &tty_backup);<br />　　　　tty_change = tty_backup;<br />　　　　// 設定を変更<br />　　　　tty_change.c_lflag &= ~( ECHO | ICANON ) ;　　　// エコーを止め、RAW モードへ変更<br />　　　　tty_change.c_cc［VMIN］= 0 ;　　　　　　　　　　// 0文字入力された時点で入力を受け取る<br />　　　　tty_change.c_cc［VTIME］ = 0.01 ;　　　　　　　 // 何も入力がなくても1msec待つ (1 = 1/10sec)<br />　　　　ioctl( 0, TCSETAF, &tty_change ) ;　　　　　　　// ここで設定を反映<br />　　// モードを戻す<br />　　} else if( mode_flag == 0 ) {<br />　　　　// スタックしていた設定に戻す<br />　　　　ioctl( 0, TCSETAF, &tty_backup ) ;<br />　　}<br />　　return 0;<br />}</span></small><br /><br />　同じ感じでgetcharを使ってもいいような情報が多かったのですが、RaspberryPiのblueseyeではこの方法でないとキー入力があるまで一時停止してしまいます。<br />　Pythonでも同様の処理を書いたことがありますが、Ｃ言語の方が圧倒的にレスポンスがいいです。<br />　矢印キーがANSIエスケープシーケンスのコードで取得できたことには驚きましたが、ファンクションキーも含め、getcharでは取得できないこともあるキーも取得出来て満足。<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 電装工芸 〔3225文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=487</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=487</guid>
	<category>tegalog</category>
	<pubDate>Fri, 27 Jan 2023 23:28:47 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　棚上げしていた本業に取り組んでおりますが、ここ10日ほどは… ]]></title>
	<description><![CDATA[ 　棚上げしていた本業に取り組んでおりますが、ここ10日ほどは残業することも精神的に追われることもない日常を送っているので心身共に回復しております。<br /><br />　VSCodeのオカゲですが、Pythonと同じ感覚でＣ言語を使えています。覚えなきゃならないことはまだまだ沢山ありますが、実行ファイルの完成まで１クリックですし、コンパイルエラーの説明がとても丁寧でわかりやすいし、コンパイルの時間もPythonのインタプリタ翻訳と大差ありませんので、方言違いのPythonを書いている様な使い勝手です。相当昔の記憶によりますが、リンカーの処理を勝手にやってくれるだけでも楽ってもんです。<br />　Ｃ言語の取り扱いにはローレベルのコンピュータの知識と摩訶不思議な記述の習得が不可欠ですが、慣れてくるとPythonよりも書いてて楽しいですね。コンピュータを動かしているって実感がPICのアセンブラ並に強いからでしょうか。何をしているかも所要時間もわからない便利なだけのコマンドでハードウェアの制御をするとすべてが遠くに思えて面白くありません。この感覚が変人たる所以かもしれませんが、私の基本はハードウェアを直に動かすPICのアセンブラなんだと改めて思います。<br /><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 電装工芸 〔649文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=486</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=486</guid>
	<category>tegalog</category>
	<pubDate>Thu, 26 Jan 2023 18:57:09 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　ダンプ表示のライブラリは出来ました。何の変哲もない16進数… ]]></title>
	<description><![CDATA[ 　ダンプ表示のライブラリは出来ました。何の変哲もない16進数のカラム表示です。<br />　データ配列のポインタ、表示データ数、列数、行数、最上行値のポインタなどを引数にして関数を呼ぶと表示します。<br />　地味ですが、こういったライブラリがあると開発の効率が良くなるのでは？という想いで作ってみました。後でDMXデータを表示する画面を作る際にも同様のことをするので習作でもあります。<br /><br />　以下オレメモです。<br />　ANSIエスケープシーケンスにおいてパラメータに変数を用いたい場合。<br /><br />　<span class="decorationF deco-code">// カーソルをx=10,y=5にして文字列を表示する<br />＃define ESC 0x1B<br />int main(void) {<br />　int x = 10 ;<br />　int y = 5 ;<br />　printf(&quot;%c［%d&#58;%dHカーソルを指定の位置に&quot;, ESC, x, y ) ;<br />　return 0 ;<br />}</span><br /><small class="decorationS">　※ このブログシステムでは＃や［が機能文字扱いなので、上記ではこれらを全角文字で書いています。</small><br /><br />　などとします。大昔のN-BASICの「LOCATE + PRINT」みたいなことをしています。<br />　printfの文字列中のエスケープを\eと直で書くと後に続く%dが機能しませんが、＃defineで定義したESC(0x1B)を%cで読み込めば機能します。<br />　もちろん、printfのESCの位置に0x1Bと直書きしてもいいのですが、＃defineした方が読みやすいと思います。<br /><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 電装工芸 〔724文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=485</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=485</guid>
	<category>tegalog</category>
	<pubDate>Thu, 26 Jan 2023 08:14:38 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　本業では社内のサーバーやパソコンのメンテをしていますが、処… ]]></title>
	<description><![CDATA[ 　本業では社内のサーバーやパソコンのメンテをしていますが、処理の待ち時間でＣ言語のお勉強。<br />　時間についてです。<br />　DMXを扱うには無受信１秒でタイムアウトしなければなりませんし、Delayを構成するには1/30～1/50秒程度のインターバルタイムで受信値をスタックしなければなりません。<br />　ですので、msec(1/1000)クラスの時間評価が必要です。<br /><br />　システムが持つ時間情報を扱うには&lt;time.h&gt;を用い、エポック秒やPOSIX時間などと呼ばれる基準日時(1970年1月1日0時0分0秒（UTC）)からの経過時間(secとnsec)を使うのがよいと思います。有効な精度は10usec程度の様ですが、今現在書いている処理では十分です。これを処理の節目でスタックして経過時間を評価するのですが、年月日時でパラメータが分かれているよりもトータル秒数の方が扱いが簡単です。23時59分59秒の１秒後に0時0分0秒にならないタイマで継続した時間評価をしたいのでこの方がいいと思います。<br />　ただ、スタックする変数のバイト長には気を付けないといけません。secもnsecもそれぞれ4バイト数なので評価をするには8バイト数で考えないといけないからです。64bitOSならint型でも8バイト数なことが多いので問題ありませんが、私はRaspberryPiで32bitOSを使っているのでint型は4バイト数になります。対策には8バイト数である「(unsigned) long long int」型を使います。ちょっとクセがある型なので計算やprintfで注意しないといけませんケドね。<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 電装工芸 〔694文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=484</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=484</guid>
	<category>tegalog</category>
	<pubDate>Tue, 24 Jan 2023 16:02:55 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　オレメモであります。 ]]></title>
	<description><![CDATA[ 　オレメモであります。<br />　参考になりそうな先達のページ<br /><br />● UDP/IP通信全体の参考<br /><a class="url" href="https&#58;//hensa40.cutegirl.jp/archives/780" target="_blank" title="https&#58;//hensa40.cutegirl.jp/archives/780">UDP / IP でパケットの送受信を行う</a><br />● broadcast通信の参考<br /><a class="url" href="https&#58;//www.geekpage.jp/programming/linux-network/broadcast.php" target="_blank" title="https&#58;//www.geekpage.jp/programming/linux-network/broadcast.php">UDPブロードキャスト送信サンプル</a><br />● ネットワークデバイスを指定した通信の参考<br /><a class="url" href="https&#58;//qiita.com/KazumichiShirai/items/969fc588299e0f2c9681" target="_blank" title="https&#58;//qiita.com/KazumichiShirai/items/969fc588299e0f2c9681">Ethernetインターフェース(eth0, eth1)を指定してソケットを作成する (Linux, C, Raspberry Pi)</a> <br />● 受信タイムアウトの参考<br /><a class="url" href="https&#58;//daeudaeu.com/timeout-recv/" target="_blank" title="https&#58;//daeudaeu.com/timeout-recv/">selectを使用してタイムアウト付き受信を実現する</a> &lt;= recvもrecvfromも受信があるまでひたすら待ち続けるので、タイムアウトさせることは必須。<br /><a class="url" href="https&#58;//ryo-n.hatenablog.com/entry/20080125/1201265780" target="_blank" title="https&#58;//ryo-n.hatenablog.com/entry/20080125/1201265780">UDP通信におけるselectの使い方。</a> &lt;= recvの例が多い中、recvfromの書式を確認出来る。recvfromを使う理由は送信元アドレスを取得したいから。<br />● 時間の扱い方<br /><a class="url" href="https&#58;//www.mm2d.net/main/prog/c/time-01.html" target="_blank" title="https&#58;//www.mm2d.net/main/prog/c/time-01.html">時間情報の取得方法と扱い方</a> &lt;= これの５ページ目の「POSIX環境」が結構大事。DelayをするにもDMXのタイムアウトをするにもこれが必要。<br />● ターミナルの行長と行数を取得する<br /><a class="url" href="https&#58;//zombie-hunting-club.net/archives/300" target="_blank" title="https&#58;//zombie-hunting-club.net/archives/300">ターミナルのサイズを取得する</a><br /><a class="url" href="https&#58;//zenn.dev/kusaremkn/articles/abdbd2f38c3d98b145eb" target="_blank" title="https&#58;//zenn.dev/kusaremkn/articles/abdbd2f38c3d98b145eb">ターミナルの幅と高さを得る</a> <br />● ANSIエスケープシーケンス<br /><a class="url" href="https&#58;//qiita.com/PruneMazui/items/8a023347772620025ad6" target="_blank" title="https&#58;//qiita.com/PruneMazui/items/8a023347772620025ad6">ANSIエスケープシーケンス チートシート</a> <br /><br />　この辺りを参考にすれば「ネットワークデバイスを指定してbroadcastで通信する」が出来そうな気がします。<br />　ただし、１行々々読み込んで使われている構造体をよく把握することが大切です。構造体の中に必要な情報が隠れていることが多いからです。構造体の中に構造体があったりもするので、十分に読み込まないといけません。<br /><br />　実験は受信が当面の課題となり、<br />１）ネットワークデバイスを指定せずArt-Netを受信する。&lt;= とにかく受信する<br />２）ネットワークデバイスを指定してArt-Netを受信する。&lt;= ネットワークデバイスを制限して受信する。<br />３）送信元IPアドレスを取得し、IPアドレスをもとに受信値を振り分ける。&lt;= 複数の送信元(卓)がある場合の不確実性排除とミックス処理のためには不可欠。<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> <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 電装工芸 〔980文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=483</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=483</guid>
	<category>tegalog</category>
	<pubDate>Tue, 24 Jan 2023 11:34:36 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　RTCを装着したRaspberryPiは正常のようです。 ]]></title>
	<description><![CDATA[ 　RTCを装着したRaspberryPiは正常のようです。<br />　今後製作する装置にもRTCを装着したいのですが、電池切れをどうやって拾うか思案中です。<br /><br />　socketの実験は連休中に時間が取れず未対応です。<br />　Art-Netの受信と送信を１台でこなすにはIPアドレス的には同じゾーンで装置は別という変な構成になります。その上、broadcastで受けてbroadcastで送るというこれもまた変な構成です。ですので、コピペで使える先例がありそうでありません。<br />　RaspberryPiのPythonでは成功していることですから可能だと思いますが、Ｃ言語のsocketの方が設定すべきパラメータが多いため、Pythonには無かった設定をどうするかが難問なのです。難しいというより、「ネットワークデバイスを指定してbroadcastで通信する」という前提の先例が少なく、沢山のデータシートを継ぎハギしないと見えないことが多いために苦心しているところです。<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 電装工芸 〔455文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=482</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=482</guid>
	<category>tegalog</category>
	<pubDate>Tue, 24 Jan 2023 10:45:23 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　珍しく明日から３連休。すべてを自由に使えるワケではありませ… ]]></title>
	<description><![CDATA[ 　珍しく明日から３連休。すべてを自由に使えるワケではありませんがscocketのテストが出来そう。<br />　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><br />　 -- Posted by 電装工芸 〔106文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=481</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=481</guid>
	<category>tegalog</category>
	<pubDate>Thu, 19 Jan 2023 18:04:34 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　RaspberryPiにRTC(リアルタイムクロック)を入… ]]></title>
	<description><![CDATA[ 　RaspberryPiにRTC(リアルタイムクロック)を入れているのに起動の度に時間がずれる。<br />　チェックしたところRTCモジュールの電池がダメになっています。定格3.3vのところ0.6vしかない。<br />　RTCのチップはDS3231ですが、電池には充電タイプのLIR2032(LRではなくLIR)を使えばいいらしい。<br />　amazonにあったのでポチる。先ほど届いたので取り付けたところRTCの機能が回復。<br />　Art-Netエンジンのテストプログラムを書いていて気持ち悪かったのでスッキリしました。<br /><br />追記<br />　時刻合わせは<br />$ sudo ntpdate ntp.nict.jp<br />　ネットワーク経由で現在時を取得し、<br />$ sudo hwclock -w<br />　DS3231に書き込みます。<br />　この手順をした後、電源を完全に切ってから起動すると時刻が合っているハズです。<br />　時刻が初期化されてしまうならDS3231の電池がNGかと。<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> -- Posted by 電装工芸 〔425文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=480</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=480</guid>
	<category>tegalog</category>
	<pubDate>Thu, 19 Jan 2023 17:01:36 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　秋月電子通商さんでRaspberryPi4Bが販売されてい… ]]></title>
	<description><![CDATA[ 　<a class="url" href="https&#58;//akizukidenshi.com/catalog/g/gM-14778/" target="_blank" title="https&#58;//akizukidenshi.com/catalog/g/gM-14778/">秋月電子通商さんでRaspberryPi4B</a>が販売されていました。<br />　特需ですぐに無くなってしまう？<br />　お金は辛いですが、とりあえず３個発注しました。<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> -- Posted by 電装工芸 〔90文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=479</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=479</guid>
	<category>tegalog</category>
	<pubDate>Wed, 18 Jan 2023 19:25:51 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　本業が落ち着いたので所属会社の作業部屋を片付けをしています… ]]></title>
	<description><![CDATA[ 　本業が落ち着いたので所属会社の作業部屋を片付けをしています。<br />　コンセプトマシンで使うオンジナオイルの20Lの空き缶２個の処分で悩む。捨てようと思えば捨てられますが、一般家庭ゴミでは出せませんので面倒。<br />　ならば、イスにしてしまいましょう。<br />　上面に丸く切ったコンパネを貼り、床を傷つけないように底面の縁にゴムのエッジ材を取り回しました。すべて余り材とジャンク品で済んだので目先のお金はゼロ。<br />　しばらくは作業部屋とジャンク材の片付けです。キレイ好きとは真逆ですが、次の作業のためにもやっておかないといけません。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%e6%9c%ac%e6%a5%ad" class="taglink" title="本業">#本業</a> -- Posted by 電装工芸 〔262文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=478</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=478</guid>
	<category>tegalog</category>
	<pubDate>Wed, 18 Jan 2023 17:45:07 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　Art-Netを受信する準備を進めています。 ]]></title>
	<description><![CDATA[ 　Art-Netを受信する準備を進めています。<br />　思った以上に面倒だったのはデータの比較です。受信値と期待値を比較して処理を分岐する処理は重要です。文字列ならstrcmp、バイナリならmemcmpを使います。どちらもstring.hの関数です。<br />　どちらにしてもバイナリな感覚を持ち合わせていないと使えませんが、アセンブラに慣れた体にとって違和感はありませんし、ある意味とても明確な処理になるので悪い気はしません。Pythonが如何に簡単に書けるかを感じたりはしましたけどね。<br />　あとはエンディアンの処理です。RaspberryPiはARM系なのでリトルエンディアンです。受信したArt-Netを仕分けて情報にするには2-4バイトのバイナリを数値化しないといけませんが、エンディアンを気にしながらバイナリを並べて処理します。並べたバイナリを数値化するにはカッコとアンパサンドを使った不思議な記述をしますが、理解不能なので定型句と思って使っています。<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=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔506文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=477</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=477</guid>
	<category>tegalog</category>
	<pubDate>Tue, 17 Jan 2023 18:55:37 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　RaspberryPiをアップデートしたらネットワーク関連… ]]></title>
	<description><![CDATA[ 　RaspberryPiをアップデートしたらネットワーク関連が動かなくなった。<br />　起動パレードを見ると「Failed to start DHCP Client Daemon.」と出る。<br /><br />　<a class="url" href="https&#58;//raspberrypi.stackexchange.com/questions/133376/fix-error-failed-to-start-dhcp-client-daemon-after-upgrade-to-bullseye-remot" target="_blank" title="https&#58;//raspberrypi.stackexchange.com/questions/133376/fix-error-failed-to-start-dhcp-client-daemon-after-upgrade-to-bullseye-remot">このサイトの通り手直ししたら治った。</a> <br /><br />　抜粋すると次の通り。<br /><br /><span class="decorationF deco-code">$ sudo nano /etc/systemd/system/dhcpcd.service.d/wait.conf<br /><br />Change from&#58;<br />&#91;Service&#93;<br />ExecStart=<br />ExecStart=/usr/lib/dhcpcd5/dhcpcd -q -w<br /><br />To&#58;<br />&#91;Service&#93;<br />ExecStart=<br />ExecStart=/usr/sbin/dhcpcd -q -w</span><br /><br />　wait.confを訂正するってことです。<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> <br /> -- Posted by 電装工芸 〔361文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=476</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=476</guid>
	<category>tegalog</category>
	<pubDate>Tue, 17 Jan 2023 14:14:47 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　ここ数日は本業で手一杯でした。ライトアップの施工があったの… ]]></title>
	<description><![CDATA[ 　ここ数日は本業で手一杯でした。ライトアップの施工があったのですが、建物の窓を光らせたいとのことで専用の行燈を製作してました。<br />　簡単な作りではあったのですが思った以上に時間がかかり、徹夜して間に合わせたのはいいですが、その余波で心身共にキツイここ数日。<br />　８月のお盆明けからの大連チャンでしたが、この後３月中旬までは緩い日程なので、各種製作や開発を進めて行けそうです。<br /><br />　同時にイロイロ進めますが、とにかくArt-Netエンジンを完成させたい。<br />　Art-Netエンジンとは、Art-Netを受信し、Merge、In-Delay、Patch、Out-Curve、Out-Delayを施し、Art-Netとして送信するデバイスドライバの様なモジュールです。ユーザーインターフェースなどは別途製作ですが、これが完成すれば求めることの半分は完成です。<br />　そのためにＣ言語を学習しているワケですが、ポインタ、構造体、共有メモリ、マルチプロセスの基本が見えてきましたので、これからしばらくはArt-Netの要であるscoketを試そうと思います。Ｃ言語でscoketを扱う情報は高位者による高位者向けの高度な物ばかりですが、幸いPythonでの前例がありますので、これをＣ言語に置き換える方向で読み解いていこうと思います。<br />　学習を進めれば進める程「ライブラリの使い方はmanとヘッダーファイルを読めば分かるだろ！」という圧を強く感じますが、この感覚が自分にとっても当たり前になるように精進したいものです。<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=%e6%9c%ac%e6%a5%ad" 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 電装工芸 〔671文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=475</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=475</guid>
	<category>tegalog</category>
	<pubDate>Mon, 16 Jan 2023 14:44:10 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　Ｃ言語の教科書を幾つか読んでいます。 ]]></title>
	<description><![CDATA[ 　Ｃ言語の教科書を幾つか読んでいます。<br />　熟知した人でないと書けないことですが、熟知した人は初心者の気持ちを忘れた人たちです。どんなに優しく書こうとしても初心者向けの説明など書けません。部分的に初心者の理解を助けてくれる文章があるので複数読んだ方がいいのです。<br />　お勧めというか、理解しやすかった教科書を２つご紹介します。<br /><br /><a class="url" href="https&#58;//www.amazon.co.jp/gp/product/B00MNZWO18/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&amp;psc=1" target="_blank" title="https&#58;//www.amazon.co.jp/gp/product/B00MNZWO18/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&amp;psc=1">「新・明解C言語 入門編」</a> <br />　初心者が挫折しやすい変数の型、ポインタ、構造体を後回しにして書いているのでＣ言語の全体像が見えやすい。変数の型、ポインタ、構造体で悩みたくないなら他の言語を使うべきですが、冒頭から「変数の型がぁ～」「ポインタがぁ～」と書かれた解説書は挫折率が高い(俺評価)のでよろしくありません。簡単とは言いませんが、これは挫折し難い内容です。<br /><br /><a class="url" href="https&#58;//9cguide.appspot.com/" target="_blank" title="https&#58;//9cguide.appspot.com/">「苦しんで覚えるＣ言語」</a> <br />　書籍にもなっていますが、webでも読める解説書です。途中息切れを感じるところはありますが、これはこれでわかりやすい。<br /><br />　あと、以前ご紹介した「改訂第３版(５版) ANSI C 対応 はじめてのＣ」は和文規格書かもしれません。わかりやすい記述も多いのですが、誰もが悩むポインタは触るだけだったりと、誰もが躓くところほど流している傾向があります。すでに習得している人の参考書としてなら悪くありませんケド。<br /><br />　ただ、総じて言えることですが、Ｃ言語はこの時代に初めてプログラムを書く人が使う言語ではありません。画面とキーボード、マウスで完結するシステムならPythonなどの高度にマネージされた言語を使うべきです。なぜなら、CPUのレジスタとかフラグ、メモリの概念が体に染み込んでいないと書式の意味を理解することが難しいからです。私の課題は対象がハードウェアですからPythonよりもＣ言語の方が適切ってだけです。<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 電装工芸 〔771文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=474</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=474</guid>
	<category>tegalog</category>
	<pubDate>Tue, 10 Jan 2023 14:40:35 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　ランチャーに行く前にscoketの基本動作の確認かな？ ]]></title>
	<description><![CDATA[ 　ランチャーに行く前にscoketの基本動作の確認かな？<br />　受信したArt-Netパケットをそのまま送信する実験。<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=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a> -- Posted by 電装工芸 〔101文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=473</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=473</guid>
	<category>tegalog</category>
	<pubDate>Sun, 08 Jan 2023 19:12:16 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　共有メモリの衝突回避ですが、共有メモリの中にハンドシェイク… ]]></title>
	<description><![CDATA[ 　共有メモリの衝突回避ですが、共有メモリの中にハンドシェイク表すフラグを入れたらそれでいいんじゃないかと。<br />　そのフラグが立っていれば極々わずかな時間sleepを繰り返す処理です。<br /><br /><span class="decorationF deco-code">while(flag1 == 1)<br />{<br />　sleep(0.001);<br />}<br />flag2 = 1;<br />/* 共有メモリ処理　*/<br />flag2 = 0;</span><br /><br />　みたいなものです。<br />　別プロセスがフラグを0にすればwhileを抜けます。<br />　簡易的なモノですが、フラグを書き換えられるプロセスを一つにしておけばイイんじゃないかと。最も簡単なセマフォはこういうことですし。<br /><br />　子プロセスの停止制御も同様の考え方が使えます。<br />　動作し続けるってことは繰り返し処理です。単なる繰り返しはwhile(1)とかで無限ループすることが多いので、while(flag==1)とかにすればいい。共有メモリ上のフラグが1ならwhileでループし0になったら抜ければいいのです。抜けたら終了処理をしてプロセスを落とすと。子プロセスが完全に終わったことはスタックしておいたプロセスIDを見ればわかります。<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 電装工芸 〔506文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=472</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=472</guid>
	<category>tegalog</category>
	<pubDate>Sun, 08 Jan 2023 14:22:17 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　共有メモリに構造体を配置してみましたが、割と簡単でした。 ]]></title>
	<description><![CDATA[ 　共有メモリに構造体を配置してみましたが、割と簡単でした。<br />　構造体のタグ(ひな形)をヘッダーファイルに作り、親プロセスと子プロセスにinclude。共有メモリのサイズは構造体のタグから得て設定。共有メモリ上に置く変数を独立したポインタにするとオフセットをそれぞれ計算して与えないといけませんが、構造体なら一括設定出来て便利です。<br />　構造体をポインタにすると表記が独特になりますが、意味合いが明示的となって読みやすいかもしれません。<br />　この辺りには、本文中に出来るだけ定数を直書きしないという方針にも繋がってきます。<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 電装工芸 〔291文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=471</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=471</guid>
	<category>tegalog</category>
	<pubDate>Sun, 08 Jan 2023 13:06:45 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　屋外で開催される成人式関連のイベントで電源出しです。 ]]></title>
	<description><![CDATA[ 　屋外で開催される成人式関連のイベントで電源出しです。<br />　起動してしまえばやることはありません。<br />　本日の課題は共有メモリのテストです。<br /><br />　次のページにあるソースをそのまま使って挙動を確認です。<br />　<a class="url" href="http&#58;//web-ext.u-aizu.ac.jp/course/osrtk/exercise/ex/ex07/ex07.html" target="_blank" title="http&#58;//web-ext.u-aizu.ac.jp/course/osrtk/exercise/ex/ex07/ex07.html">プロセス間でのメモリ共有</a> <br /><br />　親プロセス「ShareMemTest1」を起動した後、待機時間(20秒)のうちにコンソールで「ShareMemTest2」に共有メモリのIDを与えて起動するというもの。一貫したプログラムではありませんが、やりたいことはプロセス間でのメモリ共有ですからむしろわかりやすい。<br />　ちなみに、コンソールでプログラムを起動する際、末尾に「&」を付けると新規プロセスで実行します。<br /><br />　ここサンプルを使うなら、<br /><br />　＜親プロセスを起動＞<br />$ ./ShareMemTest1 & <br /><br />　＜起動後表示＞<br />nShareMemID = 23 /* IDは都度変わります */<br />process1 &#58; nVar1 = 1, nVar2 = 2<br />・・・ここで20秒Sleepしてます・・・<br /><br />　＜子プロセスを起動＞<br />$ ./ShareMemTest2 23 & <br /><br />　＜起動後表示＞<br />nShareMemID = 23<br />process2 &#58; nVar1 = 1, nVar2 = 2<br />process2 &#58; nVar1 = 2, nVar2 = 2<br />・・・子プロセスはここで終了・・・<br /><br />・・・20秒後、親プロセスが再開・・・<br />process2 &#58; nVar1 = 2, nVar2 = 2<br />・・・親プロセスも終了・・・<br /><br />　となります。<br />　正に記述にある通り。<br /><br />$ ipcs -m<br />　や<br />$ free<br />　を用いるとSharedメモリの状況がわかります。<br /><br />　実際のテストではgetpid()を用いてプロセスIDも表示しながら確認しましたが、確かに別プロセスでした。<br />　共有メモリの容量は、無意味に8MBくらい設定してみましたが何の問題も無し。<br /><br />　親側の設定は、typedefで構造体を定義し、構造体のポインタ変数を作り、構造体のメモリサイズ(sizeof()で取得)をもとに共有メモリを作り、構造体のポインタ変数に共有メモリを割り当てる、といった流れでしょうか。<br />　子側は、typedefで構造体を定義し、構造体のポインタ変数を作り、親から取得したIDから構造体のポインタ変数に共有メモリを割り当てる、といった流れ？<br />　共有メモリ上に変数(構造体)を構築した後は共有メモリを意識する必要は無いと思います。もちろん、衝突回避は常に考えないといけませんけど。<br /><br />　勘違いしていた点ですが、共有メモリのIDは管理用の通し番号であってポインタに設定するアドレスではないことです。Ｃ言語では何かにつけてポインタ渡しなのでこれもそうかと思ってしまいました。<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 電装工芸 〔1230文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=470</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=470</guid>
	<category>tegalog</category>
	<pubDate>Sun, 08 Jan 2023 10:48:29 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　Ｃ言語の基本的な書き方は整理がついてきました。 ]]></title>
	<description><![CDATA[ 　Ｃ言語の基本的な書き方は整理がついてきました。<br />　次はライブラリの理解と使い方となるのですが、ネットで検索しても情報があるっちゃあるけどイマイチ感。<br />　基本に立ち戻れば、ライブラリのman(公式のマニュアルファイル)とヘッダーファイルを読めとなります。以前からそうするのが王道とは思ってはいましたが、何が書いてあるのかサッパリでした。<br />　それが少しわかるようになってきました。我ながら大進歩。<br />　manはLinux系のOSなら本体にも必ず入っているものの英文が多いのですが、ネットで検索すると日本語版がすぐに見つかるのでこちらを読んだ方がいいかも。<br />　かといってman読めばいいかと言えばそうでもない。前触れもなく突然出現する用語やパラメータが多い。<br />　ようやくわかったのですが、ライブラリのmanはヘッダーファイルを補足しているに過ぎないらしい。つまり、ライブラリを理解するための主役はmanではなくヘッダーファイルということ。<br />　変数の型定義、構造体の定義、プロトタイプ宣言などが書かれているヘッダーファイルは定義書であり解説書でもありますので、これを読み解けない人がＣ言語でプログラムを書けるワケないでしょう・・・という熟練者たちのご意見はその通りです。<br />　どこを読むべきか、何を理解するべきかが見えて来ただけでも今日のところはいいんじゃないかと。<br /><br />　早速、socketのライブラリである sys/scoket.h を読んでみようと /usr/include を覗いたのですがありません。<br />　google様に教えてもらい、次のコマンドで在処を検索できました。<br />　$ sudo dpkg --search sys/socket.h<br />　結果は /usr/include/arm-linux-gnueabihf/sys/socket.h とのことでした。<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 電装工芸 〔837文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=469</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=469</guid>
	<category>tegalog</category>
	<pubDate>Sat, 07 Jan 2023 20:12:22 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　現場が早く終わったので、開発用のRaspberryPiをノ… ]]></title>
	<description><![CDATA[ 　現場が早く終わったので、開発用のRaspberryPiをノートパソコンのVSCodeと繋いでおきました。ここまでしておけば比較的身軽に開発が出来ます。<br />　本格的に開発を進めましょう。<br /><br />　Ｃ言語でのsocketについて調べてみましたが、PythonのscoketライブラリはＣ言語のsocketをほぼそのまま橋渡ししているだけみたいです。引数の書式にわずかな違いはありますが、ほぼ同様に使えそうです。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> <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 電装工芸 〔249文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=468</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=468</guid>
	<category>tegalog</category>
	<pubDate>Fri, 06 Jan 2023 15:51:26 +0900</pubDate>
</item>

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

