at backyard

Color my life with the chaos of trouble.

GitHubでコミットログを打ち間違えてリモートにpushしてしまった際の対応案

このポストは git commit --amend でコミットログを修正してからリモートブランチにforce pushする、というような内容ではない。
(当然ながら上のような行為を共有リポジトリで行うのは大変危険なことである。)

ここで書く内容は非常に牧歌的な内容だ。

GitHubではコミットに対してコメントを残すことができる

GitHubではコミットに対してコメントを残すことができる。
(GitLabや似たサービスであればたいていできるものだろうか?)

そのため、間違えたコミットログを残してしまったコミットに対して、このコメントは間違いです。本当は〇〇と打とうとしていました というようなコメントを残すことで、コミットの改変などの危険な行為はせずに一応は誤ってコメントしてしまったことを残すことができることに気づいた。

実際に私はさきほど誤ったコミットログを残していたことにpushしてから気づき、この対応策を実行した。

Add README · shinshin86/js-leet@3cdc121 · GitHub

このような感じでコメントは残るようだ。

最後になるが、メリークリスマス( npm xmas)。

と、ここで衝撃が...

f:id:shinshin86:20211224220837p:plain
npm xmasがない...!?

npm xmasはなくなった!?

どうやらnpm xmas は消えたようだ。Twitterでもリツイートしているが、どうやらもうnpm xmas はないようだ。
(下記が該当のコミット)

chore: remove dead code · npm/cli@24d2ec9 · GitHub

Macのコマンドライン上からChromeをシークレットモードで開く方法

ごくたまに(年に2,3回)、ターミナル上からChromeのシークレットモードでHTMLファイルを開きたい時がある。

最初に結論から書くと、下記の一行で行ける。

open -n -a "Google Chrome" --args -incognito <開きたいファイル(htmlなど)>

ちなみにこの開きたいファイルのパスは絶対パスである必要がある。

ただ、いちいち絶対パスを打つのも面倒くさい。。。

というわけで、下記のようなシェルスクリプトを作ってみた。

github.com

こいつを使うと、下記のようにHTMLファイルを相対パスで指定しても絶対パスに変換してシークレットモードでChromeを呼び出すようにしてくれる。

foic <html file>

このシェルスクリプトをセットアップする労力と絶対パスを打ち込む労力を天秤にかけると、まあ微妙...と思われる方もいるかも知れない。が、今のところ自分としては作ってよかったと思っている。

Denoのtestでネストしたテストを書く方法

目次

Denoのtestでネストしたテストを書く方法

Denoのテストでネストしたテストを書く方法は下記のようになる。

Deno.test("nest test sample", async (t) => {
  await t.step("nest test", () => {
    // test is here
  });
});

このようにDeno.testの中に t.step を書くことでネストしたテストを書くことが可能。

なお、現在(2021/12/19時点)はまだ安定化していないため、実行には下記のように --unstable フラグを付ける必要がある。

deno test --unstable

--unstableをつけないで実行した場合(Deno v1.17)

ちなみにこの --unstable フラグを付けないで実行した場合、下記のようなエラーが出る(V1.17で検証)

error: TS2339 [ERROR]: Property 'step' does not exist on type 'TestContext'.

t.stepにはawaitをつける必要がある

なお、t.stepには await をつけて実行する必要がある。

例えば下記のように asyncawait をつけない場合はエラーになる。

Deno.test("nest test sample", (t) => {
  t.step("nest test", () => {
    // test is here
  });
});

エラー内容は下記のようになる。

Error: There were still test steps running after the current scope finished execution. Ensure all steps are awaited (ex. `await t.step(...)`).

1.17よりネストしたテストに関する情報がより充実した模様

先日Denoの 1.17 がリリースされたが、このリリースによりネストしたテストのレポートが以前より充実したものになった。
(本当は1.16との比較も残そうと考えたが、そう考えたときには既に deno upgrade コマンドを叩いてしまっていた。ただ、こちらのポストによると 1.16.2 の時点ですでに入っていたものであるという情報あり。)

Deno 1.18よりネストしたテストを行う際の --unstable フラグが不要になりそう

また、Denoの 1.18 ではこのテストステップAPIは安定化されるとのことで、以降は --unstable フラグは不要になるものと思われる。

詳細は下記のリリースノートに記載。

deno.com

該当箇所はこちら(上記ドキュメント内から引用)
(ネストしたテストのレポート充実化についてもここの文章で触れられている)

Another update is for users using unstable test steps API. The final test report output will now include number of test steps with distinction for passed/ignored/failed steps. The test step API is scheduled to be stabilized in v1.18

個人的にはテストはネストして書きたいので安定化されるのは嬉しい。

追記:Denoの1.18がリリースされ、test steps APIが安定化されました

1.18がリリースされ、test steps APIが安定化された。

1.18以降は実行時に --unstable は不要となります。
詳細はリリースノートにて。

https://deno.com/blog/v1.18#stabilization-of-test-steps-api

日本語でのDeno1.17リリース内容まとめ(余談)

ちょっと本題からそれるが、上にも少し書いたとおり先日(2021/12/17)Denoの 1.17 がリリースされた。
1.17 によるリリース内容を日本語でまとめてくださっている下記のポストが分かりやすいので、こちらのブログでもリンクを貼らせていただく。

zenn.dev

PySimpleGUIで簡単な計算機を作ってみた

PySimpleGUIを試すがてら、簡単な計算機を作ってみました。

PySimpleGUIで作った計算機

2つのフォームに計算したい数値を入れてラジオボタンで足し算、引き算、掛け算、割り算を選択し、Submit を押せば、その下の窓に計算結果が表示されます。

目次

PySimpleGUIでのラジオボタンの実装について

PySimpleGUIの実装方法については下記の公式ドキュメント、ならびにQiitaの記事を参考にさせていただきました。

https://pysimplegui.readthedocs.io/en/latest/#radio-button-element

PysimpleGUIラジオボタンの使い方 - Qiita

足し算、引き算、掛け算、割り算を下記で定義して、リスト内包表記を使ってラジオボタンを生成しています。

実際に書いたコードを一部抜粋して下に載せます。

またコードの全体についてはGitHubに上げていますので、そちらを参照ください。
(一応このポストを書いた状態のコードを v0.0.1 とタグを打っているのでそちらのリンクを貼っておきます)

Release v0.0.1 · shinshin86/pysimplegui-calc-sample · GitHub

calc_dict = {
    "-ADD-": "+ (Add)",
    "-SUB-": "- (Sub)",
    "-MUL-": "* (Mul)",
    "-DIV-": "/ (Div)",
}

・
・
・
calc_frame = [
  ・
  ・
  [sg.Radio(item[1], key=item[0], group_id='calc', default=item[0]=="-ADD-") for item in calc_dict.items()],
  ・
  ・
]

sg.Radioラジオボタンを定義します。

渡す引数は下記のとおりです。

sg.Radio("ラベルテキスト", "-KEY-(※)", group_id='同じIDを付与されたラジオボタンがグループ化される')
# ※PySimpleGUIでは-KEY-というようなスタイルが慣習となっている

なお、下記のようにdefault=True とすると、デフォルトでチェックを入れることが可能です。

sg.Radio("ラベルテキスト", "-KEY-", group_id='同じIDを付与されたラジオボタンがグループ化される', default=True)

上に貼ったコードでは default=item[0]=="-ADD-" とすることで、デフォルトで足し算にチェックを入れるようにしています。

ラジオボタンのチェックに関する値の受け取り方

ラジオボタンの値の受け取りについてはvaluesを通して行います。

実際に書いたコードを必要な部分だけ抜粋して下に載せます。

while True:
    event, values = window.read()

    if values["-ADD-"]:
        # 足し算の処理
    elif values["-SUB-"]:
        # 引き算の処理
    elif values["-MUL-"]:
        # 掛け算の処理
    elif values["-DIV-"]:
        # 割り算の処理

このようにラジオボタンの値は入力テキストと同様に valuesにdictオブジェクトとして格納されているので、dictオブジェクトの値をチェックすることでラジオボタンの選択に応じた処理を行うことが可能です。

なお、ラジオボタンの値はチェックされている場合はTrue、それ以外はFalseが格納されています。

PySimpleGUIとは?

PySimpleGUIとは?という方向けのポストを以前書いていたので、気になる方はそちらを参照してみてください。

shinshin86.hateblo.jp

PyhonでサクッとGUIを作れるのはかなり嬉しいですね。

関連する記事 (tkinterでノートアプリ)

PySimpleGUIと同じような立ち位置としてtkinterというGUIライブラリがあります。

そちらを用いてノートアプリも作成しているので、こちらもよろしければ御覧ください

shinshin86.hateblo.jp

PySimpleGUIでポップアップの結果に応じて処理を変えたい時

PySimpleGUIを触っていると、popup関数を使うことは多いと思います。

この popup関数、様々なバリエーションが用意されており、例えばpopup_yes_noを使って下記のようなコードを書いてみることが可能です。

import PySimpleGUI as sg

pressed_text = sg.popup_yes_no("あなたはビールが好きですか?")

# ビールが好きな人にしかアプリを起動させない
if pressed_text == "Yes":
    start_app()

画面的には下記のようなポップアップが表示されます。

f:id:shinshin86:20211215161221p:plain

この場合のsg.popup_yes_no の挙動ですが、シンプルに押したボタンのテキストが返されます。

つまり上記のケースだと、YesNo が返ります。

またユーザがポップアップを選択肢以外の方法で閉じた場合、上の画像の場合、左上の赤ボタンを押したケースでは None が返ります。

https://pysimplegui.readthedocs.io/en/latest/#popup-output

今回はYes or No というポップアップでしたが、OK or cancel などバリエーションが用意されています。

詳細は上の公式ドキュメントを参照してみてください。

Mac環境でpyinstallerを使ってOSError: Python library not found: libpython3.9m.dylib, Python, Python3, libpython3.9.dylib,というエラーが出た場合の対処方法

Mac環境で作成しているPythonプログラムを実行ファイルにまとめようとした際に発生したエラーの備忘録です。

実行ファイルにはpyinstallerを用いています。

github.com

なお環境としてはM1チップのMacBook Airを使用しており、Pythonはpyenvを通じてインストール、バージョンは 3.9.6 です。

pyinstallerを使って実行ファイルを作成しようとしたら、下記のようなエラーが出ました。

OSError: Python library not found: libpython3.9m.dylib, Python, Python3, libpython3.9.dylib, .Python
    This means your Python installation does not come with proper shared library files.
    This usually happens due to missing development package, or unsuitable build parameters of the Python installation.

    * On Debian/Ubuntu, you need to install Python development packages:
      * apt-get install python3-dev
      * apt-get install python-dev
    * If you are building Python by yourself, rebuild with `--enable-shared` (or, `--enable-framework` on macOS).

このエラー文に従い、下記のようにオプションを付けて再インストールしました。

PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.9.6

次にpyinstallerを使ってみると、ないと言われます。

pyinstaller sample.py
# => command not found: pyinstaller

そこで試しにpip installしてみると、

pip install pyinstaller
Requirement already satisfied: pyinstaller in ....
...
...
...

という形ですでにインストールされていると言われます。

おそらくpathが通っていないだけな気もしますが一度uninstallしてから再度installしたら直ったと書かれている方がいたので、そちらのやり方にしがってみることにします。
(パスだけの問題ではない可能性ももちろんあるので)

以下実行ログ

pip uninstall pyinstaller
# 下記のようなログが出る
# Found existing installation: pyinstaller 4.7
# Uninstalling pyinstaller-4.7:
...
...
...

再度インストール

pip install pyinstaller

これで再度試してみると無事に処理が完了できました。

pyinstaller sample.py

Wikipediaの文章素材を二次利用する際のライセンス周り

調査してみた際の備忘録。

基本的な内容は下記に記載がある。

Wikipedia:ウィキペディアを二次利用する - Wikipedia

メモ

  • ウィキペディアの文章素材はCC-BY-SA 3.0の条件のもとで利用できる。
  • また特記がない場合はGNUフリー文書利用許諾契約の条件のもとで利用が可能らしい。
  • つまり特記がない文章素材についてはCC-BY-SA 3.0GNUフリー文書利用許諾契約で利用できるということらしい。
  • CC-BY-SA 3.0に従った二次利用を行う場合、その形態がいかなるものであっても、著作者への著作権表示(credit)を提供する必要がある。
  • 具体的には下記のいづれかの方法で示す必要がある。
    • 二次利用元のページヘのハイパーリンクかURLを可能なところに表示
    • 代わりに表示できるオンライン上の複製へのハイパーリンクかURLを可能なところに表示
    • 著作者のリスト。(この一覧では寄与が微小あるいは無関係の投稿は除くことができる。)
    • またこれらの決まりはウィキペディアのコミュニティによって作成された文章に適用されるものであって、外部を出所とする文章は追加の帰属が作品に添付される場合があるらしい(この 添付 という表現がはっきりとわからない。つまり作品上に外部を出所とする文章がある場合、それが外部の文章であることを示す必要がある、ということだろうか。ここについてはハッキリと分からないため、気になる方は上の詳細ページを読んでみてください。
  • 文章素材を改変して二次的著作物を創作し、それを頒布する場合は、その二次的著作物もCC-BY-SA 3.0、またはCC-BY-SA 3.0の後継ライセンス等の条件の下で二次利用許諾されるようにする必要がある
  • 文章素材を改変して頒布する場合は、改変内容(どのように改変したか)を明示する必要がある。変更履歴などを表示できればそちらを利用するが、例えばプログラム内で利用する場合などはdiffなどで示すようにすれば良さそうだろうか?
  • 文章素材(またはその二次的著作物を)頒布する場合は、頒布される複製物毎にその文章素材(二次的著作物)をCC-BY-SA 3.0のもとで二次利用許諾することを表明し、利用承諾を示すURI(CC-BY-SA 3.0)を表示する必要がある。またはCC-BY-SA 3.0の利用許諾条項の写しの添付だが、この場合は最初に書いたURIを貼るというのが良さそう。

ざっくりと重要そうなところだけ備忘録がてらまとめてみたが、いずれにせよ他にも記載はあるので詳細はウィキペディアのページを実際に見てみたほうが良さそう。

なおこれらはあくまで文章素材にだけ適用されるもので画像はまた別となる。

そちらについても下記のページに記載されているので、ウィキペディアに掲載されている画像のライセンスについて調べたい方は公式ページを見てみるのが良さそう。

Wikipedia:ウィキペディアを二次利用する - Wikipedia