Windows 10 EnterpriseをApril 2018 Update(1803)してみる。

ノートPCで使っているVL版(ボリュームライセンス版)のWindows 10 Enterprise、1703なので先日出た1803に更新してみる。

前回のFall Creators Update(1703)それ以前のCreators Updateと比べて、今回は超簡単だった。スタート→設定→更新プログラムのチェック。あとは完了まで若干の操作を除いて放置するだけ。約1.5時間。

Win10EntUpd1803

で終わったところ。前回見た「お使いのPCは監視され、…」の表示は無くなった。

Win10Ent1803-1

Win10Ent1803-2

今回もちょっと不具合。

・スキャナのユーティリティEPSON SCANが消えた。前回も、前々回も発生したのと同じ症状。EPSON SCANを再インストールして復活。読み取り設定などは消えずに残っていた。

・Synapticsのトラックパッドが使えなくなった。今回初めて。Win+X→デバイスマネージャ→マウスと他の…からSynaptic PS/2…を関連ファイルごと削除→再起動で自動的に再認識。設定→デバイス→マウス→その他のマウスオプションを開くと新しいツールのセットアップが始まった。

不具合はこれくらいだった。細かいところがいろいろ変わってる。表示切替時の効果が早くなった(アニメーションが完了するまでの時間が短くなった)気がするが気のせい?

広告

『インサイド Visual InterDev』を読んだ。

ASPとVisual InterDevをいまさらちゃんと知りたくなったので『インサイド Visual InterDev』を古書で買ってきた。この本はアマゾンの英語版のレビューも「最悪!」っていう感じで書かれてるから、よっぽどひどいのだろう。今回読んだのはもちろん日本語版だが同じように感じた。

vid-ms1

「マイクロソフト公式解説書」シリーズって微妙で、詳しすぎてわけわからんすぎるか、とんでもない良書か、そうでなければただのウォークスルー・製品・新機能紹介。この本は後者。今更クラシックASPってのもどうかと思うが、なんでかASP.netな現在も「ASP最高!」ていう人もいるようで、ほーんそんなにええんかーと思ったのが起因。VIDがまだ現役だったころのウェブサイトといえばLAMP(Linux+Apache+MySQL+Perlとかの構成)がはやりだったが、個人的に管理してたイントラサイトはWIOP (Windows+IIS+Oracle+JSP)という変態構成だった。Windows ServerやOracleが比較的自由に使えたことと、MySQLとPHPが嫌いなことと、Linuxは他に使える人が居ないという理由で。MSのプロダクトはLinuxより好みだが、でもASPは「ダメなテクノロジー」と考えてたから使わなかった。

今回はVMWare14上にWindows NT 4.0 Workstation SP6にVisual Studio 97をセットアップして動作を確認した。すごくシンプルな感じで確かに「(ASP.netにはついてけないから)ASP最高!」になるのも分からなくも無いと思った。

vid-ms2

本の帯に「VB,VJ++を両方使いたいならコレ!!」って書いてあるからVJ++も使うんかと思ってわくわくしてたけど「VJと同じIDEが使える」とか「VJのプロジェクトも含めることができる」とかそういうことしか書いてない。サンプルプロジェクトもサンプルコードの1つも無し。この本ではVJ++は全然使えるようにならない。VBは「VBあればDesign-Time Control作れる」って書いてあってサンプルが載ってるけど「インターフェース」やら「コントロール」やらさらっと出てきて、この本だけではたぶん無理。しかもちゃんとやろうとすると(VB CCEでがんばるのでなければ)VB5 Professional以上が要るし、Design-Time Control SDKなんてのを追加で入れないといけないしで結構しんどい。しかもDesign-Time Control SDKは今は公開されておらず、MSDNサブスクライバダウンロードで「Web Control SDK and DDKs」という名で入手できたからMSDN入っててよかったと心底思った。この帯は「VBScript,JScriptを両方使いたいなら」を書き間違えたんだろう。

Web系・オープン系な人ですらもはや知らない人が多い気がする自称高機能Web開発環境Visual InterDev。この本はVisual InterDev 1.0がターゲットでこの環境もたいがいひどい。Visual Studio 97の開発環境とは言ってるが、オートコンプリートはおろかWYSIWYG編集もほぼできないしデバッガ機能も無いしできないことはFrontPageやその他のツールに丸投げ。自動FTP機能付きマルチファイルテキストエディタっていうくらいのが良い。もっと高機能なVisual InterDev 6.0は持ってるけどあえて使わないプレイ。

今更ASPでなんかしようというのは、いろいろ無理ゲーだとわかった。「(レガシー|クラシック)ASP最高!」と今から始めようとするのはよした方がいい。すでにMS含めてウェブ上の資料もかなり消滅してるし、ASPがダメだったのは歴史が証明している。

Advanced Windows 改訂第3版を読んだ。

Advanced Windows 改訂第3版を読んだ。

AdvWin3

Windows95が普及しきった時期に買って、第二章で挫折してから放置してた。よく似た装丁のプログラミングWindows95プログラミングWindows95 with MFCはどうにかこなしたが、これは無理だった。

あらためて読み返すとそこまで実はそこまで難しくは無い。16ビットから32ビットへ移り変わった時期の内容だが、Win16の知識がWin32プログラミングの役に立つのと同じように、現在でも十分通じる部分も多い。序章と第1章でWin32の概要説明が終わると、第2章でいきなり「カーネルオブジェクト」の解説が始まる。この構成が挫折の要因。第2章「カーネルオブジェクト」から第6章「仮想メモリの探求」までスキップして、第7章「アプリケーションでの仮想メモリの活用方法」から読み始めると最後まではこれまでに経験済みの内容やそれに関連した項目が多くて平易に読める。第18章「プロセス境界の突破」はまだ満足には理解できてない。

Windowsというかパソコンは「使ってれば分かるようになる」なんて言われるけど、それは単に使い方や表面上だけのお話。この本に載ってるようなカーネルオブジェクト、プロセス、メモリマネージャの動作、スレッド同期メカニズム、例外処理機構など「パソコンを使ってる」だけで知ることなんて絶対不可能だと思った。非プログラマーの感想としては、自作PCでOSのインストールができるとか、ExcelでVBAマクロが組めるとかのスキルも結構だが、こういった内容はギークの教養として知ってて損は無い(と思う)。

このシリーズ今は第5版まで出てて改訂第3版はアマゾンにも在庫が無いくらい古いが、他の二冊とあわせてもっと早く読み終えておくべきだった。この版はWindows NT4向けに書かれているがWindows95のこともちゃんと書いてあってちょっと得した感じ。64ビットWindowsが普及しきった現在、本当は第5版で64ビットのこともちゃんと勉強しないといけない。

MSプレスの本3冊読んで、ちょっとパソコンに詳しくなれたよ。

Googleの勧めるWindows 10 Pro Professional

Googleのスポンサー広告が完全に詐欺なソフト販売業者をサジェストしてきた。

outlaw

こういうふざけた出所がGoogleの豊富な資金になっていると思うと腹立たしい。精査とかザルなんかな。AdWordsの不適切な何とかのリンクを押した。

Windows 10 Pro Professionalってなんやねん。

DEBUG で クワイン その2

DEBUG (DEBUG.COM、DEBUG.EXE) で Quine その2。自分自身を出力するプログラムのx86アセンブラ版。

前回でクワインはできたが、標準出力だとリダイレクトするとDEBUG自身の出力がゴミになる。そのままでもエラーを無視すれば動かなくも無いが気持ち悪いし、標準エラー出力にするとリダイレクトできるのはNT系32ビットのCMDに限られて、DOSでは動かしにくいしであまり面白くない。クワインなら一発で自分自身を吐き出してほしい。

そこで結果は標準出力ではなくファイルに出力するようにした。ついでに「『自分自身を出力するプログラム』を出力する」機能も追加した。通常アセンブラで開発、デバックするときは次の手順になるが、

ソースコード→アセンブル→バイナリ→デバッグ

これだと

無→デバッグ→バイナリ+ソースコード

という意味不明なことになる。

クワインのコード(DEBUG.COMのレスポンス)

f100 630 0      
a100            
mov ah,3c       
mov cx,0        
mov dx,1a6      
int 21          
mov ax,3d01     
int 21          
jnc 113         
int 20          
mov bx,ax       
mov si,1c0      
mov di,40       
mov ah,40       
mov cx,10       
mov dx,si       
int 21          
mov ah,40       
mov dx,1a4      
mov cx,2        
int 21          
add si,10       
dec di          
jnz 11b         
mov si,1c0      
mov di,47       
mov ah,40       
mov dx,1a0      
mov cx,4        
int 21          
mov ah,40       
mov dx,si       
mov cx,10       
int 21          
mov ah,40       
mov dx,1a3      
mov cx,3        
int 21          
add si,10       
dec di          
jnz 13a         
mov si,5c0      
mov di,7        
mov ah,40       
mov cx,10       
mov dx,si       
int 21          
mov ah,40       
mov dx,1a4      
mov cx,2        
int 21          
add si,10       
dec di          
jnz 163         
mov ah,3e       
mov dx,1a6      
int 21          
int 20          
                
a1a0            
db"db ",27,d,a  
db"quout.txt",0 
                
a1c0            
db 'f100 630 0      '
db 'a100            '
db 'mov ah,3c       '
db 'mov cx,0        '
db 'mov dx,1a6      '
db 'int 21          '
db 'mov ax,3d01     '
db 'int 21          '
db 'jnc 113         '
db 'int 20          '
db 'mov bx,ax       '
db 'mov si,1c0      '
db 'mov di,40       '
db 'mov ah,40       '
db 'mov cx,10       '
db 'mov dx,si       '
db 'int 21          '
db 'mov ah,40       '
db 'mov dx,1a4      '
db 'mov cx,2        '
db 'int 21          '
db 'add si,10       '
db 'dec di          '
db 'jnz 11b         '
db 'mov si,1c0      '
db 'mov di,47       '
db 'mov ah,40       '
db 'mov dx,1a0      '
db 'mov cx,4        '
db 'int 21          '
db 'mov ah,40       '
db 'mov dx,si       '
db 'mov cx,10       '
db 'int 21          '
db 'mov ah,40       '
db 'mov dx,1a3      '
db 'mov cx,3        '
db 'int 21          '
db 'add si,10       '
db 'dec di          '
db 'jnz 13a         '
db 'mov si,5c0      '
db 'mov di,7        '
db 'mov ah,40       '
db 'mov cx,10       '
db 'mov dx,si       '
db 'int 21          '
db 'mov ah,40       '
db 'mov dx,1a4      '
db 'mov cx,2        '
db 'int 21          '
db 'add si,10       '
db 'dec di          '
db 'jnz 163         '
db 'mov ah,3e       '
db 'mov dx,1a6      '
db 'int 21          '
db 'int 20          '
db '                '
db 'a1a0            '
db 'db"db ",27,d,a  '
db 'db"quout.txt",0 '
db '                '
db 'a1c0            '
db '                '
db 'n quin.com      '
db 'r cx            '
db '530             '
db 'w               '
db 'g               '
db 'q               '
                
n quin.com      
r cx            
530             
w               
g               
q               

第一世代のジェネレータ(perlのコード)

#!perl

# DEBUG.COM用 クワイン ジェネレータ 2

# ソース前半部	(コメント中の”’はSBCS)
$part1 =<<EOT;
f100 630 0		# ごみ消去
a100
mov ah,3c		# DOSコール番号 空のファイル作成
mov cx,0		# 属性
mov dx,1a6		# ファイル名のアドレス
int 21			# DOSコール
mov ax,3d01		# DOSコール番号 ファイルオープン、書き込みモード
int 21			# DOSコール
jnc 113			# 成功したら続行
int 20			# 失敗したら終了
mov bx,ax		# 出力ハンドル。DOSコールでは不変なのでストアは1回だけ。stderrの場合は2にする。
mov si,1c0		# -- フェーズ1:実行ソース表示。埋め込みソース開始アドレス->SI (SIは表示文字列のポインタ)
mov di,40		# 64行が対象。残り7行は後半部になる。(DIは減算カウンタ)
mov ah,40		# DOSコール番号 ファイル出力
mov cx,10		# 1行は固定長16文字
mov dx,si		# 表示文字列アドレスをDXにセット
int 21			# 表示する
mov ah,40		# DOSコール番号 ファイル出力
mov dx,1a4		# CRLF文字列アドレス
mov cx,2		# 長さ2文字
int 21			# 表示する
add si,10		# 表示文字列ポインタSIを1行分(16文字)進める
dec di			# 行数カウンタデクリメント
jnz 11b			# 指定行数表示したらループ終了
mov si,1c0		# -- フェーズ2:埋め込みソース表示。ソースはDB ’...’ で囲む。SIは表示文字列のポインタ。
mov di,47		# 71行が対象。(全行)
mov ah,40		# DOSコール番号 ファイル出力
mov dx,1a0		# 文字列 ”DB ’” のアドレス
mov cx,4		# 長さ4文字
int 21			# 表示する
mov ah,40		# DOSコール番号 ファイル出力
mov dx,si		# 表示文字列アドレスをDXにセット
mov cx,10		# 1行は固定長16文字
int 21			# 表示する
mov ah,40		# DOSコール番号 ファイル出力
mov dx,1a3		# 文字列 ’CRLF のアドレス
mov cx,3		# 長さ3文字
int 21			# 表示する
add si,10		# 表示文字列ポインタSIを1行分進める
dec di			# 行数カウンタデクリメント
jnz 13a			# 指定行数表示したらループ終了
mov si,5c0		# -- フェーズ3:後半部ソース表示。
mov di,7		# 7行が対象
mov ah,40		# DOSコール番号 ファイル出力
mov cx,10		# 1行16文字
mov dx,si		# 表示文字列アドレスをDXにセット
int 21			# 表示する
mov ah,40		# DOSコール番号 ファイル出力
mov dx,1a4		# CRLF文字列アドレス
mov cx,2		# 長さ2文字
int 21			# 表示する
add si,10		# 表示文字列ポインタSIを1行分進める
dec di			# 行数カウンタデクリメント
jnz 163			# 指定行数表示したらループ終了
mov ah,3e		# DOSコール番号 ファイルクローズ
mov dx,1a6		# ファイル名のアドレス
int 21			# DOSコール
int 20			# 終了のDOSコール
			# a100コマンド終了の合図
a1a0			# 「エスケープ文字列」”db ”, ”,CR,LF の格納場所
db"db ",27,d,a	# CRLFだけの出力にも使う
db"quout.txt",0	# 出力ファイル名
			# a200コマンド終了の合図
a1c0			# 埋め込みソースの格納場所。次の行からがdb ’...’のプレースホルダになるが、同じなので中身は無し。
EOT

# ソース後半部
$part2 =<<EOT;
			# a300コマンド終了の合図
n quin.com		# 実行ファイル生成時(wコマンド)のファイル名指定
r cx			# ファイルサイズは 600h バイト
530
w			# ファイルに書き込み
g			# 実行コマンド
q			# 終了コマンド
EOT

# #
$part1 =~ s/#.+?\n/\n/g;
$part2 =~ s/#.+?\n/\n/g;

$part1 =~ s/[  \t]+?\n/\n/g;
$part2 =~ s/[  \t]+?\n/\n/g;

print $part1;
@escp = split(/\n/, $part1.$part2);
foreach $itr (@escp) {
	$line1 = "db '".$itr;
	$line2 = " "x (20-length($line1))."'\n";
	print $line1.$line2;
}
print $part2;

実行結果

DOSKEYでマルチコマンド実行。Q1.TXTはジェネレータが生成した第一世代のコード。セマンティクスは同じだが余分な空白が無いので第一世代だけは第二世代以降とは若干異なる。
quin_dbg2-1

Q2.TXTは第二世代のコード、QUOUT.TXTは第三世代のコード。
quin_dbg2-2

コード(DEBUGのレスポンス)をDEBUGにかけるとファイルを2個生成する。自分自身はQUOUT.TXTに、自分自身生成プログラムはQUIN.COMに出力する。そしてQUIN.COMを実行するとQUOUT.TXTを生成する。これも前世代と同じ内容になる。(何を書いているかよくわからなくなった。)
quin_dbg2-3

 

DEBUG.COM の wコマンドがポイントで、あらかじめBX、CXにサイズをセットしておくとnコマンドで指定したファイルにCS:100hか指定アドレスからBX、CXにセットされた長さだけバイナリで保存する。これでメモリイメージを保存できる。

書式
w [セグメントアドレス:オフセットアドレス]

機能
セグメント:オフセットアドレスから (BX << 16 | CX)バイト書き込む。アドレス未指定なら CS:0100h が先頭。

DEBUG で クワイン。

DEBUG で Quine。

かつてDOSで標準装備されて今も32ビット版のWindowsについている DEBUG.COM (DEBUG.EXE)で Quine を書いた。やってることはMASMでクワインと同じ。書き直してるのでちょっとはマシかも。

・quin.txt

a100
mov bx,1
mov si,300
mov di,33
mov ah,40
mov cx,10
mov dx,si
int 21h
mov ah,40
mov dx,204
mov cx,2
int 21h
add si,10
dec di
jnz 109
mov si,300
mov di,36
mov ah,40
mov dx,200
mov cx,4
int 21
mov ah,40
mov dx,si
mov cx,10
int 21h
mov ah,40
mov dx,203
mov cx,3
int 21h
add si,10
dec di
jnz 128
mov si,630
mov di,3
mov ah,40
mov cx,1
mov dx,si
int 21h
mov ah,40
mov dx,204
mov cx,2
int 21h
add si,10
dec di
jnz 151
int 20h

a200
db"db ",27,d,a

a300
db 'a100            '
db 'mov bx,1        '
db 'mov si,300      '
db 'mov di,33       '
db 'mov ah,40       '
db 'mov cx,10       '
db 'mov dx,si       '
db 'int 21h         '
db 'mov ah,40       '
db 'mov dx,204      '
db 'mov cx,2        '
db 'int 21h         '
db 'add si,10       '
db 'dec di          '
db 'jnz 109         '
db 'mov si,300      '
db 'mov di,36       '
db 'mov ah,40       '
db 'mov dx,200      '
db 'mov cx,4        '
db 'int 21          '
db 'mov ah,40       '
db 'mov dx,si       '
db 'mov cx,10       '
db 'int 21h         '
db 'mov ah,40       '
db 'mov dx,203      '
db 'mov cx,3        '
db 'int 21h         '
db 'add si,10       '
db 'dec di          '
db 'jnz 128         '
db 'mov si,630      '
db 'mov di,3        '
db 'mov ah,40       '
db 'mov cx,1        '
db 'mov dx,si       '
db 'int 21h         '
db 'mov ah,40       '
db 'mov dx,204      '
db 'mov cx,2        '
db 'int 21h         '
db 'add si,10       '
db 'dec di          '
db 'jnz 151         '
db 'int 20h         '
db '                '
db 'a200            '
db 'db"db ",27,d,a  '
db '                '
db 'a300            '
db '                '
db 'g               '
db 'q               '

g
q

32ビット版Windowsならコマンドプロンプト内で起動してるdebug.comにコピペでも流し込めるが106/109キー配列だと文字化けするので”を*に、’を:に置換するとうまく動く。それでもsymdebと違ってリダイレクトできないし、逆スクロールもできないからちゃんと動いてるのかわかりにくい。コマンドラインでリダイレクトを使って

debug < quin.txt > q2.txt

てやるとq2.txtに結果が保存される。要らないメッセージやエコーバックも保存されのでそこは手動で削る。結果は標準出力でなくファイルに保存したほうがよいかも。32ビット版のWindowsなら標準エラー出力に変更して2>&1でリダイレクトとすると出力を削らなくてもソースを取得できる。

quindebug

※ジェネレータは冗長なので削除。Ver2に載せる。

debugでquineなんて変人の仲間入りになるかと思ったが、アセンブラで素直に書くと正直わかりやすすぎる。全く難解プログラミングな感じがしない。RubyやCのクワインのほうがずっとわかりにくいし、わかりにくく書ける。

MASMでクワイン。

MASMでQuine。

世の中のハッカーはDOSもMASMも嫌いなんだろう。x86なアセンブラのクワインを探すとLinuxでとか、Bootableだとか、gnu asでとか、NASMでとか、DB(Define Bytes)だけのとかは出てくるのに純粋なDOSのMASM文法準拠のは、どうやっても見つけられなかったので書いた。MSCで書けるならMSアセンブラだってできるはず。(ウィルスのような)自己増殖コードを書く時でなければ、あまり役にも立たないことは分かっているのでやっつけ。動くだけ。特に短かくもない。むしろ長い。

参考 : クワイン – Wikipedia

先に結果から。

quinmasm

 

アセンブリコード quin.asm (実際にはスクリーンキャプチャのq2.asm)

code segment          
 assume cs:code       
 assume ds:code       
llen equ 22           
nlen equ 65           
 org 100h             
sta:                  
 mov dx,offset sr     
 mov di,nlen-2        
lp1: mov bx,1         
 mov cx,llen          
 mov ah,40h           
 int 21h              
 add dx,cx            
 mov si,dx            
 mov dx,offset crlf   
 mov cx,2             
 mov ah,40h           
 int 21h              
 mov dx,si            
 dec di               
 jnz lp1              
 mov si,offset sr     
 mov di,nlen          
 mov bx,1             
lp2:                  
 mov dx,offset dstr   
 mov cx,5             
 mov ah,40h           
 int 21h              
 mov dx,si            
 mov cx,llen          
 mov ah,40h           
 int 21h              
 add dx,cx            
 mov si,dx            
 mov dx,offset qstr   
 mov cx,3             
 mov ah,40h           
 int 21h              
 dec di               
 jnz lp2              
 mov si,offset sr+1386
 mov di,2             
lp3:                  
 mov dx,si            
 mov cx,llen          
 mov ah,40h           
 int 21h              
 add dx,llen          
 mov si,dx            
 mov dx,offset crlf   
 mov cx,2             
 mov ah,40h           
 int 21h              
 dec di               
 jnz lp3              
 mov ax,4c00h         
 int 21h              
qstr db 39            
crlf db 0dh,0ah       
dstr db " db ",39     
sr:                   
 db 'code segment          '
 db ' assume cs:code       '
 db ' assume ds:code       '
 db 'llen equ 22           '
 db 'nlen equ 65           '
 db ' org 100h             '
 db 'sta:                  '
 db ' mov dx,offset sr     '
 db ' mov di,nlen-2        '
 db 'lp1: mov bx,1         '
 db ' mov cx,llen          '
 db ' mov ah,40h           '
 db ' int 21h              '
 db ' add dx,cx            '
 db ' mov si,dx            '
 db ' mov dx,offset crlf   '
 db ' mov cx,2             '
 db ' mov ah,40h           '
 db ' int 21h              '
 db ' mov dx,si            '
 db ' dec di               '
 db ' jnz lp1              '
 db ' mov si,offset sr     '
 db ' mov di,nlen          '
 db ' mov bx,1             '
 db 'lp2:                  '
 db ' mov dx,offset dstr   '
 db ' mov cx,5             '
 db ' mov ah,40h           '
 db ' int 21h              '
 db ' mov dx,si            '
 db ' mov cx,llen          '
 db ' mov ah,40h           '
 db ' int 21h              '
 db ' add dx,cx            '
 db ' mov si,dx            '
 db ' mov dx,offset qstr   '
 db ' mov cx,3             '
 db ' mov ah,40h           '
 db ' int 21h              '
 db ' dec di               '
 db ' jnz lp2              '
 db ' mov si,offset sr+1386'
 db ' mov di,2             '
 db 'lp3:                  '
 db ' mov dx,si            '
 db ' mov cx,llen          '
 db ' mov ah,40h           '
 db ' int 21h              '
 db ' add dx,llen          '
 db ' mov si,dx            '
 db ' mov dx,offset crlf   '
 db ' mov cx,2             '
 db ' mov ah,40h           '
 db ' int 21h              '
 db ' dec di               '
 db ' jnz lp3              '
 db ' mov ax,4c00h         '
 db ' int 21h              '
 db 'qstr db 39            '
 db 'crlf db 0dh,0ah       '
 db 'dstr db " db ",39     '
 db 'sr:                   '
 db 'code ends             '
 db ' end sta              '
code ends             
 end sta              

asm.bat はよくあるアセンブル-リンクのバッチ。

@echo off
masm %1;
link %1;
exe2bin %1 %1.com

アセンブラでのクワインは結構自由に書けてしまってDOSのCOM形式ならば次のような方式はすぐに思いつく。

・自分自身のメモリイメージをダンプ表示する。
・自分自身を逆アセンブルする。

これだとcat $0したみたいで手抜き感があって嫌だ。それにメモリイメージをダンプせずに他の.comか.exeに書き出せば自己複製ウィルスの出来上がりっていうのも嫌な感じ。

ここではそれ以外の方法で、以前MSVC++で書いたような「普通の手続き」でやった。アセンブラの場合は「文字列置換」みたいな軟弱なことができないから、自分自身のコードを db ‘…’ に埋め込んでおき、通常のコードとして表示する部分と、それ自身のデータ部として db ‘ と ‘ で挟んで表示するように、前半部、db表示部、後半部の3パート構成とした。 db部は手抜きするために固定長にしてある。長さはllenで定義してるのに式にすると長すぎるoffset sr+1386のところハードコーディングなのがダサい。

TVアニメに浸透してきたIoT家電

名探偵コナン  – 第898話「ケーキが溶けた!」
http://www.ytv.co.jp/conan/archive/k11691017.html

複雑な人間関係を理解する必要があるソーシャルな事件が、多いが今回は技術的な事故で分かりやすかった。というかつっこみどころ満載なんでエントリのネタにする。

・内容
喫茶店の冷蔵庫に保管してあるケーキが溶ける日がある。

・原因
タクシー無線がIoT家電の電気ポットに干渉して誤動作、発生した蒸気が冷蔵庫に入って温度が上昇したため。

安室は「電気ポットとタクシー無線の周波数が同じで電波干渉を起こした。」というような発言をしているが公安警察で陸上特殊無線技士の従事者免許を持っているはずなので、これはまずいだろう。電気ポットの周波数がタクシーと同一であることが事実なら電気ポットは技適を受けいていないか、タクシーが違法無線機を使っていることになる。

電気ポットは電源以外接続されていないようだし、1分で沸くタイプではなくて外出先から指示するくらい沸くまで長時間かかるようで、しかも外来電波で誤動作するような安物だから独自の周波数を使っているとも思えず、技適の有り無しは別にしてWi-Fi接続されているのだと思う。2.4GHz帯。

タクシーは配車センターとハンドマイクで交信していた。今どきの配車はシステム化されてて緊急時でなければいちいちオペレータと音声で交信することは少ない。デジタル変調されたつまらない信号が瞬間的に送られて、運チャンへの指示も画面に出るだけ。ただ、このタクシー会社は毎日のように運チャンが道端で指示まで眠てるとか、超絶ブラックな感じがするし、いろいろ遅れているのだろう。もうアナログのタクシー無線は使えなくなっているから、壊れかけの古い無線機を改造して違法無線局として運用しているに違いない。450MHz帯。

ところで探偵バッチもアガサ博士の「すごく高くまで飛べる」ドローンすら誤動作を起こすほどとなると、車両に設置された無線機並みに高出力なのだろうということも想像に難くない。ドローンも黒の組織にクラックされてなくてよかったね。

探偵バッチの所持者とタクシー会社は違法無線局を開設しており街中の機器を誤動作させている可能性大

前日の残り湯を放置したまま店を閉じたり、電気ポットと冷蔵庫を隣り合わせに置くような喫茶店の衛生状態が気になる。

受信趣味はオワコン

アマチュア無線は無線機も免許も処分して広帯域受信機だけが残ってた。

バーテックススタンダードのVR-500。割と高級機でSSBとCWに対応してるのでLF/HF/50/144/430/1200MHzのアマチュア無線をオールモードで受信できることとAM/FM/短波放送を聴くこと以外はマリンバンドとエアバンドと特小・CBの受信くらいしかできなくなってしまった。

それ以外の国内のいわゆる「おもしろ無線」は近年ほぼすべてデジタル化完了。以前は警察無線以外の大半がアナログFMだったのでコードレスでご近所の情報を収集したり、携帯の無駄な会話をこっそり聞いたりという悪趣味なことをはじめ、消防無線で真っ先に火事場を突き止めたり、電車の遅延情報を正確に知るとか、バス・タクシー無線で道路情報を収集、そのほか業務無線とかワイヤレスマイクとか楽しみ方はかなりいろいろあった。現在はお仕事無線の大半がデジタル化されて、消防・防災無線すらデジタル化完了で災害対策などという大義名分も成立せず。コードレスも大半2.4GHz帯のデジタルで380MHz帯はガラガラ。盗聴器もデジタル化されつつある。残るは地元の400MHz帯のJR Cタイプ無線、150MHz帯のバス無線くらい。これもいつまでアナログが続くか。

真空管アンプに今も需要があるのとは対照的に真空管ラジオがニッチであるのと同じように、アマチュア無線に対して受信趣味はニッチだ。遊び方としてデジタル変調を解読しようとか、バズ音で発振源を特定しようとか、そういう技術的な楽しみ方もあるが手軽さや面白さに欠けるし、デジタル変調を聞けるアダプタもでてはいるものの、そこまでして聞く気も起きないし。エアバンドとマリンバンドくらいならアマ無線機の受信機能で十分だし、短波放送もネット配信で聴けるからBCLラジオすら要らない。当時もアマチュア無線の副次的行為ではあったが、ユーティリティ無線を受信して楽しむという行為は趣味としてももはや成立しない。BCLやオーディオと同様に90年代は楽しかったという過去の記憶となった。

広帯域受信機、ラジオライフ、アクションバンド電波、すべてが懐かしい。

そしてソニーの短波ラジオを残してVR-500も手放した。
趣味の無線よ、さようなら。

The 便乗商法。

今は無きB.H.AのB’s Recorder Goldが使いやすかったので、今は憎いソースネクスト製を使っているが、これにはアドウェアが漏れなく付いてくる。また変な広告が出てきた。

binjou

「新バージョンまたは他の製品への移行をお奨めします。」と脅したうえで、名前を出さずに「最新のOffice2016互換製品のユーザー割引も実施中です。」とソースネクストThink Free Office NEOへのリンクボタンを表示する。

Think Free Office NEOが超特価の1,980円で買えるトラッキング付きURL 3/31まで。
http://www.sourcenext.com/cp/s/1803/c_0000031661/?i=sss&utm_source=sn&utm_medium=sss&utm_campaign

Thinkfree.comから直接買うと5,599円、ソースネクストの通常価格でも3,480円なんでキャンペーン価格1,980円だと確かに安いんだけど、以前にソースネクストのポイント交換でThink Free Office1ライセンスもらってるんで要らんし。それすら使ってないし。

ほとんどのOfficeのまがいもの互換品にはAccess互換品が入ってないから使えん。Libre OfficeのBaseでがんばろうとしたけど代替はやっぱり無理。