2022年8月24日水曜日
2022年8月20日土曜日
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 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 する方法
概要
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 では内部クラスを定義することができます
簡単な使い方の紹介とメリットを紹介します
環境
- 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 は 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 をインストールする方法
概要
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日金曜日
2022年8月11日木曜日
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 を使って一つ前のバージョンを算出する方法を考える
概要
過去にセマンティクスバージョンを比較する方法を紹介しました
今回は現在のバージョンから一つ前のバージョンを取得する方法を考えます
環境
- 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 で一時的にタイムゾーンを変更する方法
TZ 環境変数を使って一緒にコマンドを実行します
export するとそのセッションではずっとタイムゾーンが変わってしまうので export せずに使います
コマンド
-
TZ="UTC" date
2022年 8月 7日 日曜日 04時38分35秒 UTC
2022年8月8日月曜日
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 を使ってコマンドを実行する方法を紹介しました
今回は 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 でヒアドキュメントでブラケットを扱う場合は二重にしなければいけない
概要
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 で矩形選択のコピーアンドペーストする方法
概要
いつも忘れるのでメモ
環境
- 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 超入門
概要
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 でクライアント証明書を設定する方法
概要
クライアント証明書認証を使ってるサービスなどで使えます
環境
- 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 を使います
また証明書と鍵ファイルへのパスはフルパスで指定しましょう