Någon som jobbar med Protobuf-filer i Swift

Permalänk
Medlem

Någon som jobbar med Protobuf-filer i Swift

Som rubriken säger. Försöker förstå hur det fungerar.

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem

Din fråga är om någon jobbar med Protobuf, men det du verkar vilja veta är hur Protobuf funkar. Hur ska svar på fråga #1 hjälpa dig få svar på fråga #2? Är det inte bättre att läsa om hur Protobuf fungerar så att du kan få en bättre förståelse?

Visa signatur

CCNP R/S + SPCOR, NSE7 (emeritus)

Permalänk
Medlem
Skrivet av vipers:

Din fråga är om någon jobbar med Protobuf, men det du verkar vilja veta är hur Protobuf funkar. Hur ska svar på fråga #1 hjälpa dig få svar på fråga #2? Är det inte bättre att läsa om hur Protobuf fungerar så att du kan få en bättre förståelse?

Kanske dumt formulerat men jag försöker få fram realtidsdata från exempelvis Skånetrafiken.

Det finns en sida, Trafiklab.se, där de har API för Information om bussar och tåg.

Denna information finns bl.a. i Protobuf-format eftersom det är snabbare än t.ex. json.

Jag har dock problem med hur jag ska dekoda Protobuf-filen. Har försökt läsa på men tycker det är svårt.

Därför tänkte jag om någon här jobbar med Protubuf i Swift kunde ge mig lite tips.

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem

Det är inte direkt tanken att du ska sitta och handskriva kod för att avkoda en protobuf-fil. Det som finns i en protobuf-fil är ett schema för hur dataformatet ser ut. Detta schema kör du typiskt igenom en "kompilator" som genererar kod för att representera detta schema i ditt valda språk, och sedan finns det typiskt ett bibliotek som implementerar "runtime" för protobuf i samma språk.

Med andra ord, sitter du läser in en protobuf-fil och försöker göra någonting med den under runtime gör du sannolikt fel. För Swift ser det ut som att det är swift-protobuf du bör kika på för ovan nämnda komponenter.

För mer konkret hjälp behöver du visa vad du har försökt och förklara mer i detalj vad du vill göra (vilket API vill du nyttja, var finns .proto-filen, hur ser din nuvarande kod ut, etc).

Permalänk
Medlem

https://support.trafiklab.se/org/trafiklabse/d/swift-och-prot...

Ser att du fått ganska så bra svar där.

Jag skulle rekommendera dig att inte börja implementera det i Swift, utan som svaret du fått, att göra en server.

Börja med det språk du ev. kan från tipset du fick: https://github.com/MobilityData/gtfs-realtime-bindings/tree/m...

Jag ska testa slänga ihop en C# och se vad det blir.

Visa signatur

Dator

Permalänk
Medlem
Skrivet av Erooo:

https://support.trafiklab.se/org/trafiklabse/d/swift-och-prot...

Ser att du fått ganska så bra svar där.

Jag skulle rekommendera dig att inte börja implementera det i Swift, utan som svaret du fått, att göra en server.

Börja med det språk du ev. kan från tipset du fick: https://github.com/MobilityData/gtfs-realtime-bindings/tree/m...

Jag ska testa slänga ihop en C# och se vad det blir.

Ok, tack!

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem
Skrivet av Erooo:

https://support.trafiklab.se/org/trafiklabse/d/swift-och-prot...

Ser att du fått ganska så bra svar där.

Jag skulle rekommendera dig att inte börja implementera det i Swift, utan som svaret du fått, att göra en server.

Börja med det språk du ev. kan från tipset du fick: https://github.com/MobilityData/gtfs-realtime-bindings/tree/m...

Jag ska testa slänga ihop en C# och se vad det blir.

Ja, jag försöker följa det svaret.

Färdiga GTFS-filer finns ju inte för Swift och att hitta lättförståeliga tutorials är inte helt lätt.

Har erfarenhet av främst C# men att skapa en server känns lite skrämmande. Kanske inte så svårt ändå.

Tänker att jag först kanske ska läsa statiska data utan Protobuf m.m. först som föreslagits.

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Datavetare
Skrivet av Larsp777:

Ja, jag försöker följa det svaret.

Färdiga GTFS-filer finns ju inte för Swift och att hitta lättförståeliga tutorials är inte helt lätt.

Har erfarenhet av främst C# men att skapa en server känns lite skrämmande. Kanske inte så svårt ändå.

Tänker att jag först kanske ska läsa statiska data utan Protobuf m.m. först som föreslagits.

Nu har jag väldigt rudimentär kunskap om Swift, men har jobbat en del med Protobuf och det finns en del saker som är samma oavsett språk då en av huvuduppgifterna för Protobuf är att beskriva "wire-format" på ett sätt som är programmeringsspråksagnostiskt.

Format som skickas beskrivs av denna protobuf-fil
https://github.com/MobilityData/gtfs-realtime-bindings/blob/m...

För att använda den ihop med Swift behöver du en plugin till Google protobuf-kompilator, något som Apple erbjuder här
https://github.com/apple/swift-protobuf

Går man snabbt igenom README.md filen ser man att det snabbaste/enklaste sättet att komma igång är via Homebrew
https://github.com/apple/swift-protobuf?tab=readme-ov-file#al...

När man installerat protobuf-swift kan man kompilera protobuf-filen till Swift bindings så här

$ mkdir swift $ protoc --swift_out=swift gtfs-realtime.proto

det ger en gtfs-reatime.pb.swift med bl.a. detta

... /// A definition (or update) of an entity in the transit feed. struct TransitRealtime_FeedEntity: SwiftProtobuf.ExtensibleMessage, @unchecked Sendable { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. /// The ids are used only to provide incrementality support. The id should be /// unique within a FeedMessage. Consequent FeedMessages may contain /// FeedEntities with the same id. In case of a DIFFERENTIAL update the new /// FeedEntity with some id will replace the old FeedEntity with the same id /// (or delete it - see is_deleted below). /// The actual GTFS entities (e.g. stations, routes, trips) referenced by the /// feed must be specified by explicit selectors (see EntitySelector below for /// more info). var id: String { get {return _storage._id ?? String()} set {_uniqueStorage()._id = newValue} } ...

I.e. man får då en Swift-variant som motsvara de filer som finns i gitrepot för t.ex. Go och C#
https://github.com/MobilityData/gtfs-realtime-bindings/blob/m...
https://github.com/MobilityData/gtfs-realtime-bindings/blob/m...

Ovanpå det behöver du tydligen ett konto mot trafiklab och huvudorsaken att de vill att man gör en server verkar vara att man har en rätt tight per-konto quota över hur många frågor per tidsenhet man får göra -> äts upp rätt snabbt om flera mobiler använder samma konto.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

Nu har jag väldigt rudimentär kunskap om Swift, men har jobbat en del med Protobuf och det finns en del saker som är samma oavsett språk då en av huvuduppgifterna för Protobuf är att beskriva "wire-format" på ett sätt som är programmeringsspråksagnostiskt.

Format som skickas beskrivs av denna protobuf-fil
https://github.com/MobilityData/gtfs-realtime-bindings/blob/m...

För att använda den ihop med Swift behöver du en plugin till Google protobuf-kompilator, något som Apple erbjuder här
https://github.com/apple/swift-protobuf

Går man snabbt igenom README.md filen ser man att det snabbaste/enklaste sättet att komma igång är via Homebrew
https://github.com/apple/swift-protobuf?tab=readme-ov-file#al...

När man installerat protobuf-swift kan man kompilera protobuf-filen till Swift bindings så här

$ mkdir swift $ protoc --swift_out=swift gtfs-realtime.proto

det ger en gtfs-reatime.pb.swift med bl.a. detta

... /// A definition (or update) of an entity in the transit feed. struct TransitRealtime_FeedEntity: SwiftProtobuf.ExtensibleMessage, @unchecked Sendable { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. /// The ids are used only to provide incrementality support. The id should be /// unique within a FeedMessage. Consequent FeedMessages may contain /// FeedEntities with the same id. In case of a DIFFERENTIAL update the new /// FeedEntity with some id will replace the old FeedEntity with the same id /// (or delete it - see is_deleted below). /// The actual GTFS entities (e.g. stations, routes, trips) referenced by the /// feed must be specified by explicit selectors (see EntitySelector below for /// more info). var id: String { get {return _storage._id ?? String()} set {_uniqueStorage()._id = newValue} } ...

I.e. man får då en Swift-variant som motsvara de filer som finns i gitrepot för t.ex. Go och C#
https://github.com/MobilityData/gtfs-realtime-bindings/blob/m...
https://github.com/MobilityData/gtfs-realtime-bindings/blob/m...

Ovanpå det behöver du tydligen ett konto mot trafiklab och huvudorsaken att de vill att man gör en server verkar vara att man har en rätt tight per-konto quota över hur många frågor per tidsenhet man får göra -> äts upp rätt snabbt om flera mobiler använder samma konto.

Tack så mycket!

Konto på Trafiklab har jag.

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10