なんじゃくにっき

プログラミングの話題中心。

はてなブックマークの表示を変えたい(2)

前回の続き

ちょっとCSSいじりました。

はてなブックマークの表示を改変

  • カテゴリとドメイン名をタイトルの左に移動
  • 日時とタグ非表示
  • ガタガタしてたので幅調整 など。
#entrylist-ad-right-top {
    position: absolute;
    right: 0;
    z-index: 1;
    top: 32px;
}

.entrylist-wrapper {
    width: 100%;    
}

.entrylist-contents-title {
    min-height: 0px;
    width: 400px;
    order: 2;
    padding: 0;
    margin: 0;
}

.entrylist-header-main .entrylist-image-entry .entrylist-contents-title {
    padding-right: 0;    
}

.entrylist-contents-title a {
    overflow: hidden;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    font-size: small;
}

.entrylist-item {
   width: 100%;    
}

.entrylist-header-main, .entrylist-item>li {
    flex-basis: auto;
    max-width: 100%;
    width: 100%;
}

.entrylist-contents-body {
    max-width: 60%;
}

.entrylist-item .entrylist-image-entry .entrylist-contents-description, .entrylist-contents-description {
    text-align: left;
    overflow: hidden;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    margin-bottom: 0;
}

.entrylist-contents-thumb{
    display:none;
}

.entrylist-contents-main {
    padding: 4px;
    flex-direction: row;   
}

.entrylist-contents-users {
    display: inline;
    text-transform: none;
    font-size: medium;
    right: auto;
}

.entrylist-contents-users a {
   display: inline;    
}

.entrylist-contents-users span {
    font-size: 14px;
}

.entrylist-contents-domain, .river-placement .entrylist-contents-domain {
    width: 130px;
    padding: 0.8rem 0 0 0.2rem;
    order: 1;
}

.entrylist-contents-meta {
    padding: 0;
    order: 0;
    width: 100px;
}

.entrylist-contents-meta li {
    margin-top: 20px;
}

.entrylist-contents-date {
    display: none;
}

.entrylist-contents-tags {
    display: none;
}

おまけ

特定のドメインの記事は見えなくしたい場合。

例として匿名ダイアリーを非表示にしたい場合。

li.js-keyboard-selectable-item:has(a[href="/site/anond.hatelabo.jp/"]) {
    display:none;
}

はてなブックマークの表示を変えたい(1)

はてなブックマークをPCのブラウザで見ると、1行に4つの記事が表示されていて、見るときに視線を左右に移動させないといけないのがちょっとつらい。

はてなブックマーク

1行1記事で基本上から下にだけ視線を移動させれば良いようにしたい。

ということでCSSを無理やり当てて表示を変更してみました。

改変はてなブックマークのSS
改変はてなブックマークのSS

ちょっとまだガタガタしている部分もありますが、気が向いたら直します。

やり方

StylusっていうChrome Extentionを使用しました。(Firefoxにもあります)

特定のサイトのCSSを上書きできるブラウザ拡張は他にもあるのでお好みのものをどうぞ。

CSS

.entrylist-wrapper {
    width: 100%;    
}

.entrylist-contents-title {
    min-height: 0px;
    width: 400px;
}

.entrylist-contents-title a {
    overflow: hidden;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    font-size: small;
}

.entrylist-item {
   width: 100%;    
}

.entrylist-header-main, .entrylist-item>li {
    flex-basis: auto;
    max-width: 100%;
    width: 100%;
}

.entrylist-contents-body {
    width: 50%;    
}

.entrylist-item .entrylist-image-entry .entrylist-contents-description, .entrylist-contents-description {
    text-align: left;
    overflow: hidden;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 3;
    margin-bottom: 0;
}

.entrylist-contents-thumb{
    display:none;
}

.entrylist-contents-main {
    padding: 4px;
    flex-direction: row;   
}

.entrylist-contents-users {
    text-transform: none;
}

.entrylist-contents-users span {
    font-size: 10.5px;
}

.entrylist-contents-domain {
    padding: 0;   
}

.entrylist-contents-meta {
    padding: 0;
}

.entrylist-contents-tags {
    max-width: 200px;
    padding: 0;
}

余談

昔々は本家はてなブックマークも1行に1記事でした。

で。それが今の表示に変わってから元の行表示がほしいユーザーがいて、その人たちに嫁のはてぶっていうサイトが人気だったんですが、そこも閉鎖してしまってました。

PDFをプログラムで編集したい

既存のPDFにテキストを追加したい・・と思ったことありませんか?

今の時期なら国税庁が配布している確定申告書等のPDFに印字したい、とかでしょうか。

確定申告書等の様式・手引き等(令和5年分の所得税及び復興特別所得税の確定申告分)|国税庁

※なお、私はe-Taxで済ませたので実際のところは確定申告書を印刷したいわけではありません

画像として編集

PDFをjpgなりpngなりのラスター画像にして編集する方法。

画像にしてしまえばいくらでも文字を載せたりすることはできます。

が、欠点としては以下の点が挙げられます

  • 出力時の解像度が低いと印刷時に汚くなる
  • 出力時の解像度が高いとファイルサイズが大きくなる
  • テキストとしての情報が失われて画像になってしまうので再度の編集が難しくなる

ライブラリ

pdf.js

GitHub - mozilla/pdf.js: PDF Reader in JavaScript

pdf.jsはJavaScriptHTML5canvasにPDFを描画するためのライブラリ。

描画してからcanvasのtoDataURLを使うとPNGを出力できるが、当然テキストの情報は失われます。

無理やりpdf.jsが内部で持っているoperationのdataをいじれば内容は編集できるが、素のPDFの情報に近く、編集するのはかなり大変。

pdf-lib

https://github.com/Hopding/pdf-lib

jsのコードからテキストを追加できます。

ただしGUIはなく、位置を指定する必要がある(単位はポイント=1/72インチ?)。また文字ごとの間隔を調整したい場合は1文字ずつ印字、になりそう。

既存テキストの編集はできません(対応したいと言っているが3年位開発止まってる)。

HummusJS/MuhammaraJS

https://github.com/julianhille/MuhammaraJS

HummusJSが開発終了してMuhammaraJSに引き継がれた。

C++製ライブラリとそのjsラッパーなのでブラウザでは動作しない(だれかWebAssembly化して・・)

PDFBox

https://pdfbox.apache.org/

Java製ライブラリ。

テキストの追加は出来る。

まとめ

コードからPDFにテキスト追加できるライブラリはいくつかありましたが、既存テキストの編集は見つけられませんでした。

また、GUIからぽちぽちしてPDFを楽に編集できる方法はオープンソースのものでは見つけられませんでした。

GUIから操作したいときはAdobeAcrobatでも買いませう。

Chromeのページ内検索で正規表現を使いたい

タイトルの通り、Chromeのページ内検索で正規表現を使いたい、んですが、今までずっとむず痒さを覚えつつも放置してました。

使いたいケースは主にgithub上でコード読むとき。今まで正規表現で検索したいときはローカルにチェックアウトする、っていう無駄なことしてました。 (リポジトリからコードを探すときはgithubの機能で正規表現で検索できますが、今見てるファイル内を検索したいときに困っていました)

あと、Chromeの検索は大文字小文字区別しないので困ります。

そんなんextention作ってくれてる人いるだろう、と思ったら案の定ありました。ありがとうございます。

https://chromewebstore.google.com/detail/chrome-regex-search/bpelaihoicobbkgmhcbikncnpacdbknn

Firefoxは昔ブラウザ標準の機能で正規表現検索機能あったと思うんだけど少なくとも今はなさそう。大文字小文字の区別はできます。

Playwrightでテストコード生成

Playwright + reg-suitでビジュアルリグレッションテスト - なんじゃくにっき

の続き

テストコード生成

npx playwright codegen

とするとブラウザが立ち上がって、そこで操作するとその操作がインスペクタにテストコードとして記述される。

それをコピーしてきてspecファイルにペーストすれば良い。

↓はブラウザのアドレスバーにgootle.comとして遷移してからロゴをクリックしたときのキャプチャ。

認証など共通する前処理

認証など各テストに共通する前処理をしたい場合

https://playwright.dev/docs/auth

Playwright + reg-suitでビジュアルリグレッションテスト

概要

Playwright + reg-suitを使ってビジュアルリグレッションテストをやってみます。

E2Eテストでスクリーンショットを撮って前回との比較をします。

インストール

今回の実行環境はUbuntuですが、MacWindowsでも多少やり方が違いますができますので公式ドキュメントにまず目を通しましょう。

Installation | Playwright

に従ってインストールします。

事前にnodeはインストールしておくこと。

npm init playwright@latest

実行中にいくつか選択肢がでますがほぼデフォルト値で決定しました。

github actionsだけ今回は使う気がなかったのでNoを選択。

依存ライブラリをインストールします。

一旦chromiumで実行するためのものだけにしておきます。

--with-depsオプションをつけなければfirefoxwebkitで実行するためのものもインストールされます。

npx playwright install --with-deps chromium

実行

npx playwright test

とするとtestsディレクトリ以下のテストが実行されます。

デフォルトでexample.spec.tsができているのでそれが実行されます。

実行が終わるとサーバーが起動して

http://localhost:9323

で結果が見られます。

テストが2つ x ブラウザ3種類の6つのテスト結果が表示されます。

playwrightテスト結果1

chroniumの依存ライブラリしかインストールしていないのでwebkitfirefoxのテストが失敗しています。

また起動したサーバーをCtrl + Cで止めたあとでも

npx playwright show-report

で最後の結果を表示できます。

実行時にUI表示

デフォルトだとheadlessで動作しますが目に見えるブラウザを起動したいときは

npx playwright test --ui

実行ブラウザを変える

https://playwright.dev/docs/browsers#configure-browsers

chromiumだけにする

playwright.config.ts を編集してfirefoxwebkitの部分をコメントアウトすればOK

モバイル表示

iPhone表示にはwebkitが必要です(iPhoneのシミュレーターではなく)

npx playwright install --with-deps webkit

したあとに

playwright.config.ts

iphoneの部分のコメントアウトを外せばOK

特定のデバイスのみで実行

npx playwright test --project chromium

--projectオプションを使う

reg-suit install

npm install --save reg-suit
npx reg-suit init 

どのプラグイン使うか聞かれるので一旦は全部外す

スクリーンショットを撮る

test/example.spec.ts

test('Take photo', async ({ page }) => {
  await page.goto('https://playwright.dev/');
  await page.screenshot({ path: './ss/example.png', fullPage: true });
});

実行ごとにスクリーンショットディレクトリを変える

スクリーンショット撮ることはできましたが毎回出力先が同じだと毎回上書きされて残らないので、実行日時 + ブラウザのディレクトリに残るようにします。

npm install --save dayjs

test/config.ts

import { test as base } from '@playwright/test';
import dayjs from 'dayjs';

export type TestOptions = {
  ssDir: string;
};

export const test = base.extend<TestOptions>({
  ssDir: './ss/' + dayjs().format("YYYYMMDDhhmmss") + "/",
});

test/example.spec.ts

import { expect } from '@playwright/test';
import { test } from './config';

test('Take photo', async ({ page, ssDir }, info) => {
  const fileName = "top.png"
  await page.goto('https://playwright.dev/');
  await page.screenshot({ path: ssDir + info.project.name + "/" + fileName , fullPage: true });
});

差分検出

2回実行してssディレクトリの下に2つディレクトリができているとすると

npx reg-cli ./ss/20240222022952/ ./ss/20240222022438/ .diff -R ./report.html

みたいにすると差分が検出されます。

CLIに変化があったファイルが表示されますがレポートもreport.htmlに出力されます。

差分表示例(赤く見える場所が差分)

スクリプト

DIR1=`ls -A ./ss | sort | tail -2 | head -1`
DIR2=`ls -A ./ss | sort | tail -1`

npx reg-cli ./ss/${DIR1} ./ss/${DIR2} .diff -R ./report.html
open ./report.html

毎回ディレクトリ指定するのは面倒なので最後の2つを比較しましょう。

やってない

github actionsを使ってgithubで特定のブランチに変更されたときにheadlessでテスト走らせて検知、みたいなこともできますが、今回は任意のタイミングで実行したかったのでやってません。

画像ファイルをS3にアップロードできますが今回はやっていません。(やる場合はreg-publish-s3-pluginを使えばよさそう)

ビジュアルリグレッションテスト

ビジュアルリグレッションテストとは

ビジュアルリグレッションテストとは画像を取得して正解画像と比較するテスト

SaaS vs 自前運用

ビジュアルリグレッションテストをE2Eテストの一環として行えるSaaSはいくつかあって、SaaSの利点としては

  • 自前でインフラ構築しなくても良い
  • 非エンジニアでも割と使える

と言う点が挙げられます。

逆に欠点としては - まだ値段が高い - あくまでもサービスとして提供されている機能しか使えず、カスタマイズが自分でできる範囲が限られる

ということがあります。

お値段はそこそこするので個人プロジェクトで使うには厳しいですね。 もっとマーケットが広がって規模の原理でお値段下がるのを期待。

逆に仕事で使うならインフラの保守、テストケースの保守なども考えるとかえってコスト削減が期待できます。

SaaS

それぞれちょっとずつ触らせてもらったことがあります。

価格はだいたいどこもお問い合わせ。

各サービス頻繁に機能追加されていて現状は異なっている可能性があるので鵜呑み厳禁。

Autify

E2EのSaaSで世界的に見て一番有名なのはここじゃないかな。

MagicPod

https://support.magic-pod.com/hc/ja/articles/4408918323225-%E7%94%BB%E5%83%8F%E5%B7%AE%E5%88%86%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF

ビジュアルリグレッションテストで閾値の設定ができる。

除外領域の設定もできるのが面白い。

Mabl

https://university.mabl.com/ja-visual-testing/12261

機械学習ベースでビジュアルリグレッションテスト動かしているのが面白い。

DataDog ブラウザテスト

DataDogは監視&分析のSaaSなんですが、ブラウザテストも機能の1つとしてあります。

スクリーンショットを撮る機能はある(というかデフォで各ステップで撮られる)んですが、ビジュアルリグレッションテストなさそう。

https://docs.datadoghq.com/ja/api/latest/synthetics/#get-a-browser-test

E2E回したあとにAPI経由で画像を取得してreg-cliで比較するプログラムを組めばビジュアルリグレッションテストできなくはなさそうです(試してない)

自前運用

最近流行りのものだとPlaywright + reg-suitじゃないかなーって思います。

Ubuntu 22.04で特定のアプリケーションにフォーカスが当たっているときにguakeのトグルが効かなくなる件

Ubuntuでターミナルにguakeを使っているんですが、

Ubuntuのバージョンを20.04から22.04にアップデートしてから、Firefoxなどのアプリにフォーカスが当たっていると F12キーでのguakeのトグルが効かなくなくて困っていました。

別のアプリに切り替えると効くのでguakeを起動するのに今まで1アクションだったのが2アクションになっていました。

たまたま解決策を見つけました。Gnome Settingからショートカットの設定でできました。

https://askubuntu.com/questions/1331707/f12-acting-weird-in-21-04-can-no-longer-toggle-guake

2023年度確定申告

概要

2023年度確定申告、所得税の納付まで済ませました。

今年は給与収入はなく、事業収入のみの個人事業主です。

去年の自分の記事を掘り起こしてくると、去年はスマホでやったらしい。

2022年度確定申告をスマホでやってみた - なんじゃくにっき2

今年はPCでやりました。OSはUbuntu、ブラウザはFirefoxです。

User agent偽装しているので真似する人は自己責任でお願いします。

準備したもの

昨年のうちに済ませておいたほうが良いこと

仕訳の入力は年明けてからやるより事前に済ませたほうが良い。

面倒なのが請求書、領収書などを会計ソフトに添付ファイルとして入力していくところ。

これを大体年末に済ませました。

一部のサービスでは2023/10以降の請求書がインボイス対応で形式が変わっていたりした。

年が明けてからやること

一部仕訳が年内に確定しないので、年明けてからも少し入力。1/15が最後でした。

控除証明書の類が全部集まってから確定申告書の作成を行ったほうが楽です。作成途中で中断するのが面倒なので。

この手のものは1/23に国民健康保険料年間納付済額のお知らせが来たのが最後でした(去年は届かなくて電話した)。

あと、年金の通知は11月分までしか載ってなかったので自分で計算する必要がありました。

確定申告書作成開始

確定申告書等作成コーナーからスタート。

去年は作成始めてから何回か必要なものが足りてないのに気づいて中断、 再開したりしてたので都度マイナンバーカード読み込んだりが面倒だったが、 今回は学習していたので一発で終えた。

マイナポータル連携

医療費は連携されたが控除されるほどの金額ではないのであまり意味はない(去年も同様だった)。

国民健康保険料は今年も連携されなかったです。

金融機関と連携できるみたいだが譲渡所得等は昨年中に売ったものがないのでなし。

決算書の入力

会計ソフトから数字をコピペで入力すると改行などの制御文字が入るのか、validation通らないことが多いので結局手打ち・・

input側で取り除いてくれると嬉しいんですが。

確定申告書の作成

決算書の作成が終わると引き続いて確定申告書の作成

ここでは入力することは控除をちょっと入力するだけでさくっと終わり。

そのままe-taxで申告終わり。

納付

納付はペイジーで行いました。手数料ゼロだしね。

メインのインターネットバンクがペイジー対応していなくて、別の銀行の口座に送金してそっちから納付。

納付するのに4つの番号が必要で

  • 収納機関番号: 00200固定
  • 納付番号: 利用者識別番号。メッセージボックスに送られてくるメッセージに載ってる。
  • 確認番号: 納税用確認番号。後述。
  • 納付区分: メッセージボックスに送られてくるメッセージに載ってる。

とあるが、納税用確認番号ってなんだと思ったらe-tax利用開始時に自分で設定するものらしい。

が、そんなもの覚えてないのでどうするのかと思ったら”受付システム”から再設定できた。

”受付システム”はマイナンバーカードさえあればログインできる。

毎回納税の度に再設定しても良いかもしれないと思いました。

納税用確認番号を忘れてしまいました。どうすればいいですか。| 【e-Tax】国税電子申告・納税システム(イータックス)

金額の入力は不要で、上記4つの番号が揃っていれば金額は自動で入力されている。