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|

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%くらいの問題では文章の意図を読み取るのに苦労したぞ。

  試験中、ココに絶対に文句を書きなぐってやると決意しつつも、もし受からなかったら、負け犬の遠吠えに思われるから、イジでも受からねば、と思っていたのだが、なんとか両方とも受かった!! あー、よかった。オイラの古いテキストでは、Xの設定は102に含まれていたのに、実際の試験では101に含まれていて、直前に暗記しなおすつもりが、アテが外れてアセったり。102では全然知らないコマンドを記述しろとかいわれて、数問を空欄にしてしまったり、試験をナメすぎていたコトにかなり反省したが、102は合格ラインスレスレの500点ながら合格。なんとか面目を保つことができた。

  とはいえ、201と202の時にはかなり気合を入れて臨まねばなるまい。あぁしかし、なんか不毛だ。こんな試験に受かっても、達成感などなく、あまり嬉しくもない。201と201に際しては、テキストが300円で手に入ったりしないだろうしなぁ。ちゅーワケで、なんだ、うまくまとまらないが、ベンダー資格制度とは、間違いなく金儲けビジネスなのである。情報処理試験のような高い問題レベルを求めてはイケない。なにせ出題側もかなり適当なのだから、受験側もあまりマジメな気持ちで受けずに、それでいて軽くタイトルホルダーになるべきなのだ!! 以上!!


2010-09-10(Fri) 工房と小屋裏と私

  盆休みをズラし、ひたすら引っ越し作業に明け暮れているみなさま、いかがお過ごしでしょうか。

  なにしろ、多量の工具や部品、ジャンクという名の下に膨大な数のゴミを蓄積し続け、仕分けきれずに重複させまくっている。運び込むだけは運び込んだものの、今年いっぱいで整理がつけばいいくらいの状況である。

  画像の説明

  ちなみにこれは、リビング側から工房を見たところ。工房は、リビングに隣接しており、このような「窓口」を設けてある。通常は開けておくが、来客などの際には閉める運用も可とする。万が一、工房のカオス度が上昇した場合でも、お見苦しくないように配慮した装備である。

  画像の説明

  こっちは、小屋裏である。小屋裏サーバルームである。我が家は小屋裏にLANが集中しているのである。こやうLANなのである。光ファイバ以外にも、TVのアンテナ線、インターホンの線もここを経由している。現在は、キューブ型のAtomサーバ(兼ルータ)が1台のみ稼働しているが、いずれはサーバラックの配置も考えている(ウソ)。

  一応、全回線についてギガビットでリンクすることを確かめるついでに、各部屋と回線との対応表を作ろうと階段を上り下りしまくっていたら、足がガクガクになってしまった。「LANは若いウチに曳け」である。

本日のツッコミ(全1件) [ツッコミを入れる]

ピョン [おお、おめでとう! 工房めっちゃかっこいい。小屋裏もうらやましいぞ。]


2020-09-10(Thu) 秋月の彼岸花、レディ

  気づくと、昨年、スキップした白い個体がレディ状態である。しかも、3つも。楽しみ。

  画像の説明

  先走っちゃってるヤツがいるが、そういうヤツはどこにでもいるものだ。


2022-09-10(Sat) 結局、効果音生成ツールを自作する

  先日、ノイズを生成できるようになってから、効果音生成プログラムに組み込んでアレコレしていたのだが、アレコレしているうち、効果音とは、基本となる波形に様々な変化を繰り返し重ねていくことによって生成するものだということがわかってきた。

  主には、正弦波、矩形波などの生成、加算、変調、音量変化などである。しかし、その方法を汎化して記述するにはどうすればいいのか。そもそも変調とは何なのか。

  考えれば考えるほどわからなくなり、コードを書いては試し、何度も書き直した。コードの追加ではなく、こんなに何度も、構造ごと変えては、頭から書き直したのは初めてだ。変調を追求していくうちに、FM音源に行き当たり、周波数変調、位相変調、YM2151(OPM)の仕組みにまで踏み込んでしまい、オペレータのコネクションを再現するために、RPNっぽい手法まで実装することになった。

  結局、ほぼ、シンセサイザを自作した、というレベルではないだろうか。ヤクの毛刈りどころか、3頭はバーベキューにして食い尽くした気分だ。

  最終的には、以下のような記述で音を作る。以下は、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認証クライアントを作る

  ちょっとした理由でウェブアクセスするクライアントを書き始めたら、相手にDigest認証を求められた。

  あれ。Rubyの標準ライブラリにはBasic認証の機能しかない。TLSの普及につれ、Digest認証が廃れて、Basic認証が復活してくる傾向とは思っていたが、相手サーバがDigest認証で固定なら、それに対応せざるをえない。

  標準ライブラリになくたって、誰か書いているだろう、と思ったが、検索してもRailsはよくわからんし、WEBrickはサーバ側の話だろうし……まぁ、自分で書くかと。車輪の再発明だとしても楽しいしな。

  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)

  ライブラリのコードは以下。RFCのまんまといえば、RFCのまんま。

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

  なかなか美しく書けた気がする。ふぅ。