me-web? 0.15.0: address blocks from Asia, Africa and Latin America too
- The provider card now names the address block your connection belongs to in Asia and the Pacific, in Africa, and in Latin America and the Caribbean, not only in Europe and the Middle East. The blocks come from the address registries APNIC, AFRINIC and LACNIC, used with their permission, and travel inside the app, so this works without a connection too. - In Latin America and the Caribbean the registry gives no names for its blocks, so the card says how the block was handed out instead, for example "passed on by the provider to one of its customers". - The app is about 6 MB larger, because it carries these blocks. - The app's name no longer has quotation marks where it stands on its own: the window title, the name under the icon, the version line and the website's titles. Inside a sentence it keeps them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
599ea2bf84
commit
6209c7f2e1
134 files changed
+1026
-433
No files matched your search
@@ -18,7 +18,7 @@ dotnet run tools/strings.cs -- check # every language agai
|
||||
dotnet run tools/strings.cs -- set Key values.json # one key, every language at once
|
||||
dotnet run tools/strings.cs -- merge keys.json # many keys: {"Key": {"en": "…", "it": "…"}}
|
||||
dotnet run tools/strings.cs -- import fr fr.json # one language's drafts: {"Key": "…"}
|
||||
dotnet run tools/strings.cs -- quote # put every “me-web?” between its language's quotation marks
|
||||
dotnet run tools/strings.cs -- quote # the name in its language's marks in a sentence, bare alone
|
||||
dotnet run tools/knowledge.cs # provider map -> artifacts/knowledge/ip2asn.bin
|
||||
dotnet run tools/languages.cs # regenerate data/languages.json from CLDR
|
||||
dotnet publish src/MeWeb.Desktop -c Release -r win-x64 --self-contained -p:PublishSingleFile=true \
|
||||
@@ -72,7 +72,7 @@ The Android release key: alias `meweb`, certificate SHA-256
|
||||
| `data/observed.json` | notes counted from shared findings and accepted by a person: per AS number and line (`home`, `mobile`), IPv4 shared or public, IPv6 offered or not, port 25, each with how many networks agree; embedded in every release |
|
||||
| `src/MeWeb.Server/ObservedNotes.cs` | every six hours (with the share sweep) counts the shared findings into `/var/lib/meweb/observed.json` on the box: one vote per /24 or /48, the latest check of each network, the publisher's own network left out; nothing is served |
|
||||
| `tools/observed.cs` | `show` prints that count, `accept <file> AS<n>/<line> ...` copies the ready notes (at least 5 networks, 4 in 5 agreeing) into `data/observed.json` |
|
||||
| `src/MeWeb.Server/KnowledgeFeeder.cs` | refreshes the open network data under `/var/lib/meweb/knowledge` every six hours (iptoasn daily, DB-IP monthly, eight RouteViews RIBs weekly through `bzcat` (one or two collectors per continent, `Collectors`; each counts once per network in `UpstreamTally`, and a path's first AS, the collector's own neighbour, is never taken for an upstream), the AOSP carrier list weekly, RIPE's `inetnum` and `inet6num` split files weekly), builds `ip2asn.bin`, `networks.bin`, `carriers.json`, `registry.bin` (every RIPE block, `RegistryBuilder`) and `SOURCES.txt` with `MeWeb.Core/Knowledge/Sources.cs`, and serves them at `/api/knowledge` |
|
||||
| `src/MeWeb.Server/KnowledgeFeeder.cs` | refreshes the open network data under `/var/lib/meweb/knowledge` every six hours (iptoasn daily, DB-IP monthly, eight RouteViews RIBs weekly through `bzcat` (one or two collectors per continent, `Collectors`; each counts once per network in `UpstreamTally`, and a path's first AS, the collector's own neighbour, is never taken for an upstream), the AOSP carrier list weekly, the address registries' block files weekly (`Registries`: RIPE's and APNIC's `inetnum` and `inet6num` split files, AFRINIC's whole dump, LACNIC's `lacnic.db`)), builds `ip2asn.bin`, `networks.bin`, `carriers.json`, `registry.bin` (every block of the four, `RegistryBuilder`) and `SOURCES.txt` with `MeWeb.Core/Knowledge/Sources.cs`, and serves them at `/api/knowledge` |
|
||||
| `tools/knowledge.cs` | takes the server's knowledge files (`MEWEB_KNOWLEDGE_URL`, default the public server; the release sets `http://127.0.0.1:5480` after deploying the server first) into `artifacts/knowledge/`, checking each SHA-256, and falls back to building `ip2asn.bin` alone from iptoasn (`--local` forces that); `MeWeb.Core` embeds whatever is there; `tools/release.cs` runs it before every app build |
|
||||
| `tools/setup.cs` + `setup.json` | pinned build tools |
|
||||
| `tools/Screenshots` | headless renders of every view in every language |
|
||||
@@ -129,15 +129,31 @@ The Android release key: alias `meweb`, certificate SHA-256
|
||||
persons, contacts, `descr` or `remarks`), RIPE credited with a link, the extract's date and a note that it may lag;
|
||||
`SOURCES.txt` (the release notes) and `RegistryCredit` carry that. The RIR's own allocations (`ALLOCATED PA`,
|
||||
`ALLOCATED UNSPECIFIED`, `ALLOCATED-BY-RIR`) are skipped: their names are registry-made (`IT-FASTWEB-20101230`).
|
||||
- **Every RIPE block travels with the app, because the app works offline.** The owner, 16 October 2026: "this is an
|
||||
offline first capable app it needs to hold value even in absence of connection". `registry.bin` holds all five
|
||||
million blocks, flattened so the narrowest one wins (`RegistryTable.Narrowest`), in Brotli chunks of 16,384 rows
|
||||
behind an index: about 26 MB, opened in a millisecond, one chunk decompressed per lookup, nothing else resident. It
|
||||
- **APNIC, AFRINIC and LACNIC came on the same terms, each with its own promise.** The letters of 15 October 2026
|
||||
(APNIC #6500381, AFRINIC #1066122, LACNIC #222611) promised what `Sources.cs` keeps, so never add a field to one
|
||||
without asking that registry again. APNIC, which named its public split files for this purpose: range and netname,
|
||||
**never the country** (its rules bar mapping addresses to places); its member allocations stay (Japan, Korea and
|
||||
Taiwan exist there only as their national registries' allocations), its own placeholders go (`ApnicPlaceholder`:
|
||||
`IANA-BLOCK`, `IANA-NETBLOCK-n`, `APNIC-AP`, `ERX-NETBLOCK`, the other registries' `*-CIDR-BLOCK`, `ROOT`, which
|
||||
would otherwise label the whole internet), and so do the national registries' umbrella blocks (`JPNIC-NET-JP`,
|
||||
`CNNIC`, `KRNIC-NET`, `TWNIC-TW`, `IDNIC-ID`, `VNNIC-NET`, which name a registry, not a provider), while their
|
||||
members' own names stay (`IDNIC-BIZNETGIO-ID`). AFRINIC: range, netname and country, skipping `ALLOCATED UNSPECIFIED`
|
||||
and `POLICY-RESERVED` (placeholders such as `IANA-BLK` and `NET-154-1-0-0`); its member allocations carry real
|
||||
names (`MTNSA-MOBILE-BROADBAND`). LACNIC's `lacnic.db` names no block: prefix, status and country only (not the
|
||||
city or the dates), so the card shows how the block was handed out in plain words (`ValueBlock*`, the status in
|
||||
`registry.bin`'s row byte). ARIN's region has no block names: its NetName and NetType come only through the Bulk
|
||||
Whois download behind an ARIN Online key, not wired in, and its public delegation file says only "allocated" and
|
||||
the country, which the provider map already has.
|
||||
- **Every registry block travels with the app, because the app works offline.** The owner, 16 October 2026: "this is an
|
||||
offline first capable app it needs to hold value even in absence of connection". `registry.bin` holds all seven and
|
||||
a half million blocks of the four registries, flattened so the narrowest one wins (`RegistryTable.Narrowest`), in
|
||||
Brotli chunks of 16,384 rows behind an index: about 32 MB, opened in a millisecond, one chunk decompressed per lookup, nothing else resident. It
|
||||
is not inside `MeWeb.Core`, because the APK stores every assembly once per processor type: the desktop head and the
|
||||
screenshot tool embed it in their entry assembly, the Android head ships it as an uncompressed asset
|
||||
(`AndroidStoreUncompressedFileExtensions`) that `AndroidPlatform.OpenRegistry` reads in place through `OpenFd`.
|
||||
`RegistryBuilder` reads IPv4, then IPv6, with the names in a temporary file: about 200 MB peak, under the unit's
|
||||
512 MB, and some three minutes on top of the RouteViews tally. `/api/ip` still answers each caller with its own
|
||||
`RegistryBuilder` reads IPv4, then IPv6, with the names in a temporary file, into lists sized up front (6.5 million
|
||||
IPv4 and 2 million IPv6 rows; RIPE alone has 1.48 million IPv6 blocks, and a list that outgrows its size doubles):
|
||||
about 276 MB peak in October 2026, under the unit's 512 MB, and some four minutes on top of the RouteViews tally. `/api/ip` still answers each caller with its own
|
||||
block from the server's newer copy; without that answer the app looks the address up itself, and when the server
|
||||
cannot be reached at all it uses the router's public outside address or the STUN answer, so the provider card names
|
||||
the network and the block without the publisher's server. A change to any knowledge file's format bumps
|
||||
@@ -193,15 +209,20 @@ The Android release key: alias `meweb`, certificate SHA-256
|
||||
the central 66 of 108 units around its smallest enclosing circle; a change to the drawing goes into all three files.
|
||||
The plain `mipmap-xxxhdpi/icon.png` is only for Android 7.x.
|
||||
- **Release notes are the commits since the previous tag.** `tools/release.cs` writes "What's new" from each
|
||||
commit's subject (without the `"me-web?" x.y:` prefix, quoted or not) and body, dropping trailers and any line that mentions Claude;
|
||||
commit's subject (without the `me-web? x.y:` prefix, quoted or not) and body, dropping trailers and any line that mentions Claude;
|
||||
the release step needs `fetch-depth: 0` for the tags. So a commit body is written for the people who download the
|
||||
release: plain words, one bullet per change they would notice.
|
||||
- **The name is always quoted, in each language's own marks.** “me-web?” in English, «me-web?» in Italian, „me-web?“
|
||||
in German, « me-web? » (no-break spaces) in French, 「me-web?」 in Japanese: unquoted, the question mark reads as the
|
||||
end of a sentence ("What me-web? found"). `tools/strings.cs check` fails on a bare name; `AppName` is the title. In
|
||||
right-to-left languages the `Localizer` wraps the name in U+2066/U+2069 (left-to-right isolate), the English fallback
|
||||
included: without it Avalonia lays out ”me-web?“ alone on a line as `me-web?”“`, and inside a sentence the `?`
|
||||
jumps to the other end of the name. A left-to-right mark after the name was tried and does not fix the lone title.
|
||||
- **The name is quoted inside a sentence, in each language's own marks, and bare where it stands alone.** “me-web?”
|
||||
in English, «me-web?» in Italian, „me-web?“ in German, « me-web? » (no-break spaces) in French, 「me-web?」 in
|
||||
Japanese: unquoted in a sentence, the question mark reads as its end ("What me-web? found"). Alone, as a title or a
|
||||
label, the marks only clutter it (the owner, 30 October 2026): the window and launcher name (`AppName`, `Product`,
|
||||
the Android label, the desktop file, the macOS bundle), the page titles and the download page's heading, the
|
||||
version line (`VersionLine`, "me-web? 0.15.0 · free software"), the README's heading and the commit prefix
|
||||
(`me-web? 0.15.0: ...`). `tools/strings.cs check` fails on a bare name in a sentence and on a quoted one in the keys
|
||||
of its `alone` list; `quote` puts each right. In right-to-left languages the `Localizer` wraps the name in
|
||||
U+2066/U+2069 (left-to-right isolate), the English fallback included: without it Avalonia lays out the lone title
|
||||
”me-web?“ as `me-web?”“`, and inside a sentence the `?` jumps to the other end of
|
||||
the name. A left-to-right mark after the name was tried and does not fix the lone title.
|
||||
- **Avalonia 12 refreshes an indexer binding only on `PropertyChanged("Item")`.** `{s:Tr Key}` binds `Localizer.Instance[Key]`;
|
||||
the WPF name `"Item[]"` and `""` refresh nothing, so until 0.7.1 changing the language left every `{s:Tr}` text in
|
||||
the old one while the view models' `*Formatted` strings followed. The screenshot tool draws each `start-<code>`
|
||||
|
||||
Reference in new issue
Block a user