kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Playwright for Python: a タグの href 属性を取得する

Playwright for Python でリンクタグ a タグの href 属性から URL を取得するときは,Locator オブジェクトで get_attribute('href') のように実装する.

page.locator('h1#title > a').get_attribute('href')
page.locator('h1.entry-title > a').nth(0).get_attribute('href')

サンプルコード

以下の例では kakakakakku blog のブログ名と最新記事の URL を取得している.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    context = browser.new_context()

    page = context.new_page()
    page.goto('https://kakakakakku.hatenablog.com/')

    # https://kakakakakku.hatenablog.com/
    url = page.locator('h1#title > a').get_attribute('href')
    print(url)

    # https://kakakakakku.hatenablog.com/entry/2023/01/10/081119
    url = page.locator('h1.entry-title > a').nth(0).get_attribute('href')
    print(url)

    context.close()
    browser.close()

GitHub Actions の「ワークフローの再利用」をプライベートリポジトリで使う

2022年12月のリリースで GitHub Actions「reusable workflow(ワークフローの再利用)」をプライベートリポジトリでも使えるようになった❗️特に会社でプライベートリポジトリを使っている場合に便利で待望のアップデートだと思う.今まではプライベートリポジトリの場合は "同一リポジトリ内" での再利用しかできず,ワークフローを共通化するというユースケースでは使いにくかった.GitHub Actions のワークフローをコピーして増やす作業からおさらばできる...❓

github.blog

構成

今回はブログ用に以下のようなリポジトリ構成を作って試してみた.ワークフローとしては,Python プロジェクトで使える Flake8 / pytest の実行を再利用できるように reusable workflow にまとめる.

ついでに GitHub Actions の関連ドキュメントも以下にまとめておく.現時点だと日本語化されていないところもある.

再利用するワークフローを定義する(呼び出し先)

まず,再利用するワークフローを定義するプライベートリポジトリで「アクセス権限」を付与しておく.以下のように Actions > General メニューの AccessAccessible from repositories owned by the user 'USER NAME' を設定しておく.今回は kakakakakku/github-actions-reusable-workflows リポジトリを使う.

次に GitHub Actions の YAML ファイルを .github/workflows/python.yml として書く.普段と違うところは onworkflow_call と書くところ.あとは普段のワークフローと同じで Flake8 / pytest を実行している.

on:
  workflow_call:

jobs:
  python:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ['3.8', '3.9']
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}
      - name: Install dependencies
        run: |
          pip install flake8 pytest
      - name: Lint with flake8
        run: |
          flake8 . --count --show-source --statistics
      - name: Test with pytest
        run: |
          pytest

ワークフローを再利用する(呼び出し元)

今度は再利用する側の YAML ファイルを .github/workflows/main.yml として書く.ポイントは uses で再利用するワークフローを指定するところ.あとは普段のワークフローと同じ.

name: Test

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

jobs:
  reusable-python:
    uses: kakakakakku/github-actions-reusable-workflows/.github/workflows/python.yml@master

実行すると期待通りにワークフローを再利用できている❗️

機能 1. 再利用するワークフローのブランチを指定できる

ワークフローを更新するときに mainmaster などを直接更新してしまうと,再利用しているリポジトリが多いほど影響も気になると思う.reusable workflow ではワークフローを呼び出すときに @ でブランチ名やリリースタグを指定できるので,動作確認をしながら開発を進められる.

jobs:
  reusable-python:
    uses: kakakakakku/github-actions-reusable-workflows/.github/workflows/python.yml@develop

機能 2. パラメータやシークレットを指定できる

ワークフローを再利用しようとすると,どうしても柔軟性が失われてしまう.reusable workflow では "パラメータ" や "シークレット" を呼び出し元のワークフローで指定できるため,ワークフローごとに異なる値を注入することもできる.以下の YAML はドキュメントから引用した.また GitHub Actions の if と組み合わせれば,一部のステップをスキップするように使うこともできる.

name: Reusable workflow example

on:
  workflow_call:
    inputs:
      config-path:
        required: true
        type: string
    secrets:
      token:
        required: true

jobs:
  triage:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/labeler@v4
      with:
        repo-token: ${{ secrets.token }}
        configuration-path: ${{ inputs.config-path }}

注意点 1. 階層

reusable workflow の usesjobs.<job_id>.uses の階層のみで使える.jobs.<job_id>.steps[*].uses の階層では使えないため,もし複数のワークフローを再利用し,順番に実行する場合は needs を指定して以下のように書く.

name: Test

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

jobs:
  reusable-python:
    uses: kakakakakku/github-actions-reusable-workflows/.github/workflows/python.yml@master
  reusable-deploy:
    needs: reusable-python
    uses: kakakakakku/github-actions-reusable-workflows/.github/workflows/deploy.yml@master

2022年の振り返りと2023年の抱負

2022年の振り返り 🎉

幅広く技術を語れるように学び続けた ⭕

2019年から4年連続で「幅広く技術を語れるように学び続ける」を年間目標にしていて,今年もたくさん学び続けられたと思う.引き続き "自称" 意識高い系❗️まだ技術講師という仕事を続けているため,顧客満足度の高い技術講師であり続けるために学び続けている.よって「語れる = 教えられる」という目標設定は本当に自分自身にあっている.また2022年も「四半期ごとに」中目標を掲げていて,2022年は以下に取り組んでいた.

1-3月 : 今まで後回しにしていた "もろもろ" を学ぶ 📅

2021年末に Trello の整理をしていたときに「長期間未着手のままになっているタスク」が多くあることを課題に感じた.幅広い技術に興味はあっても時間にも限りがあるため,優先順位が低めのタスクはどうしても残り続けてしまう傾向にある.そこで,1−3月はあえて明確な目標を掲げずに「もろもろを学ぶ」ことにした.例えば「フィーチャーフラグ関連 / Redash 関連 / Katakoda 関連 / Airflow 関連」などの学習はこの期間に集中して行えた.

4-6月 : Kubernetes セキュリティを学ぶ / MLOps を実践する 📅

2021年に準備時間が取れず受験できなかった CKS (Certified Kubernetes Security Specialist) を取得するために4月は集中して Kubernetes セキュリティ学んでいた.結果的に Kubernetes 関連のブログ記事を多く書けて,CKS も合格した.ついでに KCNA (Kubernetes and Cloud Native Associate) にも合格した.詳しくは以下の記事にまとめてある.

5-6月は MLOps 関連のインプットに集中していた.背景としては,技術講師として MLOps を教えることになり,技術的なトレンドやツールセット,各社での取り組みなど,ありとあらゆる情報を収集していた.実はブログにまとめていないことが多く,それはまた別途まとめたいと思う.そして,今まで自分自身が経験してきた DevOps プラクティスをそのまま機械学習プロジェクトに適用できる部分もあれば,機械学習特有の課題が出てくることもあり,技術講師として教えるために現場に戻って "MLOps のプロダクション経験を獲得したいなぁー" なんて考える日もあった.

7-9月 : プログラミング教育関連のノウハウを論文からインプットする 📅

今まで "プログラミング講師2年ほど" と "技術講師4年半ほど" を経験してきて「どのように効果的に教えるか」という観点では,書籍を読んでインプットをしたり,実際のお客様相手にアウトプット(実践)もしてきたと思う.しかし,今まで論文などを読んで「アカデミックな観点で」インプットしたことはなく,研究結果から活用できるノウハウを探すことにしたのが7-9月の中目標だった.以下のブログ記事にまとめた論文は特に印象に残ったもので,実際にオンライン研修で活用したノウハウもいくつかある.また論文を一つ見つけたら,あとは参考文献を使って芋づる式にネタを探せるので「論文を読めばネタは無限だぁぁぁぁぁー」なんて叫んでる日もあったりなかったり😁個人的には印象に残る中目標になった.

10-12月 : 英語学習に再入門する 📅

学生時代の頃から何度も何度も英語を勉強して挫折してを繰り返していて,また英語学習の波が来たという感じ.実は「将来やりたいこと」を洗い出していたときに今以上に英語を使える必要があると感じて,10-12月は技術的なインプットを減らしてでも英語学習に時間を割くようにした.当然ながら長期的に学び続ける必要があるため,Reading / Listening / Writing / Speaking / Vocabulary など複数の学習を並行していて,自分自身の「現在の立ち位置」を整理することを優先した.TOEIC や英検も受験したりもした.英語に関してはブログにまとめていないことが多く,2023年もちょこちょこ出していく予定だけど,以下はこの期間に書いた.

技術講師としてのノウハウを言語化した ⭕

決まった答えはなく言語化する難しさもある技術講師(インストラクター/トレーナー)としてのノウハウを多くアウトプットした1年だった.kakakakakku blog と builders.flash(企業メディア)にいくつかの記事を書いた.今まで仕事仲間と 1on1 をしながら繰り返し伝えてきたことでもあるけど,やはり記事になっていると共有しやすく,書けて良かったと思っている.

また11月には,技術系ポッドキャスト fukabori.fm (第84回) に4年振り2回目の出演をすることになり,技術講師という仕事の楽しさを伝えられたことも印象に残っている.エンジニアのキャリアパスとしては珍しいとは思うので,もし興味があったら Twitter に DM でももらえればお話できます!

さらに8月と10月には会社の同僚と「モブプログラミング」をしている姿をライブ配信するというイベントを企画した.テーマであるモブプログラミングとは関係なく,僕自身の「トークスキル」をたくさん褒めてもらえて,これも「惹き付ける技術」という観点では技術講師としてのノウハウに含まれると思う(自分で言うのはちょっと気が引けるけど...笑).

1年間を通して余裕がなかった 💧

2021年の振り返りで「1年間を通して余裕がなかった 💧」という失敗談を書いて,改善していく気持ちはあったけど,いざ振り返ってみると,日々の余裕の無さは2022年もあまり変わらなかった.2022年も多くの「山場」はあって,それ自体は楽しみながら乗り越えられたとは思うけど,それでも「モチベーションが下がってしまう時期」が数回あったのは印象に残っている.症状的には「燃え尽き症候群」に近い部分もあるけど,メンタル的に厳しい日も少しあった.そして,2021年頃からは「モチベーションだけではどうにもならない」という現実を突き付けられることが多く,悩みの種ではある.仕事は楽しみたいし,個人タスクも楽しみたいし,家族と過ごす時間も大切にしたいし,たまには趣味の時間も取りたいという「トレードオフ」を改めて考え直したいと思っている.

ヒゲ脱毛に加えて足全体脱毛も開始した ⭕

2021年5月に開始したヒゲ脱毛は2022年も継続して,まだ鼻下は多少残っているけど「17回」照射して,一度止めている.残っているところはレーザーの機種を変えて完全になくすべく追加契約を検討する予定.とは言え,2週間に1度ほどサッと剃ればキレイになる喜びは大きく,うまく伝わりそうな表現としては,今までは「こんなの誰が使うんだよ!」と思っていたビジネスホテルに置いてある一枚羽カミソリだとしても,十分キレイに剃れてしまう感じ.今までゴミ扱いしていてごめん!笑

さらに2022年5月からは追加契約で足全体(くるぶし〜太ももの付け根まで)の脱毛も開始した.今まではボーボーなスネ毛が気になって夏なのに半ズボンを履けなかったり,娘たちに "熊みたいな足!" と言われてしまうこともあって,コンプレックスに感じていた.まだたった「3回」の照射だけど,70% ほどは生えなくなっていて,遠目だと相当キレイな足に見える可能性すらある.

脱毛を開始して良かったと思うことをザッと箇条書きにしておく.

  • とにかく朝が楽!
  • 朝剃ったのに夕方にまた生えてきてるという嫌悪感がない!
  • 肌荒れが減る
  • 鏡を見て自分の顔にガッカリする頻度が減る
  • 娘たちに嫌がられない
  • カミソリやシェービングクリームなど備品を買わなくて済む
  • 洗面台やお風呂場に常備しておくべきものが減る(とにかくこれは嬉しいことの一つなんだけど伝わる❓)

インプット/アウトプット 💡

テックブログ

2022年は「週1記事(52記事)」のノルマと,ストレッチゴールの「70記事」を達成して「計80記事」を書いた.1年間を通して,ノルマを達成できなかった週はなく,計画的に楽しく書き続けることができた.累計ブクマ数は「17591 → 18644 (+1053)」となり,グラフ的に大きく伸びている2箇所では「Diagrams」「UUID」の記事を書いた.

以下に Google AnalyticsGoogle Search Console を使ってランキング🏆をまとめてみた.やはり Git / Jupyter Notebook / Pandas ネタは需要があるな!という感じ.また今年書いた Playwright for Python 関連の記事は日本語記事が少ない背景もあって,検索流入が増えている.

さらに12月には「はてなブログの読者登録数」「900人」になって嬉しかった.はてなブログ読者数ランキング を見てみたら,12月7日時点で「340位」だった🏆せっかくなら書いた記事を多くの人に届けたいと思っていて,2023年も読者登録をよろしくです❗️

プルリクエスト

読んだ本

2022年は「計9冊」を読んで書評を書いた.2021年よりは増えているけど,実際にはもっと読んでいるので「読んだけど書評記事を書いていない本」が数冊残っている.また献本してもらった本の書評記事も残ってしまった(土下座).どうしても書評記事を書こうとすると準備負荷が高くなってしまって後回しになってしまうため,もっとカジュアルに書評記事を書きたいところ(何年連続で言ってるんだ...).

買って良かったモノ 🎁

オンライン研修を配信する配信宅で使っている FlexiSpot E7 Pro を自宅用にもう1台買った.FlexiSpot の机を広く使うために買った「エルゴトロンのモニターアーム」はおすすめ.OEM した Amazon Basic 製品もあって価格的には安いけど,サポート期間の長さとメーカー優先でエルゴトロンを選んだ.また素足のまま立っていると足が痛くなってしまうため「ウーフォスのリカバリーシューズ」を履いていて,本当におすすめ.かなり人気で在庫切れになっている日が多いので,定期的に巡回してやっと買えた.サイズは +1cm ぐらいにしておくと良いと思う!

お手頃価格でオシャレなエコバッグを探していて「サーモスのポケットバッグ」を買った.小さく畳めて便利!

36歳にもなると段々と体に嫌な変化が出てきて,娘たちに "お父さんくさい!" と言われてしまう日も出てきた.だけど「リデンのボディーソープ」を使い始めたら言われなくなってちょっと安心した.同じ悩みを持つお父さんにおすすめ!

2022年5月から足全体の脱毛を開始して,照射の前にカミソリで全剃りをしたらカミソリ負けをしてしまった.カミソリ以外を探していて「パナソニックのファーストボディトリマー」を買ったら非常に使いやすかった.照射前の全剃りだけじゃなく,腕などにも使えて,日常的にお世話になっている.脱毛に関係なく,お手入れをするならおすすめ!

2023年の抱負 ✨

幅広く技術を語れるように学び続ける(+ 実戦投入力)

技術講師という今の仕事との相乗効果が高く,メリットも多いため「幅広く技術を語れるように学び続ける」という年間目標は5年目になるけど継続する❗️さらに,2023年は「実戦投入力」も意識しながら学び続けたいと思っている.実戦投入力というのは実は "2016年〜2018年まで3年間" 年間目標に掲げていたもので,Hello World で満足するのではなく,プロダクション環境で使う目線で深く学ぶという意識のこと.技術講師を4年半も続けているということは,逆に「4年半も開発現場から遠ざかっている」とも言えて,そろそろ現場感を取り戻したいという気持ちもあるので「実戦投入力」も意識する1年にしたいと思う.なお,四半期ごとの中目標はまだ "1-3月" しか決めてなく,個人振り返りをしながら決めていく予定.

テックブログの定量的な目標は継続して,以下とする.2022年と同様に状況次第ではストレッチゴールも目指す.

  • ブログ「週1記事(52記事)」ノルマ
  • ストレッチゴールとして1年間で「70記事」
    • 2023年は今までほとんど書いていなかった「雑文」にも挑戦したいと思っていて記事数は増える可能性あり❗️

また,10-12月に取り組んだ英語学習も継続しつつ,技術的なインプットにも繋げていく.例えば,英語の技術書を読んだり,英語の Podcast や YouTube から情報収集をしたりすることで,まだ日本では認知度が低いような技術にもアンテナを張りたいところ!

動画編集に入門する

2022年の年間目標に掲げていた「動画編集への入門」は全くできなかった.残念すぎるし,自分自身の計画性のなさにうんざりする.日々の余裕の無さも原因ではあるけど,個人的な性格(悪癖)として「新しいことに挑戦するときにまとまった時間が取れるまで後回しにしてしまう(結局そんな日は来なくてずるずる伸びてしまう)」というものがある.小さなタスクに分割しながらコツコツ進められるように改善しつつ,2023年の年間目標として改めて掲げる.近い将来のために「動画編集スキル」を学ぶのだ❗️

脱毛を継続する

ヒゲ脱毛と足全体脱毛を継続しつつ,さらに他の部位も検討するかも.あとヒゲが減ってきて,今度は根本的に肌質改善をしたくなってるし,歯の黄ばみも気になってきて,ホワイトニングも検討するかも.インストラクターという「顔出しの」仕事だから投資効果はあるはず!と自分に言い聞かせつつ,沼に入り込まないようには気を付けたいところ.とは言え,払える程度のお金💰でコンプレックスを軽減できてしまう体験が素晴らしく癖になっているとは思う.

ひとまず以上❗️まだまだ他にも「2023年の抱負」はあるけど,ブログに書けるのはこのあたり❗️

まとめ

2023年も学び続けることを楽しむぞ🔥変化の1年にできればと〜

よろしくお願いしまーす❗️

過去の振り返り

英語でメールやドキュメントをうまく書けるように / Coursera コース「Writing Professional Email and Memos」を受講した

2022年11月頃に Coursera コース「Writing Professional Email and Memos」を受講した.英語学習用のコースではないけど,日頃から英語メールや英語ドキュメントを書く機会があるため,ライティングスキルを伸ばすために受講してみた.2016年に作られたコースで微妙に古さ(コンテンツ的にも/文化的にも)を感じるところはあるけど,参考になる情報もあって受講して良かった❗️コース紹介も兼ねて簡単にまとめておく.

  • 1週目
    • Introduction to Professional Memos and Emails
  • 2週目
    • Five Types of Emails/Memos
  • 3週目
    • Audience, Grammar, and Clarity, Oh My!
    • Case Studies in Writing a Memo
  • 4週目
    • Turn in Your Final Memo

www.coursera.org

コース構成

コース構成としては,ザッと以下のコンテンツが混ざっている.ビデオを観たり,ドキュメントを読んだりする時間もあるけど,実際にメール(送信はしない)やドキュメントを書く演習が含まれているのがポイントだと思う.

  • ビデオ
  • ドキュメント(ウェブサイトを含む)
  • 演習
  • テスト/課題(注意 : Coursera サブスクリプションを購入しないと使えない)

参考になったこと

メールに関しては From, To, Bcc, Subject, Date とは?という基礎的すぎる説明もあったけど,簡潔に書く重要さや,メールの受信者に何を期待するのか(単なる情報共有なのか/何かをして欲しいのか)を明確に書く重要さなども学べた.またメールを書くときに以下を意識するべきという紹介もあった.

  • Audience awareness(認識)
  • Tone(温度感)
  • Formality(堅さ)
  • Attitude(態度)
  • Correct English(英語の正しさ)
  • Clarity(明確さ)
  • Conciseness(簡潔さ)

他に「フォーマルなメールを書く Tips」「忙しい人にメールを読んでもらう Tips」などは,ウェブサイトへの誘導になっていて,実際に読んでみて参考になるところもあった.

www.wikihow.com

www.businessinsider.com

さらに「惹きつけるメールにするためのオープニングフレーズ」などもすぐに使えそうで良かった.

またコース名にある "Memos(メモ)" という言葉の意味は最初ピンと来なかったけど,具体的な種類として以下が紹介されていて理解できた."メモ" と言うより "ドキュメント" って言うと伝わりそう.種類ごとにポイント解説やサンプルも載っていた.

  • Progress Report(進捗報告)
  • Meeting Minutes(議事録)
  • Incident Report(障害報告)
  • Directive(指示)
  • Response to Inquiry(問い合わせへの返答)

演習

演習では,提示されたメールやメモに対してレビューをして改善案を出したり,お題を選んでドキュメントを書いたりする.僕は仕事でも書く機会がありそうな「Progress Report」を選んで書いた.実際に書いてみると,予想以上にうまく書けなくて頭を悩ませることになった.貴重な訓練になった.しかし書いたドキュメントをレビューしてもらえるわけではないため,ProWritingAid を使ってフィードバックをしてもらった.個人的に Premium プランを契約しているため,細かく直せて良かった.

prowritingaid.com

まとめ

Coursera コース「Writing Professional Email and Memos」を受講した.メールやドキュメントを英語で書くときのポイントを抑えつつ,演習で実際に書けるのは良かった.最近よく Coursera コースを受講していて,英語コースだとこんなにも多くのことを学べるんだなーと再認識している.もっと学んでいくぞ❗️

Coursera 関連

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

2022年のプルリクエストを振り返る

2016年から毎年 OSS に送ったプルリクエストを振り返る記事を書いている.2022年は「計6件」だった.2020年頃から件数は停滞している.今の仕事だとコードを書いて OSS にコントリビュートする機会はほとんどなく,貢献できていないことに残念さは感じる.プライベートリポジトリには毎日のようにコミットをしているため,GitHub 自体は日々使っている.過去の振り返りは以下にある.

プルリクエストを振り返るための検索

プルリクエストを振り返るために GitHub の検索条件を使う.今回は「2022年」に限定するため created:2022 とする.

is:pr is:public author:kakakakakku -user:kakakakakku created:2022

2022/01

Unleash/unleash

Feature Flag サービス Unleash を試しているときにサンプルコードがうまく動かず修正した.

github.com

Unleash に関しては以下の記事などにまとめた.

kakakakakku.hatenablog.com

katacoda/scenario-examples

Katacoda で学習コンテンツを作る手順を調べながら公開されているコンテンツに誤りがあり修正した.

github.com

github.com

Katacoda で学習コンテンツを作る話は以下の記事にまとめたけど,Katacoda は「2022年6月末」にサービス停止になってしまった.

kakakakakku.hatenablog.com

2022/05

moabukar/Kubernetes-and-Cloud-Native-Associate-KCNA

資格 KCNA (Kubernetes and Cloud Native Associate) の対策として参考にしていたサイトのドキュメントを修正した.

github.com

KCNA に合格したときのまとめ記事は以下にある.

kakakakakku.hatenablog.com

2022/07

FairwindsOps/pluto

Kubernetes apiVersion の非推奨などを検出するライブラリ「Pluto」のドキュメントを修正した.

github.com

以下の記事を書きながらプルリクエストを出した.

kakakakakku.hatenablog.com

2022/08

cyber-dojo/exercises-start-points

ペアプログラミングやモブプログラミングを練習するときによく使っている Cyber-Dojo のお題「FizzBuzzPlus」の説明文を修正した.FizzBuzzPlus で 51 -> Buzz という例は個人的にわかりにくく,直せて良かったと思う.

github.com

まとめ

2022年は「計6件」のプルリクエストを送った.2023年も件数目標は立てず,機会があれば積極的にプルリクエストを送っていくぞ❗️