Pokazywanie postów oznaczonych etykietą java. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą java. Pokaż wszystkie posty

niedziela, 2 września 2007

Radości programowania:

Z javadoca log4j:

parse

public java.util.Date parse(java.lang.String s,
java.text.ParsePosition pos)
This method does not do anything but return null.

piątek, 17 sierpnia 2007

Microsoft jest zły

Tak mnie naszło że dla firmy oprogramowanie M$ nie jest takim złym wyborem.

Niby Open Source jest free, ale z czegoś te firmy się utrzymują. Generalnie żyją z udzielania wsparcia technicznego dla oprogramowania, więc nie zależy im na tym żeby ludzie tego wsparcia nie potrzebowali i dokumentacji jest tyle co kot napłakał.

I ja bym się zastanawiał co jest lepsze zapłacić za program i mieć z świetną dokumentację. Czy nie płacić za program a płacić za szkolenia.

Przykład.
Standardowa biblioteka która przychdziz z g++ która ma dokumentacji. Koniec kropka. a MS VC++, czy borland które mają ją świetną.

Z Javą nie ma tego problemu (przynajmniej SE) , bo SUN daje świetne tutoriale (no i dżawadoki), ale przy EE już jest opcja pay for support i keine pappieren.

To co się opłaca zależy też od rozmiaru firmy... Bo małej firmie NIE opłaca się zatrudniać admina do np. administrowania serwerem MySQL na Debianie, albo chociaż na skonfigurowanie ww. zestawu, opłaca sie jej natomiast zpłacić za Microsoft SQL server.

In general, we decided to use high-end components for our hosting architecture: Dell PowerEdge 2950 Servers with SCSI RAID, Windows Server 2003, and SQL Server 2005. Yep, that’s an expensive way to do it. Since FogBugz runs fine on LAMP (Linux / Apache / MySQL / PHP), we could have gotten a bunch of cheap boxes, used all free software, and saved some money in exchange for some level of headaches. Indeed, most hosted services really should be built on LAMP. In our case, though, the cost of those Microsoft licenses and those extremely reliable Dell servers can be spread out over quite a few paying customers, so for us the cost difference per customer is really inconsequential. And we’ve been running IIS and Microsoft SQL Server here for six years without data loss, so that’s what we know and trust. But to be honest, if we ever get to the point where we’re racking up 10 new servers at a time, we’ll almost certainly switch to LAMP. I’m still gonna buy Dell servers and SCSI hard drives, because frankly, the small extra cost over cheapo white boxes is well worth it in reliability.
Joel on Software


Ze swojej strony dodam że mi pasi to że mogę se ściągnąć JBossa i pobawić się w weekend.

Drugi powód kiepskiej dokumentacji jest taki że mało kto lubi robić dokumentację.

środa, 15 sierpnia 2007

Are you stealing these LCDs? Yeah, but we are doing it while our code compiles

Well they ain't java developers,
Cause java compiles in seconds.*


*Lousy slow C++. It executes as fast as it compiles. Have my word on that one. Jeśli zauważasz że Java jest wolniejsza od C++, to pewnie używasz Javy 1.4, albo (nie daj Boże) gcj. Java 1.5 jest skokiem jakościowym jak między C a C++.

image from xkcd

Long time ago I was working in a project that had half of its codebase in C++, and half in Java. Java developers started their day starting their Java IDE, and while it was starting, they were making themselves coffe. C++ programmers started Emacs, and went working straight on. No coffe for C++ programmers!

piątek, 10 sierpnia 2007

Mapowanie

Programowanie ma zadziwiająco mało struktur:

Singleton (jeden obiekt):
.

Lista(Szeregowo ustawione obiekty różnych typów):
...........................

Tablica(Albo lista list):
...........................
...........................
...........................

Drzewo (Z bierzącego węzła jest dostęp do N węzłów potomnych):
.
. .
. .
. .

Graf (Jak wyżej ale węzeł może być swoim węzłem potomnym).

Naturalną strukturą dla obiektu jest graf. Widać to szczególnie w javie*, ale i cpp ma podobną. Dla języków niskiego poziomu naturalną strukturą jest lista.

Można mapować jedne strukturę na drugą, ale to zawsze jest robota. Mapowanie drzewa na ścieżkę od jednego węzła do drugiego (ale ścieżkę przepływu danych, która nie jest ścieżką po gałęziach), zajęło mi z pół godziny roboty i parędziesiąt linijek mojego dość oszczędnego kodu... Mapowanie np. Vectora na tablicę to jest jedna linia kodu..

I teraz co za debil wymyślił SQL? Albo inaczej co za debil wymyślił mapowanie obiektów na SQL...
To jest tak nienaturalna struktura. Nie da się wrzucić obiektu w tablicę. Chyba że statycznego (ale takie są nudne i nieprzydatne). Żeby to miało jakieś wydajnościowe uzasadnienie... Ale nie! Sql nie jest bardzo wydajny, a jeśli jest więcej czasu traci się na obsługę mapowania Baza Danych <-> Obiekt niż się oszczędza na odczycie danych....

Doh!!

Bo mapowaniem Baza Danych <-> język ją przetwarzający zajmuje się serwer integracji. A przy jego oprogramowaniu to java jest niskopoziomowa ;).

Dlatego ostatnio tak modny jest XML, jest zajebiście nieoptymalnym wydajnościowo formatem (jak wszystkie tekstowe). Ale mapowanie Java <-> XML jest mapowaniem 1 do 1. Kod mapujący takie coś to i maszyna napisze (i owszem --- piszą ;)).



* Obiekty są tak na prawdę zbiorami odnośników do innych obiektów. Liściami tego drzewa są typy prymitywne.

środa, 25 lipca 2007

Locale

Z locale są zawsze zajebiste problemy. Czasem java potrafi zmienić definicję locale razem z wersją (i wtedy działanie programu zależy od wersji JVM...), czasem sam OS potrafi mieć dziwne zdanie co do metody parsowania dat. Napisałem program który się naciął na obie opcje...

Najpierw o drugim.


Są programy które powinny się stosować do dziwactw OS, oraz takie które tego nie powinny robić.

Programy których użytkownik jest jednocześnie użytkownikiem komputera (w przypadku XP raczej jego 'administratorem', w przypadku linuksa starczy własne konto) powinny stosować się od widzimisie OS, bowiem zakładają one że widzimisie OS są widzimisiami usera programu.

Natomiast jeśli zakładamy że program będzie użytkowany przez ludzi 'z ulicy' powinny być agnostycznymi względem locale systemowego, i posiadać własne. Takie powinny być wszystkie programy w kafejkach internetowych, programy z serii PortableApps itp. Mój program do zarządzania magazynem Harcerskim powinien być też taki - bo generalnie na obozy jadą komputery prywatne (mało który szczep stać na zakup komputera szczepowego).

Mój program naciął się na locale w ten sposób że po drodze było wywołanie public static Locale Locale.getLocale(). A właściciel komputera (Jula) miała ustawiony format daty MM/DD/YY.

Co do pierwszego...



To radą jest napisanie własnej biblioteki do parsowania liczb i dat...

Nie wiem dlaczego ale nawet po zamienieniu locale na PL ciągle daty m,iały być postaci MM/DD/YY. Więc strzeliłem sobie własną klasę do obsługi dat. W takich wypadkach ogólnie najlepiej na własną rękę parsować co trzeba parsować.

poniedziałek, 30 kwietnia 2007

Metaprogramming

Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data or that do part of the work during compile time that is otherwise done at run time. In many cases, this allows programmers to get more done in the same amount of time as they would take to write all the code manually.
-wikipedia

Mówią że C++ daje narzędzia do metaprogrammingu a java nie. Przykładowo by wygenerować klasę całkują funkcje zwracającą double i std::complex, starczy napisać jeden szablon integrator.

Ale to Java ma powera do metaprogrammingu. Czytałem sobie w "Thinking in Java"* w rozdziale o adnotacjach, adnotacje to są takie fajne metadane dołaczane do kodu źródłowego. Ogólnie można do każdego elementu klasy dopisać jakąś informację. Co więcej, można za pomocą narzędzia apt (annotation processing tool), generować nowe pliki klas.

Dziś pisałem sejwowanie klasy do XML wygląda tak że na początku pisze się kod:
Element root = new Element ("[nazwa klasy]");
a dla każdej składowej klasy pisze się:
Element [nazwa składowej] = new Element ("[nazwa składowej]");
[nazwa_składowej].appendChild(String.valueOf(this.[nazwa_składowej]));
root.appendChild([nazwa_składowej]);
W sumie upierdliwe jak się ma 9 składowych. Wyglądało to tak:

package jb.sk;

import java.io.Serializable;
import java.text.ParseException;

import nu.xom.Element;

public class Comment implements Serializable, Comparable{

private static final long serialVersionUID = -5532948060127766412L;

String author;
String authorEmail;
long authorIP;
String authorUrl;
long date;
boolean deleted;
String message;
CommentId no = null;
boolean visible;
public Element getXML(){

Element comment = new Element("comment");

Element author = new Element("author");
author.appendChild(getAuthor());
comment.appendChild(author);

Element authorEmail = new Element("authorEmail");
authorEmail.appendChild(getAuthorEmail());
comment.appendChild(authorEmail);

Element authorIP = new Element("authorIP");
authorIP.appendChild(String.valueOf(getAuthorIP()));
comment.appendChild(authorIP);

Element authorUrl = new Element("authorUrl");
authorUrl.appendChild(getAuthorUrl());
comment.appendChild(authorUrl);

Element date = new Element("date");
date.appendChild(String.valueOf(getDate()));
comment.appendChild(date);

Element deleted = new Element("this.deleted");
date.appendChild(String.valueOf(isDeleted()));
comment.appendChild(deleted);

Element message = new Element("message");
message.appendChild(getMessage());
comment.appendChild(message);

Element no = new Element("no");
no.appendChild(this.no.toString());
comment.appendChild(no);

Element visible = new Element("visible");
visible.appendChild(String.valueOf(isVisible()));
comment.appendChild(visible);

return comment;
}
/*...*/
}


No i trafiło mnie żestarczyłoby utworzyć takie coś:
@XMLAble
abstract Comment_base{
@XMLAbleElement
String author;
/*..*/
Comment(Element e){
set(e);
}

abstract Element getXML();
abstract set(Element elem);

/*..*/
}


Potem automatycznie (przy pomocy apta) pisać klasę: Comment, która te dwie metody nadpisuje kodem generowanym w trywialny sposób. Po prostu tworzyłaby nową klasę dla @XMLAble i która sejwowałaby każdy element z annotacją @XMLAbleElement. Trywial :). Może kiedyś napisze coś takiego :).


---
* Wersji IV, wersja III dostępna na stronie autora (nie ma w niej chyba rozdziału w którym mówie).

Reklama:

Zachęcam do zajrzenia na: http://fizolof.blogspot.com/

Moja strona domowa zmieniła adres: http://jbhome.wikidot.com/

Ta strona nie będzie już updejtowana. Blog został przeniesiony na: http://jbhome.wikidot.com/blog:start

Blog: