【Mac】PDF に 無料 プレビュー アプリで自在に文字入力する方法 - 入力フォームに文字が収まらない

役所関連の配布された様式 PDF に文字入力した PDF を作成します。

ここでは、国税庁「居住者証明書交付請求書」を作成していきます。

👉 No.9210 居住者証明書の請求|国税庁

国税庁のサイトで様式が2つ公開されています。

「印刷用」は、印刷して手書きで記入してね、

「入力用」は、そのままパソコンで入力できますよ、

ということなのでしょう。

 

🧑🏻‍💻 PDF入力フォームに文字が収まらない問題

配布されているPDFに設定された入力フォームでは、

フォントやサイズや入力位置が変更できないようで

きれいに収まってくれません。

 

🧑🏻‍💻 パスワードロックを外す

プレビュー や Chrome の「印刷」機能からパスワードロックなしの PDF を作成します。

ダウンロードした PDF をプレビューで開いて、「ファイル」-「印刷」から、

または、Chrome でリンククリックでPDFを開いた状態から「印刷」-「保存」で一度PDFを書き出すか、
または「プレビューで開く」とそのまま編集可能な状態になります。

使う様式はどちらでもいけますが、

PDFにすでに作成されている入力フォームは必要ないので

「印刷用」のほうが混乱しなくて分かりやすいと思います。

覚えておくことは、プレビューでも、Chromeでも、

「印刷機能を使ってパスワードロックなしPDFを再作成する。」

ということです。

 

🧑🏻‍💻 PDF に文字を入力する

昔からある「マークアップパネルからテキストを追加」する方法。

一番万能で自在。

または、

最近のプレビュー新機能の「自動で作成される入力フォームからテキスト追加」する方法。

これも便利かもしれません。

 

🧑🏻‍💻 まとめ

元はといえばこんなメッセージがきましたので。

役所へのPDF様式を元にした書類作成は、

慣れてる人以外は毎回イライラしますよね。

毎回、紙に印刷して手書きで記入していたので、

今回少し調べてみました。

最後に、作成してる風景を動画を。



 

🧑🏻‍💻 参考

👉 【Android】Google Play Store Developer アカウントを「個人」から「組織」に変更した手順をきちんとまとめておく
👉 PDFのメタ情報を確認する
👉 リンゴ印のライフハック(103) Macの「PDFとして保存」を上手に使おう | マイナビニュース


【ffmpeg】VP9 コーデックから H.264 コーデックへの動画変換

YouTubeやGoogleフォトからダウンロードした動画は、他のサービスやツールでの利用が難しいことが多く、特に動画コーデックの互換性が問題となることがあります。特にVP9コーデックで圧縮された動画は、特定のプラットフォームやアプリでの再生がサポートされていない場合があります。したがって、VP9コーデックで圧縮された動画をH.264コーデックに変換することは、さまざまなデバイスやサービスでの利用を可能にするための重要なステップです。

👉 ffprobe vs mediainfo

 

🎬 VP9コーデックとは

VP9はGoogleが開発したオープンでロイヤリティフリーな動画圧縮コーデックであり、VP8の後継にあたります。このコーデックは、特に高解像度の動画配信に適しており、H.264に比べて同等の品質でファイルサイズを小さくすることが可能です。VP9はYouTubeやGoogleのストリーミングサービスで広く利用されており、その高い圧縮効率と画質が評価されています。しかし、一部のプラットフォームやデバイスでは、VP9を直接再生できないことがあり、この点がユーザーにとっての障壁となることがあります。

👉 VP9 - Wikipedia

 

🎬 H.264コーデックの利点

H.264は、現在最も広く使用されている動画圧縮コーデックの一つであり、様々なデバイスやプラットフォームでサポートされています。これにより、H.264でエンコードされた動画は、ほぼすべてのメディアプレーヤーやデバイスで再生可能であり、特にSNSやオンラインサービスにおいては、非常に高い互換性を誇ります。したがって、VP9からH.264への変換は、動画を広範に利用するために必要な手段と言えます。

 

🎬 変換方法

VP9コーデックからH.264コーデックへの変換は、FFmpegという強力なオープンソースの動画処理ツールを使用することで簡単に行えます。以下のコマンドをターミナルで実行することで、VP9で圧縮された動画をH.264形式に変換できます。


ffmpeg -i before.mov -y -vcodec libx264 -qp 0 -pix_fmt yuv420p -acodec copy after.mov


-i before.mov : 変換元の動画ファイルを指定します。
-y : 既存の出力ファイルを上書きすることを指示します。
-vcodec libx264 : 出力動画のコーデックをH.264(libx264)に指定します。
-qp 0 : 品質を最優先にする設定です。数字が小さいほど高品質になりますが、ファイルサイズも大きくなります。
-pix_fmt yuv420p : 出力動画のピクセルフォーマットを設定します。多くのデバイスでの再生互換性を確保するために、yuv420pが推奨されます。
-acodec copy : オーディオコーデックを変更せずに、元のオーディオをそのままコピーすることを意味します。

 

🎬 実際の利用例

この方法を使用することで、Instagramなどのプラットフォームに動画をアップロードできるようになります。動画の圧縮と変換を行うことで、質の高い動画を手軽に他のサービスで利用することが可能になります。また、これにより視聴者にとっても快適な再生体験を提供することができるでしょう。

 

🎬 まとめ

VP9からH.264への動画変換は、動画の互換性を向上させ、様々なプラットフォームでの利用を可能にするための有効な手段です。FFmpegを使用することで、手軽に高品質な動画を変換し、SNSやオンラインサービスでのシェアを促進できます。このように、動画の圧縮形式を変更することは、デジタルコンテンツの普及において非常に重要なプロセスです。


ffmpeg -i before.mov -c:a copy -c:v libx264 after.mov

これで Instagram にもアップできました!



【SwiftUI + SwiftData】MVVMパターンを考えたときに

SwiftUI ベースに MVVM のパターンを考えたとき。

Apple と Orange の子 View があるとして、こういう感じで認識していましたけども MVVM。

1つの View に対して、1つの ViewModel でライフサイクルは同期している。

その View の子の View に対しては親の ViewModel を渡したり、差し込んでいく。

著名な公開されているコードを見てると、こういう形が多いように見えるし、そのほうが書きやすいように思える。

世の中そんな流れですかね。

どうなんですかね。

ModelContext てそんな子に向けてのツールですよね。

どこかなんかいい参考記事ないですかね。

まあ、ざっくりの話なんですけども。


スマートフォン を ドリル で破壊する

電源が入らなくなったスマートフォンたち。

バッテリー交換したり、してもらったり、保証期限内交換とかしてましたが、もうめんどくさい。

👉 スマホのバッテリーが膨張し始めたときどうするか。 hatena-bookmark

👉 Android端末のバッテリーが膨らんできた場合 hatena-bookmark

今回は、セキュアに破壊して捨てます。

 

🔥 新規購入アイテム

ドリルドライバーです。めっためたにやってやります。

 

🔥 電動ドリルドライバー到着

到着しました。

同梱物。

と説明書でした。

いざ。

「+」のビットでは無理ですね。

ホームセンターに行ってきます。

 

🔥 ドリルビット

種類が多すぎてわからん。

初心者はここらへんかな?

こんな記事。

電動ドリルは、金属を貫通する必要があるので5N・m以上のトルクがあるものが望ましく、ドリルビット(替芯)は鉄工用が必要です。筆者はカインズのACドリルドライバー「KT-01」(3280円)と、直径6mmの鉄工用ドリルビット(2本で578円)を使用しました。

👉 ASCII.jp:定番のHDD破壊方法 これであなたもドリル◯◯ hatena-bookmark

 

🔥 ガラスは強い

18V のドリルドライバーでこの感じ。




ガラスをズボズボっと穴を開けていくには厳しい感じがします。

ガラス部分を貫通させることはやめておくことにします。

カバーを開いてから基盤部分をドリルすることにします。

ヘラ的なものをメルカリや100均で手に入れます。

あとはマイナスドライバーなどをつかってカバーやガラスを含む表面部分をめくっていきます。

 

🔥 内蔵バッテリーは危険

破壊するの危険。

一般ごみと一緒に捨てるのも危険です。




破壊する前にすべて取り外します。

まとめて自治体の指示にしたがって捨てることにします。

 

🔥 ドリルビット到着

これ買いました。

むむ。

硬え。各部品、穴あけに対して強くね ?

 

🔥 新アイテム購入

ロックチェーンも南京錠もガンガン切っちゃうこれ。

チップを狙ってガンガン切断していきます。

これが一番良いですわ。

 

🔥 まとめ

ドリルはスマホやパソコンを破壊するのには適してない。

バッテリーの液漏れや巻き込みなど取り扱いは素人には危ないし、

メモリチップやディスクを確実に貫通できないので

データを救出できる可能性はあると思う。

最後に、スマホ破壊に役立った工具 のみを。

メガネ大事。

ケガをしないように気をつけてください。



【Swift】URLSession で Passing argument of non-sendable type '(any URLSessionTaskDelegate)?' outside of main actor-isolated context may introduce data races

今日現在、以下の設定でやっています。


 

🧑🏻‍💻 お天気情報を取得する

無料で公開されている WEB API を使います。

シンプルに取得する。


import SwiftUI

struct TestWeatherView: View {
  private let url = URL(string: "https://wttr.in/?format=3")!

  var body: some View {
    Text(try! String(contentsOf: url))
  }
}

#Preview {
  TestWeatherView()
}

ちょっと窮屈なので砕いていきます。


struct TestWeatherView: View {
  @State private var text = ""
  private let url = URL(string: "https://wttr.in/?format=3")!

  var body: some View {
    Text(text)
      .onAppear {
        text = try! String(contentsOf: url)
      }
  }
}

OK です。

次は、Web クライアントを汎用性のある URLSession に変えます。


struct TestWeatherView: View {
  @State private var text = ""
  private let url = URL(string: "https://wttr.in/?format=3")!

  var body: some View {
    Text(text)
      .task {
        let (data, _) = try! await URLSession.shared.data(from: url)
        text = String(data: data, encoding: .utf8)!
      }
  }
}

ここで、警告がでます。

Passing argument of non-sendable type '(any URLSessionTaskDelegate)?' outside of main actor-isolated context may introduce data races

これは、なんですか。

 

🤔 Passing argument of non-sendable type '(any URLSessionTaskDelegate)?' outside of main actor-isolated context may introduce data races

URLSession のドキュメントを見ておきます。


func data(from url: URL) async throws -> (Data, URLResponse)

👉 data(from:) | Apple Developer Documentation hatena-bookmark

Task 内の以下の部分


let (data, _) = try! await URLSession.shared.data(from: url)

左辺はメインスレッド、

--- 境界 ---

右辺はバックグラウンドスレッド

👉 【Swift】concurrency をマスターするための一つのきっかけ hatena-bookmark

ということで、

いわゆる「アクター境界」を越えているので、

data() の返り値は Sendable でなければなりません。

リファレンスやコードを追いかけてみると、

Data, URLResponse 共に Sendable に準拠しています。

👉 Data | Apple Developer Documentation hatena-bookmark
👉 URLResponse | Apple Developer Documentation hatena-bookmark

あ、Tuple かな ?

などと思いましたがなんか違う。

👉 Pitch: User-defined tuple conformances - Evolution / Pitches - Swift Forums hatena-bookmark

 

🧑🏻‍💻 Actor を使う

Actor は Sendable に準拠しています。


なので、これでバックグラウンドの通信部分をラップします。


actor WeatherA {

  // OK
  static func getData(url: URL) async -> (Data, URLResponse) {
    try! await URLSession.shared.data(from: url)
  }

  // OK
  nonisolated func getData(url: URL) async -> (Data, URLResponse) {
    try! await URLSession.shared.data(from: url)
  }
}

これで、無警告でOKとなりました。

 

🧑🏻‍💻 extension 化してメインスレッドを避ける

こんな方法でもいけます。


extension URLSession {
  func dataEx(url: URL) async -> (Data, URLResponse) {
    try! await data(from: url)
  }
}

 

🧑🏻‍💻 まとめ

分かれば、なるほど感あるけど、分からなければ全く謎で時間だけ食うので、

そんな誰かと自分用のメモとして。

class でも警告なしでいけるようです。



「Actor はデータの非同期操作のために作られてる」感じがする。

外野から使ってみた雰囲気だけだけれども。

 

🧑🏻‍💻 参考