資格試験向け法令条文検索方法の提案

最新の過去問を買うべきか買わざるべきか それが問題だ

資格試験に限らず、受験では、過去問を解くことが合格の近道です。

僕は、のんびりと受験勉強をしますので、過去問は比較的早めに準備します。また、ある程度、合格の見込みが立ってから受験を申し込みます。
このため、過去問を入手しても、試験を見送ることが多々あります。

ここで葛藤が生まれます。

例えば、過去5回分の問題集を買って持っているとします。試験を見送ったとすると、その回の過去問をどうするかです。

お金が豊富にあれば、重複している4回分を気にせず、過去問の最新版を買うことがベストでしょう。市販の過去問には解説が載っているので、効率的に勉強することができます。

しかし、近年は、試験直後に試験機関のHP上に問題と解答が掲載される事例が増えてきました。もし、法律以外の科目が自力で解けるのであれば、法律の解説のためだけに過去問を買うことは癪だとは思いませんか?

では、どうすれば最新の過去問を買い続けることなしに、独学で法律の勉強をすることができるのでしょうか?

僕は、条文検索が簡単にできれば独学が可能だと思っています。

少なくとも、労働安全コンサルタント試験では、2年ほど最新の過去問を買わなくても不都合を感じることなく勉強できました。

条文の検索が困難な理由

法令の条文はe-Gov等、関係機関のHPに公開されており、簡単に検索できそうです。しかし、次のような理由により、必要な条文までたどり着くことは思いのほか困難です。

インターネット上の検索の場合

(1)法律、施行令、規則を同時検索しにくい
(2)余計な法令や条文まで表示される
(3)ダウンロードに時間がかかる
(4)外出先では通信量が気になる

条文をダウンロードしてgrep検索(テキストファイル中の文字列検索)する場合

(5)htmlタグが邪魔で読みにくい
(6)不要な改行で条文が途中で切れてしまい、意味が分からなくなる
(7)第2項以降になると条番号が分からず、それ以降の検索が続かない

(1)~(4)については、対策が思いつきません。しかし、(5)はhtmlタグの除去、(6)は改行コードの除去、(7)は条文番号を挿入、という作業で困難に対応できます。そのため、僕は、ダウンロードして検索する方法を採用しています。

法令をダウンロードする方法

例として、労働安全衛生法を調べることとします。
ブラウザはインターネットエクスプローラを想定しています。

  • e-Gov(電子政府の総合窓口)にアクセスします
  • 「法令」欄の 「e-Gov法令検索」をクリックします
  • 「法令索引検索/法令名の用語索引」の検索欄に「労働安全衛生」とタイプして「検索」をクリックします
    • 名称に「労働安全衛生」を含む法令の一覧が示されます
    • 「施行令」や「規則」もありますね(全文一致の検索のようで、労働安全衛生「法」まで打ち込むと「規則」は表示されない)
  • 「労働安全衛生法をクリックします
    • 条文が表示されます
  • 条文のテキスト部分をコピーし、メモ帳などに貼り付けます
  • テキストファイルとして保存します

この手順で保存すれば、htmlのタグは付いてこないはずです。
しかし、別のホームページからダウンロードするなりして、htmlタグが付いたテキストしか手元にない場合には、以下のプログラムを用いれば除去することができます。

HTMLのタグを除去するプログラム

このプログラムは、htlm(htm)のタグ(”<“と”>”で囲まれた領域)を除去します。

元のhtmlファイルには書き込みません。ただし、ファイルを開く過程でトラブルが発生する可能性がありますので、バックアップしてからお試しください。

なお、本記事のプログラムの使用又は使用手順に従ったことによって生じるトラブルについて一切の責任を負いませんので、自己責任でご使用ください。

注意

「Visual Basic 2010 Express」で作成しました。

  • より新しいバージョンでは試していません
  • インストール方法はMicrosoftのHPでご確認ください

使用準備

  • 「スタートページ」の「新しいプロジェクト」をクリックします
  • 「Windows フォーム アプリケーション」をクリックします
  • 「Form1」の画面に、「ツールボックス」から「TextBox」と「Button」を一つずつ貼り付けます
  •  プログラムをクリップボードにコピーします
  • 「Form1」画面上の「Button1」をダブルクリックします
  •  開いたエディタにおいて、「Private Sub …」から「End Sub」の部分を選択し、クリップボードの内容で上書きします

プログラム

    ''' -------------------------------------------------------------- <summary>
    ''' HTML ファイルのタグを除去するプログラム                       </summary>
    ''' V1.00  2017/05/23  新規作成
    ''' ------------------------------------------------------------------------
    Private Sub Button1_Click( _
     ByVal sender As System.Object, _
     ByVal e As System.EventArgs) _
     Handles Button1.Click

        ' TextBox1にPathを入力したHTMLファイルをストリームリーダにセットする
        Dim sr As New System.IO.StreamReader(Me.TextBox1.Text, _
         System.Text.Encoding.GetEncoding("shift_jis"))
        ' ファイルの末尾まで文字列sに読み込む
        Dim s As String = sr.ReadToEnd
        ' ストリームリーダを閉じる
        sr.Close()

        ' 書き込み用文字列をクリアする
        Dim strW As String = ""
        ' タグの階層をカウントする整数jをクリア
        Dim j As Integer = 0
        ' iは文字列の場所を指す整数である
        For i = 0 To s.Length - 1
            ' i番目の文字に従って分岐処理
            Select Case s.Substring(i, 1)
                Case "<"
                    ' 左かっこならタグの階層をインクリメント
                    j += 1
                Case ">"
                    ' 右かっこならタグの階層をデクリメント(負にはしない)
                    If j > 0 Then j -= 1
                Case Else
                    ' かっこでない場合、タグの外であることを確認する
                    If j = 0 Then
                        ' 書き込み用文字列に追記する
                        strW &= s.Substring(i, 1)
                    End If
            End Select
        Next i

        ' Pathに"_1.txt"を付けたファイルを新規書き込みでストリームライタにセット
        Dim sw As New System.IO.StreamWriter(Me.TextBox1.Text & "_1.txt", _
         False, System.Text.Encoding.GetEncoding("shift_jis"))
        ' 書き込み用文字列の内容を書き込む
        sw.Write(strW)
        ' ストリームライタを閉じる
        sw.Close()
    End Sub

(デバッグモードによる)プログラムの実行

  •  メニュー欄の右向きの三角アイコンをクリックして(デバッグモードで)実行します
  •  テキストボックスに、htmlファイルのPath(”C:\”等から始まるファイル名)を入力します
  •  Button1をクリックします
  •  同じディレクトリにタグ除去後のファイルができます。名前は、「元のファイル名_1.txt」です
  •  右上の「×」をクリックして終了します

exeファイルの作成

  • 本プログラムを今後も使う場合、exeファイルを作ることができます
    • 以下は一例です。名前は適宜変更してください。
  • 「ファイル」メニュー → 「すべてを保存」を選びます
  • 「名前:RemoveTag」
    「場所:C:\Users\ユーザ名\Desktop」として、
    「ソリューションのディレクトリを作成」のチェックを外し、
    「上書き保存」をクリックします
  •  右上の「ソリューションエクスプローラー」において、「RemoveTag」を右クリックします
  • 「ビルド」を選びます
  • 「デスクトップ\RemoveTag\bin\Release\RemoveTag.exe」にexeファイルができます

条文を検索しやすいように加工しよう

検索結果の使い勝手を向上させるための加工のポイントは以下の3点になります。

(1)改行を削除して項を一行にする
(2)第2項以降にも条番号を入れる
(3)項ごとに見出しを入れる

以下に加工例を示します。なお、後述の「条文加工用プログラム」を用いると、この加工を自動化できます。

加工例1

「著作権法」の第十三条第1項には、第一号から第四号まで記載されています。各号は改行後に記載されており、grepで1つの号だけを抽出されても条文の意味が分かりません。そこで、各号番号の直前の改行を削除して項を1行にまとめます(1)。また、条文の内容が分かるように条番号の前に見出しを入れます(3)。

加工例は以下のようになります。

(権利の目的とならない著作物)第十三条 次の各号のいずれかに該当する著作物は、この章の規定による権利の目的となることができない。  一 憲法その他の法令  二 国若しくは地方公共団体の機関、独立行政法人(独立行政法人通則法 (平成十一年法律第百三号)第二条第一項 に規定する独立行政法人をいう。以下同じ。)又は地方独立行政法人(地方独立行政法人法 (平成十五年法律第百十八号)第二条第一項 に規定する地方独立行政法人をいう。以下同じ。)が発する告示、訓令、通達その他これらに類するもの  三 裁判所の判決、決定、命令及び審判並びに行政庁の裁決及び決定で裁判に準ずる手続により行われるもの  四 前三号に掲げるものの翻訳物及び編集物で、国若しくは地方公共団体の機関、独立行政法人又は地方独立行政法人が作成するもの

ここでは、号番号を目立たせるために、号番号の前に全角空白を2文字置くこととしました。

ところで、この条文の内容をお読みいただけますでしょうか。

第一号に、法令は著作権の目的となることができない旨が記されています。よって、法令をいくら引用しても著作権法違反になりませんので、本サイトでは安心して引用しています。

加工例2

「特定電子メールの送信の適正化等に関する法律」の第三条は、3項から構成されています。ここでは加工例として第1項と第2項を示します。

第1項については、加工例1と同様に、(1)と(3)を考慮して加工します。
第2項については、頭に見出し(3)と条番号(2)を加えます。

特に、条番号を加えておかないと、この第2項が検索に引っかかった時に「前項第一号」が何を指すのかが分かりません。

(特定電子メールの送信の制限)第三条 送信者は、次に掲げる者以外の者に対し、特定電子メールの送信をしてはならない。   一あらかじめ、特定電子メールの送信をするように求める旨又は送信をすることに同意する旨を送信者又は送信委託者(電子メールの送信を委託した者(営利を目的とする団体及び営業を営む場合における個人に限る。)をいう。以下同じ。)に対し通知した者  ニ(以下略)

(特定電子メールの送信の制限)第三条 2 前項第一号の通知を受けた者は、総務省令・内閣府令で定めるところにより特定電子メールの送信をするように求めがあったこと又は送信をすることに同意があったことを証する記録を保存しなければならない。

この条文を読むと、広告や宣伝のためにメールを送るためには、同意記録の保存が必要なことが分かります。違反すると同法第三十五条により、百万円以下の罰金です。

条文加工用プログラム

条文加工用のプログラムを作りました。
使い方は上述の「htmlのタグを除去するプログラム」と一緒です。

ただし、表には対応できていません。

プログラム

    ''' -------------------------------------------------------------- <summary>
    ''' 条文を加工するプログラム                                      </summary>
    ''' V1.00  2017/05/31  新規作成
    ''' ------------------------------------------------------------------------
    Private Sub Button1_Click( _
     ByVal sender As System.Object, _
     ByVal e As System.EventArgs) _
     Handles Button1.Click
        Dim vbCrLf = Environment.NewLine    ' 改行コード

        ' 実行ボタンを操作不可にする
        Me.Button1.Enabled = False

        ' 元ファイルをShift(-JISコードとして開く)
        Dim sr As New System.IO.StreamReader(Me.TextBox1.Text, _
         System.Text.Encoding.GetEncoding("shift_jis"))
        ' 内容をすべて読み込む
        Dim strBefore As String = sr.ReadToEnd()    ' 加工前の文字列
        ' 閉じる
        sr.Close()

        ' 半角スペースを全角スペースに置き換える
        Do While strBefore.IndexOf(" "c) >= 0
            strBefore = strBefore.Replace(" ", " ")
        Loop

        ' 全角スペース2文字を全角スペース1文字に置き換える
        Do While strBefore.IndexOf("  ") >= 0
            strBefore = strBefore.Replace("  ", " ")
        Loop

        ' 改行前の空白を削除
        Do While strBefore.IndexOf(" " & vbCrLf) >= 0
            strBefore = strBefore.Replace(" " & vbCrLf, vbCrLf)
        Loop

        ' 連続改行を削除
        Do While strBefore.IndexOf(vbCrLf & vbCrLf) >= 0
            strBefore = strBefore.Replace(vbCrLf & vbCrLf, vbCrLf)
        Loop

        Const cstItems As String = "一, 二, 三, 四, 五, 六, 七, 八, 九, 十, " & _
         "十一, 十二, 十三, 十四, 十五, 十六, 十七, 十八, 十九, 二十, " & _
         "イ, ロ, ハ, ニ, ホ, ヘ, ト, チ, リ, ヌ, ル, ヲ, ワ, カ, " & _
         "ヨ, タ, レ, ソ, ツ, ネ, ナ, ラ, ム, ウ, ヰ, ノ, オ, ク, " & _
         "ヤ, マ, ケ, フ, コ, エ, テ, ア, サ, キ, ユ, メ, ミ, シ, " & _
         "ヱ, ヒ, モ, セ, ス"                                        ' 号番号を列挙する
        Dim strItems() As String = cstItems.Replace(" ", "").Split(","c)    ' 号番号を配列にする
        Dim i As Integer                                                    ' 制御変数

        ' 号番号の前の改行を削除し全角空白を2つ入れる
        For i = strItems.GetLowerBound(0) To strItems.GetUpperBound(0)
            strBefore = strBefore.Replace(vbCrLf & strItems(i), "  " & strItems(i))
        Next

        Dim intCrLf As Integer                      ' 改行コードの位置
        Dim intLen As Integer = strBefore.Length    ' 加工前の文字列長さ
        Dim intLenNL As Integer = vbCrLf.Length     ' 改行コードの長さ
        Dim intTmp As Integer                       ' 位置情報の一時的保持用
        Dim strAfter As String = ""                 ' 加工後の文字列
        Dim strArticle As String = ""               ' 条番号
        Dim strTitle As String = ""                 ' 条文の見出し

        ' 加工後の文字列を作成する。iは加工前の文字列を処理している位置を示す
        Do While i < intLen
            ' 次の改行コードの位置を調べる
            intCrLf = strBefore.IndexOf(vbCrLf, i)
            ' 改行コードが処理位置より後ならその領域の文字列を加工後の文字列に追記する
            If intCrLf > i Then strAfter &= strBefore.Substring(i, intCrLf + intLenNL - i)
            ' 改行コードが見つからなかったら加工後の文字列作成修了
            If intCrLf < 0 Then Exit Do
            If intCrLf + intLenNL = intLen Then Exit Do
            ' 改行コードの次の1文字で分岐
            Select Case strBefore.Substring(intCrLf + intLenNL, 1)

                Case "("
                    ' ─── 左丸括弧の場合は見出しとみなす ───
                    ' 右丸括弧の位置を探す
                    intTmp = strBefore.IndexOf(")" & vbCrLf, intCrLf + intLenNL)
                    ' 右括弧が無い場合はそこまでの文字列を加工後の文字列に追記して終了
                    If intTmp < 0 Then strAfter &= strBefore.Substring(intCrLf + intLenNL) : Exit Do
                    ' 見出しを内部変数に保持
                    strTitle = strBefore.Substring(intCrLf + intLenNL, intTmp - intCrLf - 1)
                    ' 処理位置を右括弧の次の位置に変える
                    i = intTmp + 1

                Case "第"
                    ' ───「第」の場合は条文とみなす ───
                    ' 条番号の終わり(全角スペース)を探す
                    intTmp = strBefore.IndexOf(" ", intCrLf + intLenNL)
                    ' 条番号の終わりが無い場合はそこまでの文字列を加工後の文字列に追記して終了
                    If intTmp < 0 Then strAfter &= strBefore.Substring(intCrLf + intLenNL) : Exit Do
                    ' 条番号を内部変数に保持
                    strArticle = strBefore.Substring(intCrLf + intLenNL, intTmp - intCrLf - 1)
                    ' 見出しを先頭につけておく
                    strAfter &= strTitle
                    ' 処理位置を改行コードの次に変える
                    i = intCrLf + intLenNL

                Case "1", "2", "3", "4", "5", "6", "7", "8", "9"
                    ' ─── 算用数字の場合は項とみなす ───
                    ' 項の場合は、見出しと条番号を先頭につけておく
                    strAfter &= strTitle & strArticle
                    ' 処理位置を改行コードの次に変える
                    i = intCrLf + intLenNL

                Case Else
                    ' ─── 条件に合致しない場合 ───
                    ' 処理位置を改行コードの次に変える
                    i = intCrLf + intLenNL
            End Select
        Loop

        ' 加工後の文字列を保存するファイルにShift JISで上書きする
        Dim sw As New System.IO.StreamWriter(Me.TextBox1.Text & "_1.txt", _
         False, System.Text.Encoding.GetEncoding("shift_jis"))
        sw.Write(strAfter)
        ' ファイルを閉じる
        sw.Close()

        ' 実行ボタンを操作可能にする
        Me.Button1.Enabled = True
    End Sub

スマホでオフライン法令検索

僕は、Android スマホを用いて法令検索をしています。
検索ソフトとしては、Aquamarine Networks. の aGrep を使っています。

法律、施行令、規則のテキストファイルを1つのディレクトリに入れておき、横断的に検索をかけます。もちろんオフラインなので、通信費もかかりません。

aGrep の検索は一瞬で終了します。検索ワードがハイライト表示されますし、行ごとに薄い区切り線が入りますので、見やすいです。

検索履歴が残るので、前に使ったキーワードで再検索をかけることも簡単です。検索対象とするディレクトリを簡単に切り替えることができますので、資格試験ごとに異なる法令を使い分けることも簡単です。

参考

労働安全コンサルタントの受験勉強では、下記の法令を一つのディレクトリに入れて検索していました。試験にはあまり関係ない法令も入っていますが、ほぼ一瞬で検索できるので、迷ったら入れておくとよいと思います。ファイル名の先頭に番号を付けて、重要法令から順に出てくるようにしておくと便利です。容量は全部で1.4MBくらいです。

  1. 労働安全衛生法
  2. 労働安全衛生法施行令
  3. 労働安全衛生規則
  4. 労働安全衛生法関係手数料令
  5. 労働安全衛生法に基づく製造時等検査及び型式検定の手数料の加算額の計算に関する省令
  6. 安全衛生特別教育規程
  7. ボイラー及び圧力容器安全規則
  8. クレーン等安全規則
  9. ゴンドラ安全規則
  10. 作業環境測定法
  11. 作業環境測定法施行令
  12. 作業環境測定法施行規則
  13. 有機溶剤中毒予防規則
  14. 特定化学物質障害予防規則
  15. 鉛中毒予防規則

提案した法令検索方法の効果

ここで提案した法令検索方法を使って判明したことが2点ほどありましたので、参考までにご紹介します。

過去問の解説に誤りがあることがある

試験実施機関が発表する解答は正確です。例え間違っても、各所から指摘が入り、必ず訂正されます。

しかし、過去問に付されている「解説」は必ずしも全てが正確ではありません。解説は基本的に一人で執筆するでしょうし、苦手な分野でも無理やり解説せざるを得ないからだと思います。

論理的に納得できない解説がされていた問題に対して法令を検索し、本来の解答根拠を発見したことが数件ありました。

こんなとき、ちょっと嬉しさを感じます。

法令は頻繁に改正されている

数年前の過去問の解説を読んでいると、現行の条文と条文番号が違っていたり、表現が違っている場合に何度か出くわしました。
法令は、世間の動向に合わせて日々改訂されていて、生き物のように感じました。

逆に、関係者が動向に注意を払うような関心の高い条文だからこそ試験問題に出るのかもしれません。

資格試験は、学んだ知識が古くならないように、短期決戦で臨むべきだと思いました。また、業務等で本検索方法を長年使っていく場合には、2年に1度くらい全文をダウンロードをし直してアップデートしておくことが大切だと思います。

コメント

タイトルとURLをコピーしました