ぽっけの技術ブログ

仕事や趣味で日々学んだことを出力していきます。

英単語の暗記カードアプリを作成しました

前回の略語暗記カード(略語の暗記カードアプリを作成しました - ぽっけの技術ブログ)を応用し、英単語暗記カードのようなコンソールアプリケーションを作成しました。

TOEIC勉強などに利用できます。

ダウンロード

github.com

使い方

flashcardsForEnglish.pyを実行すると同階層のeng.csvを読み込み、ランダムで英単語を出題します。
Enterで答えが表示されます。
自分が思ったのが合っていたら]Enter
わからなかった、または間違っていたらそのままEnterを押します。
一周するまでわからなかった問題がランダムで出題されます。
また完全に覚えた単語は:Enterすると、次の周回や起動時も二度と出題されなくなります。

<サンプル2>

単語帳ファイルについて

単語帳ファイルeng.cvs(UTF-8、BOM付き)は、[英単語],[日本語訳],[出題フラグ]の形式のCSVファイルです。
サンプルとしてTOEIC~約800点相当の英単語・イディオムを約1400語入れていますが、編集・追記が可能です。
出題フラグが1のもののみが出題され、完全に覚えた単語は出題フラグが0に変わります。

ソースコード

import csv
import random

if __name__ == '__main__':
    while True:
        with open('eng.csv', encoding='UTF-8_sig') as f:
            reader = csv.reader(f)
            l = []
            write = []
            left = 0
            for row in reader:
                if len(row) != 0:
                    l.append(row)
                    write.append(row)
                    if row[2] == '1':
                        left += 1
            
            print('全 ' + str(left) + ' 問')
            print('"]":わかった! ":":覚えた!')
        while True:
            i = random.randint(0, len(l) - 1)
            if l[i][2] != '1':
                continue

            print(l[i][0])
            input()
            print(l[i][1])

            command = input()
            if command.lower() == ']':
                print('  ( -`ω-)✧ わかった!')
                del l[i]
                left -= 1
                print('------------------------残り ' + str(left) + " 問")
            elif command.lower() == ':':
                print('゚+。:.゚ヾ(≧∇≦*)/ 覚えた!.:。+゚')
                left -= 1
                print('------------------------残り ' + str(left) + " 問")

                for row in write:
                    if row[0] == l[i][0]:
                        row[2] = '0'
                        l[i][2] = '0'
                        break
                with open('eng.csv', 'w', encoding='UTF-8_sig', newline='') as f:
                    writer = csv.writer(f)
                    writer.writerows(write)
            else:
                print('◆◆◆◆◆◆◆◆ (・_・)わからん……◆◆◆◆◆◆◆◆')
                print('------------------------')

            if left == 0:
                print('  旦_(-ω- ,,)一周しました。')
                print('')
                break

所感

今回もシンプルな実装とシンプルな機能を目指して作りました。
前回の略語暗記カードを少し改造して英単語暗記カードを作ろうとしましたが、正確に日本語訳を入力しなければならないのは使っていて面倒なので、このような脳内判定形式にしました。
また単語数が1400語以上と膨大になったので、完全に覚えた単語は二度と出題しない機能を付けました。

Pyinstallerでビルドすると重くなるとき

Pyinstallerでpyファイルをexeファイルにビルドすると、ファイルサイズがとても大きくなることがあります。
自分は2KBのpyファイルをビルドすると19943KBのexeファイルになってしまいました。

pyinstaller xxx.py --onefile

pyinstallerで--onefileオプション付きでビルドすると、環境上のライブラリを全て取り込みexeファイルを作成してしまうのが原因です。
対策として不要なライブラリがある場合、--excludeオプションでビルドから除外するライブラリを指定することも出来ます。

ただ、自分は今回乱数生成用のライブラリが必要だったので、 numpy を標準ライブラリの random で代用してみます。

import numpy
# 中略
i = numpy.random.randint(0, len(l))
import random
# 中略
i = random.randint(0, len(l) - 1)

numpy.random.randint()は第1引数以上、第2引数未満の整数をランダムに返すのに対し、
random.randint()は第1引数以上、第2引数以下の整数をランダムに返します。
なので書き換えるときは第2引数の値を1小さくするといいでしょう。

この状態でビルドするとサイズを6498KBまでに抑えることが出来ました。当初の1/3以下です。

所感

作ってpyファイルとして実行するときは軽量だったので何も考えずにnumpyを使いましたが、exe化した後ことも考えてライブラリを選んだ方がよさそうです。
可能なら標準ライブラリを選んだ方が、ファイルサイズを抑えられることがあります。

pyファイルを配布する時はexeファイルにする

先日パソコンAで作成したPythonのソースファイル(.py)を、パソコンBで実行しようとするとうまくいきませんでした。
コンソールアプリだったのですが、一瞬だけコンソールが表示されすぐに終了してしまいます。

Visual Studio Codeで中身を見ると、import numpyの箇所にエラー。
pip list コマンドでライブラリを見てみるとパソコンAにはnumpyがインストールされているのに対し、パソコンBにはインストールされていませんでした。

実行環境にライブラリが足りていなければpyファイルは実行できないようです。
つまりPythonでアプリケーションを作ってもpyファイルは配布するには少し向いていない。

www.insource.co.jp

上記サイトによると配布する時はexeファイルにすると良さそうです。

  1. pyinstallerがなければ pip install pyinstaller でインストール
  2. pyファイルのある階層に移動し、 pyinstaller xxx.py --onefile

これでしばらく待つとdistフォルダが作成され、中にxxx.exeファイルが生成されます。
注意点として、例えばアプリに「同階層のCSVファイルを読み込む」といった操作が含まれる場合、そのままの場所でEXEを実行するとエラーになるのでファイルを移動させましょう。

GitHubで実行ファイルを公開するには?

以前「略語暗記カード」というアプリを作ったのでソースをGitHubに公開しました。

略語の暗記カードアプリを作成しました - ぽっけの技術ブログ

その後「どうせなら実行ファイルも配布しよう」と考えたのですが、よく考えたらGitHubページのどこに置けばいいのかわからなかったので調べてみました。

方法

ソースファイルと同じ場所に置いて公開する……と思っていたのですがそうではなく、GitHubにはRelease機能というアプリケーション配布用の機能が用意されているので、それを使うといいみたいです。

Codeタブ右の Release 内の Create a new release をクリックし、

Choose a tag にバージョン(v1.0.0など)
Release Title にタイトル
Describe this release に説明を書き、
実行ファイルをドラッグアンドドロップして Publish release をクリックします。

Codeタブ右のRelease内にリリースが追加され、実行ファイルがダウンロードできるようになります。

GitHubはソースを共有するためのサービス

GitHubとは、開発プロジェクトのソースコードを管理できるWEBサービスです。 GitHubにはソースコードを共有できる様々な機能があり、プロジェクトのソースコードの管理にかかるコストを削減できます。 https://www.acrovision.jp/career/?p=2930

つまりGitHubは基本的にソースを共有し皆でアプリを開発するための場なので、実行ファイルの配布はソース共有とは別機能になっているみたいです。

略語の暗記カードアプリを作成しました

英語の略語を覚えるための暗記カードのようなコンソールアプリケーションをPythonで作成したので公開します。
ポンポンと問題を解いていけるシンプルなPC用アプリです。
資格勉強なんかに役立ちます。

ダウンロード

github.com

目的

基本情報技術者試験応用情報技術者試験の過去問を解いていると、以下のような問題に出くわします。

WPA3はどれか。
ア. HTTP通信の暗号化規格
イ. TCP/IP通信の暗号化規格
ウ. Webサーバで使用するディジタル証明書の規格
エ. 無線LANのセキュリティ規格
応用情報技術者試験ドットコム 基本情報技術者令和元年秋期 午前問37より

この問題、WPA3が Wi-Fi Protected Access 3 の略であることを知っていれば、それだけで答えが エ. 無線LANのセキュリティ規格 であることがわかります。
このように略語さえ知っていれば答えがわかる問題が結構多かったので、略語を覚えるためのシンプルな暗記カードアプリをPythonで作ってみました。
もちろん単語帳を編集すれば他の勉強にも役立ちます。

使い方

flashcardsForAbbr.pyを実行すると同階層のabbr.csvにある略語がランダムで出題されるので、その略語の省略しない形を答えてEnterを押すと判定されます。
正解ならもうその略語は出題されませんが、不正解ならまた出題されます。
(大文字、小文字は区別されません。)

全て正解するとまた最初からランダムで出題され始めます。このとき単語帳を読み込みなおします。

また回答する代わりに以下のコマンドを入力できます。

コマンド 効果
restart, reset 最初からランダム出題(単語帳を読み込みなおします)
end, finish, quit, exit 終了(普通に×で閉じるのと同じ)

単語帳abbr.csvにはとりあえず私が応用情報技術者試験の勉強に使った単語を入れていますが、好きに変えて使ってください。
形式は[略語],[省略しない形],[解説]です。
文字コードUTF-8なのでExcelだと文字化けします。私はサクラエディタで編集しました。)

ソースコード

flashcardsForAbbr.py

import csv
import numpy

if __name__ == '__main__':
    while True:
        with open('abbr.csv', encoding='UTF-8') as f:
            reader = csv.reader(f)
            l = []
            for row in reader:
                if len(row) != 0:
                    l.append(row)
        while True:
            i = numpy.random.randint(0, len(l))
            print(l[i][0].strip())
            answer = input()
            if answer.lower().strip() == 'restart' or answer.lower().strip() == 'reset':
                break
            if answer.lower().strip() == 'end' or answer.lower().strip() == 'finish' or answer.lower().strip() == 'quit' or answer.lower().strip() == 'exit':
                exit()
            if answer.lower().strip() == l[i][1].lower().strip():
                print('  ヾ(*´∀`*)ノ 正解!')
                print(l[i][0].strip() + ' : ' +l[i][1].strip())
                print(l[i][2].strip())
                print('')
                del l[i]
            else:
                print('◆◆◆◆◆◆◆◆ (・_・)不正解……◆◆◆◆◆◆◆◆')
                print(l[i][0].strip() + ' : ' +l[i][1].strip())
                print(l[i][2].strip())
                print('')

            if len(l) == 0:
                print('  旦_(-ω- ,,)一周しました。')
                print('')
                break

所感

Pythonの勉強も兼ねて作りました。インデントでブロックを作るので見やすいし短く書けてよかったです。
シンプルなコンソールアプリケーションを目指して作りましたが、絵的に寂しくなったので結局顔文字を入れることになりました。
応用情報技術者試験の勉強に実際に使っていますが割と役に立っています。
サンプルのabbr.csvの用語解説が間違ってたらすみません。適当に修正して使ってください。

【初心者向け】 Windows起動時にいつものファイル・アプリ・Webページを開く方法

毎日ブラウザでGメールを開いて、いつも使うフォルダを開いて、今月のメモを開いて……というのが面倒だったので色々試してみました。
自分が調べた中で、一番わかりやすくて簡単だと思った方法を紹介しています。

環境
OS:Windows 10
使用ブラウザ:Google ChromeMicrosoft Edge

結論

  • ファイル・フォルダ・アプリ・ブラウザを自動起動するには、「スタートアップ」フォルダにショートカットを置きます。
  • 自動で開いてほしいWebページは、ブラウザの機能で設定します。

手順

1. スタートアップフォルダにショートカットを置く。

Windowsではスタートアップフォルダに置かれたショートカットが、起動時に自動的に実行されます。

  1. Windowsキーを押しながらRキーを押すと、ファイル名を指定して実行という小ウィンドウが開きます。

  2. shell:startupと入力してOK。

    するとスタートアップフォルダが開きます。

  3. 自動起動したいアプリのショートカットを置きます。

ファイル・フォルダの場合
例えばメモなどのTXTファイルを開きたければ、そのファイルを右クリックしてショートカットの作成をクリックすると、その場にショートカットができます。
これを先ほどのスタートアップフォルダに移動させればOKです。

アプリ・Webブラウザの場合
アプリの実行ファイル(EXEファイル)に対して同じく右クリックからショートカットの作成でショートカットを作成し、スタートアップフォルダに移動させます。
特にブラウザの場合、いつの間にかデスクトップにショートカットがある場合が多いので、これをコピー&ペーストでスタートアップフォルダに入れるだけです。
ない場合は画面右下のWindowsマークをクリックしたあと、ChromeやEdgeなどを入力して出てきたアプリを右クリック > ファイルの場所を開くでショートカットのある場所を開けるので、これをコピー&ペーストすればOKです。

以上で設定は完了です。
あとはPCを再起動すればファイル・アプリ・ブラウザが自動で開いてくれます。

2. いつものWebページを開くよう設定する。

例えばGメールや特定のWebページなどをPC起動時に開きたい場合、以下のいずれかの手順で設定できます。
いくつかありますが、基本的にはブラウザの機能を利用する方法1.、2.が簡単でおすすめです。

方法1. タブのピン留めをする(おすすめ)

タブを右クリックするとChromeの場合は固定、Edgeの場合はタブのピン留めという項目があるので、これをクリックします。
すると左端に小さなタブとして固定され、ブラウザを開きなおしてもPCを再起動しても消えることがなくなります。
(解除は同じくタブの右クリックから行えます。)
<Chromeのタブ固定>

<Edgeのタブのピン留め>

あとは1.で紹介した方法でPC起動時にブラウザを起動するだけです。
他にも色々な方法がありますが、この方法が一番簡単でおすすめです。

方法2. ページをアプリケーション化する(おすすめ その2)

Chrome

ページを開き、右上の「」からその他のツール > ショートカットを作成 > 「ウィンドウとして開く」にチェックを入れて作成
デスクトップにショートカットができるので、スタートアップフォルダに移動させます。

Edge

ページを開き、右上の「」からアプリ > このサイトをアプリとしてインストール > インストール > 「デバイスログイン時の自動開始」にのみチェックを入れて許可
これでスタートアップフォルダにショートカットが自動生成されます。

この方法だとWebページがブラウザから独立したアプリのように開きます。
個人的にGoogleカレンダーはこの方法でアプリ化し、ブラウザとは別に自動で開くようにしています。

方法3. ブラウザの起動時設定でページを指定する

  • Chrome:右上の「」から設定 > 起動時 > 特定のページまたはページセットを開く
  • Edge:右上の「」から設定 > [スタート]、[ホーム]および[新規]タブ > Microsoft Edge の起動時 > これらのページを開く

これでブラウザ起動時に指定したページが表示されるようになります。
機能としては方法1.タブのピン留めとほぼ同じですが、こちらの方が少々手間がかかってしまいます。

方法4. ページのショートカットを作成する

ChromeでもEdgeでも、アドレスバー左の鍵マークからスタートアップフォルダにドラッグ&ドロップするとそのページへのショートカットが作成されます。
スタートアップフォルダに置きましょう。

ただしどちらのブラウザから作成しても、基本的に既定のブラウザで開かれることになるので注意が必要です。

その他:PowerShellを使う方法

PowerShellでファイルやアプリを開く命令を書き、作成したps1ファイルへのショートカットをスタートアップフォルダに置く、という方法もあります。
一例としてGitHubソースコードを置いておきます。

github.com

パスは実際に開きたいファイルやアプリのものに書き換えて使用してください。
またこのps1ファイルのショートカットを作成した後、ショートカットを右クリックからプロパティ > ショートカットタブ > リンク先 の先頭に「powershell.exe 」を付けてから、このショートカットをスタートアップフォルダに置く必要があります。
(ps1ファイルの普通のショートカットだと、起動時にps1ファイルが実行されずメモ帳などで開くだけになってしまうため。)

利点として、<# #>で囲ってコメントアウトするだけで有効/無効を切り替えることができます。

まとめ

スタートアップフォルダにショートカットを置く方法が簡単でおすすめです。
これにブラウザの機能であるタブのピン留めおよびアプリケーション化を組み合わせることで、毎日のPC起動時の操作をかなり減らすことができます。
私は以前これまで紹介した方法のほぼすべてを併用していましたが、いろいろ試した結果、上記2つの組み合わせだけで十分という結論に至りました。