JScript : Visual Studio Code で、WSH を使用する準備

Visual Studio Code は、基本的には UTF-8 で記述され、Shift_JIS でソースコードを書いて運用するにはひと工夫が必要になります。( そもそも、Shift_JIS の自動判定が完全ではありません )

1) Visual Studio Code の設定

設定タブを表示させて設定の検索フィールドに『encoding』と入力すると、Auto Guess Encoding が表示されるのでチェックします。( これは、settings.json に "files.autoGuessEncoding": true と書き込む処理となります ) これによって、テキストファイルのキャラクタセットを自動で判定するようになりますが、残念ながらテキストの内容によって失敗する事が多々あるので判定がうまく行くようにテンプレートを作成します。

2) JScript 用テンプレート

いろいろ試してみて Shift_JIS と判定してくれるようなコメントを作成し、ついでに WScript.Shell オブジェクトを作成しておいて、実行の終了時にメッセージボックスを出すようにしています。
// ****************************
// 初期処理
// ****************************
WScript.Echo( "処理を開始します" );
var WshShell = new ActiveXObject("WScript.Shell");




// ****************************
// ファイルの最後
// ****************************
WshShell.Popup("処理を終了します");

オブジェクトの作成は『WScript.CreateObject("WScript.Shell")』でも可能ですが、HTML アプリケーションに転用してコードを再利用する目的で、『new ActiveXObject("WScript.Shell")』を使用しています

3) tasks.json の配置

実行フォルダに、.vscode フォルダを作成して tasks.json をセッティングする必要があります。Visual Studio Code の UI から tasks.json を作成する処理( Configure Task )は回りくどい上にどうせ変更しなくてはならないので、一つ作成しておいて新しいフォルダにコピーして運用するといいでしょう。 tasks.json を正しく設定すると、『ビルドタスクの実行 ( CTRL + SHIFT + B )』で、開いているソースコードを cscript.exe で実行して Visual Studio Code のターミナルで結果を知る事ができます。 この設定では、実行後フォーカスがターミナルに移動するので、何かキーを押せばターミナルを閉じる事ができます。
{
	"version": "2.0.0",
	"presentation": {
		"focus": true
	},	
	"tasks": [
		{
			"label": "WSH",
			"type": "shell",
			"args": ["${file}"],
			"group": {
				"kind": "build",
				"isDefault": true
				},
			"command": "cscript"
		}
	]
}






Java : Apache POI で最低限の処理を標準化( ここではワークブックは新規作成 )

最新の Excel( .xslx ) 用 XSSF に必要な jar

Apache POI Apache Commons Collections Apache Commons Compress 4.1 ドキュメント

サンプル

オーバーロードを使用して、できるだけ cell というメソッドでできるようにしてみました。Microsoft の仕様に合わせて行や列を 1 始まりにしたかったという意図もあります。
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.RegionUtil;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory;

public class Main {

    private static XSSFWorkbook book;
    private static XSSFSheet  sheet;

    // *****************************************************
    // エントリポイント
    // *****************************************************
    public static void main(String[] args) {
        try {
            // ****************************
            // ブック作成
            // ****************************
            book = XSSFWorkbookFactory.createWorkbook();

            // ****************************
            // シート作成
            // ****************************
            sheet = book.createSheet("Javaの処理");

            // ****************************
            // セルに値を直接セット
            // ****************************
            for (int i = 1; i <= 10; i++)
            {
                cell( sheet, i, 1, String.format("処理 : %d", i ));
            }

            // ****************************
            // セルの幅( 3列目 )
            // ****************************
            cellWidth( sheet, 3, 6000 );

            // ****************************
            // セルの結合
            // ****************************
            cell( sheet, 1, 3, 1, 5 );
            // 結合されたセルに値をセット
            cell( sheet, 1, 3, "結合されたセル" );
            
            // ****************************
            // 日付のセット
            // ****************************
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
            cell( sheet, 3, 3, dateFormat.parse("2020/11/27") );

            // ****************************
            // 値のセット
            // ****************************
            cell( sheet, 4, 3, 1000 );
            cell( sheet, 5, 3, 1234567890 );
            cell( sheet, 6, 3, "日本語" );
            cell( sheet, 7, 3, "ABCDEFG abcdefg" );

            // ****************************
            // 式のセット
            // ****************************
            getCell( sheet, 8, 3 ).setCellFormula( "A1" );

            // ****************************
            // 罫線
            // ****************************
            cell( sheet, 3, 3, 10, 5, BorderStyle.DOUBLE );

            // ****************************
            // セルの値を表示
            // ****************************
            for (int i = 1; i <= 10; i++)
            {
                System.out.println( cell( sheet, i, 3 ) );
            }

            // ****************************
            // 書き込み用のファイルストリーム
            // ****************************
            FileOutputStream fos = new FileOutputStream("sample.xlsx");
            
            // ****************************
            // 保存と終了
            // ****************************
            book.write(fos);
            book.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    // ****************************
    // セル( XSSFCell ) を取得
    // ****************************
    static XSSFCell getCell(XSSFSheet sheet, int row, int col) {

        XSSFRow xslRow = sheet.getRow(row - 1);
        if ( xslRow == null ) {
            // 行を作成
            xslRow = sheet.createRow( row - 1 );
        }

        XSSFCell cell = xslRow.getCell( col - 1 );
        if ( cell == null ) {
            // セルを作成
            cell = xslRow.createCell( col - 1 );
        }
        return cell;

    }
    // ****************************
    // セルに書き込む
    // ****************************
    // 文字列
    static void cell(XSSFSheet sheet, int row, int col, String value) {

        XSSFCell cell = getCell(sheet, row, col);
        cell.setCellValue(value);

    }
    // 数値
    static void cell(XSSFSheet sheet, int row, int col, double value) {

        XSSFCell cell = getCell(sheet, row, col);
        cell.setCellValue(value);

    }
    // 日付 : BuiltinFormats で定義された値(14) を使用
    static void cell(XSSFSheet sheet, int row, int col, Date value) {

        XSSFCell cell = getCell(sheet, row, col);
        XSSFCellStyle style = sheet.getWorkbook().createCellStyle();
        // Class BuiltinFormats より "m/d/yy"
        style.setDataFormat(14);
        cell.setCellStyle(style);
        cell.setCellValue(value);

    }
    
    // ****************************
    // セル読み込む
    // ****************************
    static String cell(XSSFSheet sheet, int row, int col) {

        XSSFRow xslRow = sheet.getRow(row - 1);
        if ( xslRow == null ) {
            return "";
        }

        XSSFCell cell = xslRow.getCell( col - 1 );
        if ( cell == null ) {
            return "";
        }

        CellType type = cell.getCellType();
        // 文字列
        if ( type == CellType.STRING ) {
            return cell.getStringCellValue();
        } 
        if ( type == CellType.NUMERIC ) {
            // 日付
            if( org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell) ) {
                SimpleDateFormat sdf = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss" );
                return sdf.format( cell.getDateCellValue() );
            }
            // 数値
            else {
                return String.format("%f", cell.getNumericCellValue());
            }
        } 
        // 式
        if ( type == CellType.FORMULA ) {
            return cell.getCellFormula();
        }
        
        String result = cell.getRawValue();
        if ( result == null ) {
            result = "";
        }

        return result;

    }

    // ****************************
    // セルの幅
    // ****************************
    static void cellWidth(XSSFSheet sheet, int col, int width) {

        sheet.setColumnWidth(col-1, width);

    }

    // ****************************
    // セルの結合
    // ****************************
    static void cell(XSSFSheet sheet, int row1, int col1, int row2, int col2) {

        sheet.addMergedRegion( new CellRangeAddress(row1-1, row2-1, col1-1, col2-1) );

    }

    // ****************************
    // 範囲の外側の罫線
    // ****************************
    static void cell(XSSFSheet sheet, int row1, int col1, int row2, int col2, BorderStyle borderStyle ) {

        CellRangeAddress region = new CellRangeAddress(row1-1, row2-1, col1-1, col2-1);

        RegionUtil.setBorderTop( borderStyle, region, sheet );
        RegionUtil.setBorderBottom( borderStyle, region, sheet );
        RegionUtil.setBorderLeft( borderStyle, region, sheet );
        RegionUtil.setBorderRight( borderStyle, region, sheet );

    }

}


実行結果

読込みは以下のような感じで

XSSFWorkbook book = XSSFWorkbookFactory.createWorkbook(new FileInputStream("sample.xlsx"));

関連する記事

JScript : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する

C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する

Python : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する

外字がとにかく豊富な、にしき的フォント 『 Nishiki-teki 』



ダウンロードページ / 著作

にしき的フォント - TYPVS LITTERARVM NISICIAE

制作者 : うみほたる

ライセンス

創作物その他もろもろにご自由にお使いください。

ファイル

nishiki-teki.ttf

概要 ( 制作者より )

伺かのフリーシェル「にしき」をイメージしたUnicode準拠のフォントです。現在のところ、ラテン文字、ギリシア文字、キリル文字、アルメニア文字、ヘブライ文字、オガム文字、ルーン文字、ひらがな、カタカナ、少々の漢字、リス文字、オーセージ文字、音声記号、ブライユ点字、その他いろいろな記号などを収録しています。加えて、私用領域には以下のような人工文字の類 (テングワール、キアス、ユニフォン、ソルレソル、ヴィジブルスピーチ、アーヴ、アイハ、クリンゴン、沖縄方言用・気仙方言(ケセン語)用・台湾語用の仮名など) やさまざまな記号などを収めてあります。より詳しくはこちらのPDFファイルをご覧ください。

補足 ( この記事固有 )

まだ全ての外字を確認していませんが、PHP の GD で表現できるのが &#xffff; までなので、ImageMagick で &#xf0000; 以降を表現できるように、フリーフォントでボタン作成を改造しました。冒頭の画像は、クリンゴン文字ですが、F8FF までなので、GD で表示できます。


※ サービスで再現


※ サービスで再現



ラノベPOP



ダウンロードページ / 著作

ラノベPOPフォントのフリーフォントダウンロード | フォントな。無料日本語フリーフォント

制作者 : フォントな(Kato Masashi)
  • にくまるフォント
  • ふぉんとうは怖い明朝体
  • ロゴたいぷゴシック
  • 
    ライセンス
    
    作成した印刷物およびデジタル・コンテンツにつき、その商用・非商用にかかわらず放送、通信、各種記録メディアなどの媒体の形式も問わず、使用をすることができます。ただし、これはM+のライセンスのもとにあります。
    
    ファイル
    
    ラノベPOP.otf
    ※ ラノベPOP.ttf も同梱されていますが、サポート外とされています
    
    概要 ( 制作者より )
    
    ロゴデザインやタイトルロゴ、見出し向けの漢字も含まれる日本語フリーフォントになります。軽やかで弾むような、楽しい雰囲気のキュートなPOP体フォントです。デザインされつつも、マジックペンで勢いよく書いたような要素を加えています。
    
    補足 ( この記事固有 )
    
    ひらがな・カタカナ部分のデザインが、ラノベPOP としての著作部分です。ですから、フリーフォントで簡単ロゴ作成の、デュアルページを使うと他の漢字書体と組み合す事ができます。
    
    
    ※ デュアルページで再現
    
    
    
    
    

    チェックポイントフォント / 『アメリカ横断ウルトラクイズ』をイメージした和文総合書体

    
    
    フリーフォントで簡単ロゴ作成にて、オンラインでフォント画像を作成できます。
    
    
    
    一般的な日本のフリーフォントです。
    
    チェックポイントフォントはフリーフォントです。
    
    かつて日本テレビ系列で放送されていた、懐かしのクイズ番組『アメリカ横断ウルトラクイズ』をイメージした和文総合書体として、・ひらがな ・カタカナ(タイトルロゴ「ウルトラクイズ」風) ・英数字 ・記号 ・漢字(JIS第一/第二水準一式、IBM拡張文字一式+α)の要素をカバーしています。
    
    チェックポイントフォント
    
    ウェブサイトや印刷物、動画などでの使用のほか、商用利用(同人誌などでの使用)についても、特に制限は設けておりません。ご自由にお使いいただけます。但し、著作権表示を改変しての二次配布はご容赦ください。
    
    使用許可連絡も必要ございませんが、よろしければ事後でも結構ですので、Twitterなどでご一報いただければありがたいとの事です。
    
    ファイル名
    
    CP Font.ttf
    ※ ttf フォーマットで配布されています。
    ( OpenType Edition もあります )
    
    書体の特徴
    
    手作り感がとても大きい、太い文字のフォントです。その名の『チェックポイント』から解りますが、ウルトラクイズの『チェックポイント』で使われて文字を元に作られています。
    
    
    
    

    VBScript : WshShell.Runによる 【外部プログラムの実行】 のバリエーション

    外部プログラムの実行

    VBScript を何の為に使うかという場合、最も一般的に利用価値の高いのは、やはりプログラムの実行です。 わりと簡単に使えるのですが、プログラム(言語)でもあるので、専門知識が無ければ、なかなか難しい部分もあります。しかし、実行だけで言えば、2行で書けるので、その場合に「できること」を知っておくと絶対に得をします。

    同期処理(コマンドプロンプトウインドウを開かない)

    Set WshShell = WScript.CreateObject("WScript.Shell")
    Call WshShell.Run( "zip.exe -r homepage D:\nifty\homepage", 0, True )
    
    

    
    

    同期処理(コマンドプロンプトウインドウを開く)

    Set WshShell = WScript.CreateObject("WScript.Shell")
    Call WshShell.Run( "zip.exe -r homepage D:\nifty\homepage", , True )
    
    
    

    
    

    非同期処理

    Call WshShell.Run( "zip.exe -r homepage D:\nifty\homepage",0 ) でコマンドプロンプトウインドウは開きません
    Set WshShell = WScript.CreateObject("WScript.Shell")
    WshShell.Run( "zip.exe -r homepage D:\nifty\homepage" )
    
    

    
    

    関連するページ

    WshShell.Run による外部プログラムの実行 :外部プログラムの実行

    VBScript : GUID取得

    Scriptlet.TypeLib で GUID を取得できます
    
    

    ▼ InternetExplorer.Application でクリップボードへコピーする

    ' GUID 取得用
    Set TypeLib = CreateObject("Scriptlet.TypeLib")
    
    ' クリップボード用
    ' ※ HTA 等では直接 window.clipboardData より実行
    ' ※ するように書き換える必要があります
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Navigate("about:blank")
    Do While objIE.Busy
    	' 100 ミリ秒
    	Wscript.Sleep 100
    Loop
    
    Call objIE.document.parentWindow.clipboardData.SetData( "Text", TypeLib.Guid & "" )
    objIE.Quit
    
    WScript.Echo "クリップボードにコピーしました" & vbCrLf & vbCrLf & TypeLib.Guid
    
    

    
    

    ▼ 自分でクリップボードへコピーする

    ' GUID 取得用
    Set TypeLib = CreateObject("Scriptlet.TypeLib")
    
    Call InputBox("コピーして使用して下さい","新しい GUID を取得しました",TypeLib.Guid)
    
    
    

    
    

    ▼ コマンドブロンプトを使う( clip.exe )

    sCommand = "cmd /c echo Set TypeLib=CreateObject(""Scriptlet.TypeLib""):Wscript.echo TypeLib.Guid>%temp%\_.vbs&cscript.exe /NOLOGO %temp%\_.vbs | clip"
    
    Set WshShell = WScript.CreateObject("WScript.Shell")
    ' 同期処理(コマンドプロンプトウインドウを開かない)
    Call WshShell.Run( sCommand, 0, True )
    

    
    
    
    

    VBScript : InternetExplorer.Application で、ファイルを開くダイアログを開く

    管理者権限で実行する必要がある

    昔から一般的に使われて来た方法ですが、ある時から about:blank では、fakepath というパスで返るようになって使えなくなっていました。そこで、ローカルにファイルを作ってそれで対処しています。但し、管理者権限で実行する必要があるので冒頭の処理が必要です。

    簡易的な【ファイルを開くダイアログ】

    ファイルの種類は設定できません。どうしても VBScript でファイルを開く為のダイアログを正しく使いたい場合は、COM を作成して呼び出す必要があります( exe に実行させて、ファイルで引き渡すと言う手もあります )。しかし、本来 VBScript で行う処理は簡易的なものなのでそこまでこだわる必要も無いのでこれで十分使えると思います。 冒頭の objShell.MinimizeAll は実行しておかないと、エクスプローラから実行した場合その下にファイルを開くダイアログが隠れてしまいます。 このソースは拡張子が .wsf 用です。
    <JOB>
    <SCRIPT language="VBScript">
    ' ************************************************
    ' 管理者として実行を強制する
    ' ************************************************
    Set objShell = Wscript.CreateObject("Shell.Application")
    if Wscript.Arguments.Count = 0 then
    	objShell.ShellExecute "wscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
    	Wscript.Quit
    end if
    
    ' ************************************************
    ' ファイルを開くダイアログの為に他を全て最小化する
    ' ************************************************
    objShell.MinimizeAll
    
    ' ************************************************
    ' ファイル選択
    ' ************************************************
    strValue = OpenLocalFileName
    if strValue = "" then
    	Wscript.Quit
    end if
    
    MsgBox( strValue )
    
    ' ************************************************
    ' InternetExplorer.Application でファイル選択
    ' ************************************************
    Function OpenLocalFileName( )
    
    	' ファイルシステムを操作するオブジェクト
    	Set Fso = WScript.CreateObject( "Scripting.FileSystemObject" )
    	' テンポラリフォルダ
    	TempDir =  Fso.GetSpecialFolder(2)
    	on error resume next
    	' テンポラリフォルダに空の "local.htm" を作成
    	Set objHandle = Fso.CreateTextFile( TempDir & "\local.htm", True, True )
    	if Err.Number <> 0 then
    		Exit Function
    	end if
    	objHandle.Close
    	on error goto 0
    
    	Set IEDocument = Wscript.CreateObject("InternetExplorer.Application")
    	IEDocument.Navigate( TempDir & "\local.htm" )
    	Do While IEDocument.Busy
    		' 100 ミリ秒
    		Wscript.Sleep 100
    	Loop
    	IEDocument.document.getElementsByTagName("BODY")(0).innerHTML = "<input id='FilePath' type='file'>"
    	call IEDocument.document.getElementById("FilePath").click()
    	if IEDocument.document.getElementById("FilePath").value = "" then
    		OpenLocalFileName = ""
    		IEDocument.Quit
    		Set IEDocument = Nothing
    		Exit Function
    	end if
    
    	OpenLocalFileName = IEDocument.document.getElementById("FilePath").value
    
    	IEDocument.Quit
    	Set IEDocument = Nothing
    
    End Function
    </SCRIPT>
    </JOB>
    
    

    
    
    
    

    VBScript( Jscript ) を『管理者として実行する』には、Shell の runas ( 右クリックメニューの実行と同等 ) で実現します

    UAC によるセキュリティの影響で VBScript を使う場合、管理者権限で実行しないとレジストリの一部には書き込めるのに重要なフォルダには書き込めないというような OS が決めたルールがあります。
    
    それに対する対処の最も簡単な方法は、以下の内容ををスクリプトの先頭に記述する事です
    
    

    🔻 VBScript

    Set obj = Wscript.CreateObject("Shell.Application")
    if Wscript.Arguments.Count = 0 then
    	obj.ShellExecute "wscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
    	Wscript.Quit
    end if
    
    Wscript.Echo "ここは管理者権限で実行されます"
    
    
    
    

    🔻 Jscript

    ※ Jscript は WScript 等、大文字小文字の区別があるので注意です。 ※ ダウンロードは、拡張子 .htm で SHIFT_JIS ですので、利用時は .js に変更してお使い下さい。
    var obj = new ActiveXObject("Shell.Application");
    if ( WScript.Arguments.length == 0 ) {
    	obj.ShellExecute( "wscript.exe", WScript.ScriptFullName + " runas", "", "runas", 1 );
    	WScript.Quit();
    }
    
    WScript.Echo( "ここは管理者権限で実行されます" );
    
    

    Shell.ShellExecute method
    
    これは、VBScript から利用可能な Shell の機能を使って、右クリックメニューにある『管理者として実行』を実行する方法です。ここでは日本語では無く runas と言う文字列を使って管理者として実行させています。
    
    但し、引数がなかった場合の処理としては処理終了します。ですからこのスクリプトでは、引数をダミーで一つセットして( この場合一つめの runas がそうです )自分自身を再度呼び出しています。
    
    つまり、Windows からすれば二度目の実行が管理者としての実行になります。
    
    この場合は、スクリプトに引数を渡す事ができません。もし渡したいしたい場合は、違ったトリックを使う必要があるのに注意して下さい。(その場合は、外部ファイルから入力するのがもっとも簡単で確実だと思います)
    
    

    
    
    
    
    

    【2017-10-20 の記事】家族に言われてジョーシン見に行ったら、なるほど『TV録画はUSB経由でHDDに』というのが常識になっていた。

    2017-10-20

    23,950円 LC-19K40-B シャープ 19V型地上・BS・110度CSデジタル ハイビジョンLED液晶テレビ (ブラック) (別売USB HDD録画対応) LED AQUOS [LC19K40B]【返品種別A】【送料無料】 2021/01/23 現在で、楽天は中古しか無く、以下のアマゾンリンク先は 13,980円でした

    Amazon の写真ですが、楽天で買いました

    家電はリアル店舗より、インターネットのほうが安いのは解ってましたが、Amazon と 楽天調べた後一応ヤマダも見て来ました。で、ヤマダだけ1万円高くてコケそうになりました。 結局 Amazon < 楽天 < ジョーシンですが、楽天はポイントが8倍付いたので即決。楽天とは言え、結局はジョーシンなんですけれど。(今見たら150円安くなってた...) Amazon は家族がプライム入ってるので、自分のカードが使え無いので、ポイント換算すると楽天がお得という理由で選択してます。まー一応ジョーシンの会員だし、なんかあった時に Amazon ってどーなのか解らないし。とはいえ、微々たる差ではありますが、損得計算は買い物の背中を押してくれるのでしたほうがいいですよね。

    ハードディスクはリアルジョーシンで

    せっかく誕生月で、ポイントくれると言ってるし、楽天の期限付きポイントが千円以上あるし、なにより HDD は目でパッケージ見て選びたいので今日買って来ました。 これは、店頭にあった型番的に中間のもののようです。一つ前のものは、パッケージに『7年連続№1』とあり(これは9年)、もう一つは何が違うのかパッケージからは解らない、上位型番のようなものがありましたが、解らない時は中間と決めてるので、これの 2T を購入。 Amazon はかなり安いです。楽天より、リアルジョーシンのほうが安かったです。広告の品だったらしく、普通より1000円安い上に、誕生月 5% OFF で、11,080円( 税込み )でした。ここから、ジョーシンポイント(今日もらったやつ)を 354 引いてもらって、楽天のポイント 1808 使って、8,918 を楽天カードで支払ったので、さらにポイントが(たぶん200くらい)付いてます。 支払い複雑で『すみません』を5回くらい言いましたけど。(ジョーシンアプリでクーポン3枚とジョーシンポイントと楽天ポイント使って楽天カードで支払う)

    家帰って接続

    先に、アクオスの説明書読んでたので、あっという間。というか、既に大きいアクオスあるしレコーダもあるし、リモコンの使い方ほぼ同じ。HDD は、BUFFALO 側の確認機種に LC-19K40 が書かれてなかったけれど、シャープのほうに HDD の型番が明記されてたので特になんの問題もなく予約録画と即録画と取り消しと削除のテストをして家族に引き渡しました。 たしかに、我が家ではブルーレイは使った事無い。 HDD でいい。 という世の中になっていたのでした。