いろいろな資格の投資対効果

半分趣味で資格を取るなら投資対効果なんて考える必要は無いが、賃金を増やす為に資格を取ろうと考えて居るなら投資対効果を考えるのは大事だ。中小企業診断士の資格が割に合わないと言う話しをTwitterで見かけたので、ざっくりと計算してみた。

各数字は凄く雑なので、細かい突っ込みは受け付けない。資格取得費用の大部分は勉強にかかる時間によって発生する機会損失である。今回は1時間2,500円で計算している。1年辺りの資格手当の額は求人などをざっくり見て中央付近を採用している。資格取得を切っ掛けに独立起業する事は想定していない。

資格名受験費用その他費用学習時間総費用資格手当維持費用増益投資効率
中小企業診断士302301,0002,760180561244%
公認会計士201503,0007,6701,2001201,08014%
税理士81102,0005,11860010050010%
社会保険労務士15301,0002,5453604032013%
情報処理安全確保支援士8205001,278180661149%
電気工事士二種11301002916006021%
公立大学2,5007,680217,0001,75001,7508%
金額は千円

なるほど、中小企業診断士の投資効率は4%と割りに合わなそうである。同じコストを投じて資格を取るなら、社会保険労務士の方がはるかにマシである。

工事士などのガテン系資格は資格取得による賃金増加額こそ小さいものの、投資効率は極めて高そうだ。工事士系資格で資格手当を貰えるような職場なら、確実に抑えていくのが良さそうだ。

あるていど勉強ができるなら当たり前のように大学進学を選択するが、投資効率は決して高くはない。在学中に勉強していることによる機会損失は意外に大きいのだ。投資効率を重視するなら、工業高校か高専でIT系資格を取得して就職するのが一番良いのかもしれない。

ボールペンリフィル(替え芯)の選び方

贈答品で頂いたボールペン、気に入って使っていてインクが無くなってしまったとき、何処にもメーカーも型番も書いていないし、替えインクを買いたくても諦めていたりしませんか?

ボールペンのインクの形状はJIS規格で定められており、A1、A2、B、D、E、F、G1、G2、Hの9種類に分かれています。同じ規格のリフィルであれば、他社製のリフィルでも使える可能性が高いです。HはA1~G2の何れにも一致しない規格ということなので、実質は8種類ですね。

ペン先直径、直径(一番太いところ)、全長の三つを計って以下のリストと比較してください。

規格ペン先の直径直径全長
A12.40mm3.20mm106.8mm
A21.60mm3.20mm106.8mm
B2.28mm3.00mm98.2mm
D2.35mm2.35mm67.0mm
E2.25mm3.00mm140.0mm
F2.30mm3.00mm143.0mm
G11.60mm5.00mm106.8mm
G22.54mm6.00mm98.1mm
H

だいたいG2規格が多いようです。A1~G2の規格に一致しない場合には、各メーカの独自規格と思われます。

その場合には日本筆記具工業会で公開している「油性ボールペン替芯互換表」「ゲルボールペン替芯互換表」を参照してみてください。各メーカーが出しているリフィルのペン先直径(外径)、直径(最大径)、全長が一覧表になっているので、その中から一致する型番を探してください。型番が絞られたらメーカーのページで、ペン先やお尻部分の形状が一致しているものを探す事になります。

PTAや自治会でIT活用が出来ない理由

2013年の国際成人力調査をご存じでしょうか?平均点で見ると、読解能力、数的思考力、IT活用能力の何れでも日本がトップなのです。調査結果は読解能力、数的思考を得点によってレベル1未満~レベル5までの6段階に、IT活用能力はレベル1未満~レベル3の4段階に分けて成人割合もだしています。各レベル毎の成人割合を見ると日本の特徴が際立ってきます。読解能力がレベル2以上となる成人割合は日本93.9%、ドイツ81.0%、米国78.3%。数的思考力がレベル2以上となる成人割合は日本90.6%、ドイツ80.1%、米国67.1%。IT活用能力がレベル2以上となる成人割合は日本34.6%、ドイツ36.0%、米国31.1%。

日本では読解能力、数的思考力が一様に高い水準にあり、レベル1やレベル1未満の割合が極端に少ないのです。

このことが日本においてPTA役員や自治会役員を持ち回りやくじ引きで決めることを可能にしています。紙と鉛筆で業務を行う限りにおいては、日本人ならほぼ誰でも業務を遂行できるだけの事務能力を持ち合わせているわけです。全員に一様に業務を割り振り、一人あたりの負担を減らすと共に、全員が公平に負担する仕組みを作ってきました。日本以外において、同じような役員の決め方をしたら、業務遂行能力を持たない役員が発生する確率が高く、成り立たないでしょう。

対して、IT活用能力においては、日本では成人の34.6%だけが高い能力を有しており、日本の平均値を世界でもトップレベルに引き上げています。

このことがPTA役員や町内会や自治会におけるIT活用の難問になります。ITを活用するなら、成人の35%しか業務を遂行できません。従来のように一様に全員が業務を負担することで公平性を保つ仕組みは維持できません。特定の人だけに業務が集中する事を容認し推奨するような価値観の変革が必要になるのです。

PowershellからBITS(Background Intelligent Transfer Service)を使用して大容量ファイルを配布する

BITSはMicrosoftがWindowsに標準機能として載せている分散ダウンロード機能です。WindowsUpdateもバックグラウンドでBITSを利用しており、LAN内の複数のPCからWindowsUpdateをダウンロードする場合には、他のパソコンが自動的にキャッシュサーバーとなることで、インターネットとの通信負荷を押させてくれます。このBITSはWindowsUpdate専用の機能というわけではなく、簡単なプログラムを用意すれば、大容量ファイルを配布するときに自由に活用することができます。

昨今、プログラムやセキュリティパッチのフットプリント(ファイルサイズ)が大きく鳴り続ける、パッチ配布のネットワーク負荷が原因でインターネットが輻輳するなんて事件もありましたね。社内ネットワーク(WAN)はその構造上、どうしても一か所に負荷が集中しやすく、分散ダウンロードができると随分と助かりますね。

BITSでダウンロードするための一連の流れは次のようになります。

  1. HTTPサーバー上にダウンロード元となるファイルを用意します。
  2. Start-BitsTransferでBITSに新しいダウンロード要求を登録します。
  3. 定期的にGet-BitsTransferを呼び出しダウンロードの完了を待ちます。
  4. ダウンロード完了後にComplete-BitsTransferでファイルに書き出します。

上記をPowershell Scriptで記述したのが下記です。このスクリプトをダウンロードが完了するまで定周期で実行します。

$displayName = 'BITS_Sample'; # BITSにダウンロード要求を登録する時の表示名
$fromURL = 'http://www.example.co.jp/BITS_Sample.zip'; # ダウンロード元のURL
$destFile = 'C:\TEMP\BITS_Sample.zip'; # ダウンロード先のファイル名
$logFile = 'C:\TEMP\BITS_Sample.log' # ログ出力先のファイル名

$noBitsInstance = $true;
$completeDownload = $false;

Add-Content -Path $logFile -Value ('Start Script:' + (Get-Date));

# ダウンロード先フォルダが無ければ作成しておく
if ($false -eq (Test-Path 'C:\TEMP')){
    mkdir 'C:\TEMP';
}

# ダウンロードファイルが
if ($false -eq (Test-Path $destFile)){
    # BITSへのダウンロード要求を列挙する
    Get-BitsTransfer | Where-Object {
        Add-Content -Path $logFile -Value ('BITS Status:' + $_.DisplayName + '-' + $_.JobState);
        # 表示名の一致しているダウンロード要求が転送終了になるまで待機
        if ($_.DisplayName -eq $displayName){
            $noBitsInstance = $false;
            if ($_.JobState -eq "Transferred") {
         # ダウンロード完了した転送要求を完了させる
                Complete-BitsTransfer $_;
                $completeDownload = $true;
            }
        }
    }

    # BITSにダウンロード要求が登録されていなければ、新たに登録する。
    if ($noBitsInstance -eq $true){
        $delayMinute = Get-Random -Maximum 240;
        $kickDateTime = (Get-Date).AddMinutes($delayMinute);

        # 新規ダウンロード登録までランダムに待機する
        Add-Content -Path $logFile -Value ('Wait ' + $delayMinute + ' Minutes');
        While ($kickDateTime -ge (Get-Date)){
            Add-Content -Path $logFile -Value ('delay - ' + (Get-Date));
            sleep 60;
        }

        # 新規にダウンロードを登録する
        Add-Content -Path $logFile -Value ('Start BitsTransfer:' + $displayName + '-' + $destFile);
        Start-BitsTransfer -Source $fromURL -Destination $destFile -Asynchronous -Priority Normal -DisplayName $displayName
    }

    if ($completeDownload -eq $true){
        # ダウンロード完了後の処理
        Add-Content -Path $logFile -Value ('Complte Download:' + $displayName + '-' + $destFile);
    }
}
Add-Content -Path $logFile -Value ('End Script:' + (Get-Date));

私はActive Directoryのグループポリシーでログオンスクリプトとして登録しました。コントロールパネルのタスクで定周期に起動してもよいでしょう。

BITSで使用する帯域の制限などはレジストリに記述するか、ActiveDirectoryのグループポリシーで定義します。

Nextcloudに大きなファイルをアップロードするとRequestTimeTooSkewedが発生する

NextcloudでストレージにS3を使用している場合に、約500MBを超える大きなファイルをアップロードすると、以下のようなエラーが発生する場合がある。

An exception occurred while uploading parts to a multipart upload. The following parts had errors:
- Part 1: Error executing "UploadPart" on "https://nextcloud-xxxx.s3.us-west-1.wasabisys.com/xxxx"; AWS HTTP error: Client error: `PUT https://nextcloud-xxxx.s3.us-west-1.wasabisys.com/xxxx` resulted in a `403 Forbidden` response:
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>RequestTimeTooSkewed</Code><Message>The difference between the reque (truncated...)
RequestTimeTooSkewed (client): The difference between the request time and the current time is too large. - <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>RequestTimeTooSkewed</Code><Message>The difference between the request time and the current time is too large.</Message><RequestTime>20220101T141414Z</RequestTime><ServerTime>2022-01-01T14:32:28Z</ServerTime><MaxAllowedSkewMilliseconds>900000</MaxAllowedSkewMilliseconds><RequestId>xxxx</RequestId><HostId>xxxx/xxxx</HostId></Error>

この問題を解決するには./html/config/config.phpに以下の行を追加し、500MBよりも適当に小さなサイズで分割してアップロードするように設定する。下記の例では約20MBに設定を変更している。

    array (
      'bucket' => 'nextcloud-bucket',
      'key' => '{key}',
      'secret' => '{secret}',
      'region' => 'us-west-1',
      'hostname' => 's3.us-west-1.wasabisys.com',
      'port' => '443',
      'objectPrefix' => 'urn:oid:',
      'autocreate' => false,
      'use_ssl' => true,
      'use_path_style' => false,
      'legacy_auth' => false,
      'uploadPartSize' => 20971520,
    ),

S3にsinglepartでアップロードできるファイルサイズの上限は5GBとなり、より大きなファイルをアップロードするときにはmultipartでアップロードする必要がある。標準設定のNextcloudでは約500MBを超えるファイルをアップロードするときにはmultipartアップロード を使用する。

S3のmultipartアップロードがもつ仕様上の問題で、通信帯域の不足等によりデータのアップロードに約15分以上かかると、HTTPヘッダに記載されている時刻とAWS側サーバーとの時刻の差がMaxAllowedSkewMillisecondsを超えるために”RequestTimeTooSkewed: The difference between the reque (truncated…)
RequestTimeTooSkewed (client): The difference between the request time and the current time is too large.”のエラーが発生する。

MaxAllowedSkewMillisecondsは900000msに固定されいる。HTTPのリクエストデータを複製することによる第三者の攻撃を防ぐために設けられている値で、ユーザー側でこの値を任意に変更する事は出来ない。この問題を避けるには15分以内にアップロードが終わる程度の適当なサイズに分割してアップロードする必要がある。

ただし小さく分割するとS3にアップロードできる最大ファイルサイズが小さくなる事にも注意しなくてはならない。S3には最大で5TBのファイルを保管できるが、 multipart アップロード時には10,000分割以上に分ける事ができない。仮に上記のように20MBで分割した場合には、200GBを超えるファイルをアップロード出来ない。(Amazon S3 multipart upload limits