記事一覧

VPNが...

VPNが不調なんです。この間、多分塗装工場のIPアドレスを変更したタイミングで。

うちの会社では、内線通話をVPNに乗せています。そして、ここのところ工場間で内線通話をしていると数秒間無音状態になる現象が頻発しています。最初は吉見工場のADSLが不安定なのかと思っていましたが、川口-吉見間だけでなく川口-塗装工場間でも同様の現象が起きているようです。

で、原因は何だろう、と考えてみて思いついたのは、川口-吉見間の暗号化を3DESからAESへ変更したこと。でもAESは3DESよりも負荷は小さいはずだよなあ。そうかあ、川口-吉見間がAESでもその他は全部3DESのままだから、もしかすると混在させるとダメなのかもしれないぞ。機会を見つけて元に戻すしかないなあ。

などとこの数日間考えていたのですが、先ほどルータの設定を何気なく見ていると、「IPSec Keep-Alive設定」の項目が目に止まりました。これは何かというと、「VPNが維持されているか定期的に確認して、切れていたら再接続しなさい」という設定です。そして、「IPSec Keep-Alive設定」と「定期的に音声が途切れますよね」という社内の人の指摘がつながりました。「これが原因だ!」

川口及び吉見のVPNルータの設定を見てみると、いずれも塗装工場の旧IPアドレスに対してKeep-Alive設定がされていました。なので、両VPNルータは、一定間隔で旧IPアドレスに対してVPNが維持されているか確認します。当然維持されていないのでVPNを張ろうとします。そして、この処理はVPNルータにとってかなり重い処理なのかもしれず、「定期的に無音状態になる原因」かもしれないです。

早速設定を正しく直しました。この後、「そうか、ログを見ればいいんだ」という当たり前の事に気付いてルータのログを見てみると、90秒毎に

Mar 25 15:01:48 localhost ipsec keepalive[6511]: xripsec3 : reconnect (with chain to IKE3)

といった感じで吐き出されていたものがなくなっていました。このルータのログ、かなり量が多いのでいきなり見て「そうか、IP-SecのKeepAliveが原因だ!」なんて気付いたかは微妙ですね。


2008年3月27日午後1時
半日様子を見てみましたが無音状態は発生せず。やっぱりKeepAliveの設定ミスが原因だったみたいです。

モバイル

過去の日記を読んでみると、2003年の年末にAirH"導入をしたようです。この当時はコンパクトフラッシュタイプのカードをノートPCにつないで使っていたのですが、

月額5176円で32kつなぎ放題
 (遅すぎる...)
月額4819円で25時間つなげるプラン(128k)に変更
 (音声端末がモデムになるのか)
月額5000円で32kつなぎ放題&PHS同士通話無料
 (いつの間にか法人もAB割が対象になっていた)
月額3654円で32kつなぎ放題
 (つなぎ放題が増速になった!)
月額3654円で64kつなぎ放題

という歴史があります。正直、32kというのは遅いです。現在の64kでも遅いです。で、現在悩んでいるのが

プラン1[パケコミプラン+メール放題に変更]
 これは、月額3,486円でメール無料+128k通信が20万パケットまで無料となり、それ以上使うと青天井で料金が上がっていきます。でも、普段はそれほど使わないんですよね。

プラン2[定額プラン+データ定額に変更]
 これは、月額3,950円(10万パケット)~9200円(60万パケット超)のダブル定額方式。

27万パケット程度使うとプラン2の方がお得になります。しかも、プラン2だと対PHSの通話は無料です(ほとんど使わないけど)。試しにプラン1がお得なパターンを調べてみると「使用量が20万パケットの時にプラン1が約1500円お得になる」となりました。問題は、「毎月どれくらいの通信量か分からない」ってことですね。また、最高で月9200円って考えると

プラン3[携帯に変更]

ってのも現実味ありますね。ただ、PHSだと音声端末兼用となるのが携帯だと(まともに使えないだろう)eモバイルを除けば音声と別になってしまいます。音声端末でもネットをしようと思ったら別料金のため、結構高くついてしまいますね。

プラン3A[auのデータ通信定額]
 これは、月額2,205円~5,985円(7.2万パケット超)までのダブル定額方式。ただし、ISP代が別途で、うちが使っているISPだと1575円定額or無料で5時間、それを超過すると1分5.25円が課金されるらしいです。

プラン3B[ドコモの定額データプラン]
 64kだと4200円+525円、ハイスピードだと4200円~6720円+840円、ただし、PCには専用のソフトを入れて一部の通信が制限されるものです。ただ、VPNはOKみたいですので、あまり問題ないかもしれなく検討中です。PHSと同じ64kの場合、体感速度はどうなんでしょうね。

プラン3C[eモバイル]
 4980円で使い放題(2年契約)、これがコストパフォーマンスは一番よいです。でも、エリアが問題。。。


ということで、悩むところです。

SPAMメール対策

最近(でもないですが)、SPAMメールが大量にきます。それは詐欺っぽいものだったり外国からのものだったり様々ですが、とにかく迷惑です。とくに私の場合はメールを携帯に転送しているので、すごく邪魔です。ということで、メールフィルタを設定しています。

SPAMメールでも日本のものならまだいいんです、読めますから。でも、外国語のSPAMメールは削除するだけなので本当に邪魔。なのでフィルタの基本(というか完全に)は海外からのSPAMメール対策ですね。

ContentType が Windows-1252 を含む
ContentType が ISO-8859 を含む
ContentType が us-ascii を含む

上記フィルタにひっかかったメールはフリーのメールに転送され、気分が向いた時に一応チェックする(ほぼチェックしない)ことになります。フィルタにひっかからなかったメールは

Date: が +0900 を含む

ものだけ携帯に複写転送されます。上記の条件は、海外からのSPAMメールのヘッダーを見て何となく設定しました。

ちなみに意味としては、ISO-8859とWindows-1252は欧文(西欧)文字コード、us-asciiは読んだ通りのものみたいで、海外からのSPAMメールの大部分はこの3つのどれかでひっかかります。で、Dateが+0900というのは日本を意味しているのですが、たまに必要なメールが+0900が入っていないことがあるので、携帯には転送しない、程度の扱いとしています。

現在のサーバは、間もなく「無料で!」SPAMメールフィルタが使えるようになるので、それが楽しみです。


セキュリティー分野でワールドワイドの実績を持つシマンテック社の「迷惑メール遮断システム」を導入いたします。同システムは独自の高精度な自動判別システムにより(※)、お客さま側での設定なしで、迷惑メールを遮断することが可能。

※2. 世界中から収集された迷惑メール送信元のデータベース(ブラックリスト)および送信されてきたメールの情報を解析することで、迷惑メールを自動判別します。

サーバ移転完了?

ホスティングサービス(ichipre.co.jp)の移転が終了しました。

HPについては単純に新旧両方に同じものを置いておいてDNSの書き換え完了を待つというごく単純な形となりました。ただし、社内ではhostsファイルを書きかえることで、社内からのアクセスは新サーバとなるようにしました。

メールについては、とりあえず新旧両サーバのIPアドレスを指定して両方からメールを受信するようにメールソフトを設定してあったのですが、昨晩、旧サーバからの受信設定を削除、今朝旧サーバ内の未受信メールがないことを確認して旧サーバのメールアカウント設定をクリアしました。

問題もあったけど長い間使った旧サーバ、今までありがとう。

クラスBへの変更(塗装工場編)

さて、前回の予行練習に続いて、最も簡単に移行できるはずの塗装工場に手を付けてみる。

1.塗装工場のPBXのVoIPボードのIPアドレス変更
これは、pingにより変更直後すぐ反映されたことを確認

2.塗装工場のPBXのIPアドレス&ネットマスクを変更
変更しても反映されていないようなのでPBXを再起動

3.川口&吉見のPBXのネットワーキング設定を変更
これは、内線通話のために他のPBXのIPアドレスを登録してあるので、それを変更している

4.塗装工場のルータの設定変更&再起動
設定ファイルをPCにテキストで保存して、検索&置換で抜けがないことを確認して、それをルータに転送(転送が終わるとルータは自動再起動)

5.自宅&川口&吉見のIPsec設定を変更&再起動
再起動すると、自宅&川口&吉見&塗装が問題なくつながっていることが確認できた。

6.川口PBXと塗装PBXがつながっていることを確認
自宅のPCにはPBXの子機として動くソフトフォンが入っているので、それを川口のPBXにつなげて塗装工場の内線に電話をかけ、呼び出し音が鳴ることを確認。


ということで、とりあえず問題なく移行できたみたいです。明日は吉見工場に行くので、トラブルがあった場合にもすぐ直せるので今晩作業をしたのですが、必要なかったかも。

問題は、次の「吉見工場移行」ですね。吉見工場は

塗装工場+社内サーバ(ファイルサーバ、DBサーバ)+製造設備+ネットワークプリンタ+IP子機+無線アンテナ+従業員が住んでいる寮のネットワーク

となっていて、塗装工場のように自宅からネット経由ですべて終わらせるわけにはいかないでしょう。G.W.にでもやった方がいいかなあ。

クラスBへの変更(予行練習)

さて、先日書いた「クラスBへの変更」について、川口本社と管理人自宅間のVPNで、自宅のネットワークをクラスB化するということでやってみました。ちなみに、自宅ではVPNルータが唯一のルータでDHCPサーバとしても使っています。

1.両VPNルータのフィルタ設定
VPN同士のパケットについてはすべて通すよう設定してあるのですが、そこに新しいアドレスを追加

2.VPNのIPアドレス設定変更(川口、自宅両方のVPNルータ)
変更だけでまだ再起動しません

3.自宅のDHCP情報変更
4.VPNルータのIPアドレス変更

さて、ここで問題発生。ルータのIPアドレス変更はすぐに反映されてしまうのに、DHCP情報の変更はDHCPサーバを再起動しないと反映されない。なので、ルータのIPアドレスはクラスBに変わっているのに、相変わらずDHCPではクラスCのIPアドレスを割り振る。

3.5.DHCPサーバ再起動(これをしなければいけなかった)

仕方ないのでVPNルータの電源を切って再起動。無事ネットにつながるようになりました。ところが、VPNは。。。で、

5.ノートPC&PHSで会社に接続しVPNルータのIPsec再起動
やっぱり、設定を変更しても反映させるには再起動が必要なんですね。再起動後つながるようになりました。

ところが、今度の現象は「自宅からは会社の一部のPCにしかつながらない」ということが起きました。この原因はすぐに分かりました。社内の他のルータに対して、(自宅の新しいアドレス)の場合はVPNルータに転送しろ、というスタティックルートを追加しなければいけなかったんですね。これがないため、自宅からVPNルータ以外のルータと、それをデフォルトルートにしているPCとの通信が出来なくなっていました。

6.接続可能なPCにVNCで接続してその他ルータのスタティックルート設定を変更
これですべての機器との通進が可能になりました。やれやれ。


今回の予行練習で、1と6は設定済みなので本番では問題にならないでしょう。最初にクラスBへの変更を行なう予定の塗装工場については、自宅+PBX+PBX子機(IP接続タイプ)というイメージです。PBX子機は無視するとして、PBXの設定が問題ですね。きちんと設定しないと工場間の内線が不通になるので。
でも、塗装工場はサーバがないのでトラブルはほとんどないでしょう。問題は吉見工場ですね。怖いなあ。

暗号化

現在私がVPNで利用している暗号化は3DESです。この3DESという方式は、「DES(Data Encryption Standard)を3回行なう」というものです。DESという方式は鍵長56ビットと決して強力な暗号化手法ではないようですが、一番の利点は「歴史が古く、穴がない」ということでしょう。このDESを3回行なうことで112ビット相当の暗号化となるらしいですね。ずいぶん前に128ビット暗号化が出てましたが、「穴がない」という信頼性からか3DESが今でも多く採用されているみたいです。うちのVPNルータはDESと3DESでの暗号化が選択できます。

と書いていて念のため調べたら、現在川口と吉見で利用しているVPNルータはAES(128ビット)も対応していました。しかも、AESは3DESより安全かつ低負荷らしいです。うーん、塗装工場が対応していないってのが問題だけど、川口-吉見間だけでもAESに変えようかなあ。

話を戻して、「そんな信頼性がある方式なら社内のソフトでもDESを使いたいな」なんて思ってプログラムを作ってみました(2003年11月)。ソースを見てみると分かるのですが、ほとんど行列の計算だけですね。このコードは実際には大して使っていないのですが、本当にきちんとDESで暗号化できているんでしょうか。一応、鍵を変えると暗号化の結果は変わりますし、復元も出来ています。実はDESもどきの穴あり暗号化かも。
ちなみに、3DESの場合はABC三つの鍵を用意して「鍵Aで暗号化、鍵Bで復元、鍵Cで暗号化」というものだそうです。なので、「鍵A=鍵B=鍵Cだと単なるDESになるので上位互換だ」ということみたいですね。

'''''''''VBによるMainのコード

Dim des as new ClassDES
Dim keyStr$ '暗号化するための鍵(任意の文字で設定可)
Dim key$ '上記の鍵を2進法で表したもの(特に必要はない)
Dim SourceString$, ResultString1$, ResultString2$

keyStr$ = "暗号化鍵"
key$ = des.SetKeyStr(keyStr$)
SourceString$ = "何でもいい適当な文字列(この文章が暗号化される)"
ResultString1$ = des.EncryptStr(SourceString$) '暗号化
ResultString2$ = des.UnEncryptStr(ResultString1$) '復元(SourceString$と同じになるはず)


'''''''''VBによる'classDES'の定義

Option Explicit
Private pKey$
Private KS$(0 To 15)
Const ASCII64 = ".!0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

Property Get Key$()
Key$ = pKey$
End Property
Property Let Key(ByVal vkey$)

If Len(vkey$) <> 64 Then
pKey$ = ""
Exit Property
End If
SetKey vkey$

pKey$ = vkey$
End Property
Public Function SetKeyStr$(ByVal st$)

Dim s1$

s1$ = StrToDigit$(st$)
If Len(s1$) > 64 Then
s1$ = Left$(s1$, 64)
ElseIf Len(s1$) < 64 Then
s1$ = s1$ & String$(64 - Len(s1$), "0")
End If
SetKey s1$
SetKeyStr$ = s1$
End Function
Private Function SetKey(ByVal digit64$)

Dim i&, j&, k&, C1$, D1$, C2$, D2$, shifts As Variant
shifts = Array(1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1)

C1$ = calcPC1_C(digit64$)
D1$ = calcPC1_D(digit64$)

For i = 0 To 15
KS$(i) = ""
Next
C2$ = C1$
D2$ = D1$
For i = 0 To 15
For k = 0 To shifts(i) - 1
C2$ = Mid$(C2$, 2, 27) & Left$(C2$, 1)
D2$ = Mid$(D2$, 2, 27) & Left$(D2$, 1)
Next
KS$(i) = calcPC2_C(C2$) & calcPC2_D(D2$)
Next
End Function

Public Function EncryptStr$(ByVal st$)

Dim i&, s1$, s2$, s3$, ret$, c&

s1$ = StrToDigit$(st$)
s1$ = s1$ & String$((64 - (Len(s1$) Mod 64)) Mod 64, "0")

For i = 1 To Len(s1$) Step 64
s2$ = s2$ & Encrypt8$(Mid$(s1$, i, 64))
Next

EncryptStr$ = DigitToAscii64$(s2$)
End Function

Public Function UnEncryptStr$(ByVal st$)

Dim i&, s1$, s2$, ret$

s1$ = Ascii64ToDigit$(st$)
For i = 1 To Len(s1$) Step 64
s2$ = s2$ & UnEncrypt8$(Mid$(s1$, i, 64))
Next

UnEncryptStr$ = DigitToStr$(s2$)
End Function

Public Function Encrypt$(ByVal st$)

Dim i&, s1$, s2$, s3$, ret$

st$ = st$ & String$((64 - (Len(st$) Mod 64)) Mod 64, "0")

For i = 1 To Len(st$) Step 64
s2$ = s2$ & Encrypt8$(Mid$(st$, i, 64))
Next

Encrypt$ = s2$
End Function
Public Function UnEncrypt$(ByVal st$)

Dim i&, s1$, s2$, s3$, ret$

st$ = st$ & String$((64 - (Len(st$) Mod 64)) Mod 64, "0")

For i = 1 To Len(st$) Step 64
s1$ = s1$ & UnEncrypt8$(Mid$(st$, i, 64))
Next

UnEncrypt$ = s1$
End Function

Private Function Encrypt8$(ByVal st$)

Dim i&, tempLR$, tempR$, tempL$

tempLR$ = calcIP$(st$)
For i = 0 To 15
tempL = Mid$(tempLR$, 1, 32)
tempR = Mid$(tempLR$, 33, 32)
tempLR$ = tempR$ & StrXOR$(calcP$(calcS$(StrXOR$(calcE$(tempR$), KS$(i)))), tempL)
Next

Encrypt8$ = calcFP$(Mid$(tempLR$, 33, 32) & Mid$(tempLR$, 1, 32))
End Function
Private Function UnEncrypt8$(ByVal st$)

Dim i&, tempLR$, tempR$, tempL$

tempLR$ = calcIP$(st$)
For i = 15 To 0 Step -1
tempL = Mid$(tempLR$, 1, 32)
tempR = Mid$(tempLR$, 33, 32)
tempLR$ = tempR$ & StrXOR$(calcP$(calcS$(StrXOR$(calcE$(tempR$), KS$(i)))), tempL)
Next

UnEncrypt8$ = calcFP$(Mid$(tempLR$, 33, 32) & Mid$(tempLR$, 1, 32))
End Function
Function DigitToAscii64$(ByVal st$)
Dim i&, ret$, c&

st$ = st$ & String$((6 - (Len(st$) Mod 6)) Mod 6, "0")
For i = 1 To Len(st$) Step 6
c = DigitToInt("00" & Mid$(st$, i, 6)) + 1
ret$ = ret$ & Mid$(ASCII64, c, 1)
Next

DigitToAscii64$ = ret$
End Function
Function Ascii64ToDigit$(ByVal st$)

Dim i&, ret$
For i = 1 To Len(st$)
ret$ = ret$ & Right$(IntToDigit$(InStr(ASCII64, Mid$(st$, i, 1)) - 1), 6)
Next
Ascii64ToDigit$ = Left$(ret$, 8 * Int(Len(ret$) / 8))
End Function
Function StrToDigit$(ByVal st$)

Dim i&, c&, ret$

For i = 1 To Len(st$)
Debug.Print i
c = Asc(Mid$(st$, i, 1))
If c >= 0 Then
ret$ = ret$ & IntToDigit$(c)
Else
ret$ = ret$ & IntToDigit$((c And -256) / 256)
ret$ = ret$ & IntToDigit$(c And 255)
End If
Next
StrToDigit$ = ret$
End Function
Function DigitToStr$(ByVal st$)

Dim i&, c&, ret$

For i = 1 To Len(st$) Step 8
c = DigitToInt(Mid$(st$, i, 8))
Select Case c
Case 0 To 127, 160 To 223
ret$ = ret$ & Chr$(c)
Case Else
c = (c * 256 + DigitToInt(Mid$(st$, i + 8, 8))) - 65536
i = i + 8
ret$ = ret$ & Chr$(c)
End Select

Next
DigitToStr$ = ret$
End Function
Private Function IntToDigit$(ByVal x&)
Dim i&, ret$

For i = 7 To 0 Step -1
If (x And 2 ^ i) = 0 Then ret$ = ret$ & "0" Else ret$ = ret$ & "1"
Next
IntToDigit$ = ret$
End Function
Private Function DigitToInt&(ByVal x$)
Dim i&, ret&

For i = 1 To 8
If Mid$(x$, i, 1) = "1" Then ret = ret + 2 ^ (8 - i)
Next
DigitToInt = ret
End Function

Private Function StrXOR$(ByVal s1$, ByVal s2$)

Dim i&, ret$, c&

For i = 1 To Len(s1$)
c = Val(Mid$(s1$, i, 1)) Xor Val(Mid$(s2$, i, 1))
ret$ = ret$ & Format$(c)
Next
StrXOR$ = ret$
End Function

Private Function calcPC1_C(ByVal v$)
Dim i&, ret$, PC1_C As Variant

PC1_C = Array(57, 49, 41, 33, 25, 17, 9, _
1, 58, 50, 42, 34, 26, 18, _
10, 2, 59, 51, 43, 35, 27, _
19, 11, 3, 60, 52, 44, 36 _
)

For i = 0 To 27
ret$ = ret$ & Mid$(v$, PC1_C(i), 1)
Next
calcPC1_C = ret$
End Function
Private Function calcPC1_D(ByVal v$)
Dim i&, ret$, PC1_D As Variant

PC1_D = Array(63, 55, 47, 39, 31, 23, 15, _
7, 62, 54, 46, 38, 30, 22, _
14, 6, 61, 53, 45, 37, 29, _
21, 13, 5, 28, 20, 12, 4 _
)
For i = 0 To 27
ret$ = ret$ & Mid$(v$, PC1_D(i), 1)
Next
calcPC1_D = ret$
End Function
Private Function calcPC2_C(ByVal v$)
Dim i&, ret$, PC2_C As Variant

PC2_C = Array(14, 17, 11, 24, 1, 5, _
3, 28, 15, 6, 21, 10, _
23, 19, 12, 4, 26, 8, _
16, 7, 27, 20, 13, 2 _
)

For i = 0 To 23
ret$ = ret$ & Mid$(v$, PC2_C(i), 1)
Next
calcPC2_C = ret$
End Function
Private Function calcPC2_D(ByVal v$)
Dim i&, ret$, PC2_D As Variant

PC2_D = Array(41, 52, 31, 37, 47, 55, _
30, 40, 51, 45, 33, 48, _
44, 49, 39, 56, 34, 53, _
46, 42, 50, 36, 29, 32 _
)
For i = 0 To 23
ret$ = ret$ & Mid$(v$, PC2_D(i) - 28, 1)
Next
calcPC2_D = ret$
End Function
Private Function calcFP$(ByVal v$)
Dim i&, ret$, FP As Variant

FP = Array(40, 8, 48, 16, 56, 24, 64, 32, _
39, 7, 47, 15, 55, 23, 63, 31, _
38, 6, 46, 14, 54, 22, 62, 30, _
37, 5, 45, 13, 53, 21, 61, 29, _
36, 4, 44, 12, 52, 20, 60, 28, _
35, 3, 43, 11, 51, 19, 59, 27, _
34, 2, 42, 10, 50, 18, 58, 26, _
33, 1, 41, 9, 49, 17, 57, 25 _
)

For i = 0 To 63
ret$ = ret$ & Mid$(v$, FP(i), 1)
Next
calcFP$ = ret$

End Function
Private Function calcIP$(ByVal v$)
Dim i&, ret$, IP As Variant

IP = Array(58, 50, 42, 34, 26, 18, 10, 2, _
60, 52, 44, 36, 28, 20, 12, 4, _
62, 54, 46, 38, 30, 22, 14, 6, _
64, 56, 48, 40, 32, 24, 16, 8, _
57, 49, 41, 33, 25, 17, 9, 1, _
59, 51, 43, 35, 27, 19, 11, 3, _
61, 53, 45, 37, 29, 21, 13, 5, _
63, 55, 47, 39, 31, 23, 15, 7 _
)

For i = 0 To 63
ret$ = ret$ & Mid$(v$, IP(i), 1)
Next
calcIP$ = ret$

End Function
Private Function calcE$(ByVal v$)
Dim i&, ret$, E As Variant

E = Array(32, 1, 2, 3, 4, 5, _
4, 5, 6, 7, 8, 9, _
8, 9, 10, 11, 12, 13, _
12, 13, 14, 15, 16, 17, _
16, 17, 18, 19, 20, 21, _
20, 21, 22, 23, 24, 25, _
24, 25, 26, 27, 28, 29, _
28, 29, 30, 31, 32, 1 _
)
For i = 0 To 47
ret$ = ret$ & Mid$(v$, E(i), 1)
Next
calcE$ = ret$
End Function
Private Function calcP$(ByVal v$)
Dim i&, ret$, P As Variant

P = Array(16, 7, 20, 21, _
29, 12, 28, 17, _
1, 15, 23, 26, _
5, 18, 31, 10, _
2, 8, 24, 14, _
32, 27, 3, 9, _
19, 13, 30, 6, _
22, 11, 4, 25 _
)

For i = 0 To 31
ret$ = ret$ & Mid$(v$, P(i), 1)
Next
calcP$ = ret$
End Function
Private Function calcS$(ByVal v$)

Dim i&, tempSin$, temp$, ret$, s(7) As Variant

s(0) = Array(14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, _
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, _
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, _
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 _
)
s(1) = Array(15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, _
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, _
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, _
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 _
)
s(2) = Array(10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, _
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, _
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, _
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 _
)
s(3) = Array(7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, _
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, _
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, _
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 _
)
s(4) = Array(2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, _
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, _
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, _
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 _
)
s(5) = Array(12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, _
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, _
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, _
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 _
)
s(6) = Array(4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, _
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, _
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, _
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 _
)
s(7) = Array(13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, _
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, _
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, _
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 _
)

For i = 0 To 7
tempSin$ = Mid$(v$, i * 6 + 1, 6)
tempSin$ = Left$(tempSin$, 1) & Mid$(tempSin$, 6, 1) & Mid$(tempSin$, 2, 4)
temp$ = Right$(IntToDigit(s(i)(DigitToInt("00" & tempSin$))), 4)
ret$ = ret$ & Mid$(temp$, 4, 1) & Mid$(temp$, 3, 1) & Mid$(temp$, 2, 1) & Mid$(temp$, 1, 1)
Next
calcS$ = ret$
End Function

クラスC

管理者としての私には多々悩みがあるんですが、そのうちのひとつに

「うちの会社のネットワークがクラスCで構成されている」

というものがあります。IPネットワークには大雑把にA,B,Cの3種類あって、Aは1600万個、Bは6万5千個、Cは250個のIPアドレスが登録できます。で、当時の私は

「250個もIPアドレスがあれば十分」

とクラスCを選びました。そして、現在ではクラスCのネットワーク3つがVPNでつながっています。で、ここで結論を書いてしまうと

「とりあえずクラスCを選んだのは失敗だった」

コンピュータは250台もつながないよ、と当時は思ったのですが、現在ではコンピュータ以外に

プリンタ(当時はパソコンにつなげていたが現在はネットワークに直接)
各種ルータ(当時は存在すら知らなかった)
無線アンテナ(当時はなかった?)
PBX(当時はネットワークにはつながらなかった)
IP接続型内線電話機(PBXにつながる)
各種製造に関する設備

といった感じで、とにかくIPアドレスを割り振る装置の種類が増えました。クラスCだとIPアドレスは1~254の数値を割り当てる感じなのですが、10番台は○○類、20番台は△△類、と分類するとすぐ足りなくなってしまいます。

で、いろいろとここに書く原稿を打ちながら達した結論は

1.吉見と塗装をクラスBのアドレスに変更する(トラブル少々?)
2.川口のアドレス192.168.A.0/24を、そのアドレスを含む192.168.0.0/16というネットワークに変更する(ほぼトラブルなし?)

が良いのかなと思っています。川口のアドレスを変更する場合には

印刷ができない
自分が保存したファイルが開けない
メールが送受信できない
インターネット経由でのHP閲覧ができない
工場への生産指示が出来ない
工場での検査結果入力ができない
工場設備の稼動状況がアップデートされない
インターネット経由での顧客からの注文データが受信できない
電話回線経由での顧客からの注文データが受信できない

といったことがあるでしょう。どうやってこれらの予想されるトラブルを回避しながら移行させるかが問題となります。

「求人情報」をcgi化

弊社HPの求人情報、ほとんど更新されたことがありません。というのも、求人情報を書き換えるにはhtmlを書いてサーバーにアップロードするという作業が必要になってしまうからです。
実は「どうせ誰も見ていないよ」と思っていたのですが、話を聞いてみると時々古い募集情報を見た方から連絡を頂くことがあるようです。

ということで、この部分もサーバー移転を機会にcgi化して、総務の方々自身で求人情報をメンテしてもらうことにしました。

さてさて、これで少しはHPが有効利用されるんでしょうか。

Direct3D

ファイル 33-1.jpg

Direct3D、知っている人にとっては懐かしい感じかと思います。Windows初期にグラフィック関連の遅さが問題になってから登場したもので、その一部として3次元処理をするものがDirect3D。

ずいぶん前に本を買っていろいろ調べ、その当時にCでexeを作っていたのですが、それを調べたら日付は1999年12月13日。たくさん種類のあるエアータンクを立体表示することで誰でも簡単にどんなタンクか分かるようにしようと途中まで作って止まってしまっていたものを今年に入ってから引っ張り出し、ヒマを見つけては少しずつ作っていきました。
前回の時の問題は「エアータンクを表示するためのデータをどうやって入力してメンテナンスするか」でした。表示するためのデータ入力では、その信頼性も疑問ですし数年後にはほとんど使えないものになりそうでした。
今回開発を再開する上でポイントになったのは、「以前に比べて私の管理下にあるデータが増えた」ということです。
部品手配のためのマスターとボディに穴をあけるためのタレパンのプログラム等を元に3次元データを作成して表示する、その名も「3Dガイド」。うちの会社ではすでに「塗装ガイド」、「仕上げガイド」、「EC嵌め込みガイド」、「ボス付けガイド」と呼ばれるものがありますが、それを補間するものとして使えそうです。3次元データですので、見る人が自由に見る角度等を変えられるため、きっと便利だと思います。

これがきちんと使えるようになるといいんですが、今はまだ参考程度ってとこです。何しろ、エアータンクの種類ってすごいたくさんあるので、検証と一部未対応のパーツへの対応が結構あるんです。