binary viewer

tbasicが1.60になりました。これを機会にそのsamplesとして,いくつかのプログラムを作りました。ここではその中から,binary viewer を紹介します。プログラムの名前は,「Tiny Binary Viewer」で,ファイル名は「tbview.tbt」です。tbasic set 1.60 のsamples\Advancedの中にあります。

1.60では新たに,バイナリファイルの読み書きができる ReadAllBytes,WriteAllBytes関数・手続きをサポートしました。この使い方は,Tiny Basic for Windows ファイル操作編(2023年08月版)10節に書いてあります。簡単に言えば,ファイルの内容をバイト列として,読み書きするものです。
この機能を使えば,原理的には,バイナリエディタを作ることも可能ですが,利用目的が思いつかないので,今回は,binary viewerを作ることにしました。バイナリビューアはすべてのファイルのバイト内容を表示するもので。テキストファイル,画像ファイル,文書ファイル,実行ファイルなど,標準的な起動・開く方法とは異なった形式の表示を得ることができます。そして種々のファイルの舞台裏をつぶさに見ることができます。
今回色々なエンコーディングについて調べるときに,それらの内容の確認をするためには,テキストファイルをバイナリとして確認する必要がありました。そして, ユニコードへ(2023年8月版)を書く際に,実際にtbview.tbtを確認用として使いました。

tbview.tbtの起動画面は次です。

ここで,表示は16進表示,10進表示,アスキー表示が可能です。16,10進表示は0~255までの数値ですが,アスキー表示は,制御コードと印刷可能範囲で記号・数値・アルファベットが表示されます。
例えば,「1+1の計算」と記入したテキストファイルをシフトジスでファイル名「1足す1SJIS.txt」として保存して,この内容をバイナリビューアで表示させると,次のようになります。16進表示です。

見ると,ファイル内容は「31 2B 31 82 CC 8C 76 8E 5A」です。この結果は,ユニコードへ(2023年8月版)の23ページでシフトジスでの計算結果に合致します。
同様に,「1+1の計算」と記入したテキストファイルをエンコーディングEUCでファイル名「1足す1EUC.txt」として保存して,この内容をバイナリビューアで表示させると,次のようになります。

見ると,ファイル内容は「31 2B 31 A4 CE B7 D7 BB BB」です。この結果は,ユニコードへ(2023年8月版)の27ページでEUCでの計算結果に合致します。

プログラムは全体で,200行弱ですが,コントロール画面の設定がかなりの部分を占めています。実際,ファイルを指定して,その内容を表示するだけなら,数10行のプログラムで可能です。


工夫の余地はありますが,一応のツールとして使うことができます。興味があったらお試しください。

time stamp の変更

tbasicが1.60になりました。これを機会にそのsamplesとして,いくつかのプログラムを作りました。ここではその一つを紹介します。プログラムの名前は,「Time Stamp Changer」で,ファイル名は「tsChanger.tbt」です。tbasic set 1.60 のsamples\Advancedの中にあります。

このプログラムの目的はファイル,フォルダーのtime stamp を変えるものです。
ファイルやフォルダーにはtime stampと言った3種類の性質があります。「作成時刻,更新時刻,最終アクセス時刻」です。これらの性質は,ファイルの使用状況を示すもので,ファイルを右クリックして,表示させるプロパティでそれを見ることができます。
そしてこれは本来の性質上,変更すべきものではありません。

しかし,時には変更したい場合があります。これはそのような時のためのツールです。

time stampの変更は,よく使われる一般的機能なので,特別なものではありません。標準的なプログラミング言語で実現できると思います。また,プログラミング言語を使わなくても,Power Shellでも実現できます。
実はまた,tbasicでも,1.50で,「SetCreationTime,SetLastWriteTime, SetLastAccessTime」をサポートしましたので,この時点で,tbasic でも可能でした。
プログラムを書くのであれば,特定のファイルのtime stamp変更は数行で可能です。

今回1.60を機会にこのプログラムを作ったのは,機能と言うより,操作性を重視してツールとして作ったものです。tsChanger.tbtを起動すると次の画面になります。

フォルダ参照またはファイル参照をクリックして目的のファイルを確定します。
参照をクリックすると,例えば,次のような選択画面がでます。

確定すると,次の画面が出ます。そこで変更したい時刻を設定して,目的とするボタンを押すと,設定できます。例えば,次のようになります。

このように,ファイルの選択,設定等視覚的に,簡単にできます。tbasicでのコントロール画面の機能をフルに使ったものです。ver. 1.60で,コントロール画面の機能を少し強化し,それを使いました。

プログラムは全体で,約250行で,殆どがコントロール画面設定の部分です。

少数のファイルが対象なら,このままで十分に目的が果たされます。また,必要に応じてこのプログラムを変更すれば色々機能を追加することができます。

興味のある方は実行してみてください。

このプログラムの実行時の注意をあげます。
・使用中のファイルやフォルダの time stampは変更できません。
・ファイルですと開いているものなどです。
・フォルダの time stamp の変更は少し微妙です。
フォルダが使用中と言うことは,そのフォルダ下にあるファイルが使用中ということです。たくさんのファイルやフォルダを含むフォルダの場合,その中にあるファイル等が一つでも使われていると変更できなくなります。

ユニコードへ

ユニコードについての説明文書を更新しました。前の版は,2013年10月版ですから,10年ぶりの更新です。https://tbasic.org/reference/202308ToUnicode.pdf

近日中に tbasicをtbasicを1.6にバージョンアップします。その前に,関連する文書として公開することにしました。tbasicでの説明文書の中にユニコードについての用語等が出てきますが,それらを理解する上での基礎知識がまとめてあります。

2013年10月版のタイトルは「ユニコード」です。今回,2023年08月版のタイトルは「ユニコードへ」です。更新内容は,大幅な内容追加です。前の版は7ページでしたが,今回の版は51ページです。改版というより,新たに書いたといった方が良いかもしれません。ただ趣旨は前回と同じで,ユニコードに対する入門的な解説文書です。私自身ユニコードの専門家でないので,私が勉強をして,理解した内容をまとめたものです。私自身への覚書といってもいいかもしれません。

今回,tbasicを1.6にバージョンアップする際に,必要な(主に技術的な)知識を得るために,ユニコード関連の情報を色々読んで得た内容が主ですが,それだけでなく,ユニコードが普及する以前の状況,ユニコードの始まりの状況についても調べてみました。今回はそれらを纏めて,「ユニコードへ」というタイトルにしました。

少し長い文書ですが,ユニコードについての全体的な事柄が,分かるのではと思います。技術的な部分は,プログラミングを念頭に書いているので,その部分は必要な時に読むとして,最初は飛ばして読むのが良いと思います。

全体の内容は,以下の通りです。

目次
  • 第I部 ユニコードへ
    • 1 ユニコードとは {4頁}
    • 2 標準化への動き {4頁}
      • 2.1 7ビット符号 {5頁}
      • 2.2 8ビット符号 {8頁}
      • 2.3 文字集合の切り替え(ISO/IEC 2022)} {11頁}
    • 3 日本語環境 {14頁}
      • 3.1 符号化文字集合 {14頁}
      • 3.2 日本語の文字符号化方式 {19頁}
    • 4 ユニコードへ {29頁}
      • 4.1 始まり} {29頁}
      • 4.2 Unicode Ver.1(1991) {29頁}
      • 4.3 Unicode Ver.2(1996) {30頁}
      • 4.4 Unicode Ver.3(2000) {31頁}
      • 4.5 Unicode Ver.4(2003)とその後 {31頁}
      • 4.6 Unicodeの成果 {32頁}
  • 第II部 ユニコードの仕組み{33頁}
    • 5 ユニコード{33頁}
      • 5.1 符号化文字集合 {33頁}
      • 5.2 ユニコードの文字符号化方式 {36頁}
      • 5.3 Endian {37頁}
    • 6 UTFの仕組み {38頁}
      • 6.1 UTF-32 {38頁}
      • 6.2 UTF-16 {38頁}
      • 6.3 UTF-8 {39頁}
      • 6.4 BOM {41頁}
    • 7 正規化(normalization)}{43頁}
      • 7.1 結合文字 {43頁}
      • 7.2 等価性 {44頁}
      • 7.3 正規化 {45頁}
    • 8 フォント{46頁}
      • 8.1 フォント {46頁}
      • 8.2 日本語用のフォント {47頁}
      • 8.3 世界のフォント {49頁}
    • 9 まとめ {51頁}

Winidows 11

遅ればせながら,私も Windows 11が使えるようになりました。早速,tbasic 1.5の動作確認をしました。1.5はWindows 11 を認識できませんから,起動画面は,Windows 10 と同じで,

Windows 11 上でのtbasic1.5の起動画面

となります。samplesにあるプログラムも動作確認をしました。Fontサイズの微調整が必要なものもありましたが,これ以外は,特に問題なく,動作しました。画面表示は,Windows 10 と11では余り差異は無いようです。

期待通りと言うか,予想通り,問題なく動作するようです。取り敢えず一安心です。

Shift_JIS から UTF-8へ

少し前の話になりますが,昨年の秋から,今年の春にかけて,このホームページを運用しているサーバーのOSを更新しました。昨年の暮れまで動いていたOSは CentOS6.4でした。CentOS6はこのサイトを立ち上げた2013年から稼働していたOSです。随分長く利用していましたが,昨年暮れでセキュリティーアップデートが期限切れになるのを機に最新OSに更新することにしました。

当時2020年秋のCentOSの最新版はCentOS8でした。そこで,2020年11月 CentOS8 に更新しました。実はその直後,CentOSのサポートが2021年暮れに終了になることが公表されました。同じOSを長期に使い続けたいとのことから,CentOSでの運用を諦め,CentOS以外のOSを検討しました。検討やテストを行った結果,Oracle Linux を利用することにしました。今年の3月末には Oracle Linux 8.3をインストールし,運用を始めました。現在は Oracle Linux 8.4にアップデートしています。 Oracle Linux 8 は2029年5月まで,サポートされるようなので,長期にわたって利用できそうです。

今回のOSの更新はすべて新規インストールする必要があったので,サーバーを交換するなどの手順が必要になりました。その結果,かなり手間がかかり,約半年間かかりました。その間,旧OSから10年近い期間があったので,ソフトウエアの進歩を色々とかなり感じました。

その中で特に変化を感じたのが,http からhttpsへの移行でした。前回もそのような動きはありましたが,「それも可能」と言ったものでした。今回は,httpsでなければ,まともな運用ができないような状況で,ほぼ強制的にhttps化が迫られました。幸い,https化に必要な認証局登録が無料で可能な方法があったので,それを利用させてもらいました。セキュリティ強化の社会的方向からすれば自然な流れなのでしょう。

もう一つ感じたのが,Unicode化の流れでした。Unicodeは1990年代に始まるもう随分と昔からある流れですが,一般ユーザーが余り意識しないうちに徐々に浸透してきたようです。tbasicも,2010年にUnicode対応になっていますから,tbasicも Unicode化の流れ に乗っていました。しかし今までのtbasic でのUnicode化の実際の恩恵は,半角全角の区別なく,文字列処理が可能となることくらいでした。しかし,現在のUnicode化の流れは,文字コードを積極的にUnicode化するというものです。

サーバー関係の種々のファイルがデフォルトでUTF-8となり,それを標準とする流れです。勿論,UTF-8化の傾向は以前からありました。しかし,今回はさらに進んでサーバー設定のいくつかのところで半ば強制的にUTF-8とさせられた感じがします。Windows上では,現在でもShift_JISが多く使われていますが,UTF-8への流れはWindows上でも確実に進んでいます。実際,Windowの標準エディターであるメモ帳でのデフォルトEncodingがBOM無し,UTF-8になったことが,少し前ですが話題になりました。

他方,近年web等で,日本語の文章の中に,外国語や外国語から派生する用語をよく目にするようになりました。例えば,翻訳サイトでは,日本語と外国語が並列して表示されています。しかし,元々初期のコンピュータではアルファベットと数字しか扱えませんでした。その後,日本では,日本で使用するコンピュータのハード的な改良と,ソフト的な工夫がされ,1980年代には,日本用のコンピュータで日本語,特に漢字が使えるようになりました。
世界的にも同様な状況があり,各国で自国向けのコンピュータの改良が行われ,そのコンピュータで自国向けの自国語文字が使えるようになりました。1991年には,Unicode制定のための非営利国際的組織Unicode Consortium が発足しました。そして,1991年10月にその仕様書”The Unicode Standard Version 1.0″が発表されました。その後更新が続けられ,2021年現在最新版はversion13です。

Unicode を使うと,一つの文書に多国語が混在して使用できるようになります。Shift_JISコードで書かれた日本語の文章にtrès bienと言う言葉を含めることはできませんが,Unicodを使えば混在が可能です。このブログでは,今見ているように,日本語の文書の中にフランス語 très bien を同時に表示できていますが,これは,ブログソフトwordpressがUnicodeの一つであるUTF8でで書かれていることに依ります。

このようにUnicodeが作られてから30年,種々のところで,その利用が顕在化してきました。tbasicも既にUnicode対応ですが,その効用の,より活用を考える時期かも知れません。次期のバージョンアップでは,その辺りの強化を考えてみることにします。

画像の切り貼り

最近,バスの時刻表の一部分を切り貼りして,印刷する必要がありました。
その時刻表は,利用する路線の一日のすべてのバス停の時刻が掲載された,JRの時刻表のような形式のもので,バス会社のホームページにありました。それはその路線の一日すべての時刻表ですから,かなり大きなものです。でも実際に必要なのは,その一部分です。つまり,その中から,乗車するバス停の発車時刻と,降車するバス停の到着時刻の部分が必要です。すぐに思いつくのは,全体を印刷して,必要な部分をハサミで切り抜いて,それらをテープ等で張り付けて一枚の紙にして使うことです。

全体を一枚の紙に印刷すると,字が小さすぎて見にくくなるので,その部分を拡大コピーする必要があります。往路,復路,平日,休日とあるので,この方法だと,全部で8枚の紙に印刷して,それらを切り貼りすることになります。手間は大したことはありませんが,紙の無駄にもなりますし,出来上がりもスマートではありません。何か工夫をして,1枚の紙に印刷するだけで,目的を達することはできないでしょうか。

私は,tbasicを使って必要な画像を何枚か切り抜いて,それらを一枚の画像にまとめて印刷することにしました。いくつかの作業の結果,1枚の用紙に必要な情報をすべて印刷することができました。

これらの作業は,単に画像を切り取り,張り付けただけで,特に難しいことではありません。画像処理用のツールを使えば可能でしょう。そのようなツールが身近にあり,使い慣れていれば,それを使うのが良いでしょう。私はtbasicを使い慣れているので,それを使って処理することにしました。
以下ではそこで使ったtbasicの技法・プログラムについて紹介します。処理は,画像の切り取りと,それらの貼り付けです。処理としては独立なので,分けて説明します。
例は時刻表ではなく,スナップ写真を使うことにします。

画像の切り取り

大きな画像から,特定の部分を切り抜くには,LoadPictureとSavePictureを使えば簡単にできます。ここでは私がデジカメで撮影した2048×1568の画像を例にして説明します。(以下の画像は画面に合わせて縮小されて表示されています。)この画像から2羽の鳥の部分を切り抜くことを考えます。

full.jpg(大きな画像のため縮小されています。)

一つの方法として,tbasicのsamplesにある,Trimming.tbtを使う方法があります。このプログラムを起動すれば,必要な部分を切り抜くことが簡単にできます。しかし,ここではそれほど大げさなことをせずに,次のプログラムを書いて切り抜きました。

ChDir GetProgramDir
GScreen(2048,1536,2048/2,1536/2)
GStretch On 
LoadPicture("full.jpg")
GLocate(750,650)
SavePicture("part1.png",500,400)

1行目の ChDir GetProgramDir は,ファイル読み込み系のプログラムでの定型的文です。このプログラム自体と,ここで読み込むfull.jpgを同じフォルダーに保存して実行することを指定します。これによりファイルのパスを気にすることなく,LoadPictureやSavePictureを実行することができます。
2行目のGScreenは,画像の大きさのグラフ画面を開きますが,2048×1536と大きく,ディスプレイに収まらないので,グラフ画面は幅,高さをそれぞれ半分にして開きます。
このままでLoadPictureを行うと,画像全体は画面に収まらず,スクロールモードになり,一部分しか表示されません。これを避けるため,画像を縮小して画面全体に収めるようにする命令が,3行目の GStretch です。この命令は画像を表示するとき縮小するだけで,元の画像の変更は行いません。
4行目で,画像をLoadします。 GStretch On としてあるので,元の画像の1/4が表示されています。この表示されたが像の必要な部分を切り取ります。
5行目のGLocateは切り取る左上の座標を指定しています。
6行目は,上の位置から500×400の部分を切り取り,part1.pngとして保存します。このプログラムで作成したpart1.pngは次です。

part1.png

同様にして,上のプログラムの最後の2行を以下に変更して,実行しpart2.pngを作成します。

Glocate(1340,550)
SavePicture("part2.png",500,400)

このプログラムで作成したpart2.pngは次です。

part2.png

上のプログラムで,GLocateの数値を決めるために,少し試行錯誤をする必要があるかもしれません。適当に数値を変えて,実行するだけですが,切り抜いた部分をグラフ画面で確認できると分かり易いです。そのために,実際に私は上のプログラムを少し変更たものを試行錯誤用に使いました。それは次です。

XP = 750 : YP = 650
ChDir GetProgramDir
GScreen(2048,1536,2048/2,1536/2)
GStretch On 
LoadPicture("full.jpg")
GLocate(XP,YP)
SavePicture("part1.png",500,400)
GDrawWidth = 2
Line (XP,YP)-(XP+500,YP+400),,B

追加部分は,GLocate の位置をXP,YPとして,切り抜いた部分を矩形で囲んだものです。GDrawWidthは見やすさのため,少し太い線を指定しています。このプログラムで,XP,YPの部分を色々変更して,実行すれば目的に合った部分を切り抜くことができます。

画像の貼り付け

part1.pngとpart2.pngを一つの画像に纏めます。縦に並べることもできますが,ここでは横に並べてみます。プログラムはとても簡単です。以下のプログラムで貼り付けができます。

ChDir GetProgramDir
GScreen(1000,400)
LoadPicture("part2.png")
GLocate(500,0)
LoadPicture("part1.png")
SavePicture("paste.png")

このようにして出来上がった,paste.pngは次です。

まとめ

画像の切り貼りは,よく使われる一般的な処理ですから,tbasicを使わなくても勿論可能です。画像処理用のソフト,ワープロ等で可能でしょう。身近に使い慣れたそれらのツールがあれば,そちらを使うのが良いかもしれません。一方tbasicは汎用的なプログラミング言語ですから,これを使って色々なことが可能です。簡単な処理であれば,実行速度も全く問題ありません。tbasicを使い慣れることで,色々な処理が簡単に行えるようになります。

BASIC (beginners’ all-purpose symbolic instruction code)

ランダム文字列の生成

このところ,何度かサーバーをインストールする機会がありました。その際いくつかのソフトウェアをインストールするとき,ランダムな文字列を設定ファイルに書き込む必要がありました。例えば,このブログのソフトウエアであるwordpressのインストールには,その設定ファイルに65個のランダム文字列を8種類入力する必要があります。また,データベースを管理するソフトウエア,phpMyAdminのインストール時にもランダムな文字列の設定が求められます。
勿論ランダムな文字列を入れれば良いので,手で適当に入力しても間に合います。また,そのような文字列を生成するツールも用意されている場合もあります。
しかし,作成プログラムを自分で作ってみたくなるのも事実です。実際,ランダム文字列の作成は色々な状況で起きるので,類似のプログラムは実は何度も作っています。ここでは,その簡単なひな形を紹介します。小さなプログラムで,少しの手直しで,色々に対応できます。

基本のひな形

アイデアはとても簡単です。選ぶ文字の集合を決めて,その集合の中からランダムに文字を選択することを繰り返すだけです。

選ぶ文字の集合

例えば,文字ABCDEFGから選ぶとして,その集合を数学の記号で表すと{A,B,C,D,E,F,G}となります。しかし,残念ながらtbasicには,集合という対象はありません。そこで,その代わりに,文字列”ABCDEFG”を使うことにします。勿論,集合と文字列は別な対象ですが,文字列にもその中の一つの文字を取り出すという操作が可能です。ですから,文字列でも選ぶ文字の集合としての役割を果たせます。具体的には,Mid$関数を使うと,文字列”ABCDEFG”から,例えば,”E”を選ぶことは,Mid$(“ABCDEFG”,5,1)で可能です。

一般に文字列T$から,n番目の文字を選ぶには,Mid$(T$,n,1)によって可能です。ですから,文字の集合からランダムに文字を選ぶことは,文字の集合の元で文字列を作り,その文字列の中から,ランダムに一つ選ぶことと同じになります。

例えば上の例で,{A,B,C,D,E,F,G}からランダムに一つの文字を選ぶことは,文字列”ABCDEFG”からランダムに一つの文字を選ぶこと。そしてこれはMid$関数を使えば,1から7の間の数をランダムに選ぶことと同じになります。

ランダムに取り出す

ランダムに取り出す操作は,Rnd関数を使います。Rnd関数は0≦x<1となる数xをランダムに与えます。ランダムな数を与えるのが関数と言うのは違和感を感じますが,正確に言えば,Rnd関数はランダムに見える数を与える関数です。Rnd関数は0≦x<1となる数xを与える関数ですが,例えば7倍すると,0≦7x<7をですから,使って,例えば,1から7の間の数をランダムに得るには,Int(7*Rnd)+1を使います。切り上げ関数Ceilを使ってCeil(7*Rnd)としても同じです。

一般に,1からmまでの間の自然数をランダムに得るには,Int(m*Rnd)+1または,Ceil(m*Rnd)によって可能です。

この操作を繰り返せば,ランダムな文字列を取り出すことができるような気がします。しかし少し問題があります。Rnd関数はランダムに数を出力するのではなく,ランダムに近い数を出力します。正確には,Rnd関数は初期値(シード:種)から,順次決まった数列を出力します。tbasicの場合,プログラム実行時にRnd関数に決まった初期値を設定します。ですから,プログラムを実行後最初のRnd関数の値はいつも同じです。ですから,繰り返しで出力される数の列はいつも同じです。初期値が同じなら,同じ数が出力されますから,これを避ける必要があります。それには初期値を色々と変化させれば可能です。その処理を行うのがRandomizeです。

Randomize

Randomizeは,Rnd関数の初期値を設定します。 Randomize x の書式も使えますが,これは特別な時に使うもので,普通は Randomize の形で使います。これは内蔵時計の時刻を使って初期化する方法で,簡単ですが,適切な方法です。Rnd関数を使い始めるとき,一回使うだけで十分です。

以上のことを注意すると,プログラムは簡単に書けます。

まず,ランダムに選ぶ文字列の集合を決め,それを文字列で表します。これを例えば,RandChS$としましょう。上の例,{A,B,C,D,E,F,G}からランダムに一つの文字を選ぶ場合ならば,RandChS$=”ABCDEFG”です。その個数をNumRChSとします。NumRChS=Len(RandChS$)です。求めるランダム文字列をRndStr$,その長さをLenRStrとします。
プログラムの構成はRandChS$を決め,LenRStrを決めて,上の基本のひな形を使えば良いだけです。例えば次のようにプログラムが書けます。

プログラム例

RandChS$ = "0123456789"
RandChS$ = RandChS$ + "abcdefghijklmnopqrstuvwxyz"
RandChS$ = RandChS$ + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LenRStr = 20
NumRChS = Len(RandChS$)
Randomize
RandStr$ = ""
For i = 1 To LenRStr
   r = Ceil(NumRChS * Rnd)
   RandStr$ = RandStr$ + Mid$(RandChS$,r,1)
Next i
Print RandStr$

ここで,RandChS$は,”0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”ですが,長いので,見やすいように3行で設定しています。RandChS$の指定を変えることで,色々なランダム文字列を生成できます。

上のプログラムは簡単なものですが,状況に合わせ,少しの手直しで,色々な状況に活用できます。

ディスクの内容を完全に消去する

最近,古くなったハードディスクを廃棄することにしました。大切なファイルも保存したこともある,随分と使ったディスクです。愛着もあるのですが,古くなって,速度も容量も不足に感じるようにもなり,そしてそろそろデータ破損の心配も出てきたので,思い切って廃棄することにしました。ディスクに残っていたデータを整理し,削除したり,他のディスクに移したりして,内容をすっかり空にしました。更にフォーマットをかけて,まっさらのディスクにしましたが,まだ完全にディスクの内容が消されたという確信は持てません。

実際,特別なツールを使うと,削除やフォーマットしたディスク内容が復元できるようなことも聞きます。これは,フォーマットやデータ消去が実体としてのデータの消去ではなく,それを紐付けしたインデックスの消去で,実体は残っていることのようです。ツールや,フォーマットオプションによって更に完全に消去するすることが可能なようですが,それらの処理が実際に何を行っているのか明確でないと,本当に完全に消去されたのか不安が残ります。

そこで,このような場合私は,tbasicを使って完全にデータを消去しています。方法は全く簡単で,

「無意味なデータでディスクを満たし,そのうえでフォーマットする。」

ということです。無意味なデータとは例えば,0 のみからなるデータです。そして例えば100Mバイトのテキストファイルが1000個あれば100Gのディスクが満杯になります。このディスクをフォーマットしたものは,どのような解析を行っても0のみからなるデータが抽出されるだけで,何かの情報が盗まれることはありません。

無意味なデータでディスクを満たすことは次を組み合わせて可能です。
1.0のみからなる100Mのテキストファイルzero.txtを作成する。
2.zero.txtを1000個複製する。

1zero.txtの作成はtbasicでは次のプログラムで可能です。

 A$=""
 For i=1 To 1022
   A$=A$+"0"
 Next i
 Open "Zero.txt" For Output as #1
 For i=1 to 102400
    Print #1, A$
 Next i
 Close #1

2.zero.txtを1000個複製は次のプログラムで可能です

For i=1 To 1000
   ID$=Right$("0000"+Trim$(Str$(i)),4)
   Print ID$
   FileCopy "Zero.txt", "Zero"+ID$+".txt"
Next i

これらの処理は,消去しようとするディスク(例えばXドライブ)をカレントディレクトリにして実行します。それぞれのプログラムの先頭にそれぞれ,

ChDir "X:\"

を書きます。このようにしてプログラムを実行すれば,Xドライブに1001個のzeroのみからなる100Mのテキストファイルが作成されます。ディスクの容量に応じて,zero.txtの大きさや個数を調節すれば,数テラバイトのディスクも0で満たすことができます。

これらの処理の速度は主に,ディスクの書き込み速度に依存しますので,tbasic以外の言語で同様な処理を行っても速度は変わらないと思います。ですから,上のプログラムによる,ディスクデータ完全消去法は,実際に使って効果のある現実的なものです。実際,この方法は私がディスクを廃棄する際にいつも使っている方法です。このように,

tbasic の小さなプログラムで効果あるツールを作成することができます。

新サーバー

tbasic.org のホームページのあるサーバーが新しくなりました。旧サーバーで使用されていた,OSが,メンテナンス期限が切れる時期になったので,これを機に新しいサーバーに新しいOSをインストールして,そちらに移転しました。特に今までと大きな違いはないのですが,新サーバーでは,サーバー証明書も取得しましたので,鍵マークの付いた
https
による接続で,「安全な接続ではありません」と言った表示が出なくなりました。つまり,「安全な接続です」ということですが,実際は,このサイトでは公開情報しか扱わないので,今までも危険な接続ではありませんでした。

1 2 3