niedziela, grudnia 05, 2010

Androidujemy sobie ;-) ale tak niemrawo

Tak sobie od niechcenia piszę na Androida "tablicę" stałych fizycznych i matematycznych i co rusz trafiam na problemy ;-)

Przed chwilą miałem taki, jak sprawić by wartości stałych trzymać w zewnętrznym pliku, ale by nazwy dla nich móc trzymać w pliku z zasobami?

Czyli w pliku ze stałymi trzymam coś takiego:
speed_light|c|299792458|m/s

A w pliku z łańcuchami dla angielskiego coś takiego:
<string name="speed_light">speed of light (in vacuum)</string>


Ale w kodzie gdy używam getString(int) to jako wartość łańcucha muszę wrzucić int nie łańcuch... i jak przekształcić to moje speed_light w wartość int odpowiadającą stringowi przypisanemu do speed_light?
Nie wiem czy istnieje jakaś Androidowa wersja, ja to na razie zrobiłem takim oto hackiem ;-)
// very ugly hack
Field field = R.string.class.getField(name);
name = getString(field.getInt(null));

Czyli użyłem refleksji...
Nie jestem z tego dumny bo to brzydkie. Ale działa ;-) [OK, w celu optymalizacji można wyciągnąć wszystkie pola z R.strings i wrzucić do Map<String,Integer>, ale nadal będzie to brzydkie, z tym że ciut szybsze].

Kolejny problem jest już nie Androidowy.
Fajnie by było móc dodać ficzer do konwersji do innych jednostek, ale tu jest problem...
Załóżmy, że jakoś by wprowadzono, że tą prędkość światła trzeba przeliczyć na mile na dzień...
Ja wiem, że trzeba to zrobić tak, że znam prędkość światła w m/s, czyli najpierw przeliczam ją na mile na sekundę, czyli mnożę razy 0.000621371192, mam więc 186282.397 mil na sekundę, teraz mnożę całą tą liczbę razy 86400 (czyli liczbę sekund w dobie) i dostaję 1.60947991×1010 mil na dobę.

Ale jak komputer ma to wykminić? ;-)

Jeżeli to m/s będzie zapisane jako m*s^(-1), a jednostka docelowa jako miles*day^(-1) to jeśli znane będą przeliczniki "1 m w milach" i "1 s w dniach" to można by...
Bo wtedy wynik powinien być taki:
Wartość w milach/dzień = Wartość w m/s * "1 m w milach"/"1 s w dniach"
Ale napisanie takiego parsera to już nie jest hop-siup... tzn. chyba ;-)

Nie mam na to pomysłu na razie :-(

Nawet jak wymyślę sposób dojdzie do tego problem zaokrąglania chyba, bo nie mam gwarancji, że każde takie automatyczne przekształcenie pójdzie po najbardziej "optymalnej" trasie w której wynik końcowy będzie najbardziej podobny do wyjściowego jeśli chodzi o dokładność. Można użyć BigDecimal'a, ale nadal będzie to chyba nie do końca pewne.

No i jest jeszcze ostatni problem ;-) Jak ładnie wyświetlić jednostki?
Np. przyśpieszenie to m/s2, co w "komputerowy" sposób najlepiej zapisać jako m*s^(-2).
To znów w prosty sposób można przekształcić w kod, który wyświetli coś takiego m*s-2. Bawienie się w piętrowość będzie już trudniejsze.

Ale jakąś tam zabawkę mam do pisania ;-)

Z innych pomysłów, co do których jak na razie nie mam chyba wystarczających umiejętności to program na Androida, który pozwalałby robić zdjęcia panoramiczne, ale z wykorzystaniem akcelerometru i kompasu [ogólnie tego co pozwala ustalić położenie aparatu]. Bo wydaje mi się, że to by mogło pomóc w przekształceniu istniejącego zdjęcia w taki sposób by pasowało do sąsiadów.


Podobne postybeta
3 "kuchenne" sekrety
SleepAdvisor - komórka pomaga w wyspaniu się ;-)
Niecne wykorzystanie refleksji... czyli jak poszukać tekstu w drzewie obiektów? ;-)
Trygonometria trudna
Przesyłanie "obcych" na odległość, albo uniwersalny format danych ;-)