przemelek

Reputacja

1,878

Głosów ogółem

użytkownik głosował za tyle razy
69
Użytkownik głosował przeciw tyle razy
10
  • Roczniak
  • Patrol obywatelski
  • Sławne pytanie
  • Komentator
  • Wybitne pytanie
  • Popularne pytanie
  • Student
  • Nauczyciel
  • Autobiograf
  • Cofnął głos
  • Krytyk
  • Wsparcie
  • Uczony
  • Redaktor
Prawdziwe imię
Przemysław Rumik
Członek od
2 lata, 5 miesięcy
Ostatnio widziany
9 miesięcy, 3 tygodnie temu
Witryna
http://przemele...
Miejscowość
Kraków / Wodzisław Ślaski
Wiek
34

O mnie

Programista Analityk (Senior) / Lead developer

Pytania: 2

Odpowiedzi: 81

  • 2010-02-17 11:02:12 Jezyk C++ a C#

    Było już z 3 razy ;-)

    Różnią się składnią, filozofią, zastosowaniami i wydajnością. C# ma prostszą składnie i ogólnie jest prostszy, C# działa na maszynie wirtualnej jaką jest CLR, C++ kompiluje się do kodu maszynowego [OK, za wyjątkiem czegoś co zowie się C++ .NET, czyli przyciętej wersji C++], C# jest językiem obiektowym, który od biedy pozwoli na programowanie strukturalne, C++ pozwala na pisanie obiektowe, strukturalne, na użycie template'ów i paru innych paradygmatów i podejść do problemu, C# to głównie aplikacje okienkowe i WEB przez ASP.NET [głównie, choć nie jedynie], C++ to głównie duże aplikacje okienkowe i systemy backendowe dla dużych systemów, C# jest wolniejsze, C++ szybsze. W praktyce programy w C++ skompilowane przy pomocy kompilatora Microsoftu są chyba najszybszymi programami z takich które zostały stworzone w językach wysokiego poziomu [w sensie, napisz ten sam program z tymi samymi algorytmami w różnych językach i testuj jak to działa na danym sprzęcie. W takim przypadku prawie zawsze C++ da najszybszy kod].

    Czyli C# i C++ to dwa kompletnie różne języki, które łączy tylko C w nazwie, ojcem C++ jest C, rodzicami C# jest Java i Delphi [z tym, że Java powstała trochę "na podstawie" C++]. Oba języki mają podobną, ale różną składnie.

    C++ jest bliższy sprzętu i systemu operacyjnego, C# dotyka się tylko z maszyną wirtualną [.NET albo Mono]. C# jest potencjalnie bardziej przenośny.

    A tutaj linki do wcześniejszych pytań o praktycznie to samo ;-)

    Czego lepiej jest się uczyć: C, C++ czy C# ?

    C, C++, C# - który?

  • 2009-12-22 16:57:31 Mnożenie w Java [zamknięte]

    Po pierwsze to jest JavaScript, nie Java.

    Po drugie, jest to spowodowane tym, że w komputerach liczby z przecinkiem, czyli zmiennoprzecinkowe to coś innego niż liczby rzeczywiste. W przypadku liczb rzeczywistych pomiędzy 2 dowolne i różne od siebie liczby jesteś w stanie wstawić nieskończenie wiele liczb, np. między 0 i 1, możesz wstawić 1/2, 1/4, 1/100000 i tak dalej, pomiędzy 1/100 a 1/101 możesz wstawić np. 1/100 + 1/10000 i tak dalej. W przypadku komputerów nieskończony zbiór liczb rzeczywistych [nawet ograniczonych od dołu i góry] reprezentowany jest przez pewien skończony zbiór liczb. 20.33 i 10.00 w obliczeniach zostaną przekształcone na najbliższe wartością liczby zmiennoprzecinkowe, i pomnożone [to samo zresztą może stać się w przypadku dodawania, odejmowania, dzielenia czy innych operacji] wynik zaś będzie jakąś tam liczbą która jest stosunkowo blisko rzeczywistego wyniku... Jak tego uniknąć? Można spróbować przez zaokrąglanie, jeżeli Twój wynikowe 203.29999999999999999999998 zaokrąglisz do 2 miejsca po przecinku to dostaniesz 203.30. Gdy potrzebujesz pewnej dokładności, np. liczysz pieniądze to możesz w JavaScript działać tak, że liczbę 20.33 pomnożysz razy 100, będziesz mieć wtedy 2033 grosze, pomnożysz razy 10, czyli wynikiem będzie 20330 groszy i podzielisz znów na 100, czyli 203.3 złote. Nie jest to idealne rozwiązanie, ale często wystarcza.

    W językach takich jak Java do dokładnych obliczeń na liczbach z przecinkiem używa się klasy BigDecimal, która przechowuje liczby inaczej i poza ograniczeniami wielkości pamięci nie ma żadnych innych ograniczeń w dokładności. Można też samemu zaimplementować własne mnożenie i przechowywać liczby w tablicach lub stringach i to by było rozwiązanie dla JavaScriptu. Implementacja własnego mnożenie, dzielenia, dodawania i odejmowania nie jest znów tak trudna do zrobienia i da się to wszystko zrobić w mniej niż powiedzmy 100-150 liniach kodu.

  • 2010-01-19 17:38:11 Blokowanie widoku źródła strony lub ograniczenie dostępu

    Nie zrobisz tego tak by można było wszystko ukryć, ale możesz ukryć przed nie do końca zdeterminowanym użytkownikiem. Po pierwsze możesz dociągnąć przy pomocy XMLHttpRequest kod HTML który wstawisz w DIVa [user może to podejrzeć np. FireBugiem, ale większość tego nie potrafi], po drugie możesz tym samym XMLHttpRequest podesłać np. JSONa i na podstawie danych w nim wygenerować zawartość strony, możesz też skorzystać z Appletu czy ActiveX'a który w sobie będzie miał interesujący Cię kod, który na stronie umieścisz w mniej więcej taki sposób:

    function $(id) { return document.getElementById(id); }
    var html = ourApplet.getHTMLCodeForSemiSecretPart();
    $("secretPart").innerHTML=html;
    

    User może sobie podejrzeć sciągniętego JARa, ale już większej wiedzy będzie wymagało odczytanie tekstu w nim zawartego. A wszystkie te pomysły opierają się na takiej idei, że user zwykle nie potrafi wyciągnąć zawartości DIV'a...

    Podziel się informacją po co Ci to, może się uda coś bardziej skutecznego zrobić, choć wątpię.

    Jeszcze jedna rzecz, czasem potrzebujesz jakiejś wartości tylko w skrypcie JS, w takim przypadku wartość możesz pobrać jednym z wymienionych wyżej sposobów, i wykorzystywać ją tylko wewnętrznie w wybranej funkcji..... choć i tak to można "złamać" przy pomocy debugowania JavaScript'u.

    Jest jeszcze możliwość użycia rysunku do zastąpienia jakiegoś kawałka strony.

    I ostatnia możliwość to użycie Appletu lub ActiveX'a do wyświetlenia tego co chcesz "ukryć", można przesłać dane w postaci zaszyfrowanej i wyświetlić, nadal to można złamać, ale już nie tak łatwo.

  • 2010-01-19 20:49:51 Czego lepiej jest się uczyć: C, C++ czy C# ? [zamknięte]

    Najbardziej warto C#, sam go nie lubię, ale jest najbardziej rozwojowy. C# to język dla .NET, czyli źródła kompilowane są do kodu pośredniego, który wykonuje środowisko uruchomieniowe. Głównie działa kod .NETowy na Windows, ale dzięki projektom w stylu Mono również na Linuksach i MacOSX. Główną domeną są tutaj aplikacje okienkowe i aplikacje webowe. Niektóre firmy szukają ludzi z C#, z ciekawszych ofert jakie ostatnio widziałem to do firmy piszącej symulatory lotu :-)

    C++ jest z tej trójki najpotężniejszy, to w nim np. pisany jest Windows :-) Istnieje jego uboższy krewny dla .NET [uboższy bo nie wspiera np. wielodziedziczenia], ale sam C++ jest prawie zawsze kompilowany do kodu maszynowego. Potężny, trudny, wg. statystyk w defensywie bo coraz mniej ludzi w nim pisze [choć nadal bardziej popularny niż C#]. Głównie do aplikacji okienkowych lub back-endów jakichś dużych systemów. Np. systemy rezerwacji biletów są pisane w C++. Pracę można znaleźć, ale tu nie wystarczy znać trochę, tu trzeba znać bardzo dobrze, czyli STLa powinno się chyba mieć w małym paluszku ;-)

    C, najstarszy z całej trójki, to w nim powstał Linux i większość Unix'ów. Jako jedyny z tej trójki nie pozwala na pisanie obiektowe [choć istnieją rozszerzenia obiektowe], sam język ma już blisko 40 lat, choć ostatnia jego wersja pochodzi z 2000 roku. Kompilowany do kodu maszynowego. Szczerze dawno nie widziałem oferty dla kogoś będącego po prostu programistą C, zwykle szuka się developerów C/C++. Zastosowania praktycznie identyczne jak C++.

    Powyższa kolejność prezentuje też typową zwięzłość rozwiązań tego samego problemu ;-) najmniej kodu napiszesz w C#, a najwięcej w C. Co do trudności, to najtrudniejszy jest jednak C++, później C, a najprostszy jest C#.

  • 2010-01-30 14:39:59 Kto ma wykształcenie kierunkowe (programistyczne)?

    Szczerze to znam tylko jedną osobę która jest programistą nie mając wyższego wykształcenia, ale to jest Amerykanin pracujący w stanach, a i tak jest już przesuwany w strukturze swojej firmy tak by bardziej zajmował się supportem niż kodowaniem.

    Znam za to mnóstwo programistów, którzy zaczęli pracę jako studenci i przez to robienie magistra zajęło im łącznie po 7-8 lat ;-)

    Studia wydają się być o tyle niezbędnym elementem bo eliminują "tych gorszych". Żeby skończyć informatykę na w miarę dobrej uczelni trzeba przebrnąć przez analizę matematyczną, algebrę i fizykę, a okazuje się, że dla wielu ludzi to zbyt trudne. Ale jeśli ktoś przebrnie i będzie miał jeszcze dobrą średnią to prawie na pewno będzie się nadawał do pracy jako programista. To trochę podobnie jak z lekarzami ;-) chcemy by leczyli nas ci najlepsi, więc z kodowaniem też tak jest chcemy mieć gwarancję, że za kodowanie biorą się ci najlepsi.

    Choć dla programisty nie muszą to być koniecznie studia informatyczne :-) Sam jestem fizykiem z wykształcenia, znam kilkoro matematyków pracujących jako programiści i architekci w dużych międzynarodowych korporacjach. Choć muszę przyznać, że jednak większość programistów jakich znam to informatycy, głównie po dobrych uczelniach w stylu AGH czy Politechniki Warszawskiej.

    I studia dały większości dobrych programistów których znam kilka rzeczy, po pierwsze język, dziś podstawowym językiem dla programisty nie jest wcale Java, nie jest C# czy cokolwiek innego, jest nim angielski. Bez angielskiego zostają Ci małe polskie firemki, które może czasem coś ciekawego zrobią, ale za to mają zwykle średniowieczne metody zarządzania [w stylu pensja to podstawa + 30% premii żeby firma miała haka na pracownika, a później pracownik dowiaduje się, że trzeba pracować w weekend]. Druga rzecz to szybka nauka, gdy piszesz soft do kalibracji i testowania BTSów to musisz umieć opanować jakiś tam kawałek fizyki by rozumieć co Twój kod robi, to samo gdy piszesz system księgujący musisz się szybko nauczyć podstaw księgowości.

  • 2010-02-17 10:53:28 Java a Javascript

    To dwa kompletnie różne języki.

    Podobne nazwy są wynikiem zabiegów marketingowych Netscape'a, który stworzywszy swój język skryptowy chciał go jakoś zareklamować. W tamtych czasach Java była jedynym dostępnym sposobem na zrobienie interaktywnych stron [choć możliwe, że pojawił się już wtedy ActiveX, ale głowy nie dam] i Netscape za zgodą Suna nazwał swój język skryptowy JavaScriptem.

    Co do samych języków to różnic jest wiele, poczynając od tego, że Java jest językiem silnie typowanym, a JavaScript nie, Java jest też językiem w pełni obiektowym, a w przypadku JavaScriptu wiele ficzerów obiektowości nie jest jeszcze standardem.

    Java do uruchomienia potrzebuje wirtualnej maszyny Java'y, a JavaScript interpretera JavaScript, choć to się ostatnio zmienia i coraz częściej JavaScript działa też w swoistej maszynie wirtualnej.

    Języki mają podobną składnię, bo oba są językami C-like. Java ma standard, który muszą przestrzegać wszyscy producenci chcący mieć maszynę lub kompilator Java'y, w przypadku JavaScriptu standard jest, ale każda implementacja ma swoje rozszerzenia i zwyczaje.

    Java jest językiem kompilowanym do bytecode, który wykonuje maszyna wirtualna, programy dystrybuujesz w wersji skompilowanej, w przypadku JavaScript rozprzestrzeniasz "źródło".

  • 2010-04-14 12:04:13 Tło w Swing

    Ustawiasz kolor ramki i ona rzeczywiście staje się biała, ale wnętrze całej ramki zajmuje content pane. Gdy użyjesz:

    getContentPane().setBackground(Color.RED); // zmienia kolor tla na czerwony
    

    To zobaczysz, że tło wnętrza ramki się zmieni na czerwone.

    Btw. pomyśl nad ujednoliceniem nazw zmiennych i klas, mówiąc inaczej nad tym by ich nazwy pisać po angielsku. To się może w przyszłości bardzo przydać.

  • 2011-01-09 02:23:40 Aplikacja Klient-serwer Android

    W Androidzie możesz korzystać z całego bogactwa TCP/IP. Większość przykładów i rzeczywistych rozwiązań działa po HTTP dlatego, że HTTP jest po prostu wygodniejsze do większości rzeczy (nie trzeba pisać serwerów, można użyć np. Tomcata) i czasem ludzie mogą się komunikować z siecią przez HTTP proxy. No i po co wymyślać koło za każdym razem? ;-)

    Ale jak potrzebujesz użyć czegoś innego niż HTTP to do łączenia się z siecią przez TCP/IP można użyć java.net.Socket.

    Gdy chcąc się połączyć z jakimś serwerem używasz:

    Socket socket = new Socket(InetAddress.getByName(addr),port);
    OutputStream os = socket.getOutputStream();
    InputStream is = socket.getInputStream();
    

    No i w os masz strumień do którego możesz pisać, a w is strumień z którego możesz czytać. Samo czytanie jest ciut wredne ale do zrobienia (pewnie można by to było przy pomocy java.nio obsłużyć, ale na szczęście nigdy się tym nie musiałem bawić :-)). Jak chcesz budować własny protokół to proponuję zbudować po prostu nad tymi strumieniami strumienie ObjectOutputStream i ObjectInputStream i przesyłać zserializowane obiekty (choć przyznam nie sprawdzałem jak to działa między Androidem a dużą Java'ą ;-)).

    Zachęcałbym jednak do używania HTTP, a jako protokołu wymiany danych po prostu JSONa, to jest dość częsta praktyka, która się może przydać w innych projektach. Nawet jak po stronie serwera nie będziesz chciał instalować Tomcata czy Jetty, a raczej jakiś swój program, to prosty serwer HTTP, taki obsługujący tylko GET i POST to może ze 100 linii (w końcu nie jest Ci przecież potrzebne pełne HTTP).

    Na koniec ostrzeżenie ;-) Sieć po radiu bywa zawodna i przede wszystkim jest wolna. Dlatego nie należy np. próbować się po niej podpinać do baz danych i być zawsze gotowym na to, że połączenie może zostać przerwane. No i nie rób transmisji w Androidzie w wątku odpowiedzialnym za UI bo to się może źle skończyć. Lepiej użyć do tego serwisu (nie oddzielnego wątku, bo jak złośliwie user Ci zmieni orientację ekranu to wszystkie obiekty "zewnętrzne" z aktywności, która odpaliła Twój wątek będą niepoprawne i próba ich użycia (np. by wypisać "done") skończy się wyrzuceniem wyjątku.

    W razie będziesz pisał własny serwer w Java'ie to możesz użyć java.net.ServerSocket. Prosty serwerek będzie wyglądał wtedy tak (pętla przyjmująca połączenia):

    final ServerSocket servSocket = new ServerSocket(port);
    while (true) {
        try {
            new Thread(new ServerConnection(servSocket.accept())).start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    A ServerConnection będzie klasą implementującą interfejs Runnable takiego mniej więcej wyglądu:

    public class ServerConnection implements Runnable {
    private Socket client;
    public ServerConnection(Socket client) {
        this.client = client;
        this.listeners = listeners;
    }
    public void run() {
            // multum operacji na socket'cie client ;-) i znów pobieramy OutputStream i InputStream.
    }
    }
    

  • 2011-03-06 12:36:49 (X?) HTML5

    OK, zacznijmy od tego co to jest XHTML, w dużym skrócie XHTML to HTML, który jest równocześnie poprawnie sformatowanym dokumentem XML. Czyli wszystkie tagi są zamknięte, te zamknięcia są w dobrej kolejności, a cały dokument przechodzi walidację dla dokumentów XML. HTML nie musi spełniać tych wszystkich wymogów by móc zostać wyrenderowanym (choć fakt, że bez odpowiednich nagłówków prawie każda przeglądarka przełącza się w Quirks mode, co oznacza tyle, że zaczyna pracować w trybie "wydaje mi się, że autorowi chodziło o to...")

    XHTML miał być przyszłością i dlatego po HTML 4.01 miało już nigdy nie być HTMLa, miał być tylko XHTML.

    Okazało się jednak, że XHTML nie był lekiem na całe zło. Po pierwsze był zbyt trudny, bo w XHTMLu nie da się zbytnio pisać "z palca" w notatniku. Był też zbyt duży. Wymagał też zmiany Content-Type. Miał też wiele innych cech, które były wcześniej postrzegane jako zalety, ale w realnym świecie okazały się być wadami. Nie przyjął się.

    W odpowiedzi na brak sukcesu XHTMLa W3C zdecydowało się otworzyć prace nad HTML5 (równocześnie do HTML5 powstawał i powstaje jeszcze XHTML5, czyli HTML5 zapisywany w czystym XMLu).

    Sam HTML5 wprowadza trochę nowych elementów do HTML (np. słynne <video>), ale najważniejsze wydają się być dołączone do niego API, które pozwalają JavaScript'owi (czy bardziej EcmaScript'owi ;-)) na korzystanie z takich rzeczy jak Canvas, geolokalizacja, localStorage, drag & drop i wieloma innymi. W tym tkwi siła HTML5.

    Zmieniono w nim w rzeczywistości więcej niż to co napisałem wyżej, bo np. już nie bazuje na SGML przez co zmieniły się reguły parsowania. Wywalono z niego też trochę starych tagów, dodano nowe atrybuty i nowe elementy. Powinien też zawierać MathMLa. Ale akurat te rzeczy mnie zbyt nigdy nie interesowały ;-)

    Czy HTML5 zastąpi Flasha? Chciałbym, ale wątpię ;-) Apple nie ma aż takiej siły przebicia ze swoją nienawiścią do Flasha (kierowaną tam zresztą głównie dlatego, że chcieliby wypromować swoje własnościowe rozwiązanie).

    Ajax to asynchroniczny JavaScript i XML (AsynchronousJavascriptAndXml), czyli wykonywanie przy pomocy JavaScriptu odwołań do serwera "poza" przepływem generowanym przez użytkownika przy przyciskaniu linków i podobnych cosiów. Z samego Ajax'a XML wylatuje coraz szybciej co jest dobre i zastępowany jest coraz częściej przez JSONa (czyli zserializowane obiekty JavaScript), asynchroniczność też nie jest wymogiem, bo często gdy trzeba serwer o coś spytać prościej jest to zrobić synchronicznie i zablokować na chwilę użytkownikowi UI (oczywiście jak to ma sens od strony użytkownika i jak to nie trwa zbyt długo, ja np. tego używam jak muszę sprawdzić poprawność karty kredytowej, albo upewnić się czy user może daną rzecz zrobić (co sprawdza i tak później jeszcze raz ;-)).

    JavaScriptu HTML5 nie zastąpi. Przez dołączone do niego API, JavaScript będzie się stawał podstawą coraz większej ilości aplikacji webowych (co mnie się osobiście podoba, ale ja lubię JavaScript już od 11 lat czy nawet dłużej ;-)).

    Tak, będzie można pisać strony w XMLu, choć zapewne będą potrzebne odpowiednie nagłówki i odpowiednie Content-Type. JavaScript też może i będzie mógł pracować z XMLem przy pomocy nieszczęsnego DOMa.

  • 2010-01-02 17:08:54 Serializable class

    Serializacja działa niezależnie od konstruktorów, to czy konstruktor ma czy nie ma parametry nie jest istotne. Konstruktor nie jest nigdy wołany w trakcie deserializacji obiektu, to jest mechanizm pożyczony w C# z Java'y i tam też nie woła się konstruktorów :-) Tutaj dowód na to, jest konstruktor który ma parametr, ale w momencie deserializacji nie jest wołany

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Diagnostics;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters;
    using System.Runtime.Serialization.Formatters.Binary;
    
    namespace Speed
    {
        [Serializable]
        class Test {
        private String str;
        public Test(String str) {
            this.str=str;
            Console.WriteLine("Constructed object from Test with parameter "+str);
        }
        public String getStr() {
            return this.str;
        }
        }
        class Program
        {
            static void Main(string[] args)  {
            Test test = new Test("Toster"); 
            Stream stream = new FileStream("ser.dat", FileMode.Create, FileAccess.Write, FileShare.None);
            IFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream,test);
            stream.Close();
    
                stream = new FileStream("ser.dat", FileMode.Open, FileAccess.Read, FileShare.None);
            Test newTest = (Test)formatter.Deserialize(stream);
            stream.Close();
    
            Console.WriteLine(newTest.getStr());
            }
        }
    }
    

    A czemu nie wszystko jest serializowane? Bo nie wszystko może być serializowane. Np. Socket, bo jak go zserializować skoro jego stan jest związany ze stanem fizycznego połączenia?

Tagi: 0