Najprostsze ikonki do map, ale też jednocześnie estetyczne i małe. Spełniają dobrze rolę informacyjną
http://sparce.cs.pdx.edu/mash-o-matic/tools.html
Archiwum dla kwiecień, 2008
Ikonki do Google Maps
Napisałem dzisiaj proste wczytywanie współrzędnych wierzchołków oraz tzw. normalnych wierzchołków z pliku OBJ. Oczywiście plik OBJ, z takimi danymi wyeksportowanymi z programów typu 3DS MAX, Blender i pokrewnych. Budowa tego pliku jest bardzo prosta:
- nagłówek z info o programie, który utworzył plik i inne tego typu
- współrzędne wierzchołków
- współrzędne wierzchóków tekstur
- współrzędne normalnych wierzchołków
- powierzchnie
Interesowały mnie głównie rzewczy wymienione we wstępnie, ale kod bardzo łatwo rozszerzyć. Poniżej najprostszy kod, jaki można sobie wyobrazić w tej sytuacji. Na poczet większych projektów wygodnie byłoby to opakować w jakieś klasy/funkcje, aby korzystało się wygodniej.
std::ifstream in( “apple1.obj” );
std::string buffer;
std::string tmp;
float v1;
float v2;
float v3;
std::string tbl[3];
while( !in.eof() )
{
std::getline( in, buffer );
std::istringstream line( buffer );
std::string ch = buffer.substr( 0, 2 );if( ch == “v ” )
{
line >> tmp >> tbl[0] >> tbl[1] >> tbl[2];
v1 = atof( tbl[0].c_str() );
v2 = atof( tbl[1].c_str() );
v3 = atof( tbl[2].c_str() );std::cout << “wierzcholki v1: ” << v1 << ” v2: ” << v2 << ” v3: ” << v3 << std::endl;
}
else if( ch == “vn” )
{
line >> tmp >> tbl[0] >> tbl[1] >> tbl[2];
v1 = atof( tbl[0].c_str() );
v2 = atof( tbl[1].c_str() );
v3 = atof( tbl[2].c_str() );std::cout << “normalne v1: ” << v1 << ” v2: ” << v2 << ” v3: ” << v3 << std::endl;
}
}
Wypadałoby dołączyć oczywiście odpowiednie nagłówki :)
Jakiś czas temu pisałem o darmowym hostingu głównie pod testy, spam. Wspomniany wcześniej provider usługi udostępnia ciekawy i dobrze płatny program partnerski.
Wszystko polega na sprowadzaniu poleconych osób, które się zarejestrują i założą darmowe konto WWW. Płacą dobrze, bo 5$ od osoby, a wiadomo, że wiele osób chce mieć darmowe konto pod jakieś proste własne projekty. To powoduje, że łatwo sobie dorobić na tym programie. Parametry konta nie zmieniły się od czasu, kiedy pisałem pierwszy raz o tym hostingu więc po szczegóły odsyłam właśnie tam.
Pozostaje tylko zarejestrować się i zbierać poleconych. Po zalogowaniu do panelu po prawej stronie ujrzymy menu, będzie w nim opcja JOIN AFFILIATE, którą to należy wybrać. Dalej już jest prosto, wystarczy podesłać swoim znajomym odpowiedniego linka, którego przygotuje nam automatycznie program partnerski. No i oczywiście zarabiać!
W którymś z poprzednich wpisów odnośnie subvert&profit pisałem instrukcję o tym, jak dorobić sobie parę dolarów do kieszonkowego. Niestety doszły mnie słuchy, że sporo osób ma problem z obsługą i poprawnym zbieraniem gotówki.
Przypuszczam, że częstym błędem jest zbyt wczesne wciśnięcie przycisku o wykonanym zadaniu. Należy to zrobić ZAWSZE po wykonaniu, a nie tuż po wciśnięciu. Kolejną rzeczą jest pasek narzędziowy ze StumbleUpon, dobrze jest mieć go zainstalowanego :)
Po szczegóły odsyłam także do poprzedniego wpisu o kieszonkowym.
Z powodów zawodowych musiałem zainteresować się API Google Maps. Najpierw należy się zarejestrować na stronie Google Maps, aby uzyskać swój własny klucz, przypisany do konkretnej witryny/domeny. Po zapoznaniu się z podstawami API uznałem, że jest ono bardzo przyjemne i przyjazne. Już po zarejestrowaniu, otrzymujemy od Google przykładowy kod. Poniżej zamieszczam nieco zmodyfikowany, dodałem jeden znacznik na tej mapce.
function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById(”map”));
map.setCenter(new GLatLng(20.0, 25.0), 5);var marker = new GMarker( new GLatLng( 20.0, 20.0 ), {clickable:true,title:’tytuł’} );
map.addOverlay( marker );
}
}
W przygotowanej do tego skryptu w Javascript stronie, należy odpowiednio zmodyfikować znacznik BODY:
body onload=”load()” onunload=”GUnload()”
Jak widać na pierwszym listingu, obiekt, w którym będzie mapa w dokumencie HTML, musi mieć ID o wartości “map”. Ustawienie współrzędnych środka mapy jest obowiązkowe - inaczej dostaniemy błąd. Ostatnim argumentem w metodzie setCenter jest zoom, który przyjmuje wartości od 1 do 20 ( 20 to maksymalne przybliżenie ). Należy zwrócić uwagę, że nie każdy obszar ma mapę o danym przybliżeniu. O atrybutach, przekazywanych do obiektu GMarker napiszę więcej w jednym z kolejnych wpisów.
Jak już pisałem w Kohana welcome to przesiadam się na tego frameworka, porzucając już całkowicie Code Ignitera ( na jego własne życzenie niestety ). Dziś nastąpiło pierwsze zderzenie z rzeczywistością.
Na stronie domowej projektu jest szybki tutorial jak odpalić pierwszą stronę w tym frameworku: ściągnąć, rozpakować, skonfigurować i jest :) Przejście z samego CI też nie jest trudne, kwestia zmiany nazw klas kontrolerów i modeli + kosmetyczne zmiany w helperach - nadal są to funkcje jednak tym razem jako metody statyczne. Pierwsza konfiguracja polega na przejrzeniu tylko jednego pliku application/config/config.php i wpisaniu ścieżki.
Co było inne niż w CI to fakt, że w katalogu application/config znalazłem tylko w/w plik konfiguracyjny. Jak się potem okazało, prototypy pozostałych są w system/config. I tak oto, jak potrzebowałem połączenie z bazą danych to przekopiowałem plik database.php do application/config, wpisałem odpowiednie dane i voila :)
Zachęcałem do spróbowania CI, teraz tak samo zachęcam do spróbowania z Kohaną - ta sama idea, prostota i wygoda używania.
Usuwanie automatycznie zainstalowanych pakietów przez apt-get:
sudo apt-get autoremove
Usuwanie wtyczek z /var/cache/apt/archives/:
sudo apt-get clean
Na potrzeby najbliższego projektu w C# musiałem nieco dowiedzieć się na temat refleksji ( Reflection ). Otóż przydaje się on w momencie gdy chcemy uruchamiać jakieś metody na poziomie wykonywanego programu a nie na poziomie kompilacji. Nie wiemy co to za obiekt, nie wiemy jakie ma metody i atrybuty.
Stworzyłem więc własną prościutką bibliotekę DLL, służy do tego wizard z Visual Studio. Kod poniżej:
namespace FirstDLL
{
public class Maths
{
public double Add( double d1, double d2 )
{
return d1+d2;
}public double Substract( double d1, double d2 )
{
return d1-d2;
}
}
}// a drugi plik:
namespace FirstDLL
{
class Writer
{
private string message = “heloł world”;public string Message
{
get
{
return message;
}
set
{
message = value;
}
}public void WriteMessage()
{
Console.WriteLine( message );
}
}
}
Są dwie klasy, żeby DLL nie składało się tylko z jednej ;) Zbudowanie projektu dało mi w efekcie plik FirstDLL.dll, który to umieściłem w projekcie z testowanym mechanizmem refleksji. Oto kod tej klasy ( bardzo zagmatwany, ale nieco się nakombinowałem ):
namespace ReflectionTest
{
class Program
{
static void Main( string[] args )
{
Assembly asem = Assembly.LoadFrom( “FirstDLL.dll” );
Type[] types = asem.GetTypes();
double result=0.0;foreach ( Type t in types )
{
object my = Activator.CreateInstance( t );
if ( t.IsClass )
{
MethodInfo[] mem = t.GetMethods();
foreach ( MethodInfo m in mem )
{
if ( m.Name.CompareTo( “Add” ) == 0 )
{
object[] arg = new object[2];
arg[0] = 5.4;
arg[1] = 2;
result = (double)m.Invoke( my, arg );
}
}
}
}
Console.WriteLine( result.ToString() );}
}
}
Oczywiście nie jest to kod niesamowity ani niosący jakieś szczególne zastosowanie w reflekcji - po prostu chciałem sprawdzić czy działa. Mam nadzieję, że ten prosty przykład pozwoli postawić pierwsze kroki w tej kwestii. Ja również dopiero się tego uczę i może za jakiś czas pojawi się bardziej praktyczny przykład.
Temat o którym trąbiło i nadal trąbi wielu programistów - CI w zasadzie traci wsparcie. Mówienie, że framework jest rozwijany i trzymanie go dalej na PHP4 jest zwykłą bzdurą.
Z końcem poprzedniego roku Zend oficjalnie ogłosił koniec wsparcia dla PHP4.x, zostaje PHP5!
Co na to twórcy CI? Ano, że zanim PHP5 wejdzie w powszechne użycie to minie co najmniej 10 lat.
Kpina? Nie, oni naprawdę tak mówią…
Los frameworka w swoje ręce wzięła społeczność zgromadzona wokół CI. Zaczęli przepisywać
frameworka na PHP5, jednocześnie poprawiając błędy popełnione przez Ellis Labs.
Polecam powolną przesiądkę już na nowocześniejszą wersję…