Tag Archives: java

Inne

Computing file hashes using Scala

I thought it would be nice to enter 2014 with some new know­ledge. I couldn’t survive over 2 weeks without coding so I deci­ded to take a closer look at Scala. Since I’m rather inter­me­diate Java coder, I thought it would be great to try another JVM language.

Java casts me away because of too much boiler­plate code. I feel so stupid being forced to type stuff like final BufferedString bufStr = new BufferedString(); Is Java compi­ler really that stupid that can’t figure out what type is bufStr? It seems that some­body thought the same like me and made compi­ler more smart.

Of course Scala is not about syntax only. It repre­sents a whole diffe­rent appro­ach to program­ming. Scala uses func­tio­nal para­digms instead of impe­ra­tive. After 3 days of inten­sive API reading I’ve prepa­red a little code snip­pet to illu­strate key concepts of Scala.

Gist conta­ins HashGenerator single­ton object that can compute SHA-256 hash string from file contents. It uses two redun­dant methods to get hash. getSha1HashUsingFuncChain() is more „scalish”, getSha1HashUsingMatcher() uses matcher, a power­ful Scala feature.

Accor­ding to my runtime measu­re­ment, func­tion using matcher is about 10% faster on my machine. Skim the commen­ted source below:

Inne

O pehapowcu, który chciał zostać javowcem

Znowu zleciał prawie miesiąc od ostat­niego wpisu… Nie ozana­cza to oczy­wi­ście, że przez ten czas nic się nie działo. Wręcz prze­ciw­nie, a to za sprawą próby „wgry­zie­nia się” w Javę.

Na różnych mądrych forach wyczy­ta­łem, że PHP to właści­wie zabawka, a praw­dziwe progra­mo­wa­nie zaczyna się dopiero od Javy. Szkoda tylko, że niektó­rzy nie zauwa­żają, że „zabawki” typu Alle­gro napi­sane są w PHP. Dodat­kowo zachę­cony hasłem „write once, use every­where” zain­sta­lo­wa­łem sobie NetBe­ans na Ubuntu i „ruszy­łem z tym koksem”.

Co nowego zauwa­ży­łem w Javie z punktu widze­nia znajo­mo­ści wyłącz­nie PHP (nie liczę Logo, Basic a potem Turbo Pascal za dzieciaka):

  • Nie ma w Javie zmien­nych bez wcze­śniej­szego zade­kla­ro­wa­nia ich typu. Koniec ze zmienną będącą raz inte­ge­rem, a innym razem stringiem.
  • Koniec z funk­cjami zwra­ca­ją­cymi warto­ści ładnie w PHPDoc nazwane mixed, czyli jak wszystko fajnie poszło, to return true, jak niefaj­nie to false, a jak trochę fajnie to stringa.
  • Prze­cią­ża­nie metod to jest to czego mi brakuje w PHP. Wiele zadań progra­mi­stycz­nych dałoby się łatwo i szybko rozwią­zać gdyby można było prze­cią­żać metody (np. różne warianty konstruktora).
  • Tablice mają z góry usta­loną liczbę elemen­tów. Z drugiej strony mamy rozbu­do­wane imple­men­ta­cje kolek­cji typu List, SetMap (w których słabo się jesz­cze poru­szam na dzień dzisiejszy).
  • Cała nowa grupa zagad­nień (i angiel­skiego słow­nic­twa) w ogóle nie wystę­pu­ją­cych w PHP, czyli współ­bież­ność (problem dostępu wielu wątków do tych samych danych, zaklesz­cze­nia, wzorzec producent-konsument itd.)
  • Ciekawe rozwią­za­nie „niuan­si­ków OSowych”, np. w window­sach ścieżki dostępu tworzy się znakiem \ , a w unik­sach / . Wpisu­jąc File.pathSeparatorChar Java sama dobie­rze sobie odpo­wiedni znak.
  • Budowa inter­fejsu graficz­nego i jego opro­gra­mo­wy­wa­nie (nieźle rozwią­zane w NetBeans).
  • Wszystko jest obiek­tem i dzie­dzi­czy po Object!
  • Nie da się niechluj­nie pisać kodu :-) Towa­rzysz kompi­la­tor (to również nowość) od razu zgłosi, że mu się coś nie podoba.

Z punktu widze­nia czytel­nika tego bloga zapewne wygląda to tak jakbym zabie­rał się za wszystko tylko po łebkach. Może i trochę tak jest, że szybko się czymś nudzę, ale w tym przy­padku chodzi o czystą cieka­wość czy rzeczy­wi­ście „poważna Java” jest aż tak trudna do zrozu­mie­nia. Po miesiącu nauki stwier­dzam, że nie jest to takie trudne. Oczy­wi­ście mam tutaj na myśli same podstawy języka (bez tych tysięcy biblio­tek). Samo czyta­nie doku­men­ta­cji to już wyzwanie :-)

Inne

Mój pierwszy raz… z Javą :-)

Ostat­nio nie pisuję za dużo na blogu z prostej przy­czyny: nie mam czasu. A to dlatego, że „zachciało mi się” studiów pody­plo­mo­wych. Co drugi week­end zajęty i nie ma kiedy pisać :-(

Jako iż na studiach wałku­jemy Javę, to pomy­śla­łem sobie, że „dla sportu” strzelę sobie jakiś prosty kod. Zrobi­łem prze­licz­nik liczb całko­wi­tych w syste­mie dzie­sięt­nym na binarny metodą dzie­le­nia przez 2 i zapa­mię­ty­wa­nia reszty z dzie­le­nia. Odwra­camy kolej­ność zapa­mię­ta­nych reszt i powstaje nam piękna liczba binarna :-)

Przy­kła­dowe użycie dla liczby 13:
Wpisz liczbe calkowita do zamiany na system dwojkowy
13
Dziele 13 przez 2 wyszlo 6, reszty 1
Dziele 6 przez 2 wyszlo 3, reszty 0
Dziele 3 przez 2 wyszlo 1, reszty 1
Dziele 1 przez 2 wyszlo 0, reszty 1

Szukana liczba w syste­mie binar­nym to 1101
Poni­żej podaję cały kod źródłowy (nie śmiać się z ilości doku­men­ta­cji), może komuś się przyda.

import java.io.*;

public class PrzelicznikBinarny {
	/**
	 * Metoda zamienia podana liczbe calkowita na binarna.
	 * @param liczba - liczba calkowita do zamiany na binarna
	 * @return zwraca ciag zawierajacy wyniki kolejnych dzielen liczb i wynik koncowy
	 */
	static String liczBinarna (int liczba) {
		// inicjalizacja zmiennych
		String ciag = "";
		String binarna = "";
		int reszta;
		// petla z duzym "zapasem" wykonan
		for (int i=1 ; i<1000 ; i++) {
			// licz reszte z dzielenia przez 2
			reszta = liczba % 2;
			// konstruuj ciag opisowy
			ciag += "Dziele " + liczba + " przez 2";
			// jezeli reszta wyszla 1 to zmniejsz cala liczbe o 1
			if (reszta == 1) liczba--;
			// dzielenie liczby
			liczba = liczba / 2;
			// cd ciagu opisowego
			ciag += " wyszlo " + liczba + ", reszty " + reszta + "\n";
			// dodaj reszte do ciagu wynikowego
			binarna += reszta;
			// wyjscie z petli jezeli nie ma juz czego dzielic
			if (liczba == 0) break;
		}
		// odwrocenie ciagu wynikowego
		StringBuffer odwroc = new StringBuffer(binarna).reverse();
		// sklej ciag opisowy z wynikowym i wypluj
		return ciag + "\nSzukana liczba w systemie binarnym to " + odwroc;
	}

	// prosta metoda pytajaca o wpisanie liczby z klawiatury
	public static void main(String[] args) {
		try {
			System.out.println("Wpisz liczbe calkowita do zamiany na system dwojkowy");
			int calkowita;
			BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
			calkowita = Integer.parseInt(in.readLine());
			if (calkowita < 0) {
				System.out.println("Wpisz liczbe dodatnia");
			} else {
				System.out.println(liczBinarna(calkowita));
			}
		}
		catch (IOException e) {
		}
	}
}