ふれっしゅのーと

ふれっしゅのーと

趣味に生きる30代エンジニアが心に移りゆくよしなし事をそこはかとなく書きつくるブログ

過去時点のコミットをでっちあげて10年分のGoogleマイマップの編集履歴をGitHubに移行するまでの軌跡

やったこと

Before:手動履歴管理

Googleマイマップから出力したKMLファイルをひたすらフォルダに溜めていました。ファイル名に日付を書く伝統的な履歴管理スタイルです。


エンジニアの端くれですがプライベートではこのざま

After:GitHubでのバージョン管理

GitHubでのバージョン管理に移行して、作業記録(コミットメッセージ)も付けました。


ドヤァ

過去時点のコミットをでっちあげる特殊な操作を行っているので、本記事では特にそのあたりの時間偽装テクニックを紹介しようと思います。

GitHubに移行するまでの軌跡

混沌

Googleマイマップを使って趣味で小字地図を作っているのですが、あいにくGoogleマイマップにはバックアップ機能がありません。そこでとりあえずファイルをエクスポートしてフォルダに保存していました。

冒頭で「ファイル名に日付を書く伝統的な履歴管理スタイル」だったと書きましたが、実は本当の最初はこんな感じでした……


ごみ箱ですか?いいえ、バックアップです。

つらい。

ファイル形式がバラバラ。.csv.kmzとかいうのもあって最悪です。これをあれやこれやして全部.kmlに揃えました。

.kmzから.kmlへの変換

KMZファイルはKMLファイルのZIP圧縮なので、拡張子を.zipに変更すると普通に展開でき、KMLファイルを取り出せます。

.csvから.kmlへの変換

小字地図作成の黎明期に Google Fusion Tables(現在は廃止)経由でダウンロードしたファイルがCSV形式になってました。

構造化データから非構造化データへの変換は流石に人力では無理なので、Pythonで適当なスクリプトを組んでマッピングしました。

過去時点のコミットをでっちあげる

バックアップファイルの形式を揃え終わったので、いよいよgitでコミットしていきます。

git環境構築やGitHubリポジトリ作成については本記事では触れませんので、そのあたりの解説は「GitHub 最初」とかでググってください。Macでのgit環境構築については過去記事でも軽く触れてます。

(以下、リポジトリ作成済みの状態とします)

一番古いバックアップファイルをローカルリポジトリに配置して、ファイル名をkusatsu-city-koaza-map.kml にリネームします。

そして普通にgit addします。

git add kusatsu-city-koaza-map.kml

次が重要です。過去時点でコミットしたことにするために、git commit--dateオプションを付けて日時指定でコミットします。

git commit --date="Feb 25 01:08:00 2012 +0900"

これでgit logを確認すると

% git log
commit ee276ac... (HEAD -> master)
Author: fffw2
Date:   Sat Feb 25 01:08:00 2012 +0900
    野村・上笠・平井の一部の小字を追加

…と、コミット時に指定した日時が「Date」に表示されていて「うまくいった」と安心してしまうのですが、これは巧妙なトラップです!!

このままGitHubにプッシュしても残念ながら指定した日時では表示されません。

実はgitのコミットには2種類の日時が存在しています。

  • AuthorDate:
    • git commit --dateで指定できるのはこっち
    • git logで表示されるのはこっち
  • CommitDate:
    • GitHubで使われるのはこっち

git log --pretty=fullerで CommitDate を見てみましょう。

% git log --pretty=fuller
commit ee276ac... (HEAD -> master)
Author:     fffw2 
AuthorDate: Sat Feb 25 01:08:00 2012 +0900
Commit:     fffw2 
CommitDate: Mon Oct 10 18:30:20 2022 +0900
    野村・上笠・平井の一部の小字を追加

AuthorDateは10年前の日付(git commit --dateで指定した日付)ですが、CommitDateは現在の日付になってしまってます。GitHubで使われるのはCommitDateのほうなのでこちらも改変しなくてはいけません。

2種類の日付の齟齬を解消するには

git rebase HEAD~ --committer-date-is-author-date

を実行すればOKです。(ここのオプションはcommit-dateではなくcommitter-dateです)

% git log --pretty=fuller
commit ee276ac... (HEAD -> master)
Author:     fffw2 
AuthorDate: Sat Feb 25 01:08:00 2012 +0900
Commit:     fffw2 
CommitDate: Sat Feb 25 01:08:00 2012 +0900
    野村・上笠・平井の一部の小字を追加

CommitDate=AuthorDate に書き換わりました。

あとは通常通り git push origin master でリモートにプッシュすれば、GitHubに10年前のコミットが出現します。

他の日付のバックアップファイルについても同様の作業を繰り返しましょう。最終的にこんな感じになります。

ちゃんと過去に草も生えます。

歴史改変コマンドまとめ

% git add kusatsu-city-koaza-map.kml
% git commit --date="Feb 25 01:08:00 2012 +0900"
% git rebase HEAD~ --committer-date-is-author-date
% git log --pretty=fuller
% git push origin master

git log は確認用コマンドなので慣れたら省略しても大丈夫です。

KMLファイルの差分の可視化

過去時点のコミットメッセージを書くためには当時の作業内容を思い出さなくてはなりません。当時の進捗報告ツイートの発掘の他、KMLファイルの差分比較を実施しました。

  1. Visual Studio Code の標準機能でKMLを差分比較
  2. 各差分箇所の<styleUrl>を書き換えて色を変える
  3. VSCode Map Preview プラグインでプレビュー表示

という流れで、作業前後の変更箇所を可視化できます。


KMLファイルの差分は地図上で見るとわかりやすい

おわりに

Googleマイマップの編集履歴GitHubでバージョン管理しました。

プロジェクト開始当初からバージョン管理していなくても、今回の方法を使えば「そろそろバージョン管理しようかな」と思ったタイミングでGitHubに移行できます。

「あの日は何をしたっけな〜」と頭を捻っていたら、サボり続けた夏休みの宿題の日記をあとから全部書いたときの記憶が蘇りました。大人になっても変わらないものですね。

参考サイト

「登記情報提供サービス」と「登記・供託オンライン申請システム」がややこしすぎる

大臣も混乱するややこしさ

趣味の小字地名の調査によく「登記・供託オンライン申請システム」を使っているのですが、これとそっくりな「登記情報提供サービス」というWebサービスもあり、名称だけでなく内容までも中途半端に似ているので混乱が絶えません。

本業で使っている士業の方々は勿論、河野太郎大臣までも間違えていました。

※ 2022年10月に利用時間が拡大するのは法務省の「登記・供託オンライン申請システム」ではなく民事法務協会の「登記情報提供サービス」のほうです

2つのWebサービスの違い

一言で言うと……

です。

それぞれ運営元も利用時間も違いますが、内部的には同じデータベース(登記情報システム)にアクセスしています。


法務省作成資料『登記情報システムの業務アプリケーション保守業務及び支出先法人の概要』(2014-03-12) の「登記情報システムについて」より引用。「登記ゲートウェイシステム」(オンライン登記情報検索サービス)は2016年に「登記・供託オンライン申請システム」に統合されています*1

「登記情報提供サービス」の概要

登記簿謄本などの記載情報のPDFをダウンロードできます。証明能力はないですが、少し安いのがメリット。土日も使えます。

「登記・供託オンライン申請システム」の概要

登記や供託に関する様々な申請を行える汎用的なシステムです。登記情報の取得に関して言えば、「かんたん証明書請求」から正式な登記簿謄本の郵送(または窓口で交付)請求ができます。「登記情報提供サービス」のようなブラウザ上で即時表示する機能はありません。

登記情報検索画面の仕様差

両システムで特に似ているのが登記情報を検索する画面です。

  • 「登記情報提供サービス」の検索画面

  • 「登記・供託オンライン申請システム」の検索画面

似すぎ。

しかも、完全に同じならまだ良いのですが、困ったことにそれぞれ微妙に仕様が異なっているから厄介です。

小字の仕様差

上記スクショの「所在」欄を見比べてみてください。

同じ地番ですが前者の「登記情報提供サービス」と違って後者の「登記・供託オンライン申請システム」は小字まで選択できます!


小字愛好家にはたまらない一覧画面(登記・供託オンライン申請システム)

ちなみに「登記・供託オンライン申請システム」で小字まで入力しても、確定ボタンを押して申請画面に遷移すると、小字の情報は遷移先画面に渡っていません。実務上は小字がなくても地番だけで土地を特定できるからでしょう。*4


申請画面には小字が表示されない(登記・供託オンライン申請システム)

実務上は小字はあってもなくてもよいものなので、システムの仕様変更で、ある日突然小字一覧がなくなってしまわないか心配です。

地番の仕様差

「登記情報提供サービス」のほうにだけ地番検索サービスとの連携機能があり、ゼンリン地図をベースにした地番図を参照できます(一部地域に限る)


「登記情報提供サービス」のほうでだけ使える地番検索サービス

また、地番の複数入力件数も両システムで異なっていて、「登記情報提供サービス」は最大50件ですが、「登記・供託オンライン申請システム」は最大10件です。

何故こんなややこしいことになったのか

そもそもどうしてこんなによく似たWebサービスが共存しているのでしょうか。

電子政府黎明期の混乱

── 時は20世紀末まで遡ります

当時のサラリーマン川柳に「ドットコム どこが混むのと 聞く上司」と読まれたように、この頃、一般消費者にもインターネットが急速に普及しました。

政府も1999年に「電子政府」プロジェクトを立ち上げ、2000年には高度情報通信ネットワーク社会形成基本法(IT基本法)を制定し、"紙"から"インターネット"へと変革を推進しました。

法務省も登記のオンライン化に向けて動き出します。幸い膨大な登記情報自体は昭和63年以来の地道な移行作業により既におおかたシステム化が進んでいた *5 ので、あとは関連法を整備して、一般ユーザー向けのWebアプリケーションを構築すればよいというところまで来ていました。

まず手始めに登記情報の閲覧用システムの構築が進められます。2000年に「電気通信回線による登記情報の提供に関する法律」が成立し、サービス提供を行う指定法人に民事法務協会が選ばれ、「登記情報提供サービス」がリリースされました。


開設当初の「登記情報提供サービス」(WebArchiveより)

法務省ではなく民事法務協会が運営しているのは、なんというか、まあ…… 大人の事情によるものらしいです。

クレジットカード決済による簡便な手数料納付が当時の会計法規では認められていなかった *6 ので指定法人(民事法務協会)が仲介する仕組みにした、というのが「表向きの理由」のようです。

法律施行前に指定法人が実質決まっていたとか、予算が割高だとか、天下り先になっているとか、何やらいろいろ訳ありのようですので、そういった話に興味のある方は「民事法務協会とコンピューター化の歴史」(長大記事です!)や「新登記情報提供サービスの問題」を読んでみてください。

検索画面の流用

「登記情報提供サービス」開設の3年後、満を持して「法務省オンライン申請システム」(2003年〜2012年)が稼働しました。様々な申請をオンラインで行えるようにした汎用システムです。運営は民事法務協会ではなく法務省です。*7

登記関係のオンライン申請を行えるようにするために、不動産登記法の全面改正も行われました。*8


法務省オンライン申請システム(WebArchiveより)

法務省オンライン申請システムの申請用総合ソフトから「物件情報取得」を選ぶと、ブラウザが立ち上がり「登記情報提供サービス」と瓜二つなWebサイト(登記ゲートウェイサブシステム)に遷移します。


法務省登記・供託オンライン申請システムの概要と変更点」p.40 より引用。2011年のシステム改修までは ブラウザ上で物件検索→ファイルをダウンロード→申請用総合ソフトで読み込む という、まどろっこしい手順が取られていたようです。

当時の画面を見比べてみると、都道府県選択から丁目・小字選択に至るまで、どの画面を取ってみても「登記情報提供サービス」と「登記ゲートウェイサブシステム」で瓜二つです。

おそらく「法務省オンライン申請システム」を構築する際に、オンライン物件検索に関するコンポーネント(=登記ゲートウェイサブシステム)だけ既存の「登記情報提供サービス」のUIを流用したのでしょう。

その後、2011年のシステム改修で「法務省オンライン申請システム」から登記・供託に関する申請手続きが独立して、「登記・供託オンライン申請システム」というシステム名になり、現在に至ります。

システム名もあまり良くない

法務省の「登記・供託オンライン申請システム」には

  1. 専用ソフトを使う登記・供託申請
  2. Webブラウザ上での証明書請求(登記簿の郵送請求など)

の2つの機能があります。「登記・供託オンライン申請システム」というシステム名からイメージできるのは1.の機能だけで、2.の機能はイメージできません。

システム名だけに着目すると、むしろ2.の機能は「登記情報提供サービス」にあるほうが自然なのではないでしょうか。

まとめ

あらためて歴史的経緯を図にまとめておきます。

「登記・供託オンライン申請システム」にPDF出力機能を追加して「登記情報提供サービス」を廃止したり、「登記・供託オンライン申請システム」のうち登記簿請求に関する機能を「登記情報提供サービス」のほうに移管して名が体をあらわすようにしたりすれば、ややこしさが解消すると思います。

デジタル庁さん、よろしくお願いします。*9


*1:「現行のオンライン登記情報検索サービスを提供している登記ゲートウェイシステムは,登記・供託オンライン申請システムと統合し,平成28年12月19日(月)から統合後の登記・供託オンライン申請システムの機能の1つとしてサービスの提供を開始する予定です。」(「システム統合に伴うオンライン登記情報検索サービスの変更点について」より)

*2:「昨年9月25日から、東京法務局のほか管区法務局管内の26庁の登記所を対象にインターネットによる登記情報のサービスを開始」(『新風』2001年3月号特集「電子自治体構築への歩み ネットワーク時代の"サービス"を考える」(民事法務協会松尾武理事のインタビュー記事) より)

*3:「登記・供託オンライン申請システムは,平成23年2月14日から,法務省オンライン申請システムとは別のシステムとして運用を開始しました。」(「登記・供託オンライン申請システムとは」より)

*4:さらに細かいことを言うと、字別付番の地域では小字がないと地番だけで土地を特定できないので、「登記情報提供サービス」でも「登記・供託オンライン申請システム」でも小字まで選択できます。字別付番と一村通しについては下記の記事を参照。fffw2.hateblo.jp

*5:東京法務局板橋出張所で1988年(昭和63年)に登記のコンピュータ化が始まったのを皮切りに、各登記所で登記簿の移行作業が順次行われ、二十余年の時を経て、2008年(平成20年)に約2億7千万筆の不動産と約350万社の法人の登記簿の移行が完了しました。(参考:法務省民事局総務課登記情報センター室の人事院総裁賞(平成21年度)受賞記事(人事院)不動産登記コンピュータ化指定日一覧(個人作成)

*6:確かに2000年当時はクレジットカード決済による手数料納付は認められていなかった。「行政手続等における情報通信の技術の利用に関する法律の施行に伴う関係法律の整備等に関する法律」成立によって、「登録免許税法」が改正されて、クレジットカード決済による手数料納付が認められるようになったのは2002年のこと。現在は法務省が運営する「登記・供託オンライン申請システム」でもクレジットカード決済が使える。

*7:2002年の法改正で手数料のクレジットカード決済が認められたので、2003年時点では民事法務協会に委託する「表向きの理由」もなくなっていたのでしょう。

*8:「オンライン登記申請を導入するとともに,不動産登記制度をIT社会にふさわしい制度とするため,不動産登記法を全面的に改正する法案が,平成16年(2004年)6月11日に法律第123号として成立し,この法律は,平成17年3月施行予定である」(「登記情報システム 業務・システム見直し方針(案)」(2004) より

*9:形はいびつですが既にデジタル化が完了していて、慣れれば問題なく使えるので、デジタル庁が法務省のシステムにメスを入れるのは随分あとになるでしょうね。

GASでAPIを叩いてPocketの未読数をGoogleスプレッドシートに連携する

あとで読みたいWebサイトの管理に「Pocket」を愛用してます。かれこれ8年目。

ついつい「あとで読む」を溜めすぎてしまうので、どれぐらいのペースで「あとで読む」を消化できているか可視化するために、以前、下記の記事を書きました。

fffw2.hateblo.jp

1年半ぐらい問題なく動作していたのですが、突然2022年8月10日から未読数を取得できなくなってしまいました。自分でAPIを叩くのが面倒で第三者のサービスに依存していたのですが、こういうときに手も足も出なくなってしまうのが弱いところ。

やむを得ませんね。自分でAPIを叩いてみますか(重い腰を上げる)

Pocket APIを叩いて未読数を取得するまでの道のり

開発者用ページでアプリケーションを作成

https://getpocket.com/developer/ にログインして「Create a New App」からアプリケーションを作成します。作成後に「CONSUMER KEY」(コンシューマーキー)が表示されるのでメモしておきましょう。

<作成例>

curlでアクセストークンを取得

アクセストークンを取得するまでがちょっと大変でしたが、下記の記事を参考にしたらうまくいきました。

ikeyu0806.hatenablog.com

自分の環境で実行したコマンドを載せておきます。…といっても参考記事とほぼ同じ内容です。ローカルサーバーをpythonで起動してる点が違うぐらい。

# リクエストトークン取得
curl -X POST -H "Content-Type: application/json" -H "X-Accept: application/json" -d '{"consumer_key":"{コンシューマーキー}", "redirect_uri":"http://localhost:8080"}' https://getpocket.com/v3/oauth/request

# リダイレクト先のローカルサーバーを起動
python -m http.server 8080

# 認可
open -a '/Applications/Google Chrome.app' https://getpocket.com/auth/authorize?request_token={リクエストトークン}&redirect_uri=http://localhost:8080

# アクセストークン取得
curl -X POST -H "Content-Type: application/json" -H "X-Accept: application/json" -d '{"consumer_key":"{コンシューマーキー}", "code":"{リクエストトークン}"}' https://getpocket.com/v3/oauth/authorize

<認可時の画面>

APIテスト

正常にアクセストークンを発行できていれば、下記コマンドで未読記事リストをJSON形式で取得できます。(膨大なのでhead -n 100で先頭100行のみ表示してます)

curl -X POST -H "Content-Type: application/json" -H "X-Accept: application/json" -d '{"consumer_key":"{コンシューマーキー}", "access_token":"{アクセストークン}"}' https://getpocket.com/v3/get | jq | head -n 100

jq がないよ!って怒られたら brew install jq してください。

Google Apps Script(GAS) でAPIを叩く

Googleスプレッドシートを開き、A1セルに「date」、B1セルに「count」と入力します。そして 拡張機能>Apps Script から Google Apps Script(GAS) のエディターを起動して、下記のソースコードをコピペしてください。日時と未読数を取得して、Googleスプレッドシートの最終行の次の行に書き込むスクリプトです。

function countPocketUnreadArticles() {
  var date = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss');
  var count = countItems();

  Logger.log(date + ' ' + count);

  var spreadsheet = SpreadsheetApp.openById('{GoogleスプレッドシートのID}');
  var sheet = spreadsheet.getSheetByName('シート1');
  var lastrow = sheet.getLastRow();
  var recordrow = lastrow + 1;
  sheet.getRange("A" + recordrow).setValue(date);
  sheet.getRange("B" + recordrow).setValue(count);
}

function countItems() {
  const url = "https://getpocket.com/v3/get";
  const consumer_key = "{コンシューマーキー}";
  const access_token = "{アクセストークン}";
  const data = {
    "consumer_key":consumer_key,
    "access_token":access_token
  };
  const options = {
    "method" : "POST",
    "contentType" : "application/json",
    "payload" : JSON.stringify(data)
  };
  const response = UrlFetchApp.fetch(url, options);
  const pocketItems = JSON.parse(response).list;
  const itemIds = Object.keys(pocketItems);
  return itemIds.length;
}
  • {コンシューマーキー}{アクセストークン}には先述のAPIテストで使った値を入力してください。
  • {GoogleスプレッドシートのID}には、GoogleスプレッドシートのURLのhttps://docs.google.com/spreadsheets/d/の後ろの文字列を入力してください。

試しに「実行」ボタンを押してみて、うまくGoogleスプレッドシートに書き込まれたら成功です。

仕上げに、自動実行されるようにトリガーを設定しておきましょう。これで完成です!

<トリガーの設定例>

完成

最終的にはGoogleスプレッドシートにこんな感じで「あとで読む」の未読数が時系列順に蓄積されていきます。グラフは後付けでGoogleスプレッドシートの標準機能を使って描画しました。

これで再び「あとで読む」がどれだけ残っているか視覚的に把握できるようになりました。あとはひたすら「あとで読む」を消化するだけですね……(遠い目)

大津城縄張推定復元図片手に幻の大津城を歩く

塞王の楯』を読んだ勢いで、Googleマイマップで「大津城縄張推定復元図」を作りました。大津城跡の散策のお供にどうぞ。

大津城縄張推定復元図(Googleマイマップ)

『図説 大津の歴史(上)』(大津市歴史博物館市史編纂会, 1999)の大津城縄張推定復元図をベースに、後述の関連資料を参考にして橋や天守を補筆して作成。

  • 内側から順に「奥二の丸」「二の丸」「三の丸(浜町口側は香集丸)」
  • 琵琶湖に突き出しているのが左から順に「伊予丸」「本丸」
  • 入口は「尾花川口」「三井寺口」「浜町口」の3箇所
  • 外堀の南半分の空堀部分は茶色で図示。ここは琵琶湖より標高が高いので水が入らない。(たとえサイフォンの原理で導水しようとしても物理学的に無理)

大津城とは

現地の説明板より大津市観光振興課の文章を引用しておきます。

 戦国時代の終わり、豊臣秀吉坂本城を廃し、この付近一帯に大津城を築きました。築城年代は天正14(1586)年頃とされ、初代城主は坂本城主であった浅野長吉(長政)、その後、増田長盛、新庄直頼を経て、文禄4(1595)年に京極高次が就任しています。
 高次の妻は浅井三姉妹の次女「お初」でしたが、慶長5(1600)年の天下分け目の関ヶ原の合戦においては、東軍についたため、西軍の大軍が大津城に押し寄せ、奮闘の末、関ヶ原の合戦の当日、開城しています。高次は西軍の大軍を引き付け、結果として関ヶ原の勝敗を大きく左右したとしてその後、加増のうえ小浜藩主に転封しています。
 大津城は合戦の翌年に廃城。徳川家康は、新たに膳所の地に天下普請第1号として膳所城を築いています。なお、大津城の天守は、落城しなかったという縁起をかついで彦根城に移されています。

大津城跡散策

本丸跡

本丸の場所はびわ湖浜大津駅前でアクセスもよいので、目立つ場所に「大津城跡」と刻まれた石碑が立っています。


大津城跡


大津城縄張推定復元図(元ネタ)


本丸から二の丸を望む

外堀の石垣遺構(?)

大津祭曳山展示館(中央1丁目)の隣の駐車場に外堀の遺構だと言われる石垣が残っています。


駐車場の奥に一部だけ残るいかにもな石垣


穴太衆積み?……には見えないが……


縄張推定復元図と照らし合わせると外堀の端ではなく中央に位置している……

大津城の復元石垣

京都信用金庫大津支店(浜大津1丁目)の前に大津城の石垣が復元されています。

ちなみにこのあたりの旧地名は「坂本町」といい、豊臣秀吉坂本城を廃して大津城を築いた際に、坂本城の城下町の人々が移住したことに由来します。

おわりに

大津城は戦国時代の近江を代表する湖城でしたが、廃城時期が早く、現地に遺構がほとんど残っていないこともあり、知名度自体もそんなに高くありません。

しかし、現地調査ではわかりづらくても地図で見ると見えてくるものもあります。大津城の縄張図を現在の地図と重ねてじっくり観察してみると、堀の外郭が現在の道路・宅地・溝渠などの土地区画と一致している箇所がちらほら見つかり、わずかですが往時の大津城の威容が目に浮かんできます。

今昔比較から得られるこの感動をより多くの人々に味わっていただけるように、今回大津城縄張推定復元図をGoogleマイマップで公開しました。ぜひ地図を眺めて戦国の風を感じてみてください。

参考資料

湾曲した資料の写真を ScanTailor で真っ直ぐにする

概要

スマホやデジカメで分厚い資料の写真を撮ると、どうしてもページの見開きのノド部分が湾曲してしまいますよね。ScanTailor というソフトを使えば、湾曲した資料の写真を簡単に真っ直ぐに補正できます。

経緯

スマホの高画質化が進み、スキャナーアプリでいつでも手軽に資料をスキャンできる時代になりました。

ほとんどのスキャナーアプリには台形補正(射影変換)機能が備わっていて、斜めに撮影した画像を正面から撮影した画像に変換できます。しかし、紙が膨らんでぐねっと湾曲している画像を真っ直ぐに補正する機能はなかなかありません。

パソコンを使えばなんとかなるのではないかと、まずは画像編集ソフト GIMP の「ケージ変形」や「interactive warp filter」プラグインあたりを使って試行錯誤してみたのですが、たくさんのマーカーを手動で微調整しなくてはならず骨が折れました。しかも、手間が掛かる割には期待したクオリティーにならず、とても残念な感じ。

そこで何か良いソフトはないものかと海外サイトであれこれ調べていたら Best way to flatten a curled photographed book photograph? - Graphic Design Stack Exchange

「ScanTailor の湾曲補正が最高すぎる!」

といった記述を発見(訳は適当です)。試してみたところ確かに最高でした。

ScanTailor

インストール方法

Windows の場合

https://github.com/scantailor/scantailor/releases/tag/RELEASE_0_9_11_1 から exe ファイルをダウンロードするだけ。

Mac の場合

本家では Mac 用のバイナリファイルが配布されてないので、派生版の scantailor-advanced-osx を使います。事前に homebrew をインストールした上で、下記のコマンドを実行すれば OK です。

git clone "https://github.com/yb85/scantailor-advanced-osx.git"
cd ./scantailor-advanced-osx
brew install --formula ./scantailor.rb
scantailor

操作方法

YouTube に素晴らしい解説動画がありました。これを見れば大体わかります。

自炊スキャン画像の後処理に使うScanTailor(フリー)の使い方 - YouTube

解説動画が削除された場合に備えて、一応簡単に説明しておきます。

  1. Fix Orientation(向き修正)
    回転ボタンを押して向きを修正します。

  2. Split Pages(ページ分割)
    自動でページが分割されます。正しくない場合は手動で境界を修正してください。

  3. Deskew(傾き除去)
    自動で傾きが除去されます。正しくない場合は縦のラインが真っ直ぐになるように調整してください。

  4. Select Content(版面選択)
    文字や画像があるエリアを選択してください。

  5. Margins(余白)
    デフォルトのままで OK です。

  6. Output(出力)→ Dewarping(湾曲除去)
    Mode で「Color/Grayscale」を選び、Options のチェックをすべて外しておきます。 右側の下から 2 番目にある「Dewarping」タブを押すと、青い格子が表示されるので、この格子を湾曲に合わせてください。四隅のマーカーの他に、上辺と下辺の任意の場所にマーカーを追加できます。あまりマーカーを追加しすぎると調整が大変なので、必要最小限の数に留めておきましょう。

  7. 完成
    青い格子の位置が決まったら再び「Output」タブを押してください。 補正後の画像が表示されます。このとき裏で出力フォルダに補正後の画像が保存されています。(特に出力ボタンはありません)

M1 MacBook Air を快適に使うための初期設定メモ

my new gear...

MacBook Air (Apple M1 Chip / 13inch / 8GB RAM / 256GB SSD / Silver) を買いました。

8年間 MacBook Air (Early 2014) を愛用してきたのですが、メモリ不足&バッテリー寿命で生産性低下を顕著に感じ始めたので、思い切って買い替えました。今は快適です。

初期設定メモ

基本方針

  • Mac からゴミを持ち込みたくないので自動移行機能は使わない
  • Mac でイチから環境構築して、必要なファイルだけ旧 Mac からコピーしてくる。

初回起動

  • 指示に従ってぽちぽち進めていくだけ。ややこしそうな設定は保留してもOK。
  • FireVault ディスク暗号化は迷ったが「有効にしない」にした
    • 万一のデータサルベージ時に詰みそうなので……

Mac の設定

  • ディスプレイ:解像度はとりあえずデフォルト (1440x900) のまま
  • Dock:不要なアプリを削除、サイズを小さくする、自動的に非表示
  • Finder
    • サイドバーにホームディレクトリを追加
    • パスバーを表示
  • トラックパッド
    • 「アプリケーションExpose(3本指で下にスワイプ)」を有効化
  • Mission Control
    • 「ウインドウをアプリケーションごとにグループ化」を有効化
    • ホットコーナーで左下に「ディスプレイをスリープさせる」を設定
  • スクリーンセーバー
    • 語彙力が上がるので「今日の一言」一択。美しい日本語が流れてくる。
  • Dock とメニューバー
    • バッテリー:「割合(%)を表示」
    • 時計:「秒を表示」
  • スクリーンショットの保存先変更(ターミナルで実行)

      mkdir ~/Desktop/ScreenShots
      defaults write com.apple.screencapture location ~/Desktop/ScreenShots
      killall SystemUIServer
    

ブラウザ

  • Microsoft Edge
    • 垂直タブが便利なのでメインブラウザは Chrome ではなく Edge を使っている
    • Microsoft アカウントでログインしたら旧 Mac の設定が自動同期される
    • Mac の システム環境設定>一般 で「デフォルトのブラウザ」を Edge に変更
    • 「アドレス バーで使用する検索エンジン」を Google に変更
    • 「URL のコピー & ペーストの形式の規定値」を プレーンテキスト に変更
    • ダウンロードのたびに右上にダウンロードファイル一覧がいちいち表示されると邪魔なので、設定画面で「ダウンロードの開始時にダウンロードメニューを表示」をオフ
    • 拡張機能 CLUT: Cycle Last Used Tabs をインストール
      • タブ移動がやりやすくなる
  • Google Chrome
    • Chrome でしかできないこともある(特に拡張機能)ので一応入れておく
    • Google アカウントでログインしたら旧 Mac の設定が自動同期される

アプリケーション

  • Google 日本語入力
    • キーボードの環境設定
      • キーボード:「F1、F2などのキーを標準のファンクションキーとして使用」を選択
      • ユーザ辞書:余計なお節介はしないでほしいので「英字入力中にスペルを自動変換」「文頭を自動的に大文字にする」「スペースバーを2回押してピリオドを入力」「スマート引用符とスマートダッシュを使用」を選択解除
      • 入力ソース:ひらがな(Google) と ABC 以外を全部削除
    • Google 日本語入力の環境設定
      • キー設定:MS-IME に変更
    • 辞書ツール
      • Mac の辞書ツールでエクスポート → 新 Mac に転送してインポート
  • Visual Studio Code
  • Spectacle
    • 画面分割と最大化のショートカットを非常によく使う
    • Launch Spectacle at login にチェック
  • Clipy
  • あとは必要になったときに必要なアプリを都度入れていく

ターミナル

  • 完成イメージ
  • iTerm2
    • Preferences > Profiles > Window
      • Transparency: 20(背景を透過)
    • Preferences > Profiles > Terminal
      • Unlimited scrollback にチェック(無限にスクロール可能になる)
    • Preferences > Profiles > Colors
    • Preferences > Profiles > Text
      • フォントサイズを 16 にする
  • homebrew
  • zsh
    • brew install zsh-completions
      • コマンドを途中まで入力して Tab キーを押すと候補が出てくる
    • brew install zsh-autosuggestions
      • コマンドを途中まで入力すると履歴に基づいてサジェストしてくれる(右矢印キーで確定)
    • brew install zsh-syntax-highlighting
    • .zshrcsetopt +o nomatch とおまじないを書いておく
    • プロンプトを変更
      • .zshrcPROMPT='%F{cyan}%c%f %# ' と書く
      • カレントディレクトリだけのシンプルな表示になる。色はシアン。
      • おすすめの一例に過ぎないので各自のお好みで
    • タイトルを変更

ファイルのコピー

  • Mac 側作業:システム環境設定>共有>ファイルの共有 を ON にする
  • 移動>サーバーへ接続 で新 Mac から旧 Mac にアクセス
  • 必要なファイルだけ取捨選択して新 Mac にコピーする

周辺機器

追記

Python のインストール(2022-06-10追記)

  • M1 Mac では pyenv で python をインストールできないので miniforge を使うべきといった記事が検索上位に来る。2021年の混乱期はそうだったのかもしれないが、今は M1 Mac でも pyenv で python をインストールできる。
  • 最新のインストール方法は pyenv の README を参考にするのがよい https://github.com/pyenv/pyenv
brew install pyenv
pyenv install --list
pyenv install 3.10.4
pyenv global 3.10.4
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc

スクリーンショットに影を含む設定を無効化(2022-06-12追記)

Command + Shift + 4 → Space で、選択したウインドウのスクリーンショットを撮ることができるが、デフォルトではウインドウの影を含んでしまう。影をスクリーンショットに含みたいことはまずないので、ターミナルで無効化しておく。

defaults write com.apple.screencapture disable-shadow -boolean true
killall SystemUIServer

フォルダのデフォルト設定を変更(2022-09-11追記)

フォルダ内で右クリックして「表示オプションを表示」からファイルの表示順とアイコンサイズの設定を変更できる。「デフォルトとして使用」ボタンで確定すると、すべてのフォルダに対して適用される。

  • アイコンサイズ:大きめが好きなので 128px に変更
  • グリッド間隔:下から2番目(ファイル名が全角27文字まで省略されない)
  • 表示順:「種類」に変更

git の設定(2022-10-09追記)

git 自体は Mac にプリインストールされていました。

% git --version
git version 2.30.1 (Apple Git-130)

グローバル設定にユーザー名とメールアドレスを追加します。これをやっておかないと GitHub にコミットしたときに本名(Macのアカウント名)が出ちゃうので。

% git config --global user.name "fffw2"
% git config --global user.email "[ID+username]@users.noreply.github.com"

「.DS_Store」をグローバル除外設定します。

% mkdir -p ~/.config/git
% echo '.DS_Store' >> ~/.config/git/ignore

以前まではわざわざ ~/.gitignore_global を指定していたのですが、Git 1.7.12 以降はデフォルト値 ~/.config/git/ignore が用意されている(参考:[Git] .gitignoreの仕様詳解 - Qiita)ので、今回はデフォルトの場所にグローバル除外設定を書き込みました。

Microsoft ICE でバラバラの地図画像をつなぎ合わせて巨大地図にする

概要

バラバラの地図画像を……

↓ ↓ ↓

自動合成して巨大地図にします!

経緯

京大総合博物館の「埋もれた古道を探る」展に行き、十年前から見たかった『山城国吉田村古図』を拝むことができました。京大周辺の江戸時代の姿を記録した貴重な地図です。


山城国吉田村古図(京大総合博物館蔵)

ありがたいことに撮影可。これでもかと撮影しまくりました。

しかし巨大な地図なので全体を1枚の写真に収めると、文字が読めません。そこで適当に何枚かに分割して撮影しました。


▲ 全部で18枚撮影しました

これをなんとかしてつなぎ合わせて1枚の画像にしたいです。

Microsoft ICE で自動合成

画像をつなぎ合わせると言っても、写真の傾きや歪みがあるので、そのままペタペタくっつけてもうまくいきません。

傾きや歪みを自動補正して、写真同士の重なり部分(オーバーラップ)を自動検知して、良い感じにくっつけてくれるソフトがあればよいのになあ(欲を言えば無料だと嬉しい)

いくらなんでもそんな都合の良いソフトあるわけ……

 

Microsoft「あるぞ」

www.microsoft.com

Microsoft Image Composite Editor、略して ICE です。

公式ページに行くと

Please note that the Image Composite Editor download is no longer available. This project has been retired.(訳:もうダウンロードできません。このプロジェクトは終了しました。)

と書いてあって、非常に惜しいことに2020年頃から新規ダウンロードできなくなってしまっているのですが、Microsoft Q&A に裏技が載っていました。

How to download Image Composite Editor 2.0 - Microsoft Q&A

The links in Archives work
For example :
ICE-2.0.3-for-64-bit-Windows.msi
ICE-2.0.3-for-32-bit-Windows.msi

WebArchive から過去時点のダウンロードリンクを踏むという裏技です。これで2021年4月現在も Microsoft ICE を使えます。ただしゾンビを墓から暴いて仕事させるようなものなので、何が起きても公式のサポート対象外である点はご留意ください。

さて Microsoft ICE の使い方はとても簡単です。わずか4ステップで見事なパノラマ合成画像が完成します。

1. IMPORT(画像を追加する)

ドラッグ・アンド・ドロップで画像を投入します。特に設定はいじらず、そのまま次に進みます。

2. STITCH(つなぎ合わせる)

1分ぐらい待つと、つなぎ合わせた画像が生成されます。見事な仕上がりに「おぉ!」と声が出ました。

画像の中心位置がずれている場合はマウスで動かせば OK です。

右側の「Projection(投影)」から、円柱投影、メルカトル図法、球面投影、正射投影、透視投影、など様々な投影図法を選択できるので、適切な図法を選択しましょう。(僕はあまり理解できていないので、プレビューを見ながら適当に良さげな投影図法を選択しました)

3. CROP(切り取る)

つなぎ合わせた画像をトリミングします。きれいな長方形にこだわりがなく、端に黒いエリアができても別に構わなければ「No crop(切り取らない)」を選んで次に進めばよいです。

「Auto complete(自動補完)」という機能が非常に面白く、端の黒いエリアを AI が推測して自動で埋めてくれます。風景写真とかだとこれを使ってもよいのですが、地図でこれを使うと架空の家や道路が描かれてしまうのでやめておくのが無難です。

4. EXPORT(出力する)

最後に「Export to disk...(ディスクに出力)」を押して、ファイルに保存したら作業完了です。

今回は古地図の合成に使いましたが、風景写真や連続写真の合成にも使える(むしろこっちがメイン)ので、ぜひいろいろ遊んでみてください。