Nie tylko wygląda świetnie, ale również pozwala na łatwe skopiowanie całego komunikatu, w celu dalszego zgłoszenia problemu ;)
Fragment patcha OpenJDK:
private String toNetscapeHeaderString() {
- StringBuilder sb = new StringBuilder();
-
- sb.append(getName() + "=" + getValue());
-
- return sb.toString();
+ return getName() + "=" + getValue();
}
Użycie StringBuildera wskazuje na średnio nowy kod. Może wcześniej jeszcze coś tam było, co uzasadniałoby użycie powyższej optymalizacji, tylko nowy programista wolał raczej już niczego nie dotykać ;) Na dodatek, jeśli już, to powinno być sb.append(getName()).append('=').append(getValue()), o czym większość osób zapomina...
Tym razem wykorzystałem JLayer
również do rysowania nad innym komponentem. W efekcie powstała
mała klasa, która służy do zaznaczania elementów w dowolnym JTree.
Kod jest dość uniwersalny, więc można łatwo dostosować do własnych potrzeb ;)
Poniższe demo prezentuje działanie programu:
Różne wyświetlarki plików PDF mają tzw. "tryb przeglądania", gdzie po kliknięciu myszą w środku tekstu, całą stronę można przesuwać w górę i w dół podobnie jak papier toaletowy.
Ostatnio postanowiłem (czasem jak tak siąde i myślę...) zrobić coś identycznego przy użyciu nowego
komponentu javax.swing.JLayer.
Cały kod ma mniej niż 60 linii, a użycie sprowadza się do new JScrollPane(new JLayer<>(editorPane, new BrowseLayerUI<>())).
Poniższe demo prezentuje działanie (lub fail) programu - trzeba kliknąć w tekst i poruszać myszą :)
Niech naszym przykładowych kodem będzie ta oto copypasta (wł. potwór spaghetti). Poniższy program wyświetla nazwy hostów z podanego pliku (funkcjonalność nie jest w tym przypadku istotna). Kod działa jak należy, ale jest trochę przydługi, a co za tym idzie - również mało czytelny* i niezrozumiały dla studentów ;). Zmieńmy to!
Krótkie podsumowanie nowych opcji JDK (1.)7.0-b147 (RC) w porównaniu do wersji (1.)6.0:
java -help
- -jre-restrict-search | -jre-no-restrict-search // ? + -jre-restrict-search | -no-jre-restrict-search include/exclude user private JREs in the version search
javac -help
-Werror Terminate compilation if warnings occur @<filename> Read options and filenames from file
java -X
-Xdiag show additional diagnostic messages
-XshowSettings show all settings and continue
-XshowSettings:all
show all settings and continue
-XshowSettings:vm show all vm related settings and continue
-XshowSettings:properties
show all property settings and continue
-XshowSettings:locale
show all locale related settings and continue
javac -X
Osobiście polecam -Xlint:all :)
-Xlint:{
all,
cast,
+ classfile,
deprecation,
+ dep-ann,
divzero,
empty,
fallthrough,
finally,
+ options,
overrides,
path,
+ processing,
+ rawtypes,
serial,
+ static,
+ try,
unchecked,
+ varargs,
+ -Xpkginfo:{always,legacy,nonempty} Specify handling of package-info files
True Combat
Jednak pęd jaki nabrały prace nad grą szybko został zatrzymany. Acrid przestał się udzielać i zaniechał kontaktów ze społecznością. Pojawił się około rok później by oznajmić, że stracił wszystkie pliki źródłowe gry, gdy padł mu dysk twardy. Powiedział również, że nie zrobił żadnych kopii zapasowych. [src]
Supaplex
As far as I know, the source code to the game has been lost 'in history'. [src]
PowerGG
Intensywnie rozwijany w latach 2002-2003, w roku 2004 rozwój został zakończony ze względu na fakt, iż komputer, na którym między innymi znajdowały się źródła projektu, został skradziony. [src]
Muszę przyznać, że przez lata też mi się pogubiło trochę kodu..
Nie jestem jeszcze aż tak bardzo ślepy, ale odróżnienie tych dwóch białych krzyżyków w przeglądarce Arora zajmuje mi więcej czasu, niż normalnie ;) Po prostu są zbytnio do siebie podobne. Przecież za każdym razem nikt dokładnie nie ogląda każdej ikonki, tylko klika w kolorową "plamkę" przypominającą jakiś ogólnie przyjęty symbol.
Inne ciekawe przykłady to stary pasek narzędzi w KBabel, którego chyba nigdy w życiu nie użyłem (zgadnijcie dlaczego):
Bardzo prosto. Wystarczy zablokować pasek adresu przeglądarki :)
W tej chwili bug ten można zaobserwować na stronie Oracle Secure Enterprise Search (<- przykład, działa m.in. pod Firefoksem 3.6.x i Arora). Po załadowaniu strony search.oracle.com, pasek adresu oraz wyszukiwarka pod "Ctr+K" przestaje reagować na klawisz Enter w normalny sposób. Tzn. zamiast wczytać nowy URL, odświeża istniejącą kartę...
Skrypt avi2cbz.sh za pomocą mencodera i mplayera konwertuje video (avi) + napisy (txt, w formacie MicroDVD) do formatu CBZ (Comic Book Archive).
Krótka ściągawka pokazuje, co dokładnie jest zwracane przez daną metodę. A tutaj jest skrypt, który automagicznie utworzył poniższe tabelki ;)
Oto mój pierwszy (działający) program w JavaFX - prosta animacja Flapjacka - przydatne do testowania temperatury CPU ;)
Screenshot
1. Ikona programu, itp.
XPM można wyświetlić jako zwykły plik graficzny.
2. Kod C
Plik XPM można #includować, ponieważ jest napisany w C:
/* XPM */
static const char * logo3232_xpm[] = {
(...)
Czy to znaczy, że przeglądarka graficzna jest też kompilatorem języka C? ;)
3. ASCII Art ;)
I w końcu, niektóre ikony można oglądać również w trybie tekstowym:
Oto wynik moich eksperymentów z Synthem:
Na zrzucie JMenuBar, JMenu, itp. oraz JList. Wygląd oczywiście został skopiowany z Midnight Commandera :)
Nie wytrzymałem już tego ciągłego mulenia i zrobiłem downgrade do 6.5.1.
Głównym powodem było ciągłe pojawianie się "Scanning Projects...", które przy większych projektach praktycznie blokowało wszystkie fajne funkcje IDE.
Teraz chyba zaczekam na 6.9, 7.0, albo jakiś upgrade do 6.8 ;)
- Otworzyć plik w IDE lub innym edytorze, który potrafi kolorować składnię
- Zrobić zrzut ekranu okna
- Zapisać jako JPEG w niskiej jakości z kompresją stratną, żeby obrazek szybko się ściągał
- Przekonwertować na format BMP, żeby plik był zajebiście wielki
Ostatnio zrobiłem (IMHO) nieco lepszą wersję CSS-a dla HTML-a generowanego przez javadoc (ten z JDK 6). Poprawiłem fonty, wygląd tagów "table", "code", "hr", itp. Dodałem też "wersję do druku". Wystarczy zastąpić oryginalny plik "stylesheet.css". Nie jest to cud techniki, ale może komuś się przyda :)
Obecnie różne operacje na refleksji wyrzucają mnóstwo różnych wyjątków, które trzeba przechwycić, lub podać dalej. Wyłapywanie wszystkich IllegalAccessException, NoSuchMethodException, itp. nie jest zbyt wygodne i tylko zmniejsza czytelność kodu.
W rozwojowej wersji JDK 7, dodano ostatnio małe usprawnienie w postaci nowej klasy ReflectiveOperationException (diff oraz więcej info).
Teraz będzie można napisać:
Ostatnio dużo osób trafia na ten blog szukając powyższej informacji. Ustawienie okna na środku ekranu jest banalnie proste (niestety samo API jest mało intuicyjne).
JFrame okno(...) // 1. Najpierw ustawiamy rozmiar okna. okno.setSize(...) // 2. Potem położenie. // null oznacza że chcemy umieścić okno na środku ekranu. okno.setLocationRelativeTo(null); (...) okno.setVisible(true);
I nie trzeba się już męczyć z Toolkit.getDefaultToolkit().getScreenSize() ;)
- Bo nie wiedzą o błędach. Użytkownicy wolą całymi latami narzekać, niż poświęcić 5 minut na zgłoszenie usterki. Poza tym większość uciążliwości da się łatwo obejść.
- To nie jest bug tylko feature.
- Programiści wiedzą o błędach, ale są ważniejsze priorytety, takie jak implementacja nowych funkcji (z nowymi bugami).
- Bo u nich działa.
- Ponieważ usunięcie jednego buga mogłoby przypadkowo spowodować powstanie kilku innych błędów (regression).
- Błąd powstaje w wyniku błędu w innej, niezależnej części systemu, na którą programista nie ma wpływu.
- Ponieważ kody źródłowe przepadły (open-source FTW).
- Żeby zachować kompatybilność z innymi wersjami ("bug-for-bug" compatible).
- Błąd został już dawno usunięty, ale użytkownik nadal używa wersji sprzed 5 lat.
- Bo im się nie chce.
- Próbują, ale i tak nadal nic nie działa.
Uwaga: usypiający wpis
Coś mnie naszło, żeby porównać pliki rt.jar w najstarszym i najnowszym wydaniu Javy. Wyniki są trochę zaskakujące - dodali publiczne API! Oznacza to, że jeśli na przykład użyjemy klasy javax.xml.bind.JAXB, to nasz program nie uruchomi się pod starszą wersją JRE...
Przeportowałem layout Garland do Swinga :)
Więcej informacji później... W tym czasie można przetestować wersję alpha:
http://kdt.users.sourceforge.net/java/garlandpanel/launch.html (wymagana Java 6)
PS. Kliknij przycisk "Color...", żeby zmienić wygląd.
"Throwable Events" to stosunkowo nowa technika obsługi zdarzeń w języku Java, która może służyć jako zamiennik starego i niewygodnego systemu "listenerów". Główną zaletą jest większa przejrzystość kodu (nie trzeba dodawać setek addFooListener), oraz łatwość implementacji w programach korzystających z wielu wątków.
Przykładowa implementacja
Klasa Button:
public class Button extends JButton {
public Button(String text) {
super(text);
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
throw new ClickEvent(e.getSource());
}
} );
}
}
Klasa ClickEvent:
public class ClickEvent extends RuntimeException {
private Object source;
public ClickEvent(Object source) {
this.source = source;
}
public Object getSource() { return source; }
}
Przykład użycia
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#include "fdlibm.h"
#ifdef __STDC__
double __ieee754_hypot(double x, double y)
#else
double __ieee754_hypot(x,y)
double x, y;
#endif
{
double a=x,b=y,t1,t2,y1,y2,w;
int j,k,ha,hb;
ha = __HI(x)&0x7fffffff; /* high word of x */
hb = __HI(y)&0x7fffffff; /* high word of y */
if(hb > ha) {a=y;b=x;j=ha; ha=hb;hb=j;} else {a=x;b=y;}
__HI(a) = ha; /* a <- |a| */
__HI(b) = hb; /* b <- |b| */
if((ha-hb)>0x3c00000) {return a+b;} /* x/y > 2**60 */
k=0;
if(ha > 0x5f300000) { /* a>2**500 */
if(ha >= 0x7ff00000) { /* Inf or NaN */
w = a+b; /* for sNaN */
if(((ha&0xfffff)|__LO(a))==0) w = a;
if(((hb^0x7ff00000)|__LO(b))==0) w = b;
return w;
}
/* scale a and b by 2**-600 */
ha -= 0x25800000; hb -= 0x25800000; k += 600;
__HI(a) = ha;
__HI(b) = hb;
}
JDK7 (build 50) doczekało się nowego API dla plików. Inżynierowie Sun Microsystems ciężko pracowali przez <b>dziesięć</b> lat, ale w końcu udało się!
Teraz można skopiować plik za pomocą <b>jednej</b> linijki kodu...
import java.nio.file.*; ... Paths.get("foo").copyTo(Paths.get("bar"));
ProgressIcon to prosta implementacja javax.swing.Icon, która oprócz zwykłego obrazka ikony, wyświetla również "pasek postępu".
Ikona ProgressIcon umieszczona na przycisku JButton:
Kod powstał w ramach eksperymentów, więc API może być trochę niekompletne ;)





[
