snovaのブログ

主にプログラミングやデジタルコンテンツについて書きます。最近はPython, Flutter, VRに興味があります。

小中学校の計算問題と解答を生成

イントロダクション

たまにはプログラムを書かないと腕がなまりそうなので、簡単なものを作ってみました。 小学校算数や中学校数学の計算問題と解答を作成し、ファイルに出力するプログラムです。

小学算数と中学数学の範囲

各学校ではどのような内容を学ぶのか、文科省のHPで調べ、ざっくりまとめてみました。

まず、小学校

  • 四則演算(筆算を含む)
  • 表とグラフ
  • 平面図形と立体図形
  • 分数、小数
  • 割合、比例
  • その他(魔法陣やパズル)

次に、中学校

  • 数と式
  • 方程式
  • 関数
  • 平面図形と立体図形
  • 資料の活用
  • 証明

四則演算が出来ることが前提で進んでいくので、今回は四則演算(小数、正負の数を含む)の問題生成プログラムを作成していきます。

流れ

今回のプログラムの流れをまとめます。

  1. 計算設定(問題数の設定等)
  2. ランダムに問題を生成
  3. 解答を作成
  4. 出力

計算設定については、複雑にしすぎると際限なくパターンを考えないといけないので、今回は4つだけにしました。 - 問題数 - 問題の桁数 - 負の数を含めるか - 小数を含めるか

また、出力形式はTSVにしました。 (csvだと小数ありのとき読みにくかったので)

実際のプログラム

コメントも記載したプログラムです。

四則演算問題生成

githubでも共有します。

https://github.com/snova301/math_ope4_gen

結果

add
 [['6' '+' '5' '=' '11']
 ['3' '+' '5' '=' '8']
 ['6' '+' '7' '=' '13']
 ['6' '+' '7' '=' '13']
 ['6' '+' '5' '=' '11']
 ['6' '+' '4' '=' '10']
 ['8' '+' '8' '=' '16']
 ['1' '+' '5' '=' '6']
 ['7' '+' '4' '=' '11']
 ['8' '+' '8' '=' '16']]

diff
 [['6' '-' '2' '=' '4']
 ['4' '-' '4' '=' '0']
 ['4' '-' '4' '=' '0']
 ['8' '-' '3' '=' '5']
 ['8' '-' '6' '=' '2']
 ['8' '-' '7' '=' '1']
 ['5' '-' '3' '=' '2']
 ['7' '-' '4' '=' '3']
 ['7' '-' '2' '=' '5']
 ['6' '-' '2' '=' '4']]

multiply
 [['2' '*' '1' '=' '2']
 ['8' '*' '4' '=' '32']
 ['8' '*' '4' '=' '32']
 ['1' '*' '2' '=' '2']
 ['4' '*' '4' '=' '16']
 ['7' '*' '3' '=' '21']
 ['2' '*' '2' '=' '4']
 ['1' '*' '1' '=' '1']
 ['4' '*' '6' '=' '24']
 ['4' '*' '8' '=' '32']]

 div
 [['4' '/' '4' '=' '1.0']
 ['5' '/' '5' '=' '1.0']
 ['5' '/' '2' '=' '2.5']
 ['4' '/' '4' '=' '1.0']
 ['4' '/' '7' '=' '0.5714285714285714']
 ['3' '/' '3' '=' '1.0']
 ['6' '/' '1' '=' '6.0']
 ['2' '/' '6' '=' '0.3333333333333333']
 ['6' '/' '8' '=' '0.75']
 ['7' '/' '6' '=' '1.1666666666666667']]

今後の展望

方程式、関数、図形問題、証明問題をしたいと思いますが、個人的には文章題の生成と解答がどうにかしてできないか考えてます。 上記の件がうまくいけば、数学だけではなく、理科、国語、社会にも応用していきたいと思います。

簡単な電気回路の問題をpythonで解く

イントロダクション

科学技術計算との相性が比較的良いpythonですが、電気回路に関するものが少なかったので、取り組んでみました。 ここ最近、資格試験や仕事で全くPCをいじれていなかったので、頭の体操代わりに簡単な交流電気回路を解いてみます。

目次

電気回路の基礎

高校物理を履修した人なら、オームの法則とキルヒホッフの法則はご存知かと思いますが、これらに加え行列、微分方程式、ラプラス変換などを使うと、大抵の電気回路、アナログ電子回路を解くことができます。

直流回路

直流回路の電流値を求めてみます。オームの法則で求めます。

問題は以下の通り。

E = 100 # V
R = 1000 # ohm

I = E/R # A
print(I)

答えは、0.1 Aです。

単相交流回路

交流電源に抵抗とコンデンサと入れた回路について解きます。

Em = 100 # V
f = 60 # Hz
R = 1000 # ohm
C = 10 * 10e-6 # F

abs_I = (Em / np.sqrt(2)) / np.abs(R + 1/(2*np.pi*f*C)) # A
print(abs_I)

まとめ

簡単な電気回路の問題を解きました。 頭が鈍っていたので、たったこれだけのことをするのにも、少し時間がかかりました。

今後は、より複雑な問題や三相交流回路、アナログ電子回路の問題を行列や微分方程式を使って、計算機工学の手法を使って解きたいと思います。

参考サイト

電気関係の法令をpythonで収集し、Githubで共有する

イントロダクション

私は普段、電気設備設計や工事に関する仕事をしています。

電気は非常に危険なもので、利用者だけではなく、作業者の安全にも気をつけないといけません。 そのため、いくつもの法令(電気事業法電気工事士法等)や規格(JIS、JEC等)で事故防止を図っているのですが、種類や量が多く、複雑でわかりにくいです。 もっと言うと、通常は法令だけでなく社内基準等もあります。

さらに、法律が改訂されたときはどこが変更になったのか把握する必要があります。 法令を守らないと罰せられるので、どこが変わったのか知っておくべきです。

電気主任技術者やエネルギー管理士等を目指す人にも法律を知ることは重要です。 (ただ、普通は法令の本文を暗記するのではなく、参考書で勉強します。)

そこで、電気法規や電気規格についてまとめ、簡単に調べられるようにgithubに共有することにしました。

目次

現状把握

電気法規に関してはネットで調べたら、個別にわかりやすくまとめられたサイトが複数ありました。 法律本文は国のe-Govで検索できます。

最近はe-Govだけではなく、政府の事業が検索できるサイトワシントン州の法律をまとめたGithub宮崎県総合政策部統計調査課のGithub国土地理院のオープンデータなど、国や自治体がしていることをオープン化しよう、みたいなことが増えています。

仕様

最低限必要な機能をまとめました。

  • 法律の改正があったときに更新履歴がわかる
  • 二次利用できるようにxml, json等に保存できる
  • 著作権保護されている規格は本文を記載せず、リンクを貼る

以上を満たすように検討した結果、今回はGithubで共有することにします。

なお、法律の著作権の扱いは著作権法第13条に記載の通り

十三条 次の各号のいずれかに該当する著作物は、この章の規定による権利の目的となることができない。

一 憲法その他の法令

二 国若しくは地方公共団体の機関、独立行政法人独立行政法人通則法(平成十一年法律第百三号)第二条第一項に規定する独立行政法人をいう。以下同じ。)又は地方独立行政法人地方独立行政法人法(平成十五年法律第百十八号)第二条第一項に規定する地方独立行政法人をいう。以下同じ。)が発する告示、訓令、通達その他これらに類するもの

三 裁判所の判決、決定、命令及び審判並びに行政庁の裁決及び決定で裁判に準ずる手続により行われるもの

四 前三号に掲げるものの翻訳物及び編集物で、国若しくは地方公共団体の機関、独立行政法人又は地方独立行政法人が作成するもの

JIS規格に関しては、公式FAQにて著作権法の保護対象となっているとの記載があるため、本文の記載はせずリンクを貼り付けるだけにしています。

法令の収集

法令とは、法律や省令などを総称した表現です。 電気設備や工事等に関係する法令を以下にまとめました。

上記の法令をe-Govから取得します。 取得方法は公式のPDFマニュアルを参考にしました。 なお、公式マニュアルではリクエスURIhttpとなっていますが、すべてhttpsに置き換えないと値が返ってきませんのでご注意。 (2019/08/17現在ではAPIのバージョンは1です)

まず、法令の一覧表を取得します。

URI

https://elaws.e-gov.go.jp/api/{Version}/lawlists/{法令種別}

です。

このとき、法令種別は以下の通りです。

1: 全法令
2: 憲法、法律
3: 政令、勅令
4: 府省令

法令の一覧表を取得するコード。

import requests

url_lawlist = 'https://elaws.e-gov.go.jp/api/1/lawlists/1' # api/{Version}/lawdata/{法令番号}
path_lawlist = 'lawlist.xml'

with requests.get(url_lawlist) as res_lawlist:
    print(res_lawlist.status_code)

    with open(path_lawlist, 'w') as f_lawlist:
        f_lawlist.write(res_lawlist.text)

取得した法令一覧の一部を示します。

<?xml version="1.0" encoding="UTF-8"?>
<DataRoot>
    <Result>
        <Code>0</Code>
        <Message></Message>
    </Result>
    <ApplData>
        <Category>1</Category>
        <LawNameListInfo>
            <LawName>明治五年太政官布告第三百三十七号(改暦ノ布告)</LawName>
            <LawNo>明治五年太政官布告第三百三十七号</LawNo>
            <PromulgationDate>18721109</PromulgationDate>
        </LawNameListInfo>
        <LawNameListInfo>
            <LawName>明治六年太政官布告第六十五号(絞罪器械図式)</LawName>
            <LawNo>明治六年太政官布告第六十五号</LawNo>
            <PromulgationDate>18730220</PromulgationDate>
        </LawNameListInfo>

...

        <LawNameListInfo>
            <LawName>行政手続における特定の個人を識別するための番号の利用等に関する法律第四十五条の二第一項の法務省令で定める情報を定める省令</LawName>
            <LawNo>令和元年法務省令第三号</LawNo>
            <PromulgationDate>20190620</PromulgationDate>
        </LawNameListInfo>
    </ApplData>
</DataRoot>

e-Govで検索できるように、法律の番号をリスト化します。 少しコードが汚いですが、取得した法令一覧XMLファイルから知りたい法令の番号を抽出していくプログラムのコードを載せます。

import xml.etree.ElementTree as ET 

ET_root = ET.parse(path_lawlist)
ET_root = ET_root.getroot()
list_all_LawName = [i.text for i in ET_root.findall('.//LawName')]
list_all_LawNo = [i.text for i in ET_root.findall('.//LawNo')]
list_elec_law =[r'電気事業法', r'電気事業法施行令']

list_LawNo = []
for i_elec_law in list_elec_law:
    if i_elec_law in list_all_LawName:
        num_LawName_index = list_all_LawName.index(i_elec_law)
        str_LawName = list_all_LawName[num_LawName_index]
        str_LawNo = list_all_LawNo[num_LawName_index]
        print(str_LawName)
        print(str_LawNo)
        list_LawNo.append(str_LawNo)
print(list_LawNo)

法令番号から実際に法令のデータを取得します。

URI

https://elaws.e-gov.go.jp/api/{Version}/lawdata/{法令番号}

です。

コードを載せます。

law_name = [r'電気事業法']
lawnum = [r'昭和三十九年法律第百七十号']

for i_loop, i_lawdata in enumerate(law_num):
    path_lawname = law_name[i_loop]+'.xml'
    lawdata_url = 'https://elaws.e-gov.go.jp/api/1/lawdata/'+i_lawdata

    with requests.get(lawdata_url) as res_lawdata:
        print(res_lawdata.status_code)

        with open(path_lawname, 'w') as f_lawname:
            f_lawname.write(res_lawdata.text)

status_codeで確認したとき、HTTPレスポンスが406を吐き出すことがあります。 法令取得APIが特定サイズ(10MB)を超える法令の取得を制限しているためです。

回避しようと思ったら、条項の部分まで個別で取得する方法と、法令データを一括ダウンロードできるページを使う方法があります。

なお、条項まで含んだときのURI

https://elaws.e-gov.go.jp/api/{Version}/articles;lawNum={法令番号};article={条};paragraph={項};appdxTable={別表}

です。

それでは、取得した法令データの例を以下に示します。

<?xml version="1.0" encoding="UTF-8"?>
<DataRoot>
    <Result>
        <Code>0</Code>
        <Message></Message>
    </Result>
    <ApplData>
        <LawNum>昭和三十九年法律第百七十号</LawNum>
        <LawFullText>
<Law Era="Showa" Lang="ja" LawType="Act" Num="170" Year="39">
  <LawNum>昭和三十九年法律第百七十号</LawNum>
  <LawBody>
    <LawTitle>電気事業法</LawTitle>
    <TOC>
      <TOCLabel>目次</TOCLabel>
      <TOCChapter Delete="false" Num="1">
        <ChapterTitle>第一章 総則</ChapterTitle>
        <ArticleRange>(第一条・第二条)</ArticleRange>
      </TOCChapter>

...

    <SupplProvision AmendLawNum="平成二九年五月三一日法律第四一号" Extract="true" Type="Amend">
      <SupplProvisionLabel>附 則</SupplProvisionLabel>
      <Article Delete="false" Hide="false" Num="1">
        <ArticleCaption>(施行期日)</ArticleCaption>
        <ArticleTitle>第一条</ArticleTitle>
        <Paragraph Hide="false" Num="1">
          <ParagraphNum/>
          <ParagraphSentence>
            <Sentence Function="main" Num="1" WritingMode="vertical">この法律は、平成三十一年四月一日から施行する。</Sentence>
            <Sentence Function="proviso" Num="2" WritingMode="vertical">ただし、次条及び附則第四十八条の規定は、公布の日から施行する。</Sentence>
          </ParagraphSentence>
        </Paragraph>
      </Article>
      <Article Delete="false" Hide="false" Num="48">
        <ArticleCaption>(政令への委任)</ArticleCaption>
        <ArticleTitle>第四十八条</ArticleTitle>
        <Paragraph Hide="false" Num="1">
          <ParagraphNum/>
          <ParagraphSentence>
            <Sentence WritingMode="vertical">この附則に規定するもののほか、この法律の施行に関し必要な経過措置は、政令で定める。</Sentence>
          </ParagraphSentence>
        </Paragraph>
      </Article>
    </SupplProvision>
  </LawBody>
</Law>
</LawFullText>
    </ApplData>
</DataRoot>

コード全文をgistで共有します。

日本の電気関係の法令を取得するプログラム

取得した法令データはgithubで共有します。

github.com

規格の収集

電気設備に関係する規格を以下にまとめました。

  • JIS規格(日本産業規格)
  • JEC規格(電気規格調査会規格)
  • 内線規定(需要設備における電気設備設計の規格)

※JISは日本工業規格の略でしたが、2019/07/01に日本語名が日本産業規格となりました。今後、データ等の標準化も進んでいきます。詳しくは経産省のHPで。

なお、多くの規格が民間規格なので、著作権のためGithubに上げることはできませんでした。

JIS規格

国立国会図書館のHPを見てみると、JIS規格は規格表と呼ばれる冊子を検索、閲覧するか、JISCのHPから調べることができます。

また、個人や法人が運営するサイトでも一部公開や規格の解説されています。

JEC規格

電気学会 電気規格調査会が作成している規格です。

規格の内容は公開していません。 中身を知りたい場合は電気学会のHPで冊子または電子版を購入してください。

内線規定

電気需要場所における電気設備の保安を確保するための民間規格です。 電力会社によって付録が違います。

規格の内容は公開していません。 内容を知りたい場合は電気協会のHPで購入してください。

まとめ

XMLが使いにくいので、jsonyamlで管理したいなと思いました。 (そのうち対応します。)

規格に関しては民間主体のものが多く、著作権的な関係で本文データを扱いにくいなという印象でした。 JIS規格や内線規定は有名ですが、他にも専門的な規格が多くあるとは知らず、勉強になりました。

今後は専門的な法令や規格(省エネ法、火技解釈)も取り扱いたいと思います。

以上、記事についてミスがあれば、ご連絡ください。 また、法律のまとめ方についてご意見等ございましたら、ご教示いただけると幸いです。

今後の展開

参考サイト

※本記事は2019/08/17現在の法令に則り執筆しています

Google Play and the Google Play logo are trademarks of Google LLC.