tag:blogger.com,1999:blog-24419026.post1175812373548190460..comments2024-03-22T17:03:22.754+01:00Comments on przemelek: Androidujemy sobie ;-) ale tak niemrawoprzemelekhttp://www.blogger.com/profile/14956032882265621104noreply@blogger.comBlogger11125tag:blogger.com,1999:blog-24419026.post-52983641617763057172010-12-06T13:12:17.350+01:002010-12-06T13:12:17.350+01:00Ja o kozie ty o wozie. Co innego przechowywanie je...Ja o kozie ty o wozie. Co innego przechowywanie jednostek, a co innego wprowadzanie ich z palca. Jeżeli chodzi o przechowywanie jednostek to metoda którą ci zaproponowałem jest używana dosyć powszechnie w oprogramowaniu inżynierskim, a przynajmniej tym ze stajni Autodesk i paru innych.<br />Jeżeli chodzi o wprowadzanie jednostek to inna sprawa. Wystarczy, że byś napisał normalny parser LL(1) i prosty skaner. Ustalasz zestaw tokenów (mogą być zlokalizowane) np.<br /><br />metr: m ;<br />sekunda: s ;<br />...<br />liczba: [-+]?\d+(\.\d+)? ;<br />ws: (' '|'\n'|'\r'|'\t')+<br /><br />itd.<br />Do tego piszesz prosty parser LL(1) do takiej gramatyki:<br /><br />wyrazenie: mnozenie (('+' | '-' )mnozenie)*; <br />mnozenie: stala (('*' | '/') stala )*; <br />stala: liczba | symbol;<br /><br />Dla kogoś z doświadczeniem, mniej niż 10min. Dla kogoś, kto nigdy nie pisał ręcznie parsera, ale ma łeb na karku ok. pół godziny.Unknownhttps://www.blogger.com/profile/04890690621284465831noreply@blogger.comtag:blogger.com,1999:blog-24419026.post-90933516206325565142010-12-06T12:50:22.079+01:002010-12-06T12:50:22.079+01:00Wprowadzanie danych podatne na błędy, co masz wyże...Wprowadzanie danych podatne na błędy, co masz wyżej napisane. Bo wystarczy się przesunąć o 1 i już zaczną wychodzić bzdury.<br />Łatwiej mi wpisać dist_m*time_s^(-2) [btw. wyżej napisałem dist_s ;-)] niż wektory.<br /><br />Same wektory lepiej byłoby generować na podstawie wpisanych jednostek niż wpisywać je w tej postaci "z palca".<br />Bo sam program to pikuś, przeliczanie jednostek to ciut bardziej złożony pikuś, najbardziej mozolne będzie wpisywanie danych i to musi być najprostsze do wykonania bo inaczej cała reszta będzie nieważna.<br />W ostateczności gotowy program może nie oferować konwersji, ale dane musi w sobie mieć i to w takiej postaci by były w razie czego możliwe do łatwego wykorzystania.<br />Dlatego nie jestem nawet pewien tego czy na początku nie przechowywać ich jako zapisanych po prostu jako m*s^(-2). Jak będę potrzebował konwersji to z automatu można przerobić większość z nich na dist_m i podobne, by później wyłapać ręcznie błędne konwersje.<br /><br />A chyba się zgodzisz, że łatwiej wpisać m*s^(-2) czy nawet wredniejsze m/s^2 niż [(m,0),(s,-2)]. Fakt, że [(m,0),(s,-2)] może być prostsze do wykorzystania, ale trudniej je wpisać.<br /><br />Nie, a co?przemelekhttps://www.blogger.com/profile/14956032882265621104noreply@blogger.comtag:blogger.com,1999:blog-24419026.post-83586920057774636502010-12-06T12:37:01.513+01:002010-12-06T12:37:01.513+01:00?????????
Robisz klasę w której trzymasz takie po...?????????<br /><br />Robisz klasę w której trzymasz takie pola jak:<br /><br />długość, czas, masa etc.<br /><br />Każde pole jest liczbą reprezentującą wykładnik.<br /><br />Pole wykładnik to zwykłe pole liczbowe i chyba nie muszę go objaśniać.<br /><br />To w jaki sposób będziesz przetrzymywał jednostkę to już twoja sprawa,<br />możesz używać antywzorca Anemic Domain Model i przechowywać<br />tylko wartości wykładników, a dane na temat danej jedostki przechowywać na zewnątrz.<br />Możesz przechowywać ją jako osobne pole tworząc specjalnie osobną klasę z singletonowymi obiektami dla każdej jednostki.<br />Klasa ta wiedziałaby jaki jest jej przelicznik względem jednostki tej samej miary w<br />układzie SI (więc jednostki takie jak metr, albo sekunda miałyby tą wartość równą 1, a mila miałaby 1600).<br />Trzymasz też symbol danej jednostki (ten jest niezmienny).<br /><br />Następnie robisz słownik mapujący wektory na identyfikatory stringów w zasobach opisujących<br />jednostkę w różnych językach. Każdy wektor jednostek ma referencję do instalacji tego słownika przez co potrafi, o ile istnieje, zwrócić odpowiednie oznaczenie w odpowiednim języku. Lub używasz wzorca IoC z osobnymi słownikami dla osobnych języków pobieranych ze względu na bieżącą kulturę.<br />Jeżeli standardowe oznaczenie jednostki nie istnieje (np. nikt nie ma osobnej nazwy dla m/(s^2)) to metoda ta<br />generuje oznaczenie jednostki w jaki sposób chcesz (goły string, albo coś ładniejszego przy pomocy jakiejś biblioteki).<br /><br />Chyba nie muszę tłumaczyć, że powinieneś także zaimplementować operacje na wektorach, takie jak np mnożenie. Implementacja taka staje się trywialna. Wykładniki jednostek dodajesz i tyle. Dzielenie na odwrót.<br /><br />zakładam, że najlepiej by było jakbyś zawsze trzymał jednostki w formacie SI, a konwertował je na inne tylko w celach prezentacji. Jeżeli się uprzesz, że jednostka może być dowolna to twoja sprawa i będziesz musiał robić dodatkowe przeliczenia w trakcie działań na wektorach.<br /><br />To jest podatne na błędy? Mam jedno pytanie. Czy pisałeś kiedyś jakąś aplikację inżynierską jak np. sterowanie samochodem, naprężenia na zbrojeniach, przenikalność termiczna, albo cokolwiek innego??Unknownhttps://www.blogger.com/profile/04890690621284465831noreply@blogger.comtag:blogger.com,1999:blog-24419026.post-30826240978048070982010-12-06T12:08:30.846+01:002010-12-06T12:08:30.846+01:00@anonimowy - ale Ty to strasznie przeżywasz, nie j...@anonimowy - ale Ty to strasznie przeżywasz, nie ja.<br />Czyli kompleksy masz. Co by sugerowało, że jednak moja ocena była słuszna.przemelekhttps://www.blogger.com/profile/14956032882265621104noreply@blogger.comtag:blogger.com,1999:blog-24419026.post-46290742844242660692010-12-06T12:04:09.490+01:002010-12-06T12:04:09.490+01:00Nie, nie chcesz tak samo. Chcesz trzymać wektor je...Nie, nie chcesz tak samo. Chcesz trzymać wektor jednostek podstawowych dla każdej wartości. To ma zaletę w razie oznaczenia poszczególnych jednostek byłyby takie same [nie będą bo zamiast m będę trzymał np. dist_m i gdzieś tam będę miał zapisane, że akurat po polskiemu to jest metr, a gdzieś indzie że dist_mile = 1851.66 dist_m.<br />Dzięki temu przyśpieszenie będzie zapisane jao g=9.81 dist_m*dist_s^(-2).<br />Bardziej poręczne i mniej podatne na błędy w trakcie wprowadzania niż wektory. Mniej miejsca też zajmie.przemelekhttps://www.blogger.com/profile/14956032882265621104noreply@blogger.comtag:blogger.com,1999:blog-24419026.post-11003200646226540342010-12-06T11:58:06.559+01:002010-12-06T11:58:06.559+01:00Co do kompleksów to nie ja zacząłem używać argumen...Co do kompleksów to nie ja zacząłem używać argumentu związanego z miejscem pracy.Unknownhttps://www.blogger.com/profile/04890690621284465831noreply@blogger.comtag:blogger.com,1999:blog-24419026.post-49131921219531304732010-12-06T11:57:19.545+01:002010-12-06T11:57:19.545+01:00Przecież moja metoda właśnie to robi! Moje rozwiąz...Przecież moja metoda właśnie to robi! Moje rozwiązanie "trzyma" tylko podstawowe jednostki, a paskale wyraża przy pomocy newtonów i metrów. Przeczytaj jeszcze raz to, co napisałem, albo jeszcze z 10 razy, bo jest to metoda opisująca dokładnie tą funkcjonalność o którą ci chodzi.<br />Masz podane na tacy co przechowywać w pamięci i tyle. Dodatkowo musisz gdzieś trzymać przeliczniki jednostek niestandardowych wyrażonych w jednostkach SI czyli, że np 1mila=1600 metrów. Czego chcesz więcej?Unknownhttps://www.blogger.com/profile/04890690621284465831noreply@blogger.comtag:blogger.com,1999:blog-24419026.post-23581632967064668922010-12-06T11:53:06.515+01:002010-12-06T11:53:06.515+01:00@anonimowy - ja to chcę inaczej zrobić. Trzymać je...@anonimowy - ja to chcę inaczej zrobić. Trzymać jednostki długości, jednostki czasu i inne takie razem. By móc łatwo proponować alternatywne "miary", czyli jak mam prędkość w m/s to bardzo łatwo mogę zaproponować w calach/s, milach/s i tak dalej.<br />Jednostki takie jak pascale albo joule czy waty chcę trzymać jako ich definicję i po prostu "dzielić".<br />Twoje podejście też jest ciekawe.<br /><br />Btw. czy Ty masz jakieś kompleksy? Bo na to wychodzi.przemelekhttps://www.blogger.com/profile/14956032882265621104noreply@blogger.comtag:blogger.com,1999:blog-24419026.post-1646971699323722172010-12-06T11:47:38.717+01:002010-12-06T11:47:38.717+01:00To nie jest post anonimowy (piszę go logując się p...To nie jest post anonimowy (piszę go logując się przy pomocy gmail) i jest bardzo sensowny:<br /><br />Każdą wartość przechowujesz razem z wektorem wykładników podstawowych jednostek SI<br /><br />[(m,v(m)) (s,v(s)) (g,v(g)) (N,v(N)) ...]<br /><br />(tzn. takich, których nie definiuje się jako zależności pomiędzy innymi jednostkami jak np. Ps=N/(m^2)).<br /><br />- 1 metr to będzie 1*[(m,1) (s,0) (g,0) (N,0) ...]<br /><br />- 200 gram to będzie 200*[(m,0) (s,0) (g,200) (N,0) ...]<br /><br />- 40 Ps to będzie 40*[(m,-2) (s,0) (g,0) (N,1) ...]<br /><br />Proste? Teraz wiesz np, że 1 mila to ok. 1600 [m], a jeden dzień to ok 80000 [s]. <br />Skoro 1[m/s] to <br /><br />1*[(m,1) (s,-1) (g,0) (N,0) ...]<br /><br />to chcąc przeliczyć na mile na dzień, konwertujesz na liczbę w postaci [mila dzień ...] mnożąc skalar przed wektorem przez w/w relacje podniesione do przeciwności odpowiednich potęg, czyli:<br />1*(1600^(-1))*(80000^(1)) a w wektorze podmieniając jednostki czyli wychodzi, że<br />50[(mila,1) (dzień,-1) (g, 0) (N,0)] czyli ok 50 [mila/dzień].<br /><br />W przypadku Pascali. Mamy 4 pascale i chcemy wiedzieć ile to funtów na cal kwadratowy. 4 [Ps] to 4*[(m,-2) (s,0) (g,0) (N,1) ...].<br />1 funt to ok 4.5 newtonów, a 1 cal to około 2.5 centymetra tj. 0.025 metra (czyli ok 1/40). Liczymy i mamy:<br />4*(1/1600)*0.22[(cal,-2) (s,0) (funt,1) ...]=0.00055[(cal,-2) (s,0) (funt,1) ...]<br />Czyli 4 paskale to około 0.00055 funta na cal kwadratowy. Zgadza się? No oczywiście, że się zgadza.<br /><br />Z dedykacjami dla wielce oświeconego mgr. fizyki, lead developera w wielkiej, amerykańskiej korporacji od oszołoma zesłanego z braku lepszych perspektyw do pewnej marnej, żałosnej polskiej firemki.Unknownhttps://www.blogger.com/profile/04890690621284465831noreply@blogger.comtag:blogger.com,1999:blog-24419026.post-87679237058226219232010-12-06T01:31:13.785+01:002010-12-06T01:31:13.785+01:00Brzmi zachęcająco :-)
[dodane trochę później]
htt...Brzmi zachęcająco :-)<br /><br />[dodane trochę później]<br />http://daniel-codes.blogspot.com/2009/12/dynamically-retrieving-resources-in.html<br />Wychodzi na to, że wolniejsze to jest od hacka :-(<br />Inna sprawa, że jeszcze mi się nie udało tego z pobieraniem identyfikatora użyć ;-)<br /><br />Zresztą jak się przyjrzeć kodowi odpowiedzialnemu za to Resources to on strasznie zamotany jest i rzeczywiście może działać wolniej od refleksji.<br /><br />A jak już uda mi się użyć tej Androidowej metody to sobie sam czas zmierzę ;-)przemelekhttps://www.blogger.com/profile/14956032882265621104noreply@blogger.comtag:blogger.com,1999:blog-24419026.post-84604497389152315062010-12-05T22:54:55.402+01:002010-12-05T22:54:55.402+01:00Moze Resources.getIdentifier() pomoze na ugly hack...Moze Resources.getIdentifier() pomoze na ugly hack?<br /><br />http://developer.android.com/reference/android/content/res/Resources.html#getIdentifier(java.lang.String, java.lang.String, java.lang.String)Krzysztof Wolnyhttps://www.blogger.com/profile/02256176457366894688noreply@blogger.com