ランダム文字列の生成

このところ,何度かサーバーをインストールする機会がありました。その際いくつかのソフトウェアをインストールするとき,ランダムな文字列を設定ファイルに書き込む必要がありました。例えば,このブログのソフトウエアである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
による接続で,「安全な接続ではありません」と言った表示が出なくなりました。つまり,「安全な接続です」ということですが,実際は,このサイトでは公開情報しか扱わないので,今までも危険な接続ではありませんでした。

tbasicセット 1.51を公開しました。

tbasicセット 1.51(tbw151set.zip)を公開しました。

 本体の言語機能は1.502と同じですが,
・Basic入門の閲覧形式を,webベースから,pdfベースに変更。
・それに伴い,Basic入門の文書の全体的な調整,例プログラムの追加。
が更新内容の主なものです。

 pdfベースにした理由は,最近のwebブラウザ(特に新Edge)のpdf閲覧機能では,(しおりや,添付ファイルが利用できないなど。)入門文書として使いづらいことです。

 より詳細な更新内容はこちらをご覧ください。
http://www.tbasic.org/whatsnew/index.html

プログラミングの背景で「エラトステネスの篩」を公開しました。

プログラミングの背景で「エラトステネスの篩」を公開しました。

http://www.tbasic.org/reference/numbertheory/202006Eratosthenes.pdf

旧ホームページでの「エラトステネスの篩」の更新ということですが,今回は大幅に
加筆しています。
書き始めた当初は,もっとあっさりとするつもりでしたが,書いてくるうちに,色々疑問もでて,考えるとともに,色々な文献を調べたりしました。そのうちに,いわゆるエラトステネスの篩だけでなく,その改良版についての全体的説明を纏めたいと思うようになりました。その結果,全体で,94ページにもなりました。

内容は,実際に見てもらうと早いですが,以下の通りです。
・基本篩(これが元々のエラトステネスの篩です。)
・改良篩
・車輪篩
・リスト篩
・既約篩
そして,
・区分法(これは篩法ではなく,篩を分割して実行する技法です。)
等について,かなり詳しく説明しました。恐らくこれほど詳しい内容は,日本語の文献では見かけません。エラトステネスの篩について興味のある人に参考になれば,と思っています。

付録として,ここで説明した方法を使って,大きな素数表の作成にチャレンジしました。勿論,tbasicでそれを行うのは無理ですから,ここでは,C#を使いました。その結果,

・既約篩法を使って,一度の篩で,10^10までの素数表を作成することができました。
更に,区分法を併用することで,
・10^13までの素数表を篩うことができました。
(10^13までの素数表を作る試みはネット上でもいくつか見られますので,これ自体は全く新しいというものではありません。ただあまり技巧的ではない,標準的なプログラミングで実行したという意義はあるかもしれません。)

私自身,書いていて勉強にもなり,楽しむこともできました。私のコンピュータ環境(エントリー的なデスクトップ機)ではこれ以上の計算は無理なので,一応ここまでとして,公開しました。

1.501,1.502を公開しました。

1.501,1.502を公開しました。

立て続けにバグの修正版を公開しました。いずれも,掲示板,ブログでのコメントによる指摘です。
「このような単純なバグがまだ残っているのか」という感じですが,これらはいずれも,バージョンアップに伴うコード修正の時に,誤って紛れ込んだバグです。

一応チェックをしてから公開をしているのですが,やはりバグがあります。気が付いたら,掲示板等で指摘して頂けると有難いです。

時間をみて,全体的なチェックを少ししてみたいと思います。

tbasic 1.50を公開しました。

tbasicセット1.50を公開しました。
tbw150set.zip: http://www.tbasic.org/downloads/index.html
です。

更新内容は,Windows 10 版の正式対応です。

tbw1239set の公開から5か月余り,比較的短い期間での更新です。これは,tbw1239setの同梱文書の完成が遅れていたためです。1.50の開発自体は少し前から始めていて,ここ数か月は主に微調整を行っていました。

1.2系でもWindows 10 上で動作しましたが,開始画面でのOS表示が,動作しているOSがWindows 10 であっても Windows 8 と表示されていました。
tbasicの開発自体は,ここしばらく前から,Windows 10 上で行っていましたが,利用しているコンパイラが少し古いことなどの理由からでした。

今回公開したtbasicはWindows 10をターゲットとした新しいコンパイラでコンパイルされています。そのために内部的なコードの修正・削除・追加,
更に機能強化を行いました。言語機能は基本的に変更はありませんが,1.2系に比較して,

  1. 新しいコンパイラを使ったこと
  2. 内部的なコードの修正をかなり行っていること
  3. かなりファイルサイズが大きくなったこと
  4. 利用環境の向上があったこと

から,バージョン番号を少し飛ばして,1.50としました。Windows 10上での動作の安定性が増したと思います。ボタン等の外観も微妙に変更され,少し新しい雰囲気になっています。また,動作しているOSがWindows 10 なら開始画面で Windows 10 と表示されます。

少し詳しい更新内容は更新記録
http://www.tbasic.org/whatsnew/index.html
にあります。

tbasic セットの更新

tbasicセットを久しぶりに公開しました。
tbw1239set.zip: http://www.tbasic.org/downloads/index.html
です。

 更新内容は,Basic入門のpdf化が終わったのを受けて,それらpdf文書をtbasicのBasic入門よりブラウザを使って読むようにしたものです。それに伴い,従来のBasic入門BTutor.chmを廃止しました。

 tbasic本体も少し調整しました。内容はエディターのフォント表示の不具合の修正です。

 更新の仕方は,旧来の TBasicフォルダに解凍してできる新しいTBasicフォルダを上書きするだけで可能です。
 旧版を残す場合は,別な場所に新しいTBasicフォルダを置いてください。
tbasic.ini がある場合は,新しいTBasicフォルダ旧版のiniをコピーすれば使えます。

 これで,Basic入門のpdf化関係が一段落しました。種々の事情からBasic入門のpdf化に随分と時間が掛かってしましました。これから暫くはtbasic本体の更新に力を入れたいと思っています。

 言語そのものの機能アップは少し先のこととして,まずは

  1. Windows 10 への正式対応
  2. プログラミング環境の向上

を目標とするつもりです。

BASIC入門の更新

随分と時間が掛かってしまいましたが,やっと

BASIC入門:

http://www.tbasic.org/tutorial/index.html

「構造化プログラミング(2018年04月版)」の追加です。

  • これは tbasic に同梱されているBTutor.chmの「構造化言語としてのBASIC」の加筆修正版です。基本方針は変わっていませんが,大幅に書き直しをしています。全体で55頁です。構造化プログラミングについての比較的詳しい一般的な内容も多いので,必ずしもtbasicを使っていなくても,参考になるかも知れません。また,pdf版の方が,chm版より随分と読みやすくなっています。

これで,BASIC入門のpdf化が一応すべて終わりました。

やっと次(tbasic本体の更新作業)に進みます。

プログラミングの背景:数論の更新

プログラミングの背景:数論:

http://www.tbasic.org/reference/numbertheory/index.html

「記号と準備(2017年06月版)」を更新しました。

  • 「記号と準備(2014年06月版)」の更新版です。

     更新内容は,
    数学的帰納法1,2の同値性の証明の追加,基本的素数判定の方法,
    素数の無限性の証明の追加。証明での文体を「である調」に変更。
    です。

     現在まとめている「構造化プログラミング」での説明に必要な部分の追加です。
    構造化プログラミングの理解に数学的帰納法は重要な役割を果たします。このことから,数学的帰納法についての少しの追加と,素数表を作る例での素数判定のための予備知識の追加です。

1 2 3