Archiwa autora: Zielony

Duplikaty w tabeli

Jak wiadomo posiadanie zduplikowanych wierszy narusza zasady ACID więc staramy się ich wystrzegać. Oczywiście po pierwsze należy się dobrze zastanowić dlaczego duplikaty się pojawiły. Program który dane wpisuje do tablic widocznie posiada jakiś błąd – należy go znaleźć i poprawić. Po poprawieniu programu można przejść do naprawiania istniejących danych na bazie.

Wypisanie zduplikowanych rekordów:

SELECT c1, c2, c3, …, cn, count(*) FROM TEST group by c1, c2, c3, …., cn HAVING count(*) > 1;

albo tak:

SELECT * FROM test WHERE ROWID NOT IN (SELECT MIN (ROWID) FROM test GROUP BY c1, c2, c3, …, cn);

Mój ulubiony sposób usunięcia rekordów zduplikowanych bazuje na drugim z powyższych SELECT’ów:

DELETE FROM test WHERE ROWID NOT IN (SELECT MIN (ROWID)
FROM test GROUP BY coulmn1, column2, column3);

Podoba mi sie ze względu na swoją prostotę i wykorzystanie dobrodziejstwa Oracle jakim jest pseudokolumna ROWID.

Polecam jeszcze uwadze dodatkowy sposób o którym rzadko ktokolwiek wspomina – utworzenie tabeli na nowo z samymi prawidłowymi rekordami.

CREATE TABLE test_tmp AS
SELECT distinct c1, c2, c3… FROM test;

DROP TABLE test; — usuniecie tablicy źdródłowej

RENAME TEST_TMP TO TEST; — zmiana nazwy tabelki tymczasowej na źródłową

Metoda jest o wiele szybsza niż inne jesli mamy doczynienia z dużą liczba rekordów w tablicy. Przy tradycyjnym kasowaniu rekordów za pomocą DELETE Oracle przechowuje sobie dane na wypadek ROLLBACK w tablicy UNDO – przez to takie usuwanie trwa dłuzej. Usuwanie za pomocą utworzenia nowej tabeli z samymi dobrymi rekordami jest szybsze, ale trzeba pamiętać, że nie zawsze to jest to czego chcemy – rekordy mogą być powiązane CONSTRAINT’ami z którymi trzeba będzie sobie poradzić oraz niektórzy chcieliby jednak mieć możliwość zrobienia ROLLBACK gdyby stwierdzili, że zaszła pomyłka – w przypadku tego sposobu nie ma już możliwości ROLLBACK.

Jest więcej sposobów na radzenie sobie z duplikatami w tablicach w bazach od Oracle – odsyłam do guru: Burleson’a.

Jak zmusić Garbage Collector do działania?

Można próbować, ale nie ma pewności czy rzeczywiście się uruchomi i odśmieci co trzeba:

System.gc();

lub

Runtime.gc();

Jest to jednak niepolecane aby samemu próbować go uruchamiać – lepiej się przyglądnąć dlaczego się uruchamia zbyt rzadko, pokombinować z parametrami JVM dotyczącymi gc, może wybrać inny algorytm działania gc…

Modyfikatory strictfp, native, transient, volatile

strictfp

Wszystkie obliczenia w klasie, interfejsie bądź metodzie oznaczonej tym modyfikatorem są zgodne ze standardem IEEE_754. Nie można go napisać przed konstruktorem klasy. Jeśli klasa lub interfejs mają ten modyfikator to oznacza, że wszystkie metody w nich również go mają i nie możemy przy metodach już go napisać po raz kolejny.

native

Określamy w ten sposób metodę zaimplementowaną zwykle w innym języku programowania (C, C++, Fortran, Asembler, Python, ..) i uruchomioną przez JNI (Java Native Interface). Przykład użycia pod Linuksem z napisaną metodą w języku C jest tutaj.

transient

Modyfikator określający, że dane pole ma nie być utrwalane przy serializacji (zapis klasy wraz z jej stanem na przykład pliku) – na przykład pole-hasło.

volatile

Zmienna oznaczona tym modyfikatorem może być modyfikowana przez kilka wątków jednocześnie. Dobry przykład użycia jest tutaj.

 

Domyślny modyfikator dostępu

Dotyczy:

  • pól
  • metod
  • klas
  • interfejsów

Dostęp domyślny (czyli nie użyliśmy public, private lub protected) oznacza, że dostęp do takich pól, metod, klas bądź interfejsów mają tylko i wyłącznie obiekty z tego samego pakietu (tylko i wyłącznie – pod-pakiety(podkatalogi) nie wchodzą w grę, inne pakiety tym bardziej nie).

Grepowanie logów z pomiędzy dat

Często jest tak, że mamy w jednym pliku logi z całego dnia działania aplikacji. Jeśli wiemy, że awaria wystąpiła pomiędzy 20 a 21 wieczorem to po co grepować cały plik?

Zakładając, że każda linia naszego logu musi posiada datę i czas to aby wyodrębnić z pliku logi z odpowiednich godzin można się posłuzyć poleceniem nawk (lub awk, ale nawk przyjmuje większy input)

nawk ‚$0>=from&&$0<=to’ from=”2013-01-22 20:00″ to=”2013-01-22 21:00″ > 2013-01-22_od20_do21.log

W połączeniu z grep’em może to wyglądać na przykład tak:

grep ‚szukam errora’ plik.log | nawk ‚$0>=from&&$0<=to’ from=”2013-01-22 20:00″ to=”2013-01-22 21:00″ > 2013-01-22_Errory_od20_do21.log

Jak zrobić StackOverflowError w Java?

Oczywiście się da i Garbage Collector nas nie uratuje jeśli napiszemy coś takiego:

[code lang=”java”]package it.zielony.examples;

public class OverflowExample {

public static void main(String[] args) {
add(1);
}

public static int add(int a) {
return add(++a);
}
}[/code]

Uruchamając powyższy program dostaniemy:

Exception in thread „main” java.lang.StackOverflowError
at tk.zielinscy.piotr.solutions.OverflowExample.add(OverflowExample.java:10)
at tk.zielinscy.piotr.solutions.OverflowExample.add(OverflowExample.java:10)
at tk.zielinscy.piotr.solutions.OverflowExample.add(OverflowExample.java:10) …

Kody odpowiedzi HTTP

Kod HTTP to liczba którą wysyła serwer HTTP do aplikacji klienta (zwykle przeglądarki). Liczba ta jest umieszczona w odpowiedzi serwera tuż po wersji protokołu, na przykład:

HTTP/1.1 200 OK

HTTP/1.1 400 Bad Request

W tabeli kodów HTTP (wikipedia lub u źródła czyli w3.org) można odnaleźć co oznacza każdy z nich, ale należy wiedzieć jakie są zakresy odpowiedzi i znać chociaż jeden przykład do każdej z grup:

100-199 Informacyjne (110 Connection Timed Out)

200-299 Powodzenia (200 OK)

300-399 Przekierowania (302 Found)

400-499 Błąd po stronie aplikacji klienckiej (404 Not Found, 403 Forbidden)

500-599 Błąd po stronie serwera (500 Internal Server Error)

Czym się różni porównanie za pomocą == i === w JavaScript?

Porównanie zmiennych za pomocą === jest porównaniem nie tylko zgodności co do wartości ale również zgodności co do typów zmiennych.

Przykład ze stackoverflow:

0==false// true
0===false// false, ponieważ są innego typu
1=="1"// true, następuje automatyczna konwersja
1==="1"// false, ponieważ są innego typu
null==undefined// true
null===undefined// false
'0'==false// true
'0'===false// false