Amazon Location Service のジオコーダを試してみた

はじめに

Amazon Location Service が6月に一般公開されました。
主な機能として以下の5つがあります。

  • 地図
  • ジオコーディング(住所や場所の名前を緯度経度に変換する)やリバースジオコーディング(緯度経度を住所に変換する)
  • 出発地から目的地までのルート計算
  • 位置情報デバイスのトラッキング
  • ジオフェンシング(設定した領域への出入りを検出する)

このうちのジオコーディングを試してみました。

ジオコーディングを AWS CLI から利用する

今回は AWS CLI からジオコーダを呼び出します。Location Service は新しいサービスなので、aws コマンドがインストール済みの場合は aws help で Location がサポートされているバージョンかどうかを確認し、サポートされていない場合は最新版にアップデートしておきます。

Place Index 作成

Place Index はジオコーダやリバースジオコーダを利用する際に必要となるリソースです。いくつかの設定項目を指定して Place Index を作成しておき、その Place Index を起点にジオコーダを呼び出す仕組みになっています。

以下のコマンドで、データソースとして Esri、料金プランとしてリクエスト数ベースを利用する Place Index を ExamplePlaceIndex という名前で呼び出せるようになります。

$ aws location \
>   create-place-index \
>   --data-source "Esri" \
>   --description "for investigation Esri" \
>   --index-name "ExamplePlaceIndex" \
>   --pricing-plan "RequestBasedUsage"

{
    "CreateTime": "2021-06-12T13:46:09.170000+00:00",
    "IndexArn": "arn:aws:geo:us-west-2:495463288701:place-index/ExamplePlaceIndex",
    "IndexName": "ExamplePlaceIndex"
}

Place Index 確認

以下のコマンドで、作成した Place Index の内容を確認できます。

$ aws location list-place-indexes
{
    "Entries": [
        {
            "CreateTime": "2021-06-12T13:46:09.170000+00:00",
            "DataSource": "Esri",
            "Description": "for investigation Esri",
            "IndexName": "ExamplePlaceIndex",
            "PricingPlan": "RequestBasedUsage",
            "UpdateTime": "2021-06-12T13:46:09.170000+00:00"
        }
    ]
}

ジオコーディング

ジオコーダを利用するときは search-place-index-for-text というサブコマンドを使います。

$ aws location search-place-index-for-text \
--index-name ExamplePlaceIndex \
--text "大阪市中央区" \
--max-results 5
{
    "Results": [
        {
            "Place": {
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        135.50988413000005,
                        34.681143990000066
                    ]
                },
                "Label": "大阪府大阪市中央区",
                "Municipality": "中央区",
                "Region": "大阪府"
            }
        }
    ],
    "Summary": {
        "DataSource": "Esri",
        "MaxResults": 10,
        "ResultBBox": [
            135.50988413000005,
            34.681143990000066,
            135.50988413000005,
            34.681143990000066
        ],
        "Text": "大阪市中央区"
    }
}

「大阪市中央区」の緯度経度が(34.681143990000066,135.50988413000005)であるという応答です。この座標を OpenStreetMap で表示すると、確かに大阪市中央区役所であることが確認できます。
https://www.openstreetmap.org/#map=19/34.681143990000066/135.50988413000005/

データソースとして HERE を使う Place Index 作成

Amazon Location Service ではデータソースとして EsriHERE が利用できます。ここではデータソースとして HERE を指定して、Esri のときとどのような違いがあるかを調べてみます。

$ aws location \
  create-place-index \
  --data-source "Here" \
  --description "for investigation HERE" \
  --index-name "ExamplePlaceIndexHERE" \
  --pricing-plan "RequestBasedUsage"
$ aws location list-place-indexes
{
    "Entries": [
        {
            "CreateTime": "2021-06-12T13:46:09.170000+00:00",
            "DataSource": "Esri",
            "Description": "for investigation Esri",
            "IndexName": "ExamplePlaceIndex",
            "PricingPlan": "RequestBasedUsage",
            "UpdateTime": "2021-06-12T13:46:09.170000+00:00"
        },
        {
            "CreateTime": "2021-06-12T14:12:51.610000+00:00",
            "DataSource": "Here",
            "Description": "for investigation HERE",
            "IndexName": "ExamplePlaceIndexHERE",
            "PricingPlan": "RequestBasedUsage",
            "UpdateTime": "2021-06-12T14:12:51.610000+00:00"
        }
    ]
}

HERE でジオコーディング

Esri のときと同じく「大阪市中央区」でジオコーディングします。

$ aws location search-place-index-for-text \
--index-name ExamplePlaceIndexHERE \
--text "大阪市中央区" \
--max-results 5 
{
    "Results": [
        {
            "Place": {
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        135.50988,
                        34.68114
                    ]
                },
                "Label": "大阪府大阪市中央区",
                "Municipality": "大阪市",
                "Neighborhood": "中央区",
                "Region": "大阪府"
            }
        },
        {
            "Place": {
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        135.5014,
                        34.66891
                    ]
                },
                "Label": "大阪府大阪市中央区道頓堀1丁目6ミナミ (難波)",
                "Municipality": "大阪市",
                "Neighborhood": "中央区",
                "Region": "大阪府"
            }
        },
        {
            "Place": {
                "AddressNumber": "27",
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        135.50398,
                        34.69353
                    ]
                },
                "Label": "大阪府大阪市北区中之島1丁目1-27大阪市中央公会堂",
                "Municipality": "大阪市",
                "Neighborhood": "北区",
                "Region": "大阪府"
            }
        },
        {
            "Place": {
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        135.48485,
                        34.69745
                    ]
                },
                "Label": "大阪府大阪市福島区福島7丁目4ジェイホッパーズ大阪ゲストハウス",
                "Municipality": "大阪市",
                "Neighborhood": "福島区",
                "Region": "大阪府"
            }
        },
        {
            "Place": {
                "Country": "JPN",
                "Geometry": {
                    "Point": [
                        135.50791,
                        34.68903
                    ]
                },
                "Label": "大阪府大阪市中央区伏見町1丁目1ホテルブライトンシティ大阪北浜",
                "Municipality": "大阪市",
                "Neighborhood": "中央区",
                "Region": "大阪府"
            }
        }
    ],
    "Summary": {
        "DataSource": "Here",
        "MaxResults": 5,
        "ResultBBox": [
            135.48485,
            34.66891,
            135.50988,
            34.69745
        ],
        "Text": "大阪市中央区"
    }
}

sri の場合は max-results を 5 で指定していても応答は1件だけでしたが、HERE の場合は 住所が大阪市中央区でないPOIでもアグレッシブに応答しており、ジオコーダとしての性格がかなり異なることが分かります。

鳥カゴ用の台をDIYしました

こんにちは、デザイナーのはなです。

飼っている鳥のために、鳥カゴを置く用の台をDIYしました。

ちなみに今までは床にカゴを直においていました。

こちらが設計図です。

iPadのメモ帳で適当に書いたものなので、線がとてもふにゃふにゃです。

多分誰も読めないし、私にももう読めません。

材料調達

近くのホームセンターで木材や金具などを購入します。

ホームセンターでは木材カットのサービスがあるので、担当の店員さんに寸法を伝えて切ってもらいます。

少し重かったですが、なんとか自力で持って帰ることができました。

買った金具が大きすぎたのと、中段の角材の本数をもう少し増やしたかったので、次の日もう一度ホームセンターに行って買い足してきました。

この時買い足した木材をカットしてもらう際伝える寸法を間違えて、10センチ長い木材を持って帰ってきてしまったので、自分で100円均一で買ったのこぎりで切りました。

(性格の雑さが出ている

カゴを置く部分の制作

事前準備

うちの鳥さんの主食は粟などの穀物や種なのですが、食べカスを死ぬほど巻き散らかすので、囲いを付けます。

囲いの板には、鳥用ヒーターのコンセントを通すための穴を開けます。

細いのこぎりは持っていなかったので、ドリルで穴を開けまくり、力づくで半ば無理やりぶち抜きました。

その後必死にやすりをかけ、断面を滑らかにします。

木材の角に紙やすりをかけて角をとっていきます。

この作業が一番めんどくさい上、木屑が部屋中に散らばるのでかなり嫌な作業です。

塗装

部屋が狭いのでカーペットの上のものを全部どかして木材を置き、そこで作業しています

木材に塗装をします。

カゴを置く部分には、ペンてるの水性WOODジェルステインを塗りました。

三年ぐらい前に壁面収納を作ったときのあまりです。腐ってたらどうしようと思いましたが、大丈夫そうでした。

こちらは塗膜の厚みが出ないのと、布で刷り込んで塗るタイプの塗料なので、塗りやすいように組み立てる前の木材に塗ります。

二度塗りして深みを出します。

塗装が一番好きなので、ルンルンで作業します。

組み立て

閉じているところ
開いているところ

組み立ててみました。

掃除をしやすくするために、蝶番と留め具を使って前面部分の板を開けられるようにしました。

ニス

鳥が水浴びをした時に水が飛び散るので、組み立てた後に耐水性をつけるため水性ウレタンニスを塗布します。

ニス塗る紙やすりかけるニス塗る紙やすりかける の順で二度塗りをし、表面を滑らかにして拭き掃除をしやすくします。

脚部分を組み立てる

組み立て

無心で作業していたので、あまり制作過程のちゃんとした写真を撮っていませんでした

脚部分を組み立てます。

中段に物を入れられるようにしたかったのと、台の下に掃除機をかけやすいように、脚は少し高めにしました。

中段用の角材は先に取り付けると角材と角材の間が塗装しにくいため、塗装した後に組み立てます。

写真は上部を仮置きしてみたところです。

部屋が汚すぎるのでモザイクをかけています。

塗装

もっとちゃんとした写真撮っとけばよかった

組み立てた後、塗装を行います。

脚部分は、塗ると鉄っぽい質感になる黒いアイアンペイントを塗りました。

アイアンペイントは前から一度試してみたいなと思っていたので、使えてよかったです。

写真ではわかりにくいですが、普通の黒いペンキよりも高級感があってかっこいい感じに仕上がりました。

ついでにカゴを置く部分のビスにもアイアンペイントを塗りました。

塗装の途中でフローリング(賃貸)にアイアンペイントを盛大にこぼしてしまい青ざめましたが、アルコールの除菌シートで頑張って拭いたらきれいに取れました。

塗装が乾いたら、中段用の角材を取り付けていきます。

完成

上部と下部を合体させて、完成です!

閉じているところ
開いているところ
すでに食べカスがやばいので掃除しないと…

今までと景色が変わったので、最初はカゴの中で動き回ってキョロキョロしていましたが、比較的すぐ慣れたようでした。

中段には鳥の餌と、寝る時にカゴにかける毛布を収納しています。

DIYで作ったもののいいところは、ある程度なら後からカスタマイズできるところです。

そのうち側面にアイアンバー的な物をつけて、フックで物をひっかけられるようにしたいなーと思っています。

ちなみに材料を買いにホームセンターに行った時に、ついでに鳥用の新しいおもちゃを買ったのでカゴに設置してみたのですが、一切興味も示さない上ウンチだらけにされたので捨てました。

[Solr]TextProfileSignatureによるDe-Duplication

はじめに

前回の記事で取り上げた De-Duplication ではハッシュの計算方法として、厳密には一致しなくてもほぼ同内容のドキュメントを同一として扱うためのTextProfileSignature が利用できます。Solr のドキュメントでは以下のように書かれています。

Fuzzy hashing implementation from Apache Nutch for near duplicate detection. It’s tunable but works best on longer text.

https://solr.apache.org/guide/8_8/de-duplication.html

どのくらい Fuzzy でも大丈夫なのか興味があったので調べてみました。

TextProfileSignature クラス

TextProfileSignature クラスの JavaDoc に詳しい説明がありました。

  • 文字と数字以外を取り除いて小文字に統一する
  • ソースを見ると、この判定には Character.isLetterOrDigit() が使われています。
  • 空白区切りでトークンに分割する
  • MIN_TOKEN_LEN(デフォルト2)より短いトークンを捨てる
  • 各トークンの出現回数をカウントする
  • 足きり用の QUANT を計算する。QUANT = QUANT_RATE * 最頻出のトークンの出現回数 (QUANT_RATEのデフォルト0.01)
  • QUANT が2より小さい場合は QUANT = 2 とする。ただし、2回以上出現したトークンが存在しない場合は QUANT = 1 とする。
    • すべてのトークンが1回ずつしか出現しなかった場合は足きりせず全部使うということ
    • ソースを見ると QUANT_RATE * 再頻出のトークンの出現回数 を四捨五入している。つまり、QUANT_RATE が デフォルトの 0.01 であれば、再頻出のトークンの出現回数が250までは QUANT = 2 (1回しか出現しないトークンは捨てられる)となる。
  • QUANT よりも小さい出現回数のトークンを捨てる
  • 残ったトークンを出現回数順に並べて MD5 ハッシュを計算する

ちなみに、空白文字で区切ってトークンを作るという処理なので、日本語のドキュメントにはあまり有効ではなさそうで、日本語ドキュメントで曖昧な De-Deplication をするためには、Tokenizer と連携する ProfileSignature を実装する必要がありそうです。

実験

実験のため、TextProfileSignature を呼び出す簡単なプログラムを作りました。

短いドキュメントでも効果がわかりやすいように、QUANT_RATE は 1 としています。これなら、再頻出のトークンの出現回数が2ならQUANTは2、再頻出のトークンの出現回数が2ならQUANTは3となります。

'I have an apple'  8b821c9e763bb2fc567d473996cfde4a
'I have an apple.' 8b821c9e763bb2fc567d473996cfde4a

記号の有無はハッシュ値に影響を与えません。

'an apple I have' 8b821c9e763bb2fc567d473996cfde4a

トークンの出現回数が同じなら、語順はハッシュ値に影響を与えません。

'I have the apple' 9526cdfcde3ddfad02a0691d564f30ac

トークンが別のものに変わるとハッシュ値も変化します。

'I have apple. I have apple.' 5d5a0ce2d6dc15618d873d5572c4eb5e
'I have a apple. I have the apple.' 5d5a0ce2d6dc15618d873d5572c4eb5e

QUANTが2になるので、1回しか出現しない ‘a’ ‘the’ の有無はハッシュ値に影響を与えません。

'I have an apple. I have an apple. I have the apple.' d95062c38e38e90b1c34b009bf434cda
'I have the apple. I have the apple. I have an apple.' d95062c38e38e90b1c34b009bf434cda

QUANTが3になるので、2回しか出現しない ‘a’ ‘the’ の有無はハッシュ値に影響を与えません。

妹からのエンディングノートの提案

妹があかちゃんの出産に際しエンディングノートを家族みんなに提案してきました。

エンディングノート

親もまだ働いているとはいえそこそこ歳はいってますし昨今の情勢下だとコロナもあります。交通事故や病気を考えるといいタイミングだったなと思います。ここで単純に親に提案するだけだと不穏な感じに捉えられる恐れがありますが家族みんなで書くということなのでそれほど抵抗感はなく受け入れられたかと思います。

エンディングノートはとりあえず共通のものを用意するのが良いです。同じ書式であれば何かあった時も探しやすいと思います。全部埋める必要はないですし最低限のものを書いただけの状態ですが何もない状態よりは全然いいです。とりあえず意識不明の状態になった場合の判断は真っ先に書き残しておきました。あとは気が向いたら追記していく予定です。

追伸:動画の送られてくる赤ちゃんとは別物で実際に会ったあかちゃんめっちゃかわいかった

マニュアルはIndesignで作成しよう!

マニュアルを作成する時どのようなソフトを使用しているでしょうか?
illustratorで作成している方もおられると思うのですが、InDesignで作成するメリットと方法をご紹介したいと思います。

InDesignで作成するメリット

InDesignで作成するメリットとして下記があります。

・ノンブル(ページ番号)が自動で記入される
・タイトルに基づいた目次が自動で記載される
・タイトルなど同じパターンの装飾がある場合はあらかじめ記載される

これらのメリットがあることによって、マニュアルを変更・更新する際の労力がかなり改善されると思います。
InDesignを普段使わない方はイラレと少し使い勝手が異なるので違和感があると思うのですが、一度使い始めるとだんだんなれてくると思いますので一度試してみることをおすすめします。

まずはファイルの新規作成

まずは新規ファイルを作成します。
新規ファイルを作成するときInDesignの場合「レイアウトグリッド」と「マージン・段落」の2つがあります。
特徴は下記のとおりです。

レイアウトグリッド・・・小説やエッセイなど本のようにテキスト主体でレイアウトが決まっている場合に使用します。
マージン・段落・・・パンフレットやカタログなど自由にテキストや写真などを配置したい時に使います。

今回は「マージン・段落」で作成します。
「方向」や「綴じ方」「マージン」などは作成するマニュアルの内容によって決めます。

ページの追加方法

新規作成時にページ数を決めれるのですが、後で追加・削除したい場合はページパネルを右クリックするなどして行います。「ページ」に「8」を入れると8ページ追加されます。

①「ページパネル」を選択します。
②「ページパネル」を右クリックし「ページを挿入」をクリックします。
③追加したいページ数を入力し、OKをクリックします。

ノンブル(ページ番号)の追加方法

まずはページ番号が自動で入るように準備を進めます。

①ページパネルで「A-マスター」をダブルクリックします。
②文字ツールでノンブルを設置したいところに、テキストエリアを作成し「A」と入力します。
③「A」を選択した状態で「書式 > 特殊文字を入力 > マーカー > 現在のページ番号」を選択します。
右側も同様に作成します。
※イラレで言うところの「ポイント文字」はなく「エリア内文字」のみです。

ページに「A-マスター」が適用されているとページがノンブルが記載されます。
※適用されていない場合は、「A-マスター」をページパネルの中のページにドラッグします。もしくはページを選択し、右クリックで「マスターページを適用」をクリックします。

以上でノンブルが自動で割り振られるようになります。

同じパターンのページタイトルの追加方法

同じパターンのページタイトルなどがある場合は、下記のようにします。

①「ページパネル」を右クリックし「新規マスター(B-マスター)」を作成します。
②タイトルを追加します。
③文字の大きさなど設定したら、「段落スタイル」パネルから「新規スタイルを作成」をクリックします。名前を「ページタイトル」など分かりやすい名前に変更します。(後で一括で変更できるようになります。目次作成の際も使用します。)

④「A-マスター」を「B-マスター」にドラッグ&ドロップします。これで「B-マスター」だとノンブルとページタイトルが適用されます。

⑤変更したいページを選択し、右クリック「マスターページを適用」を選択し、「B-マスター」に変更します。

各ページ(B-マスター適用ページ)にタイトルが追加されたと思います。A-マスターも適用されているのでノンブルも追加されています。

タイトルを変更する際は、変更したいページで「shift + command」を押しながらクリックするとタイトルが変更できます。
(そのままクリックしても何も反応がありません)

目次の作成方法

目次もあらかじめ用意しておくと、タイトルに合わせて自動で反映することができます。

①目次ページで長方形ツールで、図形を作成します。
②「レイアウト > 目次」を選択します。

③「目次スタイル」で「段落スタイル」で作成した「ページタイトル」を選択・追加します。
OKをクリックし、①の図形をクリックすると目次が追加されます。

④文字の大きさや色などを調整し、新しく段落スタイル「目次」を追加します。
追加した段落スタイル「目次」をダブルクリックします。
⑤段落スタイルを編集します。「タブ」を選択し、適当な位置(少し右側)にタブを追加し、リーダーに「・」を記入します。
OKをクリックします。

⑥目次とページ番号の間に「・・・」を追加する場合、文字の大きさや色などを調整し、
新しく文字スタイル「目次の点」を追加します。
※「段落スタイル」ではなく「文字スタイル」ということに注意してください。

下記画像のようになったと思います。

次に目次のスタイルを編集します。
「レイアウト > 目次スタイル > 編集」をクリックします。

⑥項目のスタイルを③で作成した「目次」に変更します。
⑦項目と番号間を「^y」に変更し、スタイルを⑥で作成した「目次の点」に変更します。

⑧OKをクリックします。
最後に目次の記載されている図形を選択し、「レイアウト > 目次の更新」をクリックすると変更が反映されているかと思います。

新たにページを追加して目次を変更したい場合は、同様に「レイアウト > 目次の更新」をクリックすると変更が目次に反映されます。

途中から1ページ目にする

表紙を最初に持ってきて、その次から1ページ目にする場合は下記のようにします。

①「ページパネル」のページを開始したい箇所で右クリックし、「ページ番号とセクションの設定」をクリックします。
②「ページ番号割り当て開始」を選択し「1」にしてOKをクリックします。

最後に

マニュアルを作成する際のInDesignの便利な機能をご紹介させていただきました。
慣れないうちは、ややこしいかもしれませんがこれらの方法を使うとマニュアルの更新や変更をする時の手間が大きく改善されると思います。
長くなりましたが最後まで読んでいただきありがとうございました。