2022年8月24日水曜日

emacs の lsp で変数が使われている参照先の一覧を表示する方法

emacs の lsp で変数が使われている参照先の一覧を表示する方法

概要

いつも忘れるのでメモ

そもそもの emacs + lsp などの設定はこちら

環境

  • macOS 11.6.8
  • emacs 28.1

コマンド

lsp-find-references

2022年8月20日土曜日

ITパスポート勉強方法メモ

ITパスポート勉強方法メモ

概要

せっかく合格したので勉強方法をメモ

前提

基本情報も応用情報も合格済み

勉強方法

過去問だけやりました
参考書などは購入していません

アプリはこちら

Webはこちら

これをひたすらやり続けました

とりあえず正答率を100%にして不安な部分はキーワードをネットで調べてより理解を深めました

勉強期間

2週間くらいです

感想

実際に出題された問題のうち 30% くらいは完全初見の問題でした
それでも問題をよく読み回答欄から消去法などで回答を絞れば回答できました
参考書まで読んで補足レベルまでカバーできているほうが初見率も下がったかなと思います

100問あるのでとりあえずどんどん回答しました
計算問題など時間がかかるやつは見直しにチェックして余った時間でじっくり回答しまいした
が、よく考えないと解けなさそうな問題は1問くらいしかなかったかなと思います

とにかく100問が長く感じました
疲れるので集中力を保てるようにしましょう

最終的には10分前くらいに退室しました

点数

全体で 825/1000 でした
分野別だと以下のとおりです

  • ストラテジ・・・790/1000
  • マネジメント・・・745/1000
  • テクノロジ・・・850/1000

不安なところがなかったので満点もあるかなーとか思ったんですが全然届きませんでした

最後に

FEとAPがあってもさすがにノー勉強だと合格できなかったかなと思います

点数は最後に確認できるのですが合格かどうかはなぜかあとから大臣が判断するみたいなのでおとなしく合格証を待ちましょう

2022年8月18日木曜日

Google Play Console からアプリを削除する方法

Google Play Console からアプリを削除する方法

概要

申請するしかないので申請します

環境

  • Google Play Console 2022/08/24 時点

申請する

https://support.google.com/googleplay/android-developer/contact/publishing

ここにアプリの情報を記載して申請するだけです

「デベロッパー アカウント ID *」は Google Play Console にログインして確認します

「以下の一般的な問題やリクエストから選択してください。」は「アプリの削除をリクエストしたい」にします

「どのようなことでお困りですか? *」には「別アプリとして公開したのでこのアプリの削除をお願いします。」としました

なぜかスクリーンショットも必須なのでスクリーンショットを添付しましょう
アプリの一覧画面でも添付しておけば大丈夫です

削除できる条件

  • アプリが良好な状態である(Google によって削除、停止されていない)
  • アプリのインストール数が全期間を通じて 0 である
  • アプリが 24 時間公開停止状態である(インストール数が 0 になるようにしてください)

たぶんこれをクリアするのが指南の技です

2022年8月17日水曜日

alembic でテーブル作成時にデータを insert する方法

alembic でテーブル作成時にデータを insert する方法

概要

bulk_insert を使うと簡単です

環境

  • Ubuntu 18.04
  • Python 3.10.2
  • alembic 1.8.1

サンプルコード

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    version_table = op.create_table('version',
                                    sa.Column('id', sa.Integer(), nullable=False),
                                    sa.Column('version', sa.String(length=10), nullable=True),
                                    sa.PrimaryKeyConstraint('id'))
    op.bulk_insert(version_table,
                   [{'id': None, 'version': "1.1.1"},
                    {'id': None, 'version': "2.2.2"}]) 
    # ### end Alembic commands ###

2022年8月16日火曜日

Python で class の中に class を定義する方法とメリット

Python で class の中に class を定義する方法とメリット

概要

Python では内部クラスを定義することができます
簡単な使い方の紹介とメリットを紹介します

環境

  • macOS 11.6.8
  • Python 3.10.2

内部クラスを使わない場合

  • vim team.py
class Team():

    def __init__(self, team_name: str):
        self.team_name = team_name


class Coach():

    def __init__(self, name: str):
        self.name = name


class Player():

    def __init__(self, name: str):
        self.name = name
  • vim team1.py
from team import Team, Player, Coach

class Team1(Team):

    def __init__(self, team_name: str):
        super().__init__(team_name)
        self.player = Player("p1")
        self.coach = Coach("c1")

    def show_name(self):
        print(self.team_name)
        print(self.player.name)
        print(self.coach.name)


if __name__ == '__main__':
    team1 = Team1("team1")
    team1.show_name()
  • python team1.py
team1
p1
c1

内部クラスを使う場合

  • vim team.py
class Team():

    def __init__(self, team_name: str):
        self.team_name = team_name


    class Coach():

        def __init__(self, name: str):
            self.name = name


    class Player():

        def __init__(self, name: str):
            self.name = name
  • vim team1.py
from team import Team

class Team1(Team):

    def __init__(self, team_name: str):
        super().__init__(team_name)
        self.player = self.Player("p1")
        self.coach = self.Coach("c1")

    def show_name(self):
        print(self.team_name)
        print(self.player.name)
        print(self.coach.name)


if __name__ == '__main__':
    team1 = Team1("team1")
    team1.show_name()

結果は同じです

考察

内部クラスを使った場合 Player と Coach クラスを import する必要がなくなります
これが一番のメリットで例えば Player と Coach クラスをいろいろな場所で使う場合にはいろいろな場所に import 文を書かなくてはいけません
しかし内部クラスにすることで親クラスを継承するだけで使えるようになるので毎回 import を書かなくて済みます
親クラスを継承していれば内部クラスは使えるので単純に self で参照することで使えます

デメリットとしては内部クラスとして定義したクラスを他のモジュールから import することができない点です
必ず親クラスである Team クラスを継承することが前提になるので例えば Coach クラスだけを使いのにわざわざ Team クラスを継承するように書かなければいけないのは面倒になります

個人的には必ず継承するような共通クラスを作るような場合には内部クラスをガンガン使っていいかなと思っています
ただ内部クラスの全部を使うわけではなく一部を使いたいというケースでは微妙で内部クラスとして定義したクラスは使っていてもいなくてもメモリ展開はされてしまうので余計なリソースを使いたくない場合には使用しないほうがいい場合もあります

内部クラスから親クラスのメソッドなどを self を介してアクセスすることはできないのでそこも注意が必要です
もし親クラスにアクセスしたい場合には親クラスをDIする必要があります

2022年8月14日日曜日

Quasar 超入門

Quasar 超入門

概要

Quasar は Vue3 用のユーザインタフェースです
今回はどんな感じで使えるのか試してみました

環境

  • macOS 11.6.8
  • nodejs 18.4.0
  • yarn 1.22.19
  • quasar 2.7.7

CLI インストール

専用の CLI があるのでこれをインストールします

  • yarn global add @quasar/cli

Quasar アプリの作成

プロジェクト的なのを作成します
今回は Web アプリを作成しますがどうやら spa/pwa/ssr/bex/electron/capacitor/cordova といろいろ選択できるようです

  • yarn create quasar

以下のように選択画面になるので「App with Quasar」を選択します

? What would you like to build? › - Use arrow-keys. Return to submit.
❯   App with Quasar CLI, let's go! - spa/pwa/ssr/bex/electron/capacitor/cordova
    AppExtension (AE) for Quasar CLI
    Quasar UI kit

するとプロジェクト名や TypeScript を使うのかとか Lint をどうするのかとか CSS どうするのかとかいろいろと聞かれます
とりあえず今回は全部デフォルトを使うので続けてエンターしていれば OK です

プロジェクトが作成できるまで待ちましょう

とりあえず動かす

プロジェクトが作成できたら動かしてみます

  • cd quasar-project
  • quasar dev

これで http://localhost:8080/#/ にアクセスするとデモ画面が表示されます

何か書き換えてみる

コンポーネントがいろいろとあるので使ってみましょう

とりあえずボタンアイコンを使ってみます

  • vim src/pages/IndexPage.vue
<template>
  <q-page class="flex flex-center">
    <q-icon name="today" class="text-orange" size="2em" />
  </q-page>
</template>

<script>
import { defineComponent } from 'vue'

export default defineComponent({
  name: 'IndexPage'
})
</script>

これで再度ページを確認すると以下のようにアイコンに変わっているのが確認できると思います

最後に

Quasar をインストールして簡単なアプリを作成するところまでやってみました
vuetify と同じようにあいろいろなコンポーネントが用意されているので簡単に UI を作ることができます

タグは <q-xxx> という感じで定義されているので q から始まるコンポーネントを追加していくことになりそうです

参考サイト

2022年8月13日土曜日

Ubuntu18.04 に nodejs 16 と yarn をインストールする方法

Ubuntu18.04 に nodejs 16 と yarn をインストールする方法

概要

nvm を使った方法はこちらを御覧ください
今回は apt を使ってインストールする方法を紹介します

環境

  • Ubuntu18.04
  • nodejs 16.16.0
  • yarn 1.22.15

nodejs のインストール

  • curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
  • sudo apt-get install -y nodejs

yarn のインストール

  • sudo corepack enable

最後に

nodejs をした際に yarn を apt でインストールするための手順が表示されるのですが今回は corepack を使ってインストールしました

yarn の公式手順としては corepack を使うのが合ってそうだが実際どれが正しいのかは不明です

参考サイト

2022年8月12日金曜日

flask-sqlalchemy で order by desc する方法

flask-sqlalchemy で order by desc する方法

概要

メモ

環境

  • Ubuntu 18.04
  • Python 3.10.2
  • flask-sqlalchemy 2.5.1

サンプルコード

スキーマのフィールドに対して desc メソッドを呼び出します

Version.query.order_by(Version.id.desc()).first()

2022年8月11日木曜日

poetry 超入門

poetry 超入門

概要

pipenv でも十分ですが poetry を使えば pypi で公開する場合に便利です

環境

  • macOS 11.6.8
  • Python 3.10.2
  • poetry 1.1.14

インストール

  • curl -sSL https://install.python-poetry.org | python3 -

.zshrc の編集

以下を追記します

export PATH="/Users/username/.local/bin:$PATH"

一旦ログアウトして

  • poetry --version

でバージョンが表示されるか確認します

プロジェクトの作成

  • poetry new test

既存プロジェクトに対して適用する場合は poetry init になります

ライブラリの追加

  • cd test
  • poetry add requests

git clone などで持ってきたプロジェクトに対して poetry.lock を元にインストールする場合は poetry install します

実行する

  • vim test/test.py
import requests

res = requests.get('https://kaka-request-dumper.herokuapp.com/')
print(res)
  • poetry run python test/test.py

ちゃんと追加したライブラリが使えてることが確認できると思います

最後に

pyproject.toml と poetry.lock は git に含めるようにしましょう

あとは Pypi で公開する方法や poetry shell なども使えます

参考サイト

2022年8月10日水曜日

Python の packaging を使って一つ前のバージョンを算出する方法を考える

Python の packaging を使って一つ前のバージョンを算出する方法を考える

概要

過去にセマンティクスバージョンを比較する方法を紹介しました
今回は現在のバージョンから一つ前のバージョンを取得する方法を考えます

環境

  • macOS 11.8.6
  • Python 3.10.2
  • packaging 21.3

サンプルコード

"""バージョン管理モジュール."""
from packaging.version import Version


class VersionManager():
    """バージョン管理するクラス."""

    def __init__(self, version: str):
        """初期化."""
        self.current_version = Version(version)

    def get_current_version(self) -> Version:
        """現在のバージョンを取得する."""
        return self.current_version

    def get_latest_minor_version(self, major_version: int) -> int:
        """メジャーバージョンの最新のマイナーバージョンを取得する."""
        if major_version == 0:
            return 9
        elif major_version == 8:
            return 30

    def get_pre_version(self):
        """一つ前のバージョンを取得する."""
        if self.current_version.minor - 1 < 0:
            if self.current_version.major - 1 < 0:
                raise
            else:
                return Version("{}.{}".format(self.current_version.major - 1,
                                              self.get_latest_minor_version(self.current_version.major - 1)))
        else:
            return Version("{}.{}".format(self.current_version.major,
                                          self.current_version.minor - 1))


if __name__ == '__main__':
    print(VersionManager("10.10.0").get_pre_version()) # => 10.9
    print(VersionManager("1.0.0").get_pre_version())  # => 0.9
    print(VersionManager("9.0.0").get_pre_version())  # => 8.30

解説

マイナーバージョンを中心に考えます
マイナーバージョンがマイナスになる場合はメジャーバージョンをマイナスします
そしてそのメジャーバージョンにおける最新のマイナーバージョンを取得します

今回はマイクロバージョンの部分までは考慮していないのでそこも考慮する必要がありますが感じとしてはマイナーバージョンの取得方法と同じ感じかなと思います

2022年8月9日火曜日

Linux で一時的にタイムゾーンを変更する方法

Linux で一時的にタイムゾーンを変更する方法

TZ 環境変数を使って一緒にコマンドを実行します
export するとそのセッションではずっとタイムゾーンが変わってしまうので export せずに使います

コマンド

  • TZ="UTC" date
2022年 8月 7日 日曜日 04時38分35秒 UTC

2022年8月8日月曜日

Squid のタイムアウトを設定する方法

Squid のタイムアウトを設定する方法

概要

ssh などで実行時間が長いコマンドを投げる場合には Squid のタイムアウト時間も調整する必要があります

環境

  • Squid 3.5.27

設定項目

squid.conf に以下を記載します
以下は30分のタイムアウトに設定する方法です

connect_timeout 1800 seconds
read_timeout 30 minutes
write_timeout 30 minutes

paramiko などを使っている場合は timeout に合わせるといいと思います
paramiko だけ timeout を伸ばしても結局 Squid 側のタイムアウトが短いとコマンドを投げっぱなしになってしまい応答が返ってこなくなります

2022年8月5日金曜日

paramikoで30分以上かかるコマンドを投げる場合にはchannelを使ったほうがいいかもしれない

paramikoで30分以上かかるコマンドを投げる場合にはchannelを使ったほうがいいかもしれない

概要

過去に paramiko を使ってコマンドを実行する方法を紹介しました
今回は channel という機能を使って接続状態を保つ方法を紹介します

環境

  • macOS 11.6.8
  • Python 3.10.2
  • paramiko

サンプルコード

import paramiko

with paramiko.SSHClient() as client:
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    rsa_key = paramiko.RSAKey.from_private_key_file("/path/to/sshkey.pem", "xxx")
    client.connect(hostname="192.168.100.1", port=22, username="user01", pkey=rsa_key)
    # channelの作成
    channel = client.get_transport().open_session(timeout=3600)
    try:
        command = "hostname"
        channel.exec_command(command)
        RECV_SIZE = 1024 * 32
        stdout_data = b''
        stderr_data = b''
        while not channel.closed or channel.recv_ready() or channel.recv_stderr_ready():
            stdout_data += channel.recv(RECV_SIZE)
            stderr_data += channel.recv_stderr(RECV_SIZE)
        code = channel.recv_exit_status()
        print(stdout_data)
        print(stderr_data)
    finally:
        channel.close()

注意事項

while で無限ループにしているので最悪抜け出せないことになるかもしれないのでもう少し考慮が必要かもしれない (外部タイマとか別のフラグのチェックとか)

2022年8月4日木曜日

Python でヒアドキュメントでブラケットを扱う場合は二重にしなければいけない

Python でヒアドキュメントでブラケットを扱う場合は二重にしなければいけない

概要

format で引数展開するブラケットとそうでないそのまま出力するブラケットを区別するようにしなければなりません

環境

  • macOS 11.8.7
  • Python 3.10.2

ダメなパターン

json = """
{
  '{key}': '{value}'
}
""".format(key="name", value="hawk")
print(json)
Traceback (most recent call last):
  File "/Users/hawk/test.py", line 1, in <module>
    json = """
ValueError: unexpected '{' in field name

成功パターン

json = """
{{
  '{key}': '{value}'
}}
""".format(key="name", value="hawk")
print(json)

おまけ: 前後の改行を削除する

json = """\
{{
  '{key}': '{value}'
}}\
""".format(key="name", value="hawk")
print(json)

2022年8月3日水曜日

emacs で矩形選択のコピーアンドペーストする方法

emacs で矩形選択のコピーアンドペーストする方法

概要

いつも忘れるのでメモ

環境

  • macOS 11.6.8
  • emacs 28.1

矩形切り取り

リージョンで矩形を選択して

  • Ctrl + x, r, k

矩形貼り付け

上記で切り取った矩形領域をそのまま矩形貼り付け
特にリージョン選択はしなくて OK
カーソルがある位置から矩形で貼り付けてくれる

  • Ctrl + x, r, y

おまけ: 複数行の先頭に任意の文字列を挿入

リージョンを選択して

  • Ctrl + x, r, t

で Ctrl + y でヤンクしたり文字列を入力すれば OK

2022年8月2日火曜日

Nuxt3 超入門

Nuxt3 超入門

概要

Vue を更に強化して使える Nuxt3 を使ってみました
プロジェクトのセットアップから簡単なサンプルを動作させるところまでやってみました

環境

  • macOS 11.6.8
  • nodejs 18.4.0
  • npx 8.12.1
  • yarn 1.22.19

プロジェクトの新規作成

  • npx nuxi init nuxt-app

nuxi という専用の CLI ツールも同時にインストールされます

Need to install the following packages:
  nuxi@3.0.0-rc.6
Ok to proceed? (y) y
Nuxt CLI v3.0.0-rc.6                                                                                                               11:45:28
ℹ cloned nuxt/starter#v3 to /Users/xxx/data/repo/api/nuxt-app                                                             11:45:29
                                                                                                                                   11:45:29
 ✨ Your fine Nuxt project is just created! Next steps:

 📁  cd nuxt-app                                                                                                                   11:45:29

 💿  Install dependencies with npm install or yarn install or pnpm install --shamefully-hoist                                      11:45:29

 🚀  Start development server with npm run dev or yarn dev or pnpm run dev                                                         11:45:29

npm notice 
npm notice New minor version of npm available! 8.12.1 -> 8.15.1
npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.15.1
npm notice Run npm install -g npm@8.15.1 to update!
npm notice 

必要なライブラリのインストール

  • cd nuxt-app
  • yarn install
yarn install v1.22.19
info No lockfile found.
[1/4] 🔍  Resolving packages...
warning nuxt > @nuxt/vite-builder > cssnano > cssnano-preset-default > postcss-svgo > svgo > stable@0.1.8: Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility
[2/4] 🚚  Fetching packages...
warning vscode-languageclient@7.0.0: The engine "vscode" appears to be invalid.
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...
success Saved lockfile.
✨  Done in 29.24s.

とりあえず動かす

  • yarn dev -o

これで localhost:3000 にアクセスするとサンプルページが確認できます

書き換えてみる

  • vim App.vue

ボタンをクリックすると増加するサンプルです
動的に変更する値の場合には ref(0) のように定義する必要があります

script や template, style の構成は Vue や React などと変わりません
あとは使用できるコンポーネントなどリファレンスを見ながら追加すれば良いかなと思います

<script setup lang="ts">
const counter = ref(0)
const click = () => {
  console.log(counter.value);
  counter.value++;
}
</script>

<template>
  <div class="hello">
    {{ counter }}
    <button @click="click">up</button>
  </div>
</template>

<style scoped>
.hello {
  font-family: Arial, Helvetica, sans-serif;
  font-size: 3rem;
  padding: 10rem;
}
</style>

参考サイト

2022年8月1日月曜日

requests でクライアント証明書を設定する方法

requests でクライアント証明書を設定する方法

概要

クライアント証明書認証を使ってるサービスなどで使えます

環境

  • Ubuntu 18.04
  • Python 3.10.2
  • requests 2.28.1

サンプルコード

import requests


class TestCert():

    def __init__(self):
        self.cert_path = "/home/user/client.crt")
        self.key_path = "/home/user/client.key")
        self.endpoint = "https://example.com/")
        self.cert = (self.cert_path, self.key_path)

    def get(self):
        return requests.get(self.endpoint, cert=self.cert)

cert を使います
また証明書と鍵ファイルへのパスはフルパスで指定しましょう