電離層の D層 は、太陽高度が高い昼間、かつ強い太陽光線(紫外線やX線)が最下層の大気に到達するという条件で発生します。 [1, 2]

電離層の中で最も低い高度(約 60 ~ 90 km)に位置し、上空の層(E層やF層)とは大きく異なる特徴を持っています。 [1]

 

D層の発生条件

D層が発生・発達するには、以下の具体的な条件が必要です。

 

1. 太陽高度が高い(昼間であること)

 D層は太陽光のエネルギーによって作られるため、昼間にしか存在しません。特に太陽が真上近くにくる正午頃(昼前後)に最も電子密度が高くなります。太陽が沈むと、大気密度が高く再結合が非常に早いため、夜間は完全に消滅します。 [1]

 

2. 特定の強い放射線(Lyman-α線やX線)の照射

D層が位置する高度約 70 km 付近は、上空に比べて大気(空気の分子)が非常に濃い領域です。通常、大半の紫外線は上空のE層やF層で吸収されてしまいますが、以下の特定の光線だけがこの低い高度まで突き抜けて届き、D層を形成します。

  • 平常時:太陽から放射される Lyman-α線(ライマン・アルファ線) という特殊な紫外線が、大気中の微量成分である一酸化窒素(NO)を電離させることで発生します。
  • 太陽活動の活発期:太陽から出る軟X線が、主成分である窒素(N₂)や酸素(O₂)を直接電離させることで、D層がさらに強化されます。

D層の最大の特徴:電波の「減衰(吸収)層」

 D層は電子密度自体は低いですが、大気密度(空気分子の数)が非常に高い場所にあります。そのため、飛び込んできた電波によって揺らされた電子が、すぐに周囲の空気分子と激しく衝突します。この衝突により、電波のエネルギーが熱へと変わってしまい、電波が急激に弱められます。これをデリンジャー現象や電波の D層吸収 と呼びます。 [1]

  • 中波(AMラジオなど)への影響:昼間、AMラジオの電波(中波)はD層に吸収されてしまうため、遠くまで届きません。夜になるとD層が消滅するため、電波はさらに上空の E層 まで届いて反射され、夜間だけ遠方のラジオ放送が聞こえるようになります。
  • 短波通信への影響:太陽フレア(爆発現象)が発生すると、強力なX線によってD層の電子密度が爆発的に跳ね上がり、短波電波が吸収されて通信不能になる「デリンジャー現象」を引き起こします。 [1, 2, 3, 4]


 電離層の F1層F2層 は、主に太陽光線(極端紫外線)の照射大気密度の高低(高度の差)という条件がそろうことで発生・分離します 

昼間は太陽光が強く降り注ぐため、ひとつの F層 が高度によって F1層(約150~200km)と F2層(約200~400km)の2つに分裂し、夜間は太陽光がなくなるため、これらが結合してひとつの F層 に戻ります。 [1]

 

F1層とF2層の発生条件

F1層とF2層が分かれて発生する具体的な条件とメカニズムは以下の通りです。

 

1. 太陽光(極端紫外線)の照射

電離層は、大気分子が太陽からの極端紫外線(10~100 nm)を吸収して電離(イオン化)することで形成されます。そのため、太陽光が十分に降り注ぐ昼間であることが発生の基本条件です。

 

2. 高度による大気組成と密度の違い

太陽光が地球大気に突入すると、高度によって「電離の起きやすさ」と「再結合(イオンが元に戻る現象)のしやすさ」のバランスが変わります。この違いが2つの層を生み出します。

  • F1層の発生条件:高度約 150~200km 付近に発生します。この高度は分子状のガス(N2 や O2)が比較的多く残っているため、太陽光による電離作用が最も活発になる領域です。ただし、密度が高いため再結合も早く、太陽が沈むとすぐに消滅します。
  • F2層の発生条件:高度約 200~400km 付近に発生します。この高度は空気が非常に薄く、主に原子状酸素(O)で構成されています。大気密度が低いため、一度電離した電子とイオンが再結合しにくい(寿命が長い)という環境条件があります。その結果、電離が蓄積されて電離層の中で最も電子密度が高い層が作られます。 [1]

季節や時間帯による変動

2つの層は、太陽との位置関係(日照条件)によって大きく姿を変えます。

  • 昼間:太陽光が強く当たるため、電離が盛んになり F1層F2層 にはっきりと分かれます。
  • 夜間:太陽光が届かなくなるため、消滅しやすい F1層 は姿を消します。再結合が遅い F2層 だけが生き残り、夜間の F層(高度約300km)へと変化します。
  • 季節(夏と冬):夏は日照時間が長いため F1層 が明瞭に現れます。一方、F2層 は大気の膨張や組成変化の影響(「冬期異常」と呼ばれる現象)により、夏よりも冬の昼間の方が電子密度が高くなるという特徴があります。 [1, 2, 3, 4]


 

東京とハバロフスク間の直線距離は約 1,472 km です。この距離をスポラディックE層(高度100 kmと仮定)の1回反射(1ホップ)で電波が伝搬する場合、斜め入射(傾斜入射)の効果によって、垂直入射よりもはるかに低い電子密度で144 MHz帯の電波が反射されます。

 

1. 斜め入射におけるM係数の算出

電離層への電波の入射角を θi としたとき、垂直入射での臨界周波数 fc と斜め入射での最高使用周波数 MUF(今回は 144 MHz)の間には、割線の法則(Secant law)と呼ばれる以下の関係があります。

MUF = fc*secθi

 

地球の半径を 6,371 km、スポラディックE層の高度を 100 km、伝搬距離を 1,472 km として幾何学的に計算すると、電離層への入射角θi は約 79.0° となります。このときの倍率(M係数:sec θi)は 5.25 倍になります。

 

2. 必要な臨界周波数(foEs)

144 MHzの電波をこの距離で反射させるために最低限必要な垂直入射臨界周波数 fc(foEs)は、M係数を用いて以下のように下がります。

 

fc = MUF/secθi = 144MHz/5.25  ≒ 27.43MHz

 

つまり、スポラディックE層の臨界周波数が約 27.4 MHz 以上に発達していれば、東京〜ハバロフスク間で144 MHz帯の通信が成立することになります。

 

 

3. 必要な電子密度の計算

電離層が垂直に入射した電波を反射できる最高の周波数(臨界周波数 fc)は、電子密度 Ne を用いて以下の近似式で表されます。

 

fc ≒  8.98×√Ne

 

ここで、fc の単位はHz、Ne の単位は m⁻³ です。

 

この式を電子密度 Ne について解くと、以下のようになります。

Ne =(fc/8.98)^2

 

2.で計算したfc = 27.43MHz を代入して電子密度を求めます。

 

Ne =(27.43x10⁶ / 8.98)^2 ≒ 9.33×10^12 m⁻³

 

これを 1 cm³ あたりの単位に換算すると、約 9.33 × 10⁶ cm⁻³ になります。垂直入射で必要な密度(約 2.6 × 10⁸ cm⁻³)に比べ、斜め反射の効果により約 3.6% の電子密度で足りるようになります。

 

4. スポラディックE層の発生場所

東京とハバロフスクの中間地点にあたる 日本海(ウラジオストクの東側沖合)の上空 に発生する必要があります。

1回反射(1ホップ)で電波が伝搬する場合、送信点と受信点のちょうど真ん中の地点(中間反射点)にある電離層で電波が反射されるためです。

 

具体的な発生場所

東京とハバロフスクを直線で結んだルート上において、スポラディックE層が発生すべき具体的な地理的エリアは以下の通りです。

  • 地理的位置: 積丹半島(北海道)の西側、およびウラジオストク(ロシア極東)の東側に挟まれた 日本海のほぼ中央(海上) です。
  • 大まかな座標: 北緯約 42.1度、東経約 137.4度 付近。
  • 上空の高度: 地上から約 100 km のE領域。

伝搬のイメージ

  1. 送信: 東京(北緯35.6°、東経139.7°)から144MHzの電波が、北北西の方向(仰角約3°〜4°の非常に低い角度)に向けて発射されます。
  2. 反射: 電波は日本海上空約100kmに浮かぶ、電子密度の高いスポラディックE層(中間地点)に斜めに入射し、下向きに急角度で屈折(反射)します。
  3. 受信: 反射された電波はそのまま日本海を越え、ハバロフスク(北緯48.5°、東経135.2°)に到達します。 [1, 2]

この中間地点の日本海上空に十分な電子密度(約 9.33 × 10⁶ cm⁻³ 以上)を持つスポラディックE層がピンポイントで存在していることが、この2国間通信を成立させる絶対条件となります。

 

7月16日16:45(JST)ごろ通信できたかもしれません。

夏至の前後にスポラディックE層(Es層)が頻繁に出現する理由は、大気潮汐波(たいきちょうせきは)などの大気波動が夏季に強まり、高度約100km付近で強力な風のシア(風向・風速の急激な変化)を作り出すためです。 [1, 2]

 

詳細なメカニズムは現在も研究途上ですが、主に以下の3つの要因が重なることで、夏至を挟む5月〜8月頃に発生のピークを迎えます。 [1, 2]

 

1. 大気波動による中性風シアの強まり

スポラディックE層は、高度100km付近において上空と下空で「東西逆方向の風」が吹くことで形成されます。 [1]

  • イオンの圧縮: 電気を帯びた金属イオンが、地磁気とこの風の力(風のシア)によって1点に押し潰されるように集まり、局所的に高密度なプラズマの層が作られます。 [1, 2]
  • 夏季の強大化: 下層大気から上昇してくる大気潮汐波や大気重力波といった「大気波動」のダイナミクスが、日本を含む中緯度地域の夏季に最も活発になり、この風のシアを強く引き起こします。 [1, 2, 3]

2. 太陽紫外放射による電離の活発化

夏至の時期は太陽の南中高度が最も高くなり、上空に降り注ぐ紫外放射が一年で最も強くなります。 [1]

  • 背景電子密度の増加: 強烈な紫外線によって地球大気が強く電離され、スポラディックE層の材料となるベースの電子密度(E層全体の密度)が底上げされます。 [1, 2]

3. 流星物質(金属イオン)の供給

スポラディックE層の形成には、分子イオンよりも長寿命で消滅しにくい「鉄(Fe+)やマグネシウム(Mg+)などの金属イオン」が不可欠です。 [1]

  • 宇宙からの材料: これらは地球に飛び込む微小な流星(塵)が、大気圏で摩擦熱により蒸発することで供給されます。一部の研究では、地球の軌道上、夏季にこれらの流星物質の対地流入量が増えることも発生を後押ししていると考えられています。 [1, 2]


スポラディックE層の発生は、太陽活動の周期(黒点数)とはほとんど相関がなく、純粋に地球の「季節(大気循環と波動)」に深く依存した現象です。 [1]

EZBBS.NETで移動情報を発信されている掲示板を定期的に巡回し、新着情報があれば表示する簡易的なプログラムをPythonで作ってみました。

最初に各掲示板を巡回し既存の情報を取得、その後は定期的に巡回し、新しい情報があれば表示するだけのプログラムです。

最後に移動運用によるサービスをしていただいている各局に感謝いたします。

-------------------------------------------------------------------------------

import time
import requests
from bs4 import BeautifulSoup
import sys
import re

# 巡回対象
TARGETS = {
    "http://www3.ezbbs.net/08/kjrakip8/": "KJR",
    "http://www3.ezbbs.net/09/backhoo0615/": "BPK",
    "http://www3.ezbbs.net/35/jn1kwr/": "KWR"
}

# 表示させたくない文字
skip_words = {
    "[ ホームページ ] [ 携帯用URL ]",
    "ブログ引っ越しました、上記ホームページからどうぞ !!CQ Now  !",
    "文字色", "投稿KEY", "タグ有効",
    "黒", "青", "赤", "紫", "緑", "水色", "黄色", "灰色",
    "藍色", "青緑", "茶色", "ピンク", "オレンジ", "オリーブ", "シエナ",
    "主に国内 CW/SSBのNow QRV局の情報や連絡などをどうぞ★お願い★E-mailの欄には、アドレスを入力しないで下さい。"
}


# 前回の投稿リストを保存
previous_posts = {url: [] for url in TARGETS}

# HTMLタグ除去用
TAG_RE = re.compile(r"<[^>]+>")

def clean_text(html):
    """HTMLタグを除去してテキストだけにする"""
    text = TAG_RE.sub("", html)
    return text.strip()

def extract_posts(url):
    """掲示板の投稿ブロックを抽出してテキスト化"""
    try:
        res = requests.get(url, timeout=10)
        res.encoding = "shift_jis"
        soup = BeautifulSoup(res.text, "html.parser")

        # EZBBS.NET の投稿は <table> 内の <td> に入っていることが多い
        tds = soup.find_all("td")

        posts = []
        for td in tds:
            raw = str(td)
            text = clean_text(raw)

            # 投稿らしいものだけ抽出(短すぎるものは除外)
            if len(text) > 20:
                posts.append(text)

        return posts

    except Exception as e:
        print(f"[エラー] {url}: {e}")
        return []

# 既存の投稿を表示する
def old_post(posts):
    for text in posts:

        # 部分一致で除外
        if not any(word in text for word in skip_words):
            text = text.replace('&gt;', '>')
            print(text)


if __name__ == "__main__":
    # Windows の文字化け対策
    sys.stdout.reconfigure(encoding='utf8')

    print("=== 新規投稿抽出モード(60秒おき) ===")
    print("------------------------")

    while True:
        for url, name in TARGETS.items():
            posts = extract_posts(url)
            if not posts:
                print(f"{name} 掲示板は投稿が取得できませんでした")
                print("------------------------")
                continue

            # 初回は保存だけ
            if not previous_posts[url]:
                print(f"\033[36m(初回取得 {name} 掲示板 )\033[0m")
                print("------------------------")
                previous_posts[url] = posts
                # 既存Postの表示
                old_post(posts)
                print("------------------------")
                continue

            # 新規投稿を検出
            new_posts = [p for p in posts if not p in previous_posts[url]]

 

            # 新規投稿あり
            if new_posts:
                for p in new_posts:
                    p = p.replace('&gt;','>')
                    print(f"\033[36m------ 新規投稿 {name} ------\033[0m")
                    print(p)
                    print("----------------------")

            # 更新
            previous_posts[url] = posts

        time.sleep(60)

Turbo Hamlogのオプション(O)ーマスターデータをテキスト出力(O)で出力されたテキストファイル(master.txt)をExcelシートに読み込み、"master.xlsx"として保存するマクロです。
 

Hamlog自体にもExcelシートへ出力する機能がありますが、変換に時間がかかるので、テキストファイルから変換してみました。

 

このマクロはマスターデータ(master.txt)と同じディレクトリに置いてください。

ワークブックにはシート”Main"と”Master"をあらかじめ作成しておきます。
 

シート”Main"はマクロを実行するボタンなどを配置
シート”Master"は”Master.txtを読み込んだ結果が反映されます。

-------------------------------------------------------------------------------

Option Explicit

Sub MasterTextToExcel()

On Error GoTo ErrorHandler
    
    Dim ws As Worksheet
    Dim filePath As String
    Dim stream As Object
    Dim lines() As String
    Dim textLine As Variant
    Dim row As Long
    Dim i As Long, j As Long
    
    
    ' スクリーン更新をオフ
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    ' ワークシートを設定 ここではシート"Master"を設定
    Set ws = ThisWorkbook.Sheets("Master")
    ws.Cells.Clear
    ws.Cells.NumberFormat = "@" ' 文字列形式に設定
    
    ' タイトル行を設定
    ws.Range("A1:T1") = Array("No", "Code", "QTH", "Flag", "1.9", "3.5", "7", "10", "14", "18", _
                              "21", "24", "28", "50", "144", "430", "1200", "2400", "5600", "SAT")
    
    ' テキストファイルのパス
    filePath = ThisWorkbook.Path & "\master.txt"
    
    ' テキストファイル読み込み(Shift-JIS)
    Set stream = CreateObject("ADODB.Stream")
    With stream
        .Type = 2 ' テキスト
        .Charset = "Shift-JIS"
        .Open
        .LoadFromFile filePath
        lines = Split(.ReadText, vbCrLf)
        .Close
    End With
    
    ' 各行を処理
    row = 1
    For Each textLine In lines
        If Trim(textLine) <> "" Then
            row = row + 1
            ws.Cells(row, 1) = row - 1 ' No
            ws.Cells(row, 2) = Trim(Mid(textLine, 1, 6)) ' Code
            ws.Cells(row, 3) = RTrim(Replace(StrConv(MidB(StrConv(textLine, vbFromUnicode), 7, 34), vbUnicode), "   ", "")) ' QTH
            ws.Cells(row, 4) = StrConv(MidB(StrConv(textLine, vbFromUnicode), 41, 4), vbUnicode) ' Flag
            ' バンド別WKD/CFM
            j = 5
            For i = 45 To 75 Step 2
                ws.Cells(row, j) = Trim(StrConv(MidB(StrConv(textLine, vbFromUnicode), i, 2), vbUnicode))
                j = j + 1
            Next i
        End If
    Next
    
    ' Masterシートを別名保存
    ws.Copy
    ActiveWorkbook.SaveAs ThisWorkbook.Path & "\Master.xlsx", xlOpenXMLWorkbook
    ActiveWorkbook.Close
    
    ' Mainシートに更新情報を記録(この部分は削除可)
    With ThisWorkbook.Sheets("Main")
        .Cells(2, 10) = "Master.xlsx " & Format(Now, "yyyy/mm/dd hh:nn:ss") & " 更新"
        .Activate
    End With
    ThisWorkbook.Save
    
    ' 後処理
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    
    MsgBox "データ読み込みが完了しました。", vbInformation
Exit Sub

ErrorHandler:
    If Not stream Is Nothing Then stream.Close
    MsgBox "エラーが発生しました。ファイルパスまたはデータ形式を確認してください。", vbCritical
End Sub