たまたま賃貸物件情報サイト Apartment Finder を見ていたらクエリ文字列が面白かったのでメモします。
Apartment Finder
- apartmentfinder.com
- 米国ワシントン DC に拠点を置く CoStar Group, Inc. という企業が手掛ける賃貸物件情報サイトのひとつ
Apartment Finder の検索フィルタ
チェックボックスでフィルタをかけることができるようになっています。例えば、アメニティ(快適性、居住性)のフィルタはこんな感じです。
適用されているフィルタはクエリ文字列で保持されているようです。
https://www.apartmentfinder.com/District-Of-Columbia/q/?am=18874644
アメニティのキーは am
ですので、英語の amenity に最初のふたもじを取ったと思われます。値は 18874644
。この値はどうのようにして決定されているのか気になります。気になりませんか?
多分ビットフィールドじゃないかなと思い、解読してみることにしました。
ビットフィールド
ビットフィールド (英: bit field) は、プログラミングにおいてブーリアン型のフラグをコンパクトなビットの並びとして格納する手法である。ビットフィールドの格納には、整数型を使用する。個々のフラグは、ビット単位で格納される。個々のフラグは、ビット単位で格納される。通常は、ソースコードで、個別のビットがフラグに対応する意味を付けられた、2の冪乗の定数が定義される。ビット演算の論理積・論理和・否定の組み合わせが、フラグのセット・リセットとテストを行うために使われる。
iex> for n <- 1..25, do: 2 ** n
[2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768,
65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216,
33554432]
これらの値が定数となります。各値に何らかの意味を割り当てます。例えば、2を「牛丼」、4を「味噌汁」、8を「お新香」と割り当てた場合、それらのすべての組み合わせをひとつの整数で表現できます。
# 定数
gyudon = 2 # 二進数: 0b0010
misoshiru = 4 # 二進数: 0b0100
oshinko = 8 # 二進数: 0b1000
# 組み合わせ
gyudon + misoshiru + oshinko == 0b1110
gyudon + misoshiru == 0b0110
gyudon + oshinko == 0b1010
さらに、Elixir 言語の inspect/2 関数を用いて先ほどのアメニティフィルタの値 18874644
を二進数に変換してみます。
iex> 18874644 |> inspect(base: :binary)
"0b1001000000000000100010100"
五つのフラッグが立っていますので、五つチェックされていたフィルタと辻褄があります。
各ビットが何をいみするのか
これは、各フィルタのチェックを一つだけつけて値を確認し、フィルタ名に紐づけていくしかないと思います。
できました。
値 | 意味 |
---|---|
2 | laundry_in_unit |
4 | dishwasher |
16 | ac |
32 | balcony |
64 | fireplace |
128 | furnished |
256 | fitness_center |
512 | swimming_pool |
65536 | parking_available |
131072 | wheelchair_accessible |
524288 | elevator |
1048576 | laundry_hookups |
2097152 | laundry_on_site |
4194304 | gate |
8388608 | garage |
16777216 | utilities_included |
33554432 | loft |
先ほどのアメニティフィルタの値 18874644
で検証してみます。
laundry_on_site = 2097152
ac = 16
dishwasher = 4
fitness_center = 256
utilities_included = 16777216
laundry_on_site + ac + dishwasher + fitness_center + utilities_included
答えは 18874644
となるはずです。
ビットフィールドの値の足し算、引き算は簡単にできます。
逆に合成された値をプログラミングで解読するには工夫が必要です。
ビットマスク
- ビット演算と呼ぶビット単位の操作を行う処理である
- ビットマスクをつかってできること
- 特定のビットをオン(
1
)やオフ(0
)にする - 特定のビットの状態(
0
か1
)を知る
- 特定のビットをオン(
コミュニティ
いろんなコミュニティから刺激と元氣をいただいています。ありがとうございます。
闘魂コミュニティ
みんなでわいわい楽しく自由に闘魂プログラミングをしています。
ぜひお気軽にお立ち寄りください。
Nervesで組み込み開発するコミュニティ
「Elixir で IoT!?ナウでヤングで cool な Nerves フレームワーク」です。
Elixir 言語でワクワクするコミュニティ