Zaloguj się
Projekty Kategorie Archiwum

Nie tylko wygląda świetnie, ale również pozwala na łatwe skopiowanie całego komunikatu, w celu dalszego zgłoszenia problemu ;)

Download

BSOD4J

8 grudnia

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...

25 września

W poprzednim odcinku.

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 ;)

SelectionLayerUI

Poniższe demo prezentuje działanie programu:

Demo (Web Start)

Program i źródła (2 w 1)

11 września

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ą :)

Demo (Web Start)

Program i źródła (2 w 1)

9 września

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!

Czytaj dalej...

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
13 kwietnia

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..

Instrukcja

*) a na pewno dla użytkowników Windows ;)

7 listopada

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.

Arora

Inne ciekawe przykłady to stary pasek narzędzi w KBabel, którego chyba nigdy w życiu nie użyłem (zgadnijcie dlaczego):

Czytaj dalej...

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ę...

28 sierpnia

Skrypt avi2cbz.sh za pomocą mencodera i mplayera konwertuje video (avi) + napisy (txt, w formacie MicroDVD) do formatu CBZ (Comic Book Archive).

Czytaj dalej...

28 lipca

Krótka ściągawka pokazuje, co dokładnie jest zwracane przez daną metodę. A tutaj jest skrypt, który automagicznie utworzył poniższe tabelki ;)

Czytaj dalej...

29 kwietnia

Oto mój pierwszy (działający) program w JavaFX - prosta animacja Flapjacka - przydatne do testowania temperatury CPU ;)

Screenshot

Czytaj dalej...

11 stycznia

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:

Czytaj dalej...

16 grudnia

Oto wynik moich eksperymentów z Synthem:

Free Image Hosting at www.ImageShack.us

Na zrzucie JMenuBar, JMenu, itp. oraz JList. Wygląd oczywiście został skopiowany z Midnight Commandera :)

14 grudnia

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 ;)

  1. Otworzyć plik w IDE lub innym edytorze, który potrafi kolorować składnię
  2. Zrobić zrzut ekranu okna
  3. Zapisać jako JPEG w niskiej jakości z kompresją stratną, żeby obrazek szybko się ściągał
  4. Przekonwertować na format BMP, żeby plik był zajebiście wielki

Demo

7 września

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 :)

Download

11 sierpnia

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ć:

Czytaj dalej...

23 lipca

Ja tu widzę tylko jeden sposób, ale za to bardzo prawdziwy ;)

riafail [src]

20 lipca

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() ;)

  1. 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ść.
  2. To nie jest bug tylko feature.
  3. Programiści wiedzą o błędach, ale są ważniejsze priorytety, takie jak implementacja nowych funkcji (z nowymi bugami).
  4. Bo u nich działa.
  5. Ponieważ usunięcie jednego buga mogłoby przypadkowo spowodować powstanie kilku innych błędów (regression).
  6. Błąd powstaje w wyniku błędu w innej, niezależnej części systemu, na którą programista nie ma wpływu.
  7. Ponieważ kody źródłowe przepadły (open-source FTW).
  8. Żeby zachować kompatybilność z innymi wersjami ("bug-for-bug" compatible).
  9. Błąd został już dawno usunięty, ale użytkownik nadal używa wersji sprzed 5 lat.
  10. Bo im się nie chce.
  11. Próbują, ale i tak nadal nic nie działa.
1 czerwca

Free Image Hosting at www.ImageShack.us

Bug ujawnia się przy plikach większych niż 20MB.

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...

16 maja

Przeportowałem layout Garland do Swinga :)

Free Image Hosting at www.ImageShack.us

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

Czytaj dalej...

/*
 * ====================================================
 * 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;
       }

Czytaj dalej...

11 marca

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"));
10 marca

ProgressIcon to prosta implementacja javax.swing.Icon, która oprócz zwykłego obrazka ikony, wyświetla również "pasek postępu".

Pobierz

Ikona ProgressIcon umieszczona na przycisku JButton:

Image Hosted by ImageShack.us

Kod powstał w ramach eksperymentów, więc API może być trochę niekompletne ;)

3 grudnia

Całkiem zabawne. Teraz czekam na WolfenKDE ;)

< Wcześniejsze wpisy

Kategorie

Ewolucja Internetu 8 | Fail 28 | Gry 45 | Humor 124 | Idiotyzm 48 | Java 107 | KDE 83 | KShutDown 22 | Linux 81 | Makagiga 58 Ogólne 792 | Polityka 74 | Programowanie 45 | Reklamy 2 | Techblog 17 | Teorie Spiskowe 11 | TV 55 | UI 2 | Użyteczność 27 | WWW 79 | Wyrwane z Kontekstu 24 | X Files 14

Archiwum

Luty 2012 | Styczeń 2012 | Grudzień 2011 | Listopad 2011 | Październik 2011 | Wrzesień 2011 | Sierpień 2011 | Lipiec 2011 | Czerwiec 2011 | Maj 2011 | Kwiecień 2011 | Styczeń 2011 | Listopad 2010 | Październik 2010 | Wrzesień 2010 | Sierpień 2010 | Lipiec 2010 | Czerwiec 2010 | Kwiecień 2010 | Marzec 2010 | Luty 2010 | Styczeń 2010 | Grudzień 2009 | Listopad 2009 | Październik 2009 | Wrzesień 2009 | Sierpień 2009 | Lipiec 2009 | Czerwiec 2009 | Maj 2009 | Kwiecień 2009 | Marzec 2009 | Styczeń 2009 | Grudzień 2008 | Listopad 2008 | Październik 2008 | Wrzesień 2008 | Sierpień 2008 | Lipiec 2008 | Czerwiec 2008 | Maj 2008 | Kwiecień 2008 | Marzec 2008 | Luty 2008 | Styczeń 2008 | Grudzień 2007 | Listopad 2007 | Październik 2007 | Wrzesień 2007 | Sierpień 2007 | Lipiec 2007 | Czerwiec 2007 | Maj 2007 | Kwiecień 2007 | Marzec 2007 | Luty 2007 | Styczeń 2007 | Grudzień 2006 | Listopad 2006 | Październik 2006 | Wrzesień 2006 | Sierpień 2006 | Lipiec 2006 | Czerwiec 2006 | Maj 2006 | Kwiecień 2006 | Marzec 2006 | Luty 2006 | Styczeń 2006 | Grudzień 2005 | Listopad 2005 | Październik 2005 | Wrzesień 2005 | Sierpień 2005 | Lipiec 2005 | Czerwiec 2005 | Maj 2005 | Kwiecień 2005 | Marzec 2005 | Luty 2005 | Styczeń 2005