SVX日記
2004-09-10(Fri) 続々・シリアルポート考察
またまた、シリアルポートの考察である。上流側の制限抵抗の値がわかると、一定の電圧を確保しながら流せる最大の電流がいくらかということも導けることに気づいた。つまり、短絡すると30.6mAの電流を流すことができるものの、短絡回路の電圧は0Vになってしまう。今回はシリアルポートから実用的に使用できるいわば「バスパワー」を計算してみるのである(なお、あくまでウチのメビウスでの計算結果である)。
シリアルポートの電圧は最大8.04Vであり、正規化されていないので電流を引き出すほど電圧が低下してしまう。実用的に考えると5Vのシリーズレギュレータをかますことになるだろう。すると、回路の電圧を6Vに維持しつつ使える最大電流値を計算するのがよいだろう。
ゲッ。たった7.5mAである。よく赤色LEDを光らせる時は470Ωをかませて、(5V - 2V) / 470Ω = 6.4mAなんてやるが、それだけでほぼギリギリである。PIC自体の消費電流も調べてみよう。私は12F675と16F819を4MHzで内蔵オシレータにより動かすことが多いが、12F675で0.8〜1.1mA、16F819で1.1〜1.4mAである。PICでLED制御するとそれだけであっぷあっぷということだ。USBは1ポートあたり500mAも流せる規格であるから、シリアルポートから引き出せる電流はビビタルモンデュアルといえよう。昨日計算した通信時の電流は、抵抗なしで1.6mA、オレ仕様の2.2kΩで1.1mA、秋月仕様の10kΩだと0.5mAであるから、少しでもバスパワーを引き出したい場合、RTS-CTSとRxD間の抵抗はギリギリまで大きくしたほうがよいということになるわけだ。
今までシリアルポートといえば「つなげばつながる不思議なコネクタ」という認識だったが、こうやって外部からちょっかい出すだけで、内部の構造が浮き出てくるというのは新鮮な発見であった。これ読んでて興味を持った人は自分のPCのシリアルポートの仕様を調べてみてはどうだろう。RS-232Cの規格はいいかげんなので、各PCで仕様は(たぶん)バラバラだろうから、きっとオモシロいぞ。短絡を許容する仕様だからよほど危険はないしね。
さて、今日はカミさんが職場から古いPCを格安で入手してきてくれた。具体的な値段は伏せるがマジで格安である。スペックはPenIIIの500MHzで、愛用のメビウスの倍速だ。うれしいことにシリアルポートもついていて、ドッキングベイ形式でフロッピーとCDROMを装備できる。とりあえずWin2kをインストールしたが、かなり快適。うちのPCの中ではかなり高速な部類に入る(^^;)。しかし、メビウスを苦労して修理したところなので、意地でも乗り換えない。乗り換えないったら乗り換えない。
話題は変わるが、私はビール党である。とりあえずビールというのもありだし、じっくり呑むのもありだと思っている。で、じっくり呑むにはやっぱりギネスなのである。最初このビールを呑んだときは、あまりの苦さに悶絶したが、慣れてしまうと日本製の黒ビールなど黒ビールの水割りにしか感じなくなってしまうから不思議だ。このギネスビールはアイリッシュであり、つまりアイルランド製だ。私はビール以外にもスコッチウィスキーが好きで高いシングルモルトを時々呑むが、これはスコティッシュであり、つまりスコットランド製だ。アイルランドとスコットランドはどちらもイギリスである。イギリスという国は料理はロクなもんがないのに、酒は素晴らしいというのが面白い。しばらく前までギネスを呑める店は大変少なかったが、最近アチコチにアイリッシュまたはイングリッシュスタイルのパブができて呑めるようになったので嬉しいトコロだ。というわけでみなさん、素直に焼酎ブームに乗って浮かれるのでなく、ひとつギネスを呑もうではないか。うまいぜ。
2005-09-10(Sat) LPICレベル1を受験す
つまらない公務員をやめ、IT業界に転職するに先立って、バカみたいにIT系資格を取得していた時期がある。もう、5年くらい前になるか。いくら未経験可と書いてあったところで、未経験でいいワケはないし、ホントに未経験で勤まったなら、それはロクな仕事ではないだろう。資格を持っていればエラいとは思っていないが、手土産程度にはなるだろうというのがオイラの考えである。実際には、手土産どころか絶大な効果があるというのが実感ではあるが。
話を戻して、業種を移るに当たって、IT資格を取得しまくった。情処二種(現、基本)、初級シスアド、CCNA、MCSE、OracleSilver。ベンダー系資格はあまり……というか、まったく役に立たないというのが印象ではあるが、なにしろ受けまくった。簡単にMCSEと書くが、これは6個の試験に合格して得られるもので、12,500円×6の威力を持つ資格である。その威力は主に受験者の財布を直撃する威力ではあるのだが……。
そんなこんなで、4年強の派遣社員みたいな、なんちゃって社長を廃業し、約2ヶ月前から、正社員として某社に就職したわけではあるが、Linuxをサポートするからには、LPICという資格を取得していることが望ましいらしい。私の所属しているこの某社は、社員の価値を高めるために、資格の取得を強く奨励しており、資格に対してかなり高い評価をしてくれる。先も書いたように、必ずしも資格を持っていればエラいとは思わないが、持ってないよりはいい。そういうモチベーションを持っているのも悪いコトではない。だから、資格至上主義とまではいかないが、そういう我が某社が好きである。
前置きが長くなったが、そういうワケで、数年ぶりにベンダー資格を受けることになったのだ。科目はLPIC。Linuxサーバの管理者系の技術資格である。現在、LPICにはレベル1, 2があり、各々2個の試験に合格することで、資格を得ることができる。本日オイラが受けたのはLPICレベル1、試験101と試験102である。
かなり前の話になるが、ジャンク屋で300円で入手したオライリーのLPICレベル1の教本と、社内Web研修を受けて、試験に挑むのである。自宅ではかなりイジり倒しているLinuxであるから、こんなもんはハナクソほじくりながらでも、合格せねばならない。いまだに正体を現していないLPICレベル3くらいは好敵手として相手をするつもりであるが、レベル1, 2くらいは、北斗の拳のザコ敵くらいのつもりで、ひでぶ、あべし、とサクサク倒す予定である。
しかし、アレだ。オイラの会社はそういう会社だからか、資格取得の際の受験料は会社が負担してくれる。バウチャーチケットというものを事前にもらっているので、タダで受験できるのだ。例え落ちても個人負担はなし。リベンジの際も、また負担してくれる。ただ、だからこそ、そういう状況下で落ちるなどというコトは許されないと思っている。だって、2科目で3万でっせ? いくら会社の金といえど、オイラの金銭感覚は、人の金にまで及ぶのである。人の金といえど、もったいないったら、もったいないのだ!!
試験勉強は適当にした。情報処理試験と違って、暗記系の試験である。不思議なことに、manページを開けばいくらでもカンニング可能な、スイッチ(-pとか-cとか)を丸暗記するような問題がとても多い。そういうワケで、試験の質としては情報処理試験よりも3段階くらい落ちる試験だと思っている。特にこの業界では、記憶力なんてモノより、問題解決能力、情報検索能力こそがモノをいうと、オイラは思っているからである。
というわけで、半分バカにしながらも、イザ試験である。R-PROMETRICという試験を管理する会社の、PCを用いた全自動受験システムで受験するのである。基本は、ラジオボタンで多肢選択式。一部はチェックボックスによる複数選択式、テキストボックスによる直接回答もある。
……が、む、むずかしい……むずかしいというか、Linuxサーバを管理するうのに、そんなコト知ってなくたっていいじゃんという問題が目白押し。モトが英語の問題だからか、出題の日本語もかなり怪しい。そもそも出題される問題の質も、かなり疑問を感じるレベルである。
あまり具体的に問題を書いてしまうと、問題バラしに相当し、受験に当たっての契約違反に相当するのであまり書かないが、いくつか疑問を感じた問題を挙げてみる。例えば、chmodでファイルのパーミッションを変更するのだが、選択肢に英字指定が入っている。オイラは8進で指定したコトしかないので、どうしてもあやふやなのだが、そういう知識も強要される。また、crontabで月曜日と火曜日に、と書いてあるのに、曜日のトコロに1, 2と書いてある選択肢がない。1, 4ならあるが、これはThursdayをTuesdayと誤訳したために違いない。極めつけは、一般ユーザのログイン時にメッセージを示したい時は、どのファイルにメッセージを記述すればよいか、との問いに、選択肢として/etc/issueと/etc/motdが挙がっているのだが、単に「ログイン時」などと曖昧に書かれても困るのである。これは翻訳者の知識のなさに基づく誤訳だよなぁ。ちなみに、約5年前に受けたCCNAは英語の原文を確認することができたが、今回はできなかった。こーゆー翻訳レベルなら、それくらいデキるようにしておいてもらいたいものである。誤訳こそないものの、10%くらいの問題では文章の意図を読み取るのに苦労したぞ。
2010-09-10(Fri) 工房と小屋裏と私
ちなみにこれは、リビング側から工房を見たところ。工房は、リビングに隣接しており、このような「窓口」を設けてある。通常は開けておくが、来客などの際には閉める運用も可とする。万が一、工房のカオス度が上昇した場合でも、お見苦しくないように配慮した装備である。
2022-09-10(Sat) 結局、効果音生成ツールを自作する
先日、ノイズを生成できるようになってから、効果音生成プログラムに組み込んでアレコレしていたのだが、アレコレしているうち、効果音とは、基本となる波形に様々な変化を繰り返し重ねていくことによって生成するものだということがわかってきた。
考えれば考えるほどわからなくなり、コードを書いては試し、何度も書き直した。コードの追加ではなく、こんなに何度も、構造ごと変えては、頭から書き直したのは初めてだ。変調を追求していくうちに、FM音源に行き当たり、周波数変調、位相変調、YM2151(OPM)の仕組みにまで踏み込んでしまい、オペレータのコネクションを再現するために、RPNっぽい手法まで実装することになった。
最終的には、以下のような記述で音を作る。以下は、soxのサンプルにあるパイプオルガンによるAm7を再現するもの。typeで正弦波(sine)を指定、freqで周波数(A3, C4, E4, G4)を指定、envでエンベロープ(音量変化)を指定。最後にそれらをRPN記法で重ねていく。
@length = 1
car1 = it = {}
it[:device] = 'generate'
it[:length] = @length
it[:type] = 'sine'
it[:freq] = <<FREQ
#+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A+BC+D+EF+G+A
#--1----(55)1--2---(110)2--3---(220)3--4---(440)4--5---(880)5--6--(1760)6--7--(3520)7--8--(7040)8
..................................../
FREQ
it[:amp] = <<AMP
#--------------25--------------50--------------75-------------100
................/
AMP
car2 = it = {}
<略、C4 の正弦波>
car3 = it = {}
<略、E4 の正弦波>
car4 = it = {}
<略、G4 の正弦波>
add = it = {}
it[:device] = 'add'
env1 = it = {}
it[:device] = 'env'
it[:length] = @length
it[:amp] = <<AMP
#--------------25--------------50--------------75-------------100
/
................................................................/
................................................................/
................................................................/
................................................................/
................................................................/
/
AMP
@connection = [ car1, car2, add, car3, add, car4, add, env1 ]
これでwavファイルが生成される<聴いてみる>。
もちろん、加算はもっとも基本的な演算で、真骨頂は変調である。インベーダのUFOの音っぽいの<聴いてみる>とか、パックマンのモンスタの音っぽいの<聴いてみる>とか、R-TYPEのショット音っぽいの<聴いてみる>とか、ダライアスのレーザ音っぽいの<聴いてみる>とか、割と直感的な記述により生成することができる。
今回、FM音源のことを調べていて、ものすごく少ないパラメータ(バイト数)で音色が作れることが、当時のPCの性能事情に即していたこと。反面、音色作りがものすごく難しかったことを、改めて知った。実際、自分もX1のFM音源をアレコレしていたが、ちっともイメージしたような音色が作れなかった。
コードと定義ファイル一式を置いておく。
2024-09-10(Tue) RubyでDigest認証クライアントを作る
あれ。Rubyの標準ライブラリにはBasic認証の機能しかない。TLSの普及につれ、Digest認証が廃れて、Basic認証が復活してくる傾向とは思っていたが、相手サーバがDigest認証で固定なら、それに対応せざるをえない。
Digest認証が面倒なのは、認証に先立って相手からnonceというチャレンジコードをもらう必要があるので、最初に失敗アクセス(401:Unauthorized)を行うことが必須であることだ。Basic認証ならば、最初から認証情報を送ることができるので、失敗アクセスは必須ではない。
RFCを眺めつつ、既存のRubyのライブラリに近い使い勝手で実装する。できた。
require './http_digest_auth'
res = nil; auth_res = nil
uri = URI.parse('http://localhost:8080/digest/')
req = Net::HTTP::Get.new(uri.path)
3.times {
auth_res = req.digest_auth('username', 'password', res, auth_res)
res = Net::HTTP.start(uri.host, uri.port) {|http|
http.request(req)
}
puts(res.code)
res.code.to_i < 400 and break
}
puts(res.body)
既存のRubyのライブラリでBasic認証する場合のサンプルコードが以下なので、できるだけ近づけた。ただし、最初に失敗アクセスを行うことが必須なので、ループしたり、認証情報の引き渡したりする処理が入るのは仕方ない。逆に、上記のスタイルでもBasic認証は動く。
require 'net/http'
uri = URI.parse('http://localhost:8080/basic/')
req = Net::HTTP::Get.new(uri.path)
req.basic_auth('username', 'password')
res = Net::HTTP.start(uri.host, uri.port) {|http|
http.request(req)
}
puts(res.body)
require 'net/http'
require 'digest/md5'
class Net::HTTPGenericRequest
attr_accessor :secret_data
def digest_auth(username, passwd, res, auth_res = nil)
@nc ||= 0
@secret_data ||= 'secret-data'
@auth_res = auth_res || {}
if(res and res.header['www-authenticate'] =~ /Digest\s+(.+)/i)
$1.split(/,\s*/).each {|kv0|
kv = kv0.split(/\s*=\s*/, 2)
kv[1].strip =~ /^\"(.*)\"$/ and kv[1] = $1
@auth_res[kv[0]] = kv[1]
}
end
if(@auth_res['realm'])
ha1 = Digest::MD5.hexdigest('%s:%s:%s' % [username, @auth_res['realm'], passwd])
ha2 = Digest::MD5.hexdigest('%s:%s' % [method, path])
nc = '%08X' % [@nc += 1]
cnonce = Digest::MD5.hexdigest('%s:%s' % [Time.now.to_f, @secret_data])
qop = 'auth' # TODO
response = Digest::MD5.hexdigest('%s:%s:%s:%s:%s:%s' % [ha1, @auth_res['nonce'], nc, cnonce, qop, ha2])
auth_req = []
auth_req << 'username="%s"' % username
auth_req << 'realm="%s"' % @auth_res['realm']
auth_req << 'uri="%s"' % path
auth_req << 'algorithm=%s' % 'MD5' # TODO
auth_req << 'nonce="%s"' % @auth_res['nonce']
auth_req << 'nc=%s' % nc
auth_req << 'cnonce="%s"' % cnonce
auth_req << 'qop=%s' % qop
auth_req << 'response="%s"' % response
auth_req << 'opaque="%s"' % @auth_res['opaque'] if(@auth_res['opaque'])
@header['authorization'] = ['Digest ' + auth_req.join(', ')]
end
@auth_res
end
end
■ ピョン [おお、おめでとう! 工房めっちゃかっこいい。小屋裏もうらやましいぞ。]