2024/11/09(土)初めて両面基板を作ってみた(両面感光基板を使用)

2024/11/09 3:08 電子工作
初めてですが、結構上手く行ったので、一部でも参考になればと考えています。
今回は、サンハヤト社謹製の両面感光基板を使用しました。
最初にお断りしておきますが、当方は、サンハヤト社の回し者ではありません。道具を売っている製造業者をこれしか知らないので・・

○ 両面基板作成にあたって固有に必要と思われるもの
・両面感光基板 感光基板でプリント基板作るのであれば、必然的ではあるが・・・
・両面感光基板対応露光装置 当方は、昔買ったこれまたサンハヤト社謹製の BOX-W9B というものを使っています。
 しかし、これはもう現在では製造自体していません。
 後継となる対応機種はなく、両面基板対応のものは BOX-W7000 しかない。
 しかもこれは20万円以上するため、現実には、BOX-S3000 にて片面ずつ露光するか、BOX-S3000 も安くないため、各自の創意工夫が求められる部分であることがネックですね。
・両面テープ
20241109_01.JPG
 露光時、基板の位置固定に使用します。粘着力は弱いのものを選びましょう。
 撮影時、この粘着テープを使用しましたが、これでも粘着力が強すぎると感じました。


・プリント基板の切れ端
20241109_04.JPG

 両面テープと共に、基板の位置固定に使用します。
 プリント基板は1.6mm厚または1.0mm厚のものが多いので、
 現物と同じ厚みのものを2枚必ず用意しましょう。

 撮影時の不手際で、両面テープを張った状態の切れ端になっています。。
・スルピンキット
(スルーホールを作る場合)
20241109_02.JPG
 0.8mm用のものを用意しましょう。最も小径且つ最も多く使うのが 0.8mm穴。
 個人的にはこれでも太いと思う。

 ワンランク細いもの、例えば 0.7mm とか 0.6mm ものが欲しいですね。
・はんだ吸引機
(スルーホールを作る場合)
スルーホールの生成時に必須なのです。詳細はスルピンキットの説明を参照お願いします。
次に、具体的な制作方法の要点です。
20241109_03.JPG
1)パターン作成
 先ずは通常通りパターンを作成します。
 この時、基板アートワークの外側にトンボ線を必ず入れておきます。
(いわゆる十字線とかトリムマークと称するもの)

 これが重要です。
20241109_05.JPG
2)ポジフィルムの張り合わせ
 トンボ線に平行になるように2辺に両面テープで基板の切れ端を合わせ、
 裏面と表面のトンボ線を合わせつつ、貼り合わせていきます。
 この精度が裏表のズレの精度に直結しますが、トンボ線に合わせることで、
 意外と0.1mm以下の誤差にすることが可能です。

 裏表や上下を間違えないように、細心の注意を払いましょう。
20241109_06.JPG
3)通常どおり、露光とエッチング
 両面基板ですから、
 露光もエッチングも片面基板2枚分の考慮が必要なことに注意しましょう。
 いつも片面基板ばかりで作業していると忘れがちなところです。

 過露光でごく一部のパターンが切れてしまいました・・・
20241109_07.JPG
4)スルーホールの作成
 スルーホールにしたい穴にスルピンキットでスルーホールを作成。
  ― スルーホールを打ち込み、
  ― ハンダで埋め込み、
  ― ハンダ吸引機で余分なハンダを吸い取る・・
 という工程の繰り返しですが、
 慣れないので仕上がりがかなり汚くなってしまいました・・・
 ハンダ吸い取り機は小さいほうがいいかもしれません。
20241109_09.JPG
5)実装してみた
 一部部品の実装サイズ確保を誤ってしまい、
 更なる空中配線の部品が出てしまいました・・・ orz

 しかしながら、動作はしたので、これで完成としてしました。

2024/06/21(金)OpenLDAP 2.6.8 では、Cyrus-SASL 抜きの構築は出来ない

これも嵌ったので自分メモ:
OpenLDAP をソースコードから構築する場合、configure で指定するオプションに --without-cyrus-sasl を指定して、Cyrus-SASL のサポートを外すことが出来ます。
ところが、こうすると、 OpenLDAP 2.6.8 では、途中で下記のエラーを吐いて構築不能になるのです:
ld: error: version script assignment of 'OPENLDAP_2.200' to symbol 'ldap_host_connected_to' failed: symbol not defined
ld: error: version script assignment of 'OPENLDAP_2.200' to symbol 'ldap_int_sasl_config' failed: symbol not defined
ld: error: version script assignment of 'OPENLDAP_2.200' to symbol 'ldap_int_sasl_get_option' failed: symbol not defined
ld: error: version script assignment of 'OPENLDAP_2.200' to symbol 'ldap_int_sasl_open' failed: symbol not defined
ld: error: version script assignment of 'OPENLDAP_2.200' to symbol 'ldap_int_sasl_set_option' failed: symbol not defined
ld: error: version script assignment of 'OPENLDAP_2.200' to symbol 'ldap_pvt_sasl_cbinding' failed: symbol not defined
ld: error: version script assignment of 'OPENLDAP_2.200' to symbol 'ldap_pvt_sasl_cbinding_parse' failed: symbol not defined
ld: error: version script assignment of 'OPENLDAP_2.200' to symbol 'ldap_pvt_sasl_install' failed: symbol not defined
ld: error: version script assignment of 'OPENLDAP_2.200' to symbol 'ldap_pvt_sasl_mutex_dispose' failed: symbol not defined
ld: error: version script assignment of 'OPENLDAP_2.200' to symbol 'ldap_pvt_sasl_mutex_lock' failed: symbol not defined
ld: error: version script assignment of 'OPENLDAP_2.200' to symbol 'ldap_pvt_sasl_mutex_new' failed: symbol not defined
ld: error: version script assignment of 'OPENLDAP_2.200' to symbol 'ldap_pvt_sasl_mutex_unlock' failed: symbol not defined
ld: error: version script assignment of 'OPENLDAP_2.200' to symbol 'ldap_pvt_sasl_remove' failed: symbol not defined
ld: error: version script assignment of 'OPENLDAP_2.200' to symbol 'ldap_pvt_sasl_secprops' failed: symbol not defined
ld: error: version script assignment of 'OPENLDAP_2.200' to symbol 'ldap_pvt_sasl_secprops_unparse' failed: symbol not defined
cc: error: linker command failed with exit code 1 (use -v to see invocation)
これは、Cyrus-SASL をインストールし、更に --without-cyrus-sasl のオプションを外さないとエラーが取れない。
弊社の使用形態では Cyrus-SASL は使わないため、このオプションは必須の形で指定していたが、嫌でも Cyrus-SASL をインストールし、サポートさせないといけない状態に…

このバージョンだけの問題なのか、本来は Cyrus-SASL と OpenLDAP はセットで使う仕様であるので、今後の強制的な方針なのかは判りません。
メンテナンス・運用管理の観点からは、出来る限り余計なものは入れたくないんだけどね・・・

2024/06/20(木)FreeBSD 13.3R で dovecot 2.3.21 はそのまま構築できない

2024/06/21 16:36 サーバ運営・管理
先日、ちょっと嵌ったので自分メモ
FreeBSD 13.3 では、clang が Ver 17 になった影響か、dovecot 2.3.21 ではこんな感じで、コンパイルエラーになる:
test-mail-index-transaction-update.c:633:14: warning: comparison of function 'timezone' equal to a null pointer is always false [-Wtautological-pointer-compare]
  633 |         test_assert(timezone == 0);
      |                     ^~~~~~~~    ~
../../src/lib-test/test-common.h:20:8: note: expanded from macro 'test_assert'
   20 |         if (!(code)) test_assert_failed(#code, __FILE__, __LINE__); \ 
      |               ^~~~
test-mail-index-transaction-update.c:633:14: note: prefix with the address-of operator to silence this warning
  633 |         test_assert(timezone == 0); 
      |                     ^ 
      |                     & 
../../src/lib-test/test-common.h:20:8: note: expanded from macro 'test_assert'
   20 |         if (!(code)) test_assert_failed(#code, __FILE__, __LINE__); \ 
      |               ^ 
test-mail-index-transaction-update.c:648:42: warning: arithmetic on a pointer to the function type 'char *(int, int)' is a GNU extension [-Wgnu-pointer-arith]
  648 |                 hdr.day_stamp = tests[i].old_day_stamp + timezone; 
      |                                                        ^ ~~~~~~~~ 
test-mail-index-transaction-update.c:648:17: error: incompatible pointer to integer conversion assigning to 'uint32_t' (aka 'unsigned int') from 'char *(*)(int, int)' [-Wint-conversion]
  648 |                 hdr.day_stamp = tests[i].old_day_stamp + timezone; 
      |                               ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
test-mail-index-transaction-update.c:650:49: warning: arithmetic on a pointer to the function type 'char *(int, int)' is a GNU extension [-Wgnu-pointer-arith]
  650 |                 mail_index_update_day_headers(t, tests[i].now + timezone); 
      |                                                               ^ ~~~~~~~~ 
test-mail-index-transaction-update.c:650:36: error: incompatible pointer to integer conversion passing 'char *(*)(int, int)' to parameter of type 'time_t' (aka 'long') [-Wint-conversion]
  650 |                 mail_index_update_day_headers(t, tests[i].now + timezone); 
      |                                                  ^~~~~~~~~~~~~~~~~~~~~~~ 
./mail-index-transaction-private.h:127:77: note: passing argument to parameter 'day_stamp' here
  127 | void mail_index_update_day_headers(struct mail_index_transaction *t, time_t day_stamp); 
      |                                                                             ^ 
test-mail-index-transaction-update.c:654:63: warning: arithmetic on a pointer to the function type 'char *(int, int)' is a GNU extension [-Wgnu-pointer-arith]
  654 |                 test_assert_idx(new_hdr.day_stamp == tests[i].new_day_stamp + timezone, i); 
      |                                                                             ^ ~~~~~~~~ 
../../src/lib-test/test-common.h:26:9: note: expanded from macro 'test_assert_idx'
   26 |                 if (!(code)) test_assert_failed_idx(#code, __FILE__, __LINE__, i); \ 
      |                       ^~~~ 
test-mail-index-transaction-update.c:654:37: warning: comparison between pointer and integer ('uint32_t' (aka 'unsigned int') and 'char *(*)(int, int)') [-Wpointer-integer-compare]
  654 |                 test_assert_idx(new_hdr.day_stamp == tests[i].new_day_stamp + timezone, i); 
      |                                 ~~~~~~~~~~~~~~~~~ ^  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
../../src/lib-test/test-common.h:26:9: note: expanded from macro 'test_assert_idx'
   26 |                 if (!(code)) test_assert_failed_idx(#code, __FILE__, __LINE__, i); \ 
      |                       ^~~~ 
5 warnings and 2 errors generated.
gmake[3]: *** [Makefile:916: test-mail-index-transaction-update.o] エラー 1
gmake[3]: ディレクトリ '/usr/local/src/dovecot-2.3.21/src/lib-index' から出ます
gmake[2]: *** [Makefile:573: all-recursive] エラー 1
gmake[2]: ディレクトリ '/usr/local/src/dovecot-2.3.21/src' から出ます
gmake[1]: *** [Makefile:704: all-recursive] エラー 1
gmake[1]: ディレクトリ '/usr/local/src/dovecot-2.3.21' から出ます
gmake: *** [Makefile:548: all] エラー 2
軒並み、timezone 絡みのようで、この件に関するパッチが3つ公開されています:
その1 https://github.com/dovecot/core/commit/e983ead775671186b3c8567d59973d2e52b678c7
その2 https://github.com/dovecot/core/commit/1a7b1f66fe4b86cb642dbcfe5a0192c1b77d0e17
その3 https://github.com/dovecot/core/commit/867a37fa7b74f798a931fb582214b5377f57610e

〔その1 src/lib/ioloop-notify-kqueue.c を修正〕
@@ -11,6 +11,7 @@
1111  
1212 #include "ioloop-private.h"
1313 #include "llist.h"
14+ #include "time-util.h"
1415 #include <unistd.h>
1516 #include <fcntl.h>
1617 #include <sys/types.h>

〔その2 src/lib-index/test-mail-index-transaction-update.c を修正〕
@@ -6,6 +6,7 @@
66 #include "test-common.h"
77 #include "mail-index-private.h"
88 #include "mail-index-transaction-private.h"
9+ #include "utc-offset.h"
910  
1011 #include <time.h>
1112  
@@ -630,7 +631,9 @@
630631  
631632     /* daylight savings times were confusing these tests, so we'll now
632633       just assume that TZ=UTC */
633 -    test_assert(timezone == 0);
634+    time_t now = time(NULL);
635+    struct tm *local_time = localtime(&now);
636+    test_assert(utc_offset(local_time, now) == 0);
634637  
635638     hdr.messages_count = 10;
636639     t = mail_index_transaction_new();

〔その3 src/lib-index/test-mail-index-transaction-update.c を修正〕
@@ -648,13 +648,13 @@
648648         i_zero(&hdr);
649649         for (j = 0; j < N_ELEMENTS(hdr.day_first_uid); j++)
650650            hdr.day_first_uid[j] = 8-j;
651 -        hdr.day_stamp = tests[i].old_day_stamp + timezone;
651+        hdr.day_stamp = tests[i].old_day_stamp;
652652         memcpy(t->post_hdr_change, &hdr, sizeof(hdr));
653 -        mail_index_update_day_headers(t, tests[i].now + timezone);
653+        mail_index_update_day_headers(t, tests[i].now);
654654  
655655         struct mail_index_header new_hdr;
656656         memcpy(&new_hdr, t->post_hdr_change, sizeof(new_hdr));
657 -        test_assert_idx(new_hdr.day_stamp == tests[i].new_day_stamp + timezone, i);
657+        test_assert_idx(new_hdr.day_stamp == tests[i].new_day_stamp, i);
658658         test_assert_idx(memcmp(new_hdr.day_first_uid,
659659                     tests[i].new_day_first_uid,
660660                     sizeof(uint32_t) * 8) == 0, i);

これらのパッチを手動で当て、いつもの手順でコンパイルすることで、いくつか Warning が出るものの、通常通りの使用可能となるようです。
バージョンアップで、この不具合が解消されることを期待したいところ。

2024/01/13(土)危うく騙されそうになった、、

2024/01/13 6:03
可能な限り全文晒します:
EXPIRATION REMINDER

This notice is to bring to your notice that your domain invoice number
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn is OVERDUE. example.com to be due
in 12 January 2024 is SUSPENDED.

The contact currently listed is xxxxxxxxx xxxxxxxxx.

RENEW example.comT
https://csschecker.com/cart/nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn

EXPIRATION:
12 JANUARY 2024

DISCLAIMER NOTICE:
We can not be held legally accountable for any claims, damage or
suffering that you may incur owing to the expiration of
example.com. Any such damages may include but are not solely
limited to: sales losses, lost files without backups, loss of results
in search rankings, lost appointments, undeliverable email and any
other business, service or technical damages that you may incur. For
further reference please refer to section 22.l.3.g of our TOS


LIABILITY:
This is the final notice that we are required to send out with regards
to the expiration of example.com.

SECURE ONLINE RENEWAL
https://csschecker.com/cart/nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn



Unable to click the link? Copy and Paste this into your browser:
HTTPS://CSSCHECKER.COM/CART/nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn

All web services will be restored automatically on example.com upon
receipt of payment. We thank you for your cooperation and continued
business.

ALERT SENT ON JANUARY 12 2024

The contents of this email are strictly confidential.
当該ドメインがレジストリ的に有効期限切れで使用不能になった、みたいな通知だが、
2ヶ月くらい前に自動更新したばかりで、whois で確認してもドメインステータスには問題は無さそう。

恐らく、ドメイン更新料金を騙し取ろうとしているのだろう。
ドメインレジストラ業者でないと、入手できない個人情報を使っているので、たちが悪い。
今後、こういうのには注意が必要である。皆さまもご注意ください。