SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|
2025|01|02|03|04|05|06|07|

2004-08-18(Wed) 続Cold Heat Soldering Toolの取扱説明書の和訳

  昨日に引き続き、取説の和訳である。例によって翻訳品質は一切保証しない。特に保障規約のあたりは法律的な問題を含んでいるので「ウソが書いてある」とまで思って、必要に応じてマニュアルの原文を確認するように。では、どーぞ。

  ハンダ付けのコツ

  以下に、COLDHEATによるハンダ付け技術を向上するための何点かのコツを挙げます。

・小さな接点の場合、コテ先は早く熱せられ、すぐ接点ができますので、大きな接点の場合以外、不用意に長い時間、コテ先を当てる必要はありません。

・コテ先の双端をハンダ付け箇所にうまく接触できない場合、本体を立てて下さい。赤色LEDは双端が正しくハンダ付け箇所に接触している場合に点灯します。数分の練習で、以後ずっとCOLDHEATを楽しく使えるようになることを保証します。手際のよい作業によってコテ先の寿命は延び、よい接点が作れることを忘れないで下さい。

・いくつかハンダ付けするうち、コテ先にスズメッキは不要であり、濡らす必要もないことに気づくはずです。双端で端子からハンダを除去することもできます。

・本製品は一般の電子工作や0.5mm〜1.0mm程度の配線、小さな装飾品の修理、集積度の低いプリント基板や部品などにおいて、趣味レベルから簡単なプロユースに耐えるよう作られていますが、高熱に弱い部品や集積度の高い部品のハンダ付けには適しません。もし使用の可否に疑義を生じた場合は、ハンダ付けしようとする部品のデータシートを確認するようにお勧めします。

・ピン間の狭い電子部品をハンダ付けする場合、異なるピン間をコテ先の双端で短絡しないように留意してください。内部の回路に電流が流れ、部品を破損する恐れがあります。

・コテ先の双端の間にハンダが溶けずに挟まってしまった場合、電源を切り、電気を通さない細い物で双端の間のハンダを取り除いてください。その他、導通性の物がコテ先の双端の間に挟まってしまった場合も、コテ先は熱せられた状態のままになりますので、確実に電源を切り、注意して取り除いてください。

・白色LEDが点灯した状態ではバッテリーを消耗しますので、使わない時は電源を切りましょう。

・この製品はバッテリーの交換なしに750接点以上のハンダ付けが可能です。

・0.8mm〜1.0mm程度の糸ハンダを利用するとよいでしょう。

  注意

  ・子供の手の届かないところに置いて下さい。

・不用意に長い時間、コテ先をハンダ付け箇所に接触すると温度が上昇して損傷を与えることがあります。コテ先のハンダ付け箇所への接触は数秒以内にしてください。ハンダが溶けることで、煙が多量に出た場合、コテ先の温度が高すぎるサインです。

・多数のハンダ付けを行った後や、長時間コテ先をハンダ付け箇所に接触した場合、コテ先が触れることのできる温度に下がるまで、長めの時間がかかることがあります。

・コテ先が導通状態の場合(赤色LEDが点灯します)や温度が十分に下がるまでは、コテ先に手を触れないで下さい。コテ先にキャップをする前にコテ先が冷えていることを確認してください。

・電源を切り、コテ先にキャップをして、ケースに入れるのが正しい収納方法です。電源を入れたままにすると不用意に発熱を始めるかもしれません。

・コテ先の双端は破損しやすいので、注意して扱い、不必要に強く押し付けないで下さい。

・高温な場所に放置すると、電池や内部の電子回路を損傷することがあります。

・COLDHEATを分解すると、製品保証が無効になります。

・警告:この製品をはんだ付け等に使用する場合、カリフォルニア州が確認している発ガン性や先天性障害(奇形の発生など)を生じる化学物質を発生します(カリフォルニア州発行の健康と安全の手引き254249.5節以降参照)。

・特に鉛入りハンダを使う場合、ハンダ付けを行う場合に生じる煙は有害です。適切な換気を行うことに注意し、ハンダ付けに関する一般的な注意を参照してください。

・可燃物や爆発物の近くで使用しないで下さい。

  保障規約

  この製品の製造上または材質上の欠陥は、購入から90日間保障されます。保障期間中に欠陥が生じた場合、製品または部品の交換が無償で行われます。この保障の範囲には、事故や誤った使用によって生じた損害は含まれません。

  すべての保証(一般的な商慣習における保証期間を含む)は、購入の日付から90日以内に制限されます。

  無制限の保証期間を義務付けている州の場合、上記の制限は当てはまりません。この保証規約は法的な権利として働きますが、州によってはさらに別の権利が与えられることがあります。製品に日付の記載されたレシートと返送料の7.95ドルを添え、着払いで以下の宛先に返品すれば修理または交換を行います。

  Cold Heat Consumer Products LLC 15071 Keswick St. Van Nuys, CA 91405

  米国特許番号6,646,228.その他、外国でも特許出願中。

  この製品に対してさらに情報が必要な場合www.coldheat.comを参照ください。

  付属品&オプション

  双端状のコテ先(特許取得済)は、コテ本体の先端から引き抜くことで容易に外れ、取り替えることができます。コテ先には様々な形があり、各々状況に応じて作業効率を向上します。円すい状のコテ先(conical tip)は、装飾品や直径0.5mm〜0.8mm程度の配線、プリント基板の部品に、ノミ状のコテ先(chisel tip)は、一般電子工作、直径0.8mm〜0.1mm程度の配線、電子部品、小さい金属片に向きます。また、標準添付のものと同じ傾斜状のコテ先(bevel tips)を追加購入することもできます。傾斜状のコテ先は多目的に、小さいものから中型の部品に使用できます。

  コテ先には様々な形があり、作業形態に応じて使い分けられますので、より使いやすい形状のものをwww.coldheat.comにてお探しください。

  と、ゆーわけで、これだけガッツリと和訳したのは初めての経験だったが、翻訳作業もなかなか面白いではないか。昔は英字を見ただけで頭痛を覚えていたのに、我ながら進歩したもんだ。ちなみに私のTOEICのスコアの最高点は600点。いつか700点を超えたいと思っているので、今後も機会を見つけては勉強も兼ねて趣味の翻訳を続けようと思う次第である。それはそうと、これだけ訳すとマニュアルの中身はすっかり頭の中である。さて、明日から本格的にCOLDHEATを使ってみることにしよう。


2023-08-18(Fri) RubyでOAuth2.0認証でGmailをPOP/SMTPする

  コンテナ上のリモートデスクトップ環境の整備の一環で、愛用の自作メーラであるMaveも動き出したのだが、PVである/home/userの下で動かす分にはDockerは関係しないことに気づいた。そらそうか。

  で、Maveの動作確認の一環でGmailアカウントにPOP/SMTPアクセスしようと思ったら、認証エラー。以前はできていたはずなのだが、と、しばらく止めていたMaverickコンテナを再起動したのだが、認証エラー。なんだ? 環境の問題ではないっぽい?

  いろいろ調べていると、なんでも2022年5月をもって通常の認証手段によるPOP/SMTPアクセスは廃止になっていたらしい。トンと知らなかった。職場でメールチェックするのに、外部のVPS上にMaverickコンテナを上げてPOPさせていたのだが、テレワークで不要になったので止めていた間にそんなことになっていたとは。

  別にGmailアクセスは必須じゃないのだが、できないのもシャクに障る。なんでも「OAuth2.0」という認証方式に変わったらしいのだが、別にGoogleの独自規格ではなくRFCが出ているらしい。

  何か以前にも似たようなことあったような、と思い返すと、会社のメールがマイクソソフトExchangeに変わった時だ。MAPIとかいう独自プロトコルらしい。知ろうという気にもならなかった。DavMailという救世主のようなアプリで難を逃れられている。別に比較できる事象ではないけれど、実にマイクソソフトらしい。ホント近づきたくもない。臭うんだから、寄ってくんな、シッシッ。

  というわけで、ダメモトで「OAuth2.0」を学び始める。が、何だろうこのひさびさのワクワク感は。このところの不安定な気分がすっ飛んでいくのを感じる。結局、しばらくの間、新しく歯ごたえのある問題に出会えなかったのが原因だったのだろうか。

  まず、一番重要な情報が以下。

  POP/SMTPアクセスが廃止になったわけではない、ということだ。さすがにそれができなくなると機能追加というレベルになってしまうので、Maveの対応をあきらめざるを得ない。

  しかし、SMTPはともかく、POPに、

AUTH XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlY...

  こんな認証コマンドあったっけ? と、思ったら、RFC1734として定義があるらしい。だいぶ古い。そんならRubyのnet/popライブラリにあるのかしらん? と、思ってコードを見ると、それは実装されていないようだ。ダメじゃん。ほんじゃnet/smtpライブラリには? と、確認すると「AUTH PLAIN」や「AUTH LOGIN」はあるが「AUTH XOAUTH2」や「AUTH xxx」という仕組みはないようだ。これも、ダメじゃん。

  でも、そんなのは自分でパッチを当ててしまえばいい。とりあえず、容易にどうにかできそうなそれは放置しておいて、先にアクセストークンを得る方法を調べよう。

  結論から言うとブラウザ操作による設定が必要で、ほぼ以下の通りで済んだ。助かった。

  ほぼ、というのは、POP/SMTPに必要なスコープは、「https://www.googleapis.com/auth/gmail.modify」や「https://www.googleapis.com/auth/gmail.readonly」ではなく、フルコントロールっぽい「https://mail.google.com/」だというところ。面倒なので細かく試していないが、たぶんそう。これが原因でだいぶ悩まされた。

  で、ここからもだいぶ試行錯誤したが、結論から言うと以下のコードでドンだ。

#!/usr/bin/env ruby
 
require 'net/http'
require 'json'
 
# setup GCP 
#  https://blog.ver001.com/gmail-api-oauth2-credential-key/
 
if(ARGV.size == 0)
    warn <<USAGE
Usage:
    $ ./oauth2.rb client_secret_xxxx.json > auth.html
    $ google-chrome auth.html
    $ ./oauth2.rb client_secret_xxxx.json 'http://localhost/?code=xxxx'
USAGE
    exit(1)
end
 
cs = nil; if((it = ARGV[0]) =~ /^client/)
    open(it) {|fh|
        cs = JSON.parse(fh.read)
    }
end
 
if(ARGV.size == 1 and cs)
    auth_uri = 'https://accounts.google.com/o/oauth2/auth'
    auth_params = {
        response_type:  'code',
        scope:          'https://mail.google.com/',
        client_id:      cs['installed']['client_id'],
        redirect_uri:   'http://localhost',
    }
    auth_response = Net::HTTP.post_form(URI(auth_uri), auth_params)
    puts(auth_response.body)
 
elsif(ARGV.size == 2 and cs and (it = ARGV[1]) =~ /^http:/)
    ps = URI.decode_www_form(URI(it).query)
    auth_uri = 'https://accounts.google.com/o/oauth2/token'
    auth_params = {
        client_id:      cs['installed']['client_id'],
        client_secret:  cs['installed']['client_secret'],
        redirect_uri:   'http://localhost',
        grant_type:     'authorization_code',
        code:           ps[0][1],
    }
    auth_response = Net::HTTP.post_form(URI(auth_uri), auth_params)
    puts(auth_response.body)
 
else
    warn('Invalid.')
end

  で、使い方はこう。

$ ./oauth2.rb client_secret_xxxx.json > auth.html
$ google-chrome auth.html 
$ ./oauth2.rb client_secret_xxxx.json 'http://localhost/?code=xxxx'

  なんと、途中でブラウザを立ち上げて承認するという奇妙な手順を経て、さらに飛び先のURLを、再びコマンドに食わせるという奇妙な手順を経る。以下のようなJSONが返ればウッシッシ。アクセストークン、ゲットだぜ。

{
  "access_token": "ya29.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "expires_in": 3599,
  "refresh_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "scope": "https://mail.google.com/",
  "token_type": "Bearer"
}

  アクセストークンが得られたらこっちのもんだ。Rubyのnet/smtpライブラリにOAuth2.0認証機能を足す。といっても、以下を足すだけ。

--- /usr/share/ruby/net/smtp.rb.org 2018-11-03 02:52:33.000000000 +0900
+++ /usr/share/ruby/net/smtp.rb 2023-08-18 16:40:20.249910652 +0900
@@ -760,6 +760,15 @@
       res
     end
 
+    def auth_oauth2(user, secret)
+      check_auth_args user, secret
+      res = critical {
+        get_response('AUTH XOAUTH2 ' + base64_encode("user=#{user}\1auth=#{secret}\1\1"))
+      }
+      check_auth_response res
+      res
+    end
+
     private
 
     def check_auth_method(type)

  アクセストークンを使ってSMTPアクセスするテストプログラムを書いてドン。

#!/usr/bin/env ruby
 
require 'net/smtp'
 
smtp = Net::SMTP.new('smtp.gmail.com', 587)
ssl = OpenSSL::SSL::SSLContext.new
ssl.verify_mode = OpenSSL::SSL::VERIFY_PEER
ssl.ca_file = '/etc/pki/tls/certs/ca-bundle.crt'
smtp.enable_starttls(ssl)
 
token = 'ya29.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
 
smtp.start('example.com', 'example@gmail.com', 'Bearer ' + token, :oauth2) {|smtp|
    p smtp
}

  以下が返ればウッシッシ。

$ ./smtp_test.rb 
#<Net::SMTP smtp.gmail.com:587 started=true>

  net/popライブラリにもOAuth2.0認証機能を足す。元のAPIの設計が微妙なせいでちょっと美しくないし、net/smtpよりちょっと量があるが、以下の変更を加える。

--- /usr/share/ruby/net/pop.rb.org  2018-11-03 02:52:33.000000000 +0900
+++ /usr/share/ruby/net/pop.rb  2023-08-18 16:38:38.149686063 +0900
@@ -415,11 +415,12 @@
     # to use APOP authentication; it defaults to +false+.
     #
     # This method does *not* open the TCP connection.
-    def initialize(addr, port = nil, isapop = false)
+    def initialize(addr, port = nil, isapop = false, isoauth2 = false)
       @address = addr
       @ssl_params = POP3.ssl_params
       @port = port
       @apop = isapop
+      @oauth2 = isoauth2
 
       @command = nil
       @socket = nil
@@ -438,6 +439,10 @@
       @apop
     end
 
+    def oauth2?
+      @oauth2
+    end
+
     # does this instance use SSL?
     def use_ssl?
       return !@ssl_params.nil?
@@ -563,6 +568,8 @@
       @command = POP3Command.new(@socket)
       if apop?
         @command.apop account, password
+      elsif oauth2?
+        @command.auth_oauth2 account, password
       else
         @command.auth account, password
       end
@@ -918,6 +925,13 @@
       })
     end
 
+    def auth_oauth2(account, password)
+      check_response_auth(critical {
+        get_response('AUTH XOAUTH2 ' + ["user=#{account}\1auth=#{password}\1\1"].pack('m0'))
+      })
+    end
+
     def list
       critical {
         getok 'LIST'

  アクセストークンを使ってPOPアクセスするテストプログラムを書いてドン。

#!/usr/bin/env ruby
 
require 'net/pop'
 
pop = Net::POP3.new('pop.gmail.com', 995, false, true)
pop.enable_ssl(OpenSSL::SSL::VERIFY_NONE, '/etc/pki/tls/certs/ca-bundle.crt')
 
token = 'ya29.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
 
pop.start('example@gmail.com', 'Bearer ' + token) {|pop|
    p pop
}

  以下が返ればウッシッシ。

$ ./pop_test.rb 
#<Net::POP3 pop.gmail.com:995 open=true>

  んがしかし、これでPOP/SMTPアクセスができる目処はついたのだが、このアクセストークン、有効期限が1時間しかないので、パスワードの替わりという形で実装すると、まったく実用にならない。

  どうも「refresh_token」というのがカギを握っていそうだが……本日はコレまで。あー、しかし、ひさびさにエキサイティングだったわッ!