<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>勝手に修理・気ままに工作</title>
    <link>https://www.projexam.com/blog/hotall/diy/</link>
    <description>興味は未知への扉を開き、意志は新たな世界へ導く。感動を探そう、楽しむを力に。</description>
    <language>ja</language>
    <generator>Nucleus CMS v3.71</generator>
    <copyright>&#169;</copyright>
    <category>Weblog</category>
    <docs>http://backend.userland.com/rss</docs>
    <image>
      <url>http://www.projexam.com/blog/hotall/nucleus/nucleus2.gif</url>
      <title>勝手に修理・気ままに工作</title>
      <link>https://www.projexam.com/blog/hotall/diy/</link>
    </image>
    <item>
<title><![CDATA[小型アンプ(BOSE 1705II)のフィルムコンデンサ交換]]></title>
<link>http://www.projexam.com/blog/hotall/diy/index.php?itemid=490</link>
<description><![CDATA[オーディオはマニアになりやすい趣味です。<br />
<br />
アンプやスピーカー、果てにはケーブルや電源タップに至るまで、論理的に考えれば理解しがたいことが、真面目に議論されます。<br />
聞き分けられる人間の耳が偉大なのか、心理的バイアスの問題なのか、謎が多いです。<br />
<div class="leftbox">
<img src="images_diy/dtampref200.JPG" border="0"><br />
</div><br class="endbox">
以前、<a href="?itemid=439">古くなったデスクトップオーディオアンプの電解コンデンサを交換</a>し、音質を向上させることが出来ましたが、電解コンデンサ以外のフィルムコンデンサを交換すれば、更に音質を向上させることができるのではと考え始めました。<br />
<br />
フィルムコンデンサは電解コンデンサよりもはるかに寿命は長いので、劣化による音質劣化は考えにくく、単に同じものを交換しても意味はありません。<br />
<br />
さて、電解コンデンサがそうであるように、フィルムコンデンサにもオーディオ用と銘打ったものが存在します。<br />
今回はこのオーディオ用のフィルムコンデンサに交換してみることにしました。<br />
<br />
<dev class="attention">この文書は個人的なものであり、読者による改造を推奨するものではなく、内容について一切の責任を負いかねます。<br />
ユーザーによる修理はメーカーの保証・修理が受けられなくなる可能性があります。</dev><br />
<br />
<hr color="#1188aa">
<br />
作業内容は次の通り<br />
<ul style="list-style-type:circle">
<li>フォルムコンデンサをオーディオ用フィルムコンデンサに交換する。<br />
<ul style="list-style-type:disc">
<li>WIMA MKP2メタライズドポリプロピレンフィルムコンデンサ</li>
<li>VISHAY Roederstein メタライズドポリエステルフィルムコンデンサ</li>
<li>Rubycon H2Dポリフェニレンスルフィドフィルムコンデンサ</li>
<li>東信工業 2AUPZポリプロピレンフィルムコンデンサ</li></ul></li>
<li>新バージョンで省かれた電源ラインのパスコンをオーディオ用電解コンデンサで追加する。</li>
<li>同じく、省かれたオペアンプの入力抵抗を追加する。</li>
</ul>
<div class="leftbox">
<img src="images_diy/dtampref201.JPG" border="0"><br />
</div>
これが作業前のプリアンプ基板です。<br />
<br />
赤茶と緑の素子がフィルムコンデンサです。<br />
左上にパスコンのシルク印刷があります。<br />
中央のケーブル端子の左に入力抵抗のシルク印刷があります。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtampref202.JPG" border="0"><br />
</div>
これが作業後の基板です。<br />
<br />
東信のコンデンサは想定外に大きいので、空いたスペースに配置しました。<br />
それ以外は元の部品より小さいので難なく交換できましました。<br class="endbox">
元通りに組立て、音を出してみます。<br />
<br />
結果は、高音が伸びて音が繊細になり、それでいて暖か味が増しました。<br />
また、低音の繋がりが良くなり、厚みが増しました。<br />
<br />
しかし、交換前と交換後を切り換えて試聴したわけではなく、過去の記憶との比較なので、高級な部品に交換したことによるプラシーボ効果が働いている可能性は否定できません。<br />
<br />
幸せならばそれでも良いのです。<br />
何より、電子工作が楽しいのですから。<br />
<br />
<hr color="#1188aa">
<br />
<h5 class="blockheader">■ BOSE 1705II - 目次 -</h5>
<ol>
<li><a href="?itemid=211">縦置きスタンドの製作</a></li>
<li><a href="?itemid=439">リフレッシュ</a></li>
<li><a href="?itemid=440">ボリューム交換</a></li>
<li><a href="?itemid=490">フィルムコンデンサ交換</a></li><br />
</ol>]]></description>
<category>オーディオ・ビジュアル</category>
<comments>http://www.projexam.com/blog/hotall/diy/index.php?itemid=490</comments>
<pubDate>Wed, 4 Mar 2026 15:36:13 +0900</pubDate>
</item><item>
<title><![CDATA[デジタルテレビチューナー(TT-4K100)の放熱対策2]]></title>
<link>http://www.projexam.com/blog/hotall/diy/index.php?itemid=477</link>
<description><![CDATA[ウィーン。<br />
ハードディスクの起動音。<br />
続いて、サーというファンの回る風切り音。<br />
静かな部屋では、僅かな音でも不要な雑音です。<br />
<div class="leftbox">
<img src="images_diy/dtvtuner200.JPG" border="0"><br />
</div><br class="endbox">
<a href="?itemid=471">熱対策をしたテレビチューナー</a>。ファンによる放熱効果は上がっているようですが、ファンの音が気になり始めました。<br />
それほど嫌な音ではないのですが、気になりだすと、なんとかしたくなるのです。<br />
<br />
現在は、テレビチューナーが動作している間、最高速度でファンが回ります。<br />
これを温度に応じて速度を調節することにしました。<br />
<br />
<dev class="attention">この文書は個人的なものであり、読者による改造を推奨するものではなく、内容について一切の責任を負いかねます。<br />
ユーザーによる改造はメーカーの保証・修理が受けられなくなる可能性があります。</dev><br />
<br />
<hr color="#1188aa">
<br />
具体的には、目標温度を設定し、この温度を越えないようにファンの出力を制御するのです。<br />
<br />
制御出力の方法には電圧/電流によるアナログ方式とパルス幅によるデジタル方式があります。<br />
まず考えたことは、音を抑えるためにアナログ方式にすることです。<br />
デジタル方式は電力損失が少ない反面、出力パルスによる振動音(鳴き)が発生するからです。<br />
<br />
アナログ方式の実現方法として、MCUのDA出力でMOSFETのゲート電圧を変化させ、ソースドレイン抵抗をリニアに制御しようと考えました。<br />
<div class="leftbox">
<img class="large-width" src="images_diy/dtvtuner201.svg" border="1" style="background-color:#FFFFFF;"><br />
</div><br class="endbox">
これが、その回路図です。<br />
<ul style="list-style-type:circle">
  <li>MCUは8ピンのPIC 12F1822。<br />
      ADCやDACが入っています。</li>
  <li>温度センサーはサーミスタ。<br />
      ADCで入力し、測定範囲は20℃..80℃。<br />
      分解能は0.3℃。</li>
  <li>リニアリティを確保するため、MOSFETはドレイン接地で、バッファとして使用します。<br />
      DACで電圧駆動します。<br />
      ただ電圧利得は最大1なので、負荷電圧は5Vに制限されます。<br />
      もし、ファンが回転しなければ、再度検討します。</li>
  <li>二色LEDで状態を表示します。<br />
      色(緑から赤までの連続)で温度、点滅速度(2秒又は5秒周期のほたる点滅)で目標温度を越えたか否かを知らせます。<br />
      LEDはPWMで点灯します。<br />
      このPWMパルスは速度を必要としないのでプログラムで制御します。</li>
  <li>ディップスイッチで目標温度(40℃,45℃,50℃,55℃)を切り換えられるようにします。<br />
       MCU内のプルアップを使用します。</li>
</ul>
実際に組立てて動作させてみると、やはり、5Vではファンは十分に回転してくれません。<br />
<div class="leftbox">
<img class="large-width" src="images_diy/dtvtuner208.svg" border="1" style="background-color:#FFFFFF;"><br />
</div><br class="endbox"><br class="endbox">
MOSFETはソース接地に変更します。<br />
<br />
ところが、今度はMOSFETのリニア領域が狭く、MCU内臓のDAコンバータの分解能では、ほとんどON/OFF制御と同じになってしまいました。<br />
<br />
結局、熱抵抗を計算したり、最大損失電力の大きいをMOSFETを探したりして、時間を費やしたのですが、購入したMOSFETではアナログ制御ができないことが判ったのです。<br />
<br />
他のデバイスに交換することも考えましたが、ここは、素直にPWMによるのデジタル方式に方針を転換することにしました。<br />
<div class="leftbox">
<img class="large-width" src="images_diy/dtvtuner202.svg" border="1" style="background-color:#FFFFFF;"><br />
</div><br class="endbox">
これが最終的な回路図です。<br />
<ul style="list-style-type:circle">
  <li>MCU内のPWM機能を使うので、出力ポートを変更しました。</li>
  <li>出力パルス周波数は慣例に従い、聴覚範囲外の25KHzにします。<br />
      分解能は0.65%。</li>
  <li>MOSFETはソース接地。<br />
      ブログ投稿後、フライホイールダイオードを忘れていたことに気づき、慌てて、手持ちのショットキーバリアダイオードを追加しました。<br />
      MOSFETは無事でした。アナログ制御用に、耐圧の高い部品を選定したことが幸いしました。</li>
</ul>
<div class="leftbox">
<img class="large-width" src="images_diy/dtvtuner203_content.png" border="0"><br />
</div><br class="endbox">
試しに50%で出力してみました。<br />
波形を見る限り、うまく出力できているようです。<br />
<br />
さて、今回の制御の処理内容は次の通り<br />
<ul style="list-style-type:circle">
  <li>現在温度が目標温度を越えた時に、その乖離に応じてファンの出力を上げていきます。</li>
  <li>目標温度より下の一定範囲に不感帯を設け、それを下回った場合、ゆっくりと出力を下げます。<br />
      これにより、過度なハンチングを減らします。</li>
</ul>
ソフトウェアの開発言語はアセンブラ。<br />
MPLAB X IDEでビルドしPIC kit3で書込みます。<br />
<div class="leftbox">
<img src="images_diy/dtvtuner204.JPG" border="0"><br />
</div>
ユニバーサル基板に回路を組み、ファンと電源ケーブルを繋ぎます。<br />
<br />
電源ケーブルはビデオ基板の<a href="?itemid=471#conpower">前回と同じ場所</a>に繋ぎます。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner205.JPG" border="0"><br />
</div>
センサーを放熱板にカプトンテープで固定します。<br />
<br />
ICチップから離れていますが、貼り付け面を広くとれる場所にしました。<br />
その代わり、目標温度を低めに設定します。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner206.JPG" border="0"><br />
</div>
基板はビデオ基板の部品がない場所に、ウレタンを加工して作った台座を間にかませて、両面テープで貼り付けます。<br />
<br />
万が一、脱落した時のことを考え、基板の配線面はカプトンテープで絶縁します。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner207.JPG" border="0"><br />
</div>
実際に通電してみます。<br />
テスト的に設定温度を低くして動作を確認します。<br />
<br />
ファンは緩やかに速度を変えながら、低速で回転しました。<br />
またLEDの表示も、ほぼ、目標温度を下回っていることを示しています。<br />
<br />
制御はできているようです。<br class="endbox">
<br />
ディップスイッチで目標温度を45℃に設定し、元通りに組立てて、作業は完了です。<br />
<br />
冬場の今の時期では、ファンはほとんど回らないので、ファンレス並みに静かになりました。<br />
あとは夏場にどうなるか。<br />
<br />
これで、リビングに雑音がひとつなくなりました。<br />
それに代わって、遠くの別の音が聞こえるようになったのです。<br />
ウィーン。<br />
気になり始めました。<br />
キッチンの冷蔵庫。<br />
<br />
<hr color="#1188aa">
<br />
<h5 class="blockheader">■ デジタルテレビチューナー(TT-4K100) - 目次 -</h5>
<ol>
<li><a href="?itemid=471">放熱対策</a></li>
<li><a href="?itemid=472">ACアダプタ交換</a></li>
<li><a href="?itemid=477">放熱対策2</a></li><br />
</ol>]]></description>
<category>オーディオ・ビジュアル</category>
<comments>http://www.projexam.com/blog/hotall/diy/index.php?itemid=477</comments>
<pubDate>Mon, 2 Feb 2026 17:13:38 +0900</pubDate>
</item><item>
<title><![CDATA[デジタルテレビチューナー(TT-4K100)のACアダプタ交換]]></title>
<link>http://www.projexam.com/blog/hotall/diy/index.php?itemid=472</link>
<description><![CDATA[<div class="leftbox">
<img src="images_diy/dtvtuner21.JPG" border="0"><br />
</div>
"DO NOT OPEN"、しっかりと書かれてあるACアダプタ。<br />
これを前にして悩んでいました。<br class="endbox">
<br />
前回、<a href="?itemid=471">放熱対策をしたテレビチューナー</a>ですが、テレビの寿命を考えると、あと５年は動いてもらわないと困ります。<br />
そう考えると、既に6年以上経過したこの製品の電源が気になり始めました。<br />
なぜなら、これまでの経験から、電源アダプタは突出して故障しやすいのです。<br />
<br />
そういう訳で、もともと結構熱くなるこのACアダプタ、せめて電解コンデンサだけでも交換しておこうかなと思い始めたのです。<br />
<br />
<dev class="attention">この文書は個人的なものであり、読者による修理を推奨するものではなく、内容について一切の責任を負いかねます。<br />
ユーザーによる修理はメーカーの保証・修理が受けられなくなる可能性があります。</dev><br />
<br />
<hr color="#1188aa">
<br />
まずは現状を確認しなければと、Pカッターを手に、壊れてもいい古い方のアダプタを分解してしまいました。<br />
良い子は真似をしてはいけません。<br />
<div class="leftbox">
<img src="images_diy/dtvtuner22.JPG" border="0"><br />
</div>
密閉されたケースにぎっしりと詰め込まれた部品達、50Wの電源なら当然発熱し、内部は高温になります。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner23.JPG" border="0"><br />
</div>
ひときわ大きなコンデンサ。<br />
400Vの高圧部品です。こういう部品は結構高額です。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner24.JPG" border="0"><br />
</div>
台湾のメーカーのようです。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner25.JPG" border="0"><br />
</div>
他のコンデンサのメーカーは、WEBで検索してもヒットしません。<br />
名前から推測すると、中華圏の弱小メーカーなのでしょう。<br class="endbox">
寿命を延ばすには、これらのコンデンサを国内メーカーの長寿命タイプに交換する必要があります。<br />
必ずしも、海外メーカーの品質が悪い訳ではありませんが、かつて、有名メーカーのPC電源が1年足らずで複数のコンデンサの液漏れを経験し、私の中では信頼性の点で避けたい思いがあるのです。<br />
<br />
さて、この密な実装でのコンデンサの交換を考えてみた時、価格的なメリットが少ない割に作業が困難なのです。<br />
そもそも、熱が籠るこの密閉構造は、部品の寿命には良くありません。<br />
そこで、今回は電源自体を買い直すことにしました。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner26.JPG" border="0"><br />
</div>
現在の電源のスペックは12V-4Aです。<br />
これを満たす電源を探します。<br />
<br />
市販されている国内メーカーのスイッチング電源ならば、信頼性も高く、容易に手に入ります。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner29.JPG" border="0"><br />
</div>
今回購入したのはTDKラムダのRWS50B-12です。<br />
<br />
組込み用の電源なので、本来ならケースに収めるものですが、既にアルミケースに入っているので、このまま使用します。その方が放熱対策も考えなくて済みます。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner27.JPG" border="0"><br />
</div>
コードは元のACアダプタのものを流用します。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner28.JPG" border="0"><br />
</div>
コードにY型の圧着端子を付けます。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner30.JPG" border="0"><br />
</div>
これをスイッチング電源に接続します。<br class="endbox">
テレビチューナーに繋いで、電源の交換は完了です。<br />
<br />
これで、しばらくは安心して使うことができます。<br />
<br />
この製品を含め、次回テレビを買い替える頃には、テレビの仕組みも変わっているかもしれません。<br />
電波が必用でなくなり、チューナーの役目も終わっているのかもしれませんね。<br />
<br />
<hr color="#1188aa">
<br />
<h5 class="blockheader">■ デジタルテレビチューナー(TT-4K100) - 目次 -</h5>
<ol>
<li><a href="?itemid=471">放熱対策</a></li>
<li><a href="?itemid=472">ACアダプタ交換</a></li>
<li><a href="?itemid=477">放熱対策2</a></li><br />
</ol>]]></description>
<category>オーディオ・ビジュアル</category>
<comments>http://www.projexam.com/blog/hotall/diy/index.php?itemid=472</comments>
<pubDate>Tue, 26 Aug 2025 18:41:47 +0900</pubDate>
</item><item>
<title><![CDATA[デジタルテレビチューナー(TT-4K100)の放熱対策]]></title>
<link>http://www.projexam.com/blog/hotall/diy/index.php?itemid=471</link>
<description><![CDATA[ぁーあ暑い!<br />
<br />
年々夏の暑さが厳しくなっています。<br />
特に今年は、天気予報では危険と表記が続き、クーラーの無い生活は考えられません。<br />
<br />
ベランダで育てている植物たちも弱っています。<br />
毎年、沢山の実をつけるゴーヤも今年は実が少なく、元気がありません。<br />
<br />
そして、この暑さの影響を受けるのは、生き物だけではありませんでした。<br />
<div class="leftbox">
<img src="images_diy/dtvtuner01.JPG" width=280 border="0"><br />
</div><br class="endbox">
録りためたテレビ番組を見ようと、テレビチューナーの電源を入れると、ランプが点滅し、映像信号が出ません。故障です。<br />
<br />
このテレビチューナー、購入を決める際、ＷＥＢ上のコメントで熱に弱いと書込みがあり、少々心配していました。<br />
今回の状況は報告されている現象と同じことから、心配が現実となってしまったようです。<br />
<br />
電源を抜き差ししたり、リセットしたり、色々試しましたが改善せず、WEB上にも有益な情報は見つかりません。<br />
<br />
いよいよ、新しく買い直すと決めるも、これに代わる製品はありません。<br />
世の中、ネット配信が主流となりつつあり、チューナレステレビも出ていることから、チューナー単体の需要は無くなったのかもしれません。<br />
<br />
仕方なく、中古で同じ製品を買うことにしました。<br />
<br />
ネットで購入。製品は無事届いたのですが、何らかの放熱対策をしないと、同じ運命を辿ることになります。<br />
<br />
そこで、製品内部にファンを取り付けることにしました。<br />
<br />
<dev class="attention">この文書は個人的なものであり、読者による修理を推奨するものではなく、内容について一切の責任を負いかねます。<br />
ユーザーによる修理はメーカーの保証・修理が受けられなくなる可能性があります。</dev><br />
<br />
<hr color="#1188aa">
<br />
<br />
壊れた方の製品を分解し、ファンが入るスペースを確認しました。<br />
8cm角・10mm厚のファンなら入りそうです。<br />
<br />
今回はアイネックスのケースファン(CFY-80US)を購入しました。<br />
<br />
これを機器の電源に繋げば、回るのですが、稼働していない時は止めたいので、制御する回路を作ります。<br />
<br />
テスターで調べてみると、機器のUSBコネクタの電源はスリープ状態になると落ちるようなので、これを利用してファンをON/OFFします。<br />
<br />
ON/OFF制御には、手元にNch Dual MOS-FET(NDS9936)があったので、これを利用します。<br />
この素子はVgs4.5VでRdsが0.066Ωなので、USBの5Vで直接ドライブできます。<br />
ただ、2回路のうち1回路しか使用しないのは勿体ないような気がしますが。<br />
<div class="leftbox">
<img class="large-width" src="images_diy/dtvtuner02_content.svg" border="1" style="background-color:#FFFFFF;"><br />
</div><br class="endbox">
これが今回の回路です。<br />
<br />
5Vで直接ドライブできるので、単純なスイッチ回路となりました。<br />
<div class="leftbox">
<img src="images_diy/dtvtuner03.JPG" border="0"><br />
</div>
回路をユニバーサル基板上に組みます。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner04.JPG" border="0"><br />
</div>
背面です。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner05.JPG" border="0"><br />
</div>
ファンに繋ぎます。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner06.JPG" border="0"><br />
</div>
基板をヒシチューブで覆います。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner07.JPG" border="0"><br />
</div>
製品基板のヒートシンクにファンを取り付けます。<br />
中央を強力両面テープで、側面のスリッドではない面を粘着テープで固定します。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner08.JPG" border="0"><br />
</div>
背面の様子です。<br class="endbox">
<div class="leftbox" id="conpower">
<img src="images_diy/dtvtuner09.JPG" border="0"><br />
</div>
接続の様子です。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtvtuner10.JPG" border="0"><br />
</div>
電源を繫ぎ、ファンが回ることを確認します。<br />
<br />
次にスリープ状態(電源ランプがOFF)でファンが止まることを確認します。<br class="endbox">
<br />
後は、元通りに組み立てます。<br />
ただ、上ケースの使用されていないスペーサーがファンと干渉するので、これを削りました。<br />
<br />
動作確認をして完成です。<br />
<br />
結果は問題なく動作しました。<br />
しかしながら、個体の識別IDが異なるので、今まで録りためた番組は見られなくなりました。<br />
同じ製品なのにと釈然としない思いはありますが、仕方のないことです。<br />
<br />
ただ、使い慣れた製品ですので、今まで通りストレスなく使えるのが救いです。<br />
<br />
ファンの動作音も静かな部屋では聞こえるものの、気にならない程度に静かです。<br />
肝心の放熱対策については、どれほどの効果か確かめる術はありませんが、確実に効果はあります。<br />
何より安心感は増したので、やって良かったと思いました。<br />
<br />
<hr color="#1188aa">
<br />
<h5 class="blockheader">■ デジタルテレビチューナー(TT-4K100) - 目次 -</h5>
<ol>
<li><a href="?itemid=471">放熱対策</a></li>
<li><a href="?itemid=472">ACアダプタ交換</a></li>
<li><a href="?itemid=477">放熱対策2</a></li><br />
</ol>]]></description>
<category>オーディオ・ビジュアル</category>
<comments>http://www.projexam.com/blog/hotall/diy/index.php?itemid=471</comments>
<pubDate>Sat, 23 Aug 2025 16:04:43 +0900</pubDate>
</item><item>
<title><![CDATA[RaspberryPiでPBXとFAXの構築 - 迷惑電話レポート]]></title>
<link>http://www.projexam.com/blog/hotall/diy/index.php?itemid=469</link>
<description><![CDATA[<div class="leftbox">
<img src="images_diy/meiwkrep01.png" width=280 border="0"><br />
</div><br class="endbox">
<a href="?itemid=450">迷惑電話対策</a>をしてから、すっかり迷惑電話に煩わされなくなりました。<br />
たまに着信電話番号リストファイルを覗くと、結構な数の迷惑電話が記録されています。<br />
<br />
やはり、現状どのくらい迷惑電話を拒否したのか、それが気になるのです。<br />
そこで、迷惑電話の履歴をレポートとして通知することにしました。<br />
<br />
<dev class="attention">この文書は個人的なものであり、内容について一切の責任を負いかねます。</dev><br />
<br />
<hr color="#1188aa">
<br />
<div class="leftbox">
<img class="large-width" src="images_diy/meiwaku_report_system.svg" border="1" style="background-color:#FFFFFF;"><br />
</div><br class="endbox">
<br />
処理内容は次の通り。<br />
<ul style="list-style-type:circle">
  <li>着信電話番号リストファイルを調べ、前回の調べた以降に着信したデータの内、迷惑電話(判定がNG)のデータを抽出しレポート対象リストファイルに保存する。</li>
  <li>レポート対象データファイルから、レポートを作成し、指定したメールアドレスに送信する。</li>
  <li>メール送信は留守電やFAXと同様にsSMTPを使用する。</li>
  <li>レポート対象リストファイルは、次回、処理済みデータの判別に使用する。</li>
  <li>一連の処理は毎日定時刻で行う。</li>
</ul>
プログラムはPython3。<br />
<pre class="sourcecode"><code>#!/usr/bin/env python3<br />
"""　迷惑電話拒否レポートスクリプト<br />
<br />
拒否した迷惑電話についての情報を通知する。<br />
<br />
着信電話番号リストファイルから前回通知以降に拒否した迷惑電話の情報をメールで通知する。<br />
通知する情報は次の通り<br />
　・電話番号<br />
　・着信日時<br />
　・着信回数<br />
　・コメント/名前<br />
通知する迷惑電話の情報を通知リストファイルに保存し、次回の処理に使用する。<br />
ファイルフォーマットは着信電話番号リストファイルと同じとし、<br />
レコードは降順(最新が先頭)とする。<br />
テキストファイル(utf-8)<br />
    &lt;着信電話番号&gt;,&lt;判定区分&gt;,&lt;最新着信日時&gt;,&lt;回数&gt;,&lt;コメント/名前&gt;LF<br />
    &lt;着信電話番号&gt;,&lt;判定区分&gt;,&lt;最新着信日時&gt;,&lt;回数&gt;,&lt;コメント/名前&gt;LF<br />
    ...<br />
<br />
<br />
Arguments<br />
----------<br />
toaddr : str<br />
    送信先メールアドレス<br />
<br />
<br />
Returns<br />
-------<br />
int<br />
    0 : 正常終了 その他 : 処理失敗<br />
<br />
Example<br />
-------<br />
コマンドの使い方<br />
<br />
  python meiwaku_report.py &lt;通知先&gt;<br />
<br />
Notes<br />
-----<br />
    各ファイルのパスは変数：XXXX_XXXX_FILEに格納。<br />
<br />
"""<br />
__author__  = "Yasuaki Nojiri"<br />
__version__ = "1.0.0"<br />
__date__    = "2025/07/01"<br />
<br />
import sys<br />
import os<br />
import stat<br />
import asyncio<br />
<br />
# 定数の設定<br />
CALLER_LIST_DIR         =   '/usr/local/share/meiwakuchk'<br />
CALLER_LIST_FILE        =   f'{CALLER_LIST_DIR}/caller-list.txt'<br />
REPORT_LIST_DIR         =   CALLER_LIST_DIR<br />
REPORT_LIST_FILE        =   f'{REPORT_LIST_DIR}/report-list.txt'<br />
REPORT_LIST_FILE_NEW    =   f'{REPORT_LIST_FILE}.new'<br />
REPORT_MAIL_DIR         =   CALLER_LIST_DIR<br />
REPORT_MAIL_FILE        =   f'{REPORT_MAIL_DIR}/report-mail.txt'<br />
REPORT_LIST_FILE_PRM    =   stat.S_IRWXU | \<br />
                            stat.S_IRGRP | stat.S_IWGRP | \<br />
                            stat.S_IROTH | stat.S_IWOTH<br />
<br />
MAIL_CONTENT            =   "To: {toaddr}\n" + \<br />
                            "Subject: [PBX]: =?UTF-8?B?6L+35oOR6Zu76Kmx44G" + \<br />
                            "u44Os44Od44O844OI?=\n" + \<br />
                            "From: PBX &lt;{fromaddr}&gt;\n" + \<br />
                            "Content-type: text/plain; charset=UTF-8\n" + \<br />
                            "Content-Transfer-Encoding: Quoted-Printable\n" + \<br />
                            "\n" + \<br />
                            "自宅の電話からのお知らせです。\n" + \<br />
                            "\t迷惑電話の着信を拒否しました。\n" + \<br />
                            "\t\t\n"<br />
<br />
MAIL_ITEM               =   "\t\t着信日時：{call_date}\n" + \<br />
                            "\t\t発信元番号：{call_id}\n" + \<br />
                            "\t\t発信元情報：{call_name}\n" + \<br />
                            "\t\t累計着信数：{call_times:&gt;4}\n" + \<br />
                            "\t\t-------------------------\n"<br />
<br />
MAIL_CMD                =   "/usr/sbin/sendmail {sendto} &lt; {content}"<br />
MAIL_FROMADDR           =   r"xxxx@xxxxxxx.xxxx"<br />
<br />
import logging<br />
logger  =   logging.getLogger(__name__)<br />
APPNAME =   os.path.basename(__file__)<br />
logging.basicConfig( \<br />
        filename=f'{CALLER_LIST_DIR}/{APPNAME}.log', \<br />
        encoding='utf-8', \<br />
        format=f'%(asctime)s {APPNAME}[%(process)d]: %(levelname)s: %(message)s', \<br />
        level=logging.INFO )<br />
<br />
def main(args):<br />
    """メイン関数<br />
<br />
    Parameters<br />
    ----------<br />
    args : array<br />
        コマンドライン引数<br />
<br />
    Returns<br />
    -------<br />
    int<br />
        終了コード<br />
<br />
    """<br />
<br />
    # コマンドライン引数の処理<br />
    toaddr = ""<br />
    innum = 0<br />
    errmsg = ''<br />
    while True:<br />
        if len(args) &lt; 2 :<br />
            errmsg = "Not enough arguments."<br />
            break;<br />
<br />
        toaddr = args[1]<br />
<br />
        break;<br />
<br />
    if errmsg != '':<br />
        # コマンドライン引数のエラー<br />
        print(errmsg)<br />
        print_usage()<br />
        sys.exit(-1)<br />
<br />
    logger.info(f'meiwaku_report start.')<br />
<br />
    # レポート対象リストファイルの準備<br />
    os.makedirs(REPORT_LIST_DIR, exist_ok=True)<br />
    if not os.path.isfile(REPORT_LIST_FILE):<br />
        # 存在しない場合は、空ファイルを作成<br />
        with open(REPORT_LIST_FILE,'w'):pass<br />
<br />
    # レポート対象リストファイルの先頭行から前回レポート着信日時を取得<br />
    lastreport      =   ""<br />
    with open(REPORT_LIST_FILE, mode='r') as file_in:<br />
        # 1行毎に読込む<br />
        for i, rec_i in enumerate(file_in):<br />
            record  =  rec_i.split(',')<br />
            if len(record) &gt; 2:<br />
                # 前回レポート着信日時を取得<br />
                lastreport  =   record[2];<br />
                break<br />
<br />
    # 着信電話番号リストファイルからレポート対象のデータを取得<br />
    # レポート対象データファイルを作成<br />
    report_count =   0;<br />
    with open(CALLER_LIST_FILE, mode='r') as file_in, \<br />
         open(REPORT_LIST_FILE_NEW, mode='w') as file_out:<br />
<br />
        # 元のファイルの内容を出力<br />
        for i, rec_i in enumerate(file_in):<br />
            record  =  rec_i.split(',')<br />
            if len(record) &gt; 2 and record[2] &lt;= lastreport:<br />
                # 前回レポート着信日時に達した場合、抜ける<br />
                break;<br />
<br />
            if record[1] == 'NG':<br />
                # 迷惑電話判定の場合、レコードを出力<br />
                print(rec_i, end='', file=file_out)<br />
                report_count =   report_count + 1<br />
<br />
<br />
    if report_count &gt; 0:<br />
        # レポート対象リストデータがある場合<br />
        # レポート対象リストファイルからレポートファイルを作成<br />
        with open(REPORT_LIST_FILE_NEW, mode='r') as file_in, \<br />
             open(REPORT_MAIL_FILE, mode='w') as file_out:<br />
            # ヘッダー、先頭コンテンツの出力<br />
            print(MAIL_CONTENT.format( \<br />
                            toaddr=toaddr, \<br />
                            fromaddr=MAIL_FROMADDR), end='', file=file_out);<br />
<br />
            # レポート対象データを出力<br />
            for i, rec_i in enumerate(file_in):<br />
                record  =  rec_i.split(',')<br />
<br />
                # レポート用に編集して出力<br />
                print(MAIL_ITEM.format( \<br />
                    call_date=record[2], \<br />
                    call_times=record[3], \<br />
                    call_id=record[0], \<br />
                    call_name=record[4].removesuffix('\n')), end='', file=file_out)<br />
<br />
        # メールの送信<br />
        if asyncio.run(run_sendmail_command(toaddr, REPORT_MAIL_FILE)) == 0:<br />
            # 送信が成功した場合、<br />
            # 今回レポート対象リストファイルの権限を設定<br />
            os.chmod(REPORT_LIST_FILE_NEW, REPORT_LIST_FILE_PRM)<br />
<br />
            # 今回レポート対象リストファイルに置換<br />
            os.remove(REPORT_LIST_FILE)<br />
            os.rename(REPORT_LIST_FILE_NEW, REPORT_LIST_FILE)<br />
<br />
            logger.info(f'Sent report mail of {report_count} MEIWAKU calls.')<br />
<br />
    else:<br />
        # レポート対象リストデータがない場合<br />
        os.remove(REPORT_LIST_FILE_NEW)<br />
<br />
    logger.info(f'meiwaku_report end. {report_count} records processed.')<br />
<br />
    return 0<br />
<br />
async def run_sendmail_command( toaddr, contnt_file ):<br />
    """ メール送信コマンドの実行<br />
<br />
    メールを送信するコマンドを実行<br />
<br />
    Parameters<br />
    ----------<br />
    toaddr: str<br />
        送信先アドレス<br />
    contnt_file : str<br />
        送信するメッセージを格納したファイルのパス<br />
<br />
    Returns<br />
    -------<br />
    int<br />
        終了ステータス<br />
    """<br />
    cmd = MAIL_CMD.format(sendto=toaddr, content=contnt_file)<br />
<br />
    proc = await asyncio.create_subprocess_shell( \<br />
            cmd, \<br />
            stdout=asyncio.subprocess.PIPE, \<br />
            stderr=asyncio.subprocess.PIPE)<br />
<br />
    stdout, stderr = await proc.communicate()<br />
<br />
    logger.info(f'[{cmd!r}] exited with {proc.returncode}.')<br />
<br />
    if stderr:<br />
        logger.err(f'{stderr.decode()}')<br />
<br />
    return proc.returncode<br />
<br />
def print_usage():<br />
    """このコマンド使用法の出力<br />
    """<br />
    print('meiwaku_report.py &lt;to mail address&gt;')<br />
<br />
#<br />
if __name__ == "__main__":<br />
    # トップレベル環境で実行された場合、メイン関数を呼ぶ<br />
    sys.exit(main(sys.argv))<br />
</code></pre>
<br />
<h7 class="blockheader">作成したユーザープログラムを配置します。</h7><br />
場所：/usr/share/asterisk/agi-bin<br />
ファイル名：meiwaku_report.py<br />
<br />
<h7 class="blockheader">ユーザープログラムの権限を設定します。</h7><br />
パーミッションの設定：<br />
<pre class="sourcecode">chmod 755 meiwaku_report.py</pre>
<br />
<h7 class="blockheader">cronのコンフィギュレーション</h7><br />
<br />
crontabを使ってスケジュールを設定します。<br />
<br />
<pre class="sourcecode">sudo crontab -e</pre>
<br />
設定内容：<br />
<ul style="list-style-type:circle">
<li>毎日、12:30と17:30にスクリプトを起動します。</li>
</ul>
<pre class="sourcecode"># meiwaku report<br />
30 17 * * * python3 /usr/share/asterisk/agi-bin/meiwaku_report.py xxxxx@xxxxxx.xxx<br />
30 12 * * * python3 /usr/share/asterisk/agi-bin/meiwaku_report.py xxxxx@xxxxxx.xxx</pre>
<small>xxxxx@xxxxxx.xxxはメール送信先アドレスです。実際の運用に合わせてください。</small><br />
<br />
<hr color="#1188aa">
<br />
<h5 class="blockheader">■ RaspberryPiでPBXとFAXの構築 - 目次 -</h5>
<ol>
<li><a href="?itemid=369">構成</a></li>
<li><a href="?itemid=371">ひかり電話RV-230SEの設定</a></li>
<li><a href="?itemid=374">OSのセットアップ</a></li>
<li><a href="?itemid=381">LANアダプタの接続</a></li>
<li><a href="?itemid=382">ユーティリティのセットアップ</a></li>
<li><a href="?itemid=385">PBXのセットアップ</a></li>
<li><a href="?itemid=396">ソフトウェアモデムのセットアップ</a></li>
<li><a href="?itemid=399">FAXのセットアップ</a></li>
<li><a href="?itemid=407">自動再起動</a></li>
<li><a href="?itemid=412">ステータスLEDの接続</a></li>
<li><a href="?itemid=415">ケースに収納・設置</a></li>
<li><a href="?itemid=419">トラブルと対応</a></li>
<li><a href="?itemid=443">迷惑電話対策</a></li>
<li><a href="?itemid=450">迷惑電話対策2</a></li>
<li><a href="?itemid=469">迷惑電話レポート</a></li><br />
</ol>]]></description>
<category>パソコン</category>
<comments>http://www.projexam.com/blog/hotall/diy/index.php?itemid=469</comments>
<pubDate>Sat, 12 Jul 2025 19:10:47 +0900</pubDate>
</item><item>
<title><![CDATA[デスクトップPCのアップグレード]]></title>
<link>http://www.projexam.com/blog/hotall/diy/index.php?itemid=468</link>
<description><![CDATA[<div class="leftbox">
<img src="images_diy/dtpcupg01.JPG" width=280 border="0"><br />
</div><br class="endbox">
<br />
修理をするのが趣味の私は、壊れていないものを買い替えるとき、残念な気持ちになります。<br />
まだまだ使えるから、そう思って古い機器を持ち続ける、捨てられないタイプの一人です。<br />
<br />
先日、妻の<a href="?itemid=461">段ボールPCをアップグレード</a>しましたが、今度は私のデスクトップPCをアップグレードすることにしました。<br />
<br />
10年使い続けたこのPCも、例にもれずWindows11対象外です。<br />
<br />
CPUはDevil's Canyon(Core_i7-4790K)、第4世代です。現在でも私にとっては十分使えるものでしたが、Windows10の継続ライセンスを購入してまで、使い続ける気にはなりませんでした。<br />
<br />
<dev class="attention">この文書は個人的なものであり、内容について一切の責任を負いかねます。</dev><br />
<br />
<hr color="#1188aa">
<br />
さて、どのようにアップグレードするのか。<br />
<br />
やはり、使えるものはそのまま使い、なるべくコストを抑えることにします。<br />
<br />
マザーボード、ＣＰＵ．メモリは当然買い替えです。<br />
<br />
電源は、17年使い続けたSS-700HMは現在までトラブルがなかったので、電解コンデンサを交換して再利用します。<br />
<br />
ケース(Antec SOLO BLACK)はケースファン(Nidec Gentle Typhoon)を含め健在、ストレージは、まだ寿命半ばなので、そのまま使います。<br />
<br />
今回の購入部品は次の通り<br />
<ul style="list-style-type:circle">
    <li>CPU：AMD Ryzen 7 9700X<br />
        <div class="subblock">今回は久々にAMDにしました。<br />
        athlon64x2 3000+以来です。<br />
        主目的はゲームではないので、流行りの3Dキャッシュではないタイプとしました。</div></li>
    <li>マザーボード：MAG B650 TOMAHAWK WIFI<br />
        <div class="subblock">ASUS　TUF GAMING B650M-E WIFIと悩みましたが、光デジタル出力が欲しかったので、こちらを選びました。</div></li>
    <li>CPUクーラー：NH-U12A chromax.black<br />
        <div class="subblock">現在のCPUクーラー、サイズ TRue Black 120 PLUSは性能的に特に問題はないのですが、縁が錆び始めているので、AM5のリテンションキットを買ってまで使い続けることは止めました。<br />
        今回は水冷を使うほどゴリゴリ動かすことを考えていませんので、従来通りサイドフローの空冷としました。</div></li>
    <li>メモリ：CP2K16G64C38U5B [DDR5 PC5-51200 16GB x 2]<br />
        <div class="subblock">現在の16GBでも不満はなかったのですが、倍の32GBにしました。</div></li>
</ul>
今回の構成は、私の使用目的からするとオーバースペックですが、前回と同様に長く使えることを意識しました。<br />
結局、ハイエンドでもなく、ハイコスパでもない、特徴のないものになってしまいましたが、バランス的にはこれでいいような気がします。<br />
<br />
まずは電源のコンデンサ交換です。<br />
<div class="leftbox">
<img src="images_diy/dtpcupg02.JPG" width=280 border="0"><br />
</div>
17年使い続けた電源です。<br />
<br />
トラブルなく動いてくれました。<br />
もう少し頑張ってもらいます。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtpcupg03.JPG" width=280 border="0"><br />
</div>
交換前の基板です。<br />
<br />
電解コンデンサはどれもニチコン製です。<br />
液漏れや膨らみはありません。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtpcupg04.JPG" width=280 border="0"><br />
</div>
交換後の基板です。<br />
<br />
できるだけ積層セラミック、または固体電解コンデンサにします。<br />
できなくても、元の電解コンデンサより寿命の長いものにします。<br />
<br />
どれも日本メーカー製を選びました。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtpcupg05.JPG" width=280 border="0"><br />
</div>
実はファンも、noctuaのものに交換したのですが、<br />
<br />
アイドル時点では回転せず、やむなく元に戻しました。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtpcupg06_content.png" width=280 border="0"><br />
</div>
このファンは3.6V程度では回転しないようです。<br />
<br />
そのうち、電圧-PWMパルス変換器でも製作しようかなと思ったりします。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtpcupg07.JPG" width=280 border="0"><br />
</div>
元のマザーボードです。<br />
<br />
16年を経過して、アルミ製の冷却フィンの端はクロムメッキが剥げ、白く錆びています。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtpcupg08.JPG" width=280 border="0"><br />
</div>
新しいマザーボードです。<br />
<br />
全体的に黒で統一されて精悍な印象となりました。<br class="endbox">
<div class="leftbox">
<img src="images_diy/dtpcupg09.JPG" width=280 border="0"><br />
</div>
ケースに組み込みます。<br />
<br />
内部を見せるケースではないので、必要以上に裏配線はせず、特に苦労なく完成しました。<br />
<br />
カードスロットとM.2スロットはガラガラで、ちょっと寂しい感じです。<br />
次回ストレージを交換する時はM.2にしようかと思います。<br class="endbox">
最後にOSをWindows11にアップグレードして、完了です。<br />
<br />
しかし、このパソコンのOSはデベロッパーサービスに含まれるもので、無償アップグレードの対象外であるようで、新規にパッケージ版を購入することになりました。<br />
<br />
ライセンスキーを入力して、無事、すべてのアップグレードは完了です。<br />
<br />
使用感ですが、そもそも10年前の機器との比較ですので、当然、速くなったと実感できます。<br />
<br />
しかし、以前、機器を更新した時のような感動はありません。<br />
<br />
ここで、はたと気づきました。<br />
このシステムのパフォーマンス上のボトルネックは、私の頭なのです。<br />
さすがに、これはアップグレードできませんね。<br />
<br />
さて、古い部品はまだ使えるので、廃棄するのに後ろ髪を引かれる思いなのですが、仕方ないですね。<br />
お陰で、今回、組立を楽しめた、と思うことにしました。<br />
]]></description>
<category>パソコン</category>
<comments>http://www.projexam.com/blog/hotall/diy/index.php?itemid=468</comments>
<pubDate>Sun, 8 Jun 2025 13:17:30 +0900</pubDate>
</item><item>
<title><![CDATA[段ボールPCのアップグレード]]></title>
<link>http://www.projexam.com/blog/hotall/diy/index.php?itemid=461</link>
<description><![CDATA[<div class="leftbox">
<img src="images_diy/danpc01.JPG" width=280 border="0"><br />
</div><br class="endbox">
取りあえずのつもりで作った<a href="?itemid=333">段ボールPC</a>でしたが、妻はずっと使ってくれました。<br />
しかしながら、今年でWindows10のサポートも終わりとなり、このPentiumマシンもお役御免です。<br />
<br />
そういう訳で、代わりになるPCが必要となりました。<br />
妻はこのケースでも良いと言ってくれたので、コストを抑えるため、マザーボードとその部品の交換だけで済ませることにしました。<br />
<br />
<dev class="attention">この文書は個人的なものであり、内容について一切の責任を負いかねます。</dev><br />
<br />
<hr color="#1188aa">
<div class="leftbox">
<img src="images_diy/danpc02.JPG" width=280 border="0"><br />
</div><br class="endbox">
今回の構成は次の通り。<br />
<ul style="list-style-type:circle">
    <li>マザーボードは、オンボードのN100CPUのmini-ITXです。<br />
        <div class="subblock">ASUS PRIME N100I-D D4-CSM</div></li>
    <li>メモリは16Gbyte。<br />
        <div class="subblock">CFD Standard D4N3200CS-16G</div></li>
    <li>このマザーボードにはSATAが1つしかないので、SATA3を5ポート増設できるM.2ボードを追加。<br />
        <div class="subblock">玄人志向 SATA3-I5-M.2</div></li>
    <li>OSはWindows10からWindows11に無償アップグレード</li>
</ul>
作業は内容は次の通り<br />
<ul style="list-style-type:circle">
    <li>電源は古くなったので、電解コンデンサを交換します。</li>
    <li>マザーボードを交換して、メモリを挿します。</li>
    <li>ストレージ、フロントパネルケーブル、電源を繋ぎます。</li>
    <li>この状態でWindowsを起動すれば、OSが自動的に新しいデバイスに合ったドライバーをインストールしてくれるはずです。</li>
    <li>SATA増設アダプタをM2,コネクタに差し、データストレージを繋ぎます。</li>
    <li>再度立ち上げて、ハードの交換は終わります。</li>
    <li>次に、Windows10をWindows11にアップグレードします。これはWindowsアップデートに指示するだけで完了するはずです。</li>
</ul>
<div class="leftbox">
<img src="images_diy/danpc03.JPG" width=280 border="0"><br />
</div><br class="endbox">
<br />
当初は、簡単に作業が進むと思っていましたが、実際はかなりの苦戦となりました。<br />
以下に、遭遇したトラブルと対応した内容を記します。<br />
<br />
<h5 class="blockheader">電源が入らない。</h5>
<div class="subblock">
<h7 class="blockheader">現象</h7><br />
電源ボタンを押してもディスプレイに何も表示されない<br />
<br />
<h7 class="blockheader">原因</h7><br />
これまで、いくつものmini-itxマザーボードを使ってきましたが、それらのすべては20ピンのATX電源ソケットでした。<br />
ところが、今回の電源ソケットは24ピンです。4ピンの12Vもついています。<br />
24ピンソケットの後ろ4ピンも単独の4ピンソケットも補助電源用と思っていましたが、これを繋がないと、起動すらしなかったのです。<br />
(実は、マニュアルには繋ぐように書かれてあったのですが、消費電力が大きなカードを挿したときのためのものと思ってしまいました。)<br />
<br />
<h7 class="blockheader">対策</h7><br />
20ピン電源ケーブルから12vを引出し、4ピンコネクタケーブルを自作し、これを繋ぐことで解決できました。<br />
<br />
<br />
<h5 class="blockheader">Windows10が起動しない。</h5>
<div class="subblock">
<h7 class="blockheader">現象</h7><br />
電源ケーブルの対策をしてBIOS画面が表示されたのですが、Windows10システムのブートが始まりません。<br />
BIOSはストレージを認識しています。<br />
マザーボードを元に戻し、Windowsのブートを調べてみました。<br />
コマンドプロンプトでシステム情報表示を立ち上げます。<br />
<pre class="sourcecode">MSInfo32</pre>
[システムの概要]-[BIOSモード]を見ます。<br />
レガシとなっていました。<br />
一方、このマザーボードはUEFIです。<br />
BIOSにCSMブート(UEFIにレガシーブートと互換性を持たせる機能)の設定項目があるのですが、これがグレー表示になっていて、設定できません。<br />
<br />
<h7 class="blockheader">原因</h7><br />
そうです。このマザーボードはレガシブートをサポートしていないのです。<br />
<br />
<h7 class="blockheader">対策</h7><br />
システムドライブをMBRからUEFI/GPTに変換しなければなりません。<br />
作業は次の通り<br />
<ul style="list-style-type:circle">
<li>リカバリーディスク/回復ドライブの作成<br />
今回はBOOTシステムを触るので、最悪、起動しなくなる可能性があります。<br />
その時のために、起動ディスクを作っておきます。<br />
これは後で分かったのですが、そもそも、WindowsのMBR-GPT変換ツールは実行時の起動ドライブに対しては処理できないようです。<br />
("cannot find room for the EFI system partition ..."エラーが出ます。)<br />
<br />
作成方法は設定の検索で「回復ドライブの作成」を入力して、表示画面に従い作成します。</li>
<li>データのバックアップ</li>
<li>ストレージドライブに512Mbyte以上の空きがあることを確認します。</br>
(空きがなければ、ツールの実行で"cannot find room for the EFI system partition ..."エラーが出ます。)</li>
<li>空きがなければ、既存のパーティションを縮小し、空きを作ります。<br />
私は、システムパーティションを削りました。<br />
ツールはGPartedを使いました。</li>
<li>Windows標準の変換ユーティリティを実行<br />
リカバリーディスクで起動し、[トラブル対策][コマンドプロンプト]を開く<br />
変換するシステムディスク番号を調べます<br />
<pre class="sourcecode">diskpart<br />
&gt;list disk<br />
  (目的のディスクの最初の項目：ディスク &lt;ディスク番号&gt;)<br />
&gt;exit</pre>
事前に変換に問題ないか確認します。<br />
<pre class="sourcecode">MBR2GPT /validate /disk:&lt;ディスク番号&gt; /allowFullOS</pre>
変換します。<br />
<pre class="sourcecode">MBR2GPT /convert /disk:&lt;ディスク番号&gt; /allowFullOS</pre></li>
</ul>
<br />
<br />
<h5 class="blockheader">Windows11にアップグレード後、ライセンスの認証ができない。</h5>
<div class="subblock">
<h7 class="blockheader">現象</h7><br />
OS起動後、ライセンスの再認証を促されるも、プロダクトIDを入力すると正しくないと拒否されます。<br />
<br />
<h7 class="blockheader">原因</h7><br />
どうやら、マザーボードを交換した時、Windows10での再認証が必用だったようで、これを行わずにWindows11へのアップグレードをしたことが良くなかったようです。<br />
<br />
<h7 class="blockheader">対策</h7><br />
マイクロソフト　サポートセンターに問合せて解決しました。<br />
いくつかのコマンドを入力し、翌日、再度認証を行うことで、プロダクトIDを入力することなく完了しました。<br />
<br />
<br />
<h5 class="blockheader">電源ボタンを押してもスリープが解除しない。</h5>
<div class="subblock">
<h7 class="blockheader">現象</h7><br />
Bluetoothキーボードを繋いだ状態でSleepするとSleep状態から復帰しない。<br />
有線キーボードだけだと復帰します。<br />
Bluetoothキーボードであっても休止モードからだと復帰します。<br />
デバイスマネージャーに不明な"USBデバイス(ポートのリセット失敗)"が表示されます。<br />
イベントログにBlutooth関連のエラーが記録されています。<br />
<pre class="sourcecode">Bluetooth の認証コード (link keys) をローカル アダプター上に保管できません。<br />
スタートアップの間に Bluetooth キーボードは、システム BIOS で機能しない可能性があります。<br />
  ソース：BTHUB<br />
  イベント：18</pre>
<pre class="sourcecode">アダプターに送信されたコマンドはタイムアウトになりました。アダプターは応答しませんでした。<br />
  ソース：BTHUB<br />
  イベント：3</pre>
BluetoothアダプタやUSBコントローラ/HUBの電源管理を、次のように変更しても改善しません。<br />
<div class="subblock">デバイスマネージャの対応するデバイスを選択し、「電源の管理」タブを開きます。<br />
電力の節約のためにコンピュータがこのデバイスの電源をオフできるようにする」のチェックを外します。</div>
<h7 class="blockheader">原因</h7><br />
これは推測ですが。<br />
稼働中にBluetoothキーボードを使っていると、スリープ解除による起動時にこのキーボードにアクセスしようとコマンドを送ります。<br />
もし、デバイスの応答が得られない場合(ログを見る限り起動時は必ず無応答)、別の経路を探るためか、このマザーボードにはないオンボードBluetoothコントローラにアクセスしようとします。当然これは失敗するのですが、何故か、ここでＯＳは起動自体を中止してしまうようです。<br />
<br />
<h7 class="blockheader">対策</h7><br />
BIOSのオンボードデバイスの設定を変更することで解決しました。<br />
<div class="subblock">[Advanced]-[Onbord Device Configuration]<br />
  [Connectivity mode(Wi-Fi & Bluetooth)]を[Disabled]に変更します。</div></div>
<br />
<br />
さて、今までマシンのスペックでWindows11にアップグレードできなかった人が、いよいよ観念して、マシンを新調することになると思います。<br />
今回のマザーボードの交換とOSアップグレードを経験して分かったことは、<ul style="list-style-type:circle">
    <li>交換する前に現在のブートモードが新しいマザーボードで対応しているかを確かめること。</li>
    <li>マザーボード交換後は、まずWindows10のライセンス再認証を完了しておくこと。</li>
</ul> です。<br />
<br />
これからアップグレードする人の参考になれば幸いです。<br />
]]></description>
<category>パソコン</category>
<comments>http://www.projexam.com/blog/hotall/diy/index.php?itemid=461</comments>
<pubDate>Fri, 21 Mar 2025 15:53:24 +0900</pubDate>
</item><item>
<title><![CDATA[イヤホン(BOSE IE2)のケーブル交換]]></title>
<link>http://www.projexam.com/blog/hotall/diy/index.php?itemid=458</link>
<description><![CDATA[かつての私は、新製品が出ると、カタログを眺めたり、店で手に取ってみたり、あれこれ悩み、意を決して買って帰るのです。そして、手に入れた製品を眺め、所有した喜びを味わっていました。<br />
そんなわくわく感が好きでした。<br />
<br />
それが最近では、そんな欲求も減ってしまったように感じます。<br />
これも年齢のせいなのでしょうか。<br />
<br />
むしろ、使い古したものを、修理しながら使い続けることの方が、充実感を得られるようになったのです。<br />
<div class="leftbox">
<img src="images_diy/iecable01.JPG" width=280 border="0"><br />
</div>
写真のBOSE IE2は、先代のIEから買い替えて15年くらい使い続けたイヤホンです。<br />
<br />
IEもケーブルの被覆が劣化して処分しましたが、今回も被覆がボロボロになってしまいました。<br />
ウレタン素材の被覆は肌触りが良いのですが、耐久性は良くありません。<br class="endbox">
流行りのTWSにでも買い替えようかと思いましたが、ケーブルだけの問題で捨ててしまうのは勿体ないので、修理することにしたのです。<br />
<br />
<dev class="attention">この文書は個人的なものであり、読者による修理を推奨するものではなく、内容について一切の責任を負いかねます。<br />
ユーザーによる修理はメーカーの保証・修理が受けられなくなる可能性があります。</dev><br />
<br />
<hr color="#1188aa">
<br />
<div class="leftbox">
<img src="images_diy/iecable02.JPG" width=280 border="0"><br />
</div>
たまたま、東京に出る用事があったので、秋葉原でケーブルを買いました。<br />
<br />
オヤイデ HPC-28-2U V2 ツイストケーブルです。<br />
オヤイデがお休みだったので、向いの千石電商で買いました。<br class="endbox">
<div class="leftbox">
<img src="images_diy/iecable03.JPG" width=280 border="0"><br />
</div>
ハウジングの背面のカバーを外します。<br class="endbox">
<div class="leftbox">
<img src="images_diy/iecable04.JPG" width=280 border="0"><br />
</div>
ブッシュを引き上げて外します。<br class="endbox">
<div class="leftbox">
<img src="images_diy/iecable05.JPG" width=280 border="0"><br />
</div>
少し余裕を持たせてケーブルを切断します。<br class="endbox">
<div class="leftbox">
<img src="images_diy/iecable06.JPG" width=280 border="0"><br />
</div>
元のイヤホンからブッシュと左右のケーブルの長さを調節する部材を外し、新しいケーブルに嵌めます。<br class="endbox">
<div class="leftbox">
<img src="images_diy/iecable07.JPG" width=280 border="0"><br />
</div>
新しいケーブルの外被を少し剥がし、中の線を引き出します。<br />
外被が戻らないようにクリップで止めます。<br class="endbox">
<div class="leftbox">
<img src="images_diy/iecable08.JPG" width=280 border="0"><br />
</div>
ハウジング側とケーブル側の線を撚ってまとめます。<br />
その際、補強用の糸をできるだけ取り除くと半田の乗りが良くなります。<br class="endbox">
<div class="leftbox">
<img src="images_diy/iecable09.JPG" width=280 border="0"><br />
</div>
銅線のエナメルを焼いて取り除きます。<br />
<br />
写真はありませんが、炎を当てると、一気に焼き広がってしまうので、ペンチで摘み、焼く部分だけ出すようにします。<br class="endbox">
<div class="leftbox">
<img src="images_diy/iecable10.JPG" width=280 border="0"><br />
</div>
予備はんだをします。<br />
<br />
一方の線にヒシチューブを被せ、はんだ付けて結線します。<br />
ヒシチューブははんだ付けの位置までずらし、半田ごての熱で収縮させます。<br class="endbox">
リッツ線は銅線が細く、特にこのイヤホンは、線が細いのに加え、本数も少なく、少し力を加えるだけで容易に切れてしまいます。<br />
<br />
今回も、はんだ付けの際、何度も切れてしまいました。<br />
線が切れる度に、心の緊張も切れそうになり、このまま、ゴミ箱に投げ捨てたい衝動と戦いながらの作業となりました。<br />
<br />
幸い、ハウジング側のケーブルに余裕を持たせておいたおかげで、なんとか銅線が尽きる前に繋ぐことができました。<br />
<div class="leftbox">
<img src="images_diy/iecable11.JPG" width=280 border="0"><br />
</div>
後は、ハウジングにケーブルを収め、ブッシュを嵌め、エポキシを充填して固定します。<br />
<br />
接着剤が固まるまで、クリップで固定しておきます。<br class="endbox">
<div class="leftbox">
<img src="images_diy/iecable12.JPG" width=280 border="0"><br />
</div>
プラグ側も同様に結線します。<br />
<br />
外被の切れ目を覆うためと、左右の分け目で解れないようにするために、それぞれのヒシチューブを被せておきます。<br />
<br />
結線後に、ヒシチューブは目的の位置までずらし、熱で収縮させます。<br class="endbox">
<div class="leftbox">
<img src="images_diy/iecable13.JPG" width=280 border="0"><br />
</div>
出来上がりました。<br class="endbox">
新しいケーブルは銅線の太さも本数も増したためか、音が良くなったように感じます。<br />
確証バイアスでしょうね。幸せならば、それでもいいのです。<br />
<br />
ハウジング内の銅線も短くなっていますし、エポキシでガッチリ固めていますので、次回の修理は不可能でしょう。<br />
その時は、昔のように新製品の購入を楽しみたいと思います。]]></description>
<category>オーディオ・ビジュアル</category>
<comments>http://www.projexam.com/blog/hotall/diy/index.php?itemid=458</comments>
<pubDate>Wed, 12 Feb 2025 17:24:05 +0900</pubDate>
</item><item>
<title><![CDATA[CDプレイヤー(DP-7060)のリフレッシュ]]></title>
<link>http://www.projexam.com/blog/hotall/diy/index.php?itemid=454</link>
<description><![CDATA[我家のリビングのオーディオセットも年季が入っています。<br />
<br />
既に<a href="?itemid=353">チューナーは調子が悪くなり、リフレッシュ</a>をしましたが、今度はCDプレイヤーの音がこもるようになりました。<br />
<div class="leftbox">
<img src="images_diy/DP7060_01.JPG" width=280 border="0"><br />
</div><br class="endbox">
KENWOOD DP-7060。30年前の製品です。<br />
<br />
その年数と症状から、電解コンデンサの劣化だと思われます。<br />
これまでのオーディオ機器をリフレッシュした成功体験があるので、迷うことなく部品を交換することにしました。<br />
<br />
<dev class="attention">この文書は個人的なものであり、読者による修理を推奨するものではなく、内容について一切の責任を負いかねます。<br />
ユーザーによる修理はメーカーの保証・修理が受けられなくなる可能性があります。</dev><br />
<br />
<hr color="#1188aa">
<br />
作業内容は次の通り<br />
<ul style="list-style-type:circle">
<li>電源回路とサーボ回路及びデジタル回路の小型電解コンデンサを固体電解コンデンサに交換。</li>
<li>大型コンデンサは国内メーカーの105℃電解コンデンサに交換。</li>
<li>アナログ回路の電解コンデンサをオーディオ用電解コンデンサに交換。</li>
<li>DACのローパスフィルターに使用されているオペアンプをオーディオ用オペアンプに交換。<br />
NJM4580L -> MUSE8920AE</li>
</ul>
<div class="leftbox">
<img src="images_diy/DP7060_02.JPG" border="0"><br />
</div>
交換前の基板です。<br class="endbox">
<div class="leftbox">
<img src="images_diy/DP7060_03.JPG" border="0"><br />
</div>
オペアンプはパッケージタイプが異なるので、変換が必用です。<br />
SOP8からSIP8への変換です。<br />
<br />
今回はユニバーサル基板で自作しました。<br class="endbox">
<div class="leftbox">
<img src="images_diy/DP7060_04.JPG" border="0"><br />
</div>
コンデンサの交換作業は、いつもの通りです。<br />
写真は交換後の基板です。<br class="endbox">
部品数は多いですが、特に苦労なく終えました。<br />
さて、鳴らしてみます。<br />
<br />
あれ、片方しか鳴りません。<br />
もう片方も、少し音が歪んています。<br />
<br />
まずは、全く鳴らない右側の回路を調べてみます。<br />
部品を触ってみると、グラグラします。<br />
半田クラックです。<br />
<br />
他の部品も、同様に触ってみると、次々と半田クラックが起きてしまいました。<br />
半田の経年劣化です。<br />
すべての部品について、再半田を行いました。<br />
<br />
しかしながら、相変わらず右側の音は出ません。<br />
オペアンプを疑いましたが、配線に間違いはありません。<br />
<br />
手元のテスターで、オペアンプの出力を調べると、プラスに振り切っています。<br />
あぁ、これはおそらく・・・。発振しています。<br />
なるほど、左側の音も歪んでいる状況と符合します。<br />
<br />
位相補償の調整が必用なようです。<br />
オペアンプの特性が異なるので、当然と云えば当然、こうなるリスクはあったのですが。<br />
<br />
さて、我家にはオシロスコープもオシレータ―もありません。<br />
それに、私に調整する技能も無いことから、オペアンプの交換は諦めました。<br />
オペアンプは元に戻します。<br />
<br />
結果は、無事、両チャネルとも正常に鳴りました。<br />
こもった音も、直りました。<br />
<div class="leftbox">
<img src="images_diy/DP7060_05.JPG" border="0"><br />
</div>
最後のルーティーン。リフレッシュした基板を眺めて、一人、悦に入ります。<br class="endbox">
オペアンプの交換は心残りですが、メーカーの音作りを重視する意味でも、やむを得ないかなと自分を納得させました。]]></description>
<category>オーディオ・ビジュアル</category>
<comments>http://www.projexam.com/blog/hotall/diy/index.php?itemid=454</comments>
<pubDate>Mon, 3 Feb 2025 18:06:26 +0900</pubDate>
</item><item>
<title><![CDATA[RaspberryPiでPBXとFAXの構築 - 迷惑電話対策2]]></title>
<link>http://www.projexam.com/blog/hotall/diy/index.php?itemid=450</link>
<description><![CDATA[<a href="?itemid=443">迷惑電話対策をした我家のPBX</a>、それなりに効果はありましたが、欲が出てきました。<br />
<div class="leftbox">
<img src="images_diy/pbx121.JPG" width=280 border="0"><br />
</div><br class="endbox">
現状、見知らぬ番号から電話が掛かって来た場合の対応は、電話番号から種類と地域を判別し、そこから掛かってくる当てが無ければ、受話せず留守番電話に任せます。<br />
後ほど、ネットでその電話番号を検索し、相手を特定し、着信電話番号リストファイルに名前と判定区分を追記することで、再度掛かってきた迷惑電話を自動的に拒否します。<br />
<br />
これらの作業を手動で行っていますが、これが結構面倒なのです。<br />
<br />
そもそも、着信時、電話機に表示される電話番号だけで相手を推定するのは困難です。<br />
それに、迷惑電話以外の場合でも、相手の名前などを着信電話番号リストファイルのコメント欄に追記するのですが、再度掛かって来た時に、即座にその情報を見ることができません。<br />
<br />
今は仕方なく、子機側の電話帳に同じ情報を追加しています。<br />
これでは、重複管理になり、煩わしいのです。<br />
<br />
そこで、次の機能を追加することにしました。<br />
<ul style="list-style-type:circle">
  <li>再度掛かってきた番号には、リストファイルの迷惑電話の判定と共に、コメントを着信者名として子機に渡す。<br />
      （通常、子機は自身の電話帳に無ければ、渡された名前を表示します。）</li>
  <li>初めて掛かって来た番号には、WEBから名前と迷惑電話に関する情報を取得・判定し、子機に渡す。<br />
      また、リストファイルにこれらの情報を追記・保存する。</li>
</ul>
<br />
<dev class="attention">この文書は個人的なものであり、内容について一切の責任を負いかねます。</dev><br />
<br />
<hr color="#1188aa">
<br />
<h7 class="blockheader">プログラムを変更・更新する。</h7><br />
    場所：/usr/share/asterisk/agi-bin<br />
    ファイル名：meiwaku_check.py<br />
<pre class="sourcecode"><code>#!/usr/bin/env python3<br />
""" 迷惑電話判定 AGIスクリプト<br />
<br />
着信電話番号が迷惑電話か否かを判定する。<br />
判定結果は指定された変数に設定(クォートで囲まない)<br />
  'OK':迷惑電話ではない<br />
  'NG':迷惑電話<br />
  ''  :不明<br />
<br />
着信電話番号の判定は、着信電話番号リストファイルを検索し、<br />
その判定区分(OK/NG/)で判断する。<br />
ファイルに無い場合は、コメント(名前)と判定区分はWEBから取得し、新しいデータを<br />
ファイルの先頭に追加する。<br />
WEBから取得できなかった場合、着信番号の先頭から地域を判定し、<br />
海外の場合はその地域の名前に'?'を付けてコメントに格納し判定区分は'NG'とする。<br />
国内の場合は判定区分を不明:''とする。<br />
検索された着信電話番号のデータは日付時刻(yyyy/mm/dd hh:mm:ss)と回数を設定して<br />
ファイルの先頭に移動する。<br />
着信電話番号リストファイルのフォーマット:テキストファイル(utf-8)<br />
    &lt;着信電話番号&gt;,&lt;判定区分&gt;,&lt;最新着信日時&gt;,&lt;回数&gt;,&lt;コメント/名前&gt;LF<br />
    &lt;着信電話番号&gt;,&lt;判定区分&gt;,&lt;最新着信日時&gt;,&lt;回数&gt;,&lt;コメント/名前&gt;LF<br />
    ...<br />
<br />
Arguments<br />
----------<br />
resvar : str<br />
    判定結果を格納する変数名。デフォルト:'MEIWAKU_CHK'<br />
comvar : str<br />
    コメント/名前を格納する変数名。デフォルト:'COMMENT'<br />
<br />
Returns<br />
-------<br />
int<br />
    0 : 正常終了 その他 : 処理失敗<br />
<br />
Example<br />
-------<br />
    exten =&gt; s,1,AGI(meiwaku_check.py,meiwaku_chk,comment)<br />
    same  =&gt; n,GotoIf($["${comment}" = ""]?callphones)<br />
    same  =&gt; n,Set(CALLERID(name)=${comment})<br />
    same  =&gt; n(callphones),GotoIf($["${meiwaku_chk}" = "NG"]?meiwaku)<br />
    same  =&gt; n,Dial(...)<br />
<br />
Notes<br />
-----<br />
    コメント(名前)と判定区分は初回着信時にWEBから取得/判定されるが、<br />
    その内容に不備がある場合は、テキストエディタで着信電話番号リストファイルに<br />
    手作業で追記/修正する。<br />
    着信電話番号リストファイルのパスは変数：CALLER_LIST_FILEに格納。<br />
<br />
"""<br />
__author__  = "Yasuaki Nojiri"<br />
__version__ = "1.1.3"<br />
__date__    = "2025/09/07"<br />
<br />
import sys<br />
import os<br />
import stat<br />
import re<br />
from datetime import datetime<br />
<br />
# パッケージのインストールディレクトリと参照ディレクトリが一致しない場合<br />
# pyst2パッケージインストールディレクトリを追加<br />
# "pip show pyst2"コマンドでインストール先を確認する<br />
sys.path.append('/home/pi/.local/lib/python3.9/site-packages')<br />
from asterisk.agi import *<br />
import requests<br />
<br />
# 定数の設定<br />
CALLER_LIST_DIR         =   '/usr/local/share/meiwakuchk'<br />
CALLER_LIST_FILE        =   CALLER_LIST_DIR + '/' + 'caller-list.txt'<br />
CALLER_LIST_FILE_NEW    =   CALLER_LIST_FILE + '.new'<br />
CALLER_LIST_FILE_PRM    =   stat.S_IRWXU | \<br />
                            stat.S_IRGRP | stat.S_IWGRP | \<br />
                            stat.S_IROTH | stat.S_IWOTH<br />
DEFAULT_RECORD          =   ['','','','0','']<br />
RECORD_LEN              =   len(DEFAULT_RECORD)<br />
SEARCH_URL              =   r"https://search.yahoo.co.jp/search?ei=UTF-8&p="<br />
SEARCH_ITEM_DELIM       =   r"&lt;li"<br />
SEARCH_NAME_REGEX       =   r"(&lt;a[^&gt;]+&gt;[\s]*「([^」\d]+)」\()|"              + \<br />
                            r"([\d]+は[\s、]*([^&lt;]+)の電話)|"                + \<br />
                            r"(電話番号(&lt;b&gt;|)[\d]+(&lt;/b&gt;|)は([^&lt;\-\s]+))|"    + \<br />
                            r"(電話番号(&lt;b&gt;|)[\d]+(&lt;/b&gt;|)（([^&lt;）]+)）は)|"  + \<br />
                            r"(&lt;b&gt;([^&lt;）]+)&lt;/b&gt;\. 電話番号)|"                + \<br />
                            r"(基本情報[\.\s]+名称:[\s]*&lt;b&gt;([^&lt;]+)&lt;/b&gt;)|"    + \<br />
                            r"(([ぁ-んァ-ヶｱ-ﾝﾞﾟ一-龠ー]+)[とを](名乗|騙|偽))"<br />
SEARCH_NAME_REGEX_IDXS  =   [2,4,8,12,14,16,17]<br />
SEARCH_MEIWK_REGEX      =   r"([はの](営業|不用品買取|迷惑電話|セールス))|" + \<br />
                            r"(([ぁ-んァ-ヶｱ-ﾝﾞﾟ一-龠ー]+)[とを](名乗|騙|偽))|" + \<br />
                            r"([はの](架空請求|詐欺|未払|還付|未納|疑い)[^だ])|" + \<br />
                            r"(うとする)"<br />
SEARCH_MEIWK_REGEX_IDXS =   [2,3,6,8]<br />
INTER_NUMBER_TABLE      =   {"1":"北アメリカ", \<br />
                             "2":"アフリカ", \<br />
                             "3":"ヨーロッパ", \<br />
                             "4":"ヨーロッパ", \<br />
                             "5":"中南米", \<br />
                             "6":"東南アジア,南太平洋", \<br />
                             "7":"ロシア,カザフスタン", \<br />
                             "8":"東アジア", \<br />
                             "9":"西南アジア,中東" }<br />
<br />
def main(args):<br />
    """メイン関数<br />
<br />
    Parameters<br />
    ----------<br />
    args : array<br />
        コマンドライン引数<br />
<br />
    Returns<br />
    -------<br />
    int<br />
        終了コード<br />
<br />
    """<br />
    resvar_val  =   ''<br />
<br />
    # コマンドライン引数<br />
    resvar =   args[1] if len(args) &gt; 1 else 'MEIWAKU_CHK'<br />
    comvar =   args[2] if len(args) &gt; 2 else 'COMMENT'<br />
<br />
    # AGIの生成<br />
    agi = AGI()<br />
<br />
    # 着信情報の取得<br />
    caller_id = str(agi.env['agi_callerid']) # 着信電話番号<br />
<br />
    agi.verbose("meiwaku_check agi start : " + caller_id)<br />
<br />
    # 着信電話番号リストファイルの準備<br />
    os.makedirs(CALLER_LIST_DIR, exist_ok=True)<br />
    if not os.path.isfile(CALLER_LIST_FILE):<br />
        # 存在しない場合は、空ファイルを作成<br />
        with open(CALLER_LIST_FILE,'w'):pass<br />
<br />
    # 着信電話番号リストファイルの検索<br />
    resrec          =   None<br />
    resrec_index    =   -1<br />
    with open(CALLER_LIST_FILE, mode='r') as file_in:<br />
        # 1行毎に読込む<br />
        for i, rec_i in enumerate(file_in):<br />
            record  =  rec_i.split(',')<br />
            if len(record) &gt; 0 and record[0] == caller_id:<br />
                # 見つかった場合、必要な情報を退避<br />
                resrec_index    =   i<br />
                resrec          =   record<br />
                resrec[-1]      =   resrec[-1].removesuffix('\n')<br />
                # 不足項目があれば、デフォルト値で埋める<br />
                for i in range(len(resrec),RECORD_LEN): resrec += [DEFAULT_RECORD[i]]<br />
                break<br />
<br />
    if resrec is None:<br />
        # 見つからなかった場合、新規に作成<br />
        resrec      =   DEFAULT_RECORD.copy()<br />
        resrec[0]   =   caller_id<br />
        # WEBで検索<br />
        rq = requests.get(SEARCH_URL+caller_id)<br />
<br />
        # 検索結果項目毎に分割<br />
        items = rq.text.split(SEARCH_ITEM_DELIM)<br />
        caller_name =   ''<br />
        meiwaku_chk =   ''<br />
        for i, item in enumerate(items):<br />
<br />
            if i == 0:<br />
                # 最初の区切り文字より前は対象外とする<br />
                continue<br />
<br />
            if not caller_id in item:<br />
                # 着信電話番号が含まれない場合、対象外とする<br />
                continue<br />
<br />
            if caller_name == '':<br />
                # 名前が未設定の場合、名前を取得<br />
                res = re.search(SEARCH_NAME_REGEX, rq.text)<br />
                if res:<br />
                    # マッチできた場合、マッチした名前グループリストの列挙<br />
                    for i, index in enumerate(SEARCH_NAME_REGEX_IDXS):<br />
                        # マッチした情報を調べる<br />
                        if res.group(index):<br />
                            # マッチした名前があれば、これを取得<br />
                            caller_name = res.group(index)<br />
                            break<br />
<br />
            if meiwaku_chk == '':<br />
                # 迷惑電話判定が未設定の場合、これを判定<br />
                res = re.search(SEARCH_MEIWK_REGEX, rq.text)<br />
                if res:<br />
                    # マッチできた場合、マッチした迷惑情報グループリストの列挙<br />
                    for i, index in enumerate(SEARCH_MEIWK_REGEX_IDXS):<br />
                        # マッチした情報を調べる<br />
                        if res.group(index):<br />
                            # マッチした情報があれば、迷惑電話として設定<br />
                            meiwaku_chk = 'NG'<br />
                            break<br />
<br />
            if caller_name != '' and meiwaku_chk != '':<br />
                # 目的の情報が取得できた場合、抜ける<br />
                break<br />
<br />
        if caller_name == '':<br />
            # 名前が取得できなかった場合、<br />
            # 着信電話番号の先頭文字を取得<br />
            fstNum =   caller_id[0] if len(caller_id) &gt; 0 else ''<br />
            if fstNum != '0':<br />
                # 先頭番号が'0'以外の場合、国際番号テーブルから名前を取得<br />
                if fstNum in INTER_NUMBER_TABLE:<br />
                    # 国際番号テーブルにある場合、<br />
                    # 疑わしい番号として、その名前の先頭に'?'を付加して設定する<br />
                    caller_name =   '?' + INTER_NUMBER_TABLE[fstNum]<br />
                else:<br />
                    # 国際番号テーブルにない場合、<br />
                    # 疑わしい番号として、'?'を設定する<br />
                    caller_name =   '?'<br />
<br />
        if meiwaku_chk == '':<br />
            # 検索できなかった場合、<br />
            if len(caller_name) &gt; 0 and caller_name[0] == '?':<br />
                # 疑わしい番号の場合、迷惑電話として設定<br />
                meiwaku_chk = 'NG'<br />
<br />
        resrec[4] =   caller_name<br />
        resrec[1] =   meiwaku_chk<br />
<br />
    # 最新着信日時の更新<br />
    resrec[2]   =   datetime.now().strftime("%Y/%m/%d %H:%M:%S")<br />
<br />
    # 回数の更新<br />
    resrec[3]   =   str(int(resrec[3]) + 1) if resrec[3].isdecimal() else '1'<br />
<br />
    # 着信電話番号リストファイルの更新<br />
    with open(CALLER_LIST_FILE, mode='r') as file_in, \<br />
         open(CALLER_LIST_FILE_NEW, mode='w') as file_out:<br />
        # 今回のデータを先頭にする<br />
        print(*resrec, sep=',', end='\n', file=file_out)<br />
<br />
        # 元のファイルの内容を出力<br />
        for i, rec_i in enumerate(file_in):<br />
            if i != resrec_index:<br />
                # 今回の検索データ以外を出力<br />
                print(rec_i, end='', file=file_out)<br />
<br />
    # 権限の設定<br />
    os.chmod(CALLER_LIST_FILE_NEW, CALLER_LIST_FILE_PRM)<br />
<br />
    # 更新ファイルに置換<br />
    os.remove(CALLER_LIST_FILE)<br />
    os.rename(CALLER_LIST_FILE_NEW, CALLER_LIST_FILE)<br />
<br />
    # 判定結果を変数に格納<br />
    agi.set_variable(resvar,resrec[1])<br />
    agi.set_variable(comvar,resrec[4])<br />
<br />
    agi.verbose("meiwaku_check agi results : " + resvar + " = " + resrec[1])<br />
<br />
    return 0<br />
<br />
if __name__ == "__main__":<br />
    # トップレベル環境で実行された場合、メイン関数を呼ぶ<br />
    sys.exit(main(sys.argv))</code></pre>
<small>このプログラムでは、検索結果の中の様々なサイトのサマリ情報から、名前と迷惑電話判定情報を取得するのですが、検索結果には決まったフォーマットはありません。ここでは、現状の検索結果を参考に、正規表現のパターンを作成し、マッチングをしています。<br />
精度を上げるためには、継続的なパターンの調整が必用となります。</small><br />
<br />
<h7 class="blockheader">PythonのWebアクセスライブラリをインストールします。</h7><br />
<pre class="sourcecode">pip3 install requests</pre>
<br />
<h7 class="blockheader">ダイヤルプランを変更します。</h7><br />
処理内容は次の通り<br />
<ul style="list-style-type:circle">
  <li>電話番号をユーザープログラムに渡し、判定結果とコメントを受取る。</li>
  <li>判定結果がNGであれば、子機への呼出は行わず、留守番電話に切り替える。</li></li>
  <li>NGでなければ、以下の処理を行う。<br />
    <ul style="list-style-type:circle">
    <li>コメントがあれば、これを子機に渡す。</li>
    <li>通常の処理を行う。</li></ul></li>
</ul>
    ファイル：/etc/asterisk/extensions.conf<br />
    変更内容<br />
        外線着信の処理の変更<br />
<pre class="sourcecode"><code>[from-hikari]<br />
exten =&gt; s,1,AGI(meiwaku_check.py,meiwaku_chk,comment)<br />
same  =&gt; n,GotoIf($["${comment}" = ""]?meiwakuchk)<br />
same  =&gt; n,Set(CALLERID(name)=${comment})<br />
same  =&gt; n(meiwakuchk),GotoIf($["${meiwaku_chk}" = "NG"]?meiwaku)<br />
same  =&gt; n,Dial(PJSIP/1001&PJSIP/1002,20,Tt)<br />
same  =&gt; n,Answer()<br />
same  =&gt; n,Wait(1)<br />
same  =&gt; n,Voicemail(5000)<br />
same  =&gt; n,Hangup<br />
; Meiwaku denwa<br />
same  =&gt; n(meiwaku),Ringing()<br />
same  =&gt; n,Wait(8)<br />
same  =&gt; n,Answer()<br />
same  =&gt; n,Wait(1)<br />
same  =&gt; n,Voicemail(5000)<br />
same  =&gt; n,Hangup</code></pre>
<small>5000は留守電、1001と1002は子機の内線番号です。実際の運用に合わせてください。</small><br />
<br />
これで、初めての番号でも、ほぼ自動的に迷惑電話を拒否できるようになりました。<br />
<br />
プログラム更新後、早速、初めての迷惑電話が入り、拒否してくれました。<br />
ただ、着信者名は取得できず、マッチングパターンを修正しました。<br />
(上記のプログラムは修正後のコードです。)<br />
<br />
今後も、修正が必要になりそうですが、気長にメンテナンスしていこうと思います。<br />
<br />
<hr color="#1188aa">
<br />
<h5 class="blockheader">変更履歴</h5>
<table>
<tr><td>2025/03/15</td><td>:</td><td>迷惑電話判定パターンの変更</td></tr>
<tr><td>2025/05/17</td><td>:</td><td>地域判定追加</td></tr>
<tr><td>2025/09/07</td><td>:</td><td>着信電話番号が含まれない検索結果項目は対象外</td></tr>
<br />
</table>
<br />
<hr color="#1188aa">
<br />
<h5 class="blockheader">■ RaspberryPiでPBXとFAXの構築 - 目次 -</h5>
<ol>
<li><a href="?itemid=369">構成</a></li>
<li><a href="?itemid=371">ひかり電話RV-230SEの設定</a></li>
<li><a href="?itemid=374">OSのセットアップ</a></li>
<li><a href="?itemid=381">LANアダプタの接続</a></li>
<li><a href="?itemid=382">ユーティリティのセットアップ</a></li>
<li><a href="?itemid=385">PBXのセットアップ</a></li>
<li><a href="?itemid=396">ソフトウェアモデムのセットアップ</a></li>
<li><a href="?itemid=399">FAXのセットアップ</a></li>
<li><a href="?itemid=407">自動再起動</a></li>
<li><a href="?itemid=412">ステータスLEDの接続</a></li>
<li><a href="?itemid=415">ケースに収納・設置</a></li>
<li><a href="?itemid=419">トラブルと対応</a></li>
<li><a href="?itemid=443">迷惑電話対策</a></li>
<li><a href="?itemid=450">迷惑電話対策2</a></li>
<li><a href="?itemid=469">迷惑電話レポート</a></li><br />
</ol>]]></description>
<category>パソコン</category>
<comments>http://www.projexam.com/blog/hotall/diy/index.php?itemid=450</comments>
<pubDate>Sun, 2 Feb 2025 12:52:25 +0900</pubDate>
</item>
  </channel>
</rss>