• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Globalny obiekt klasy

Object Storage Arubacloud
0 głosów
534 wizyt
pytanie zadane 5 maja 2019 w Java przez poldeeek Mądrala (5,980 p.)
edycja 5 maja 2019 przez poldeeek

WItam, czy jest możliwość w javie usatwić jakiś obiekt klasy, do którego mógłbym się dostać przy wykonaniu metody initialize, podczas gdy inny klasa tworzy go również w klasie initalize ?

Np. klasa MainController tworzy mi takiego użytkownika i pobiera z bazy jego dane w metodzie initialize, a klasa GlownyController w metodzie initialize próbuje wyświetlić imię tego użytkownika ?

Działa mi to jeśli ustawię wyświetlenie tego imienia np po kliknięciu w jakiś przycisk, ale jeśli wywołam to wyświetlenie w initialize dostaje takie błędy : 

"C:\Program Files\Java\jdk1.8.0_211\bin\java.exe" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2018.3.4\lib\idea_rt.jar=62137:D:\Program Files\JetBrains\IntelliJ IDEA 2018.3.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_211\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_211;C:\Users\Lenovo\Desktop\projekt\out\production\DziennikElektroniczny;C:\Program Files\Java\ojdbc8.jar" sample.Main
Exception in Application start method
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
	at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
	at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$159(LauncherImpl.java:182)
	at java.lang.Thread.run(Thread.java:748)
Caused by: javafx.fxml.LoadException: 
/C:/Users/Lenovo/Desktop/projekt/out/production/DziennikElektroniczny/sample/fxmlFiles/srodek/Glowna.fxml
/C:/Users/Lenovo/Desktop/projekt/out/production/DziennikElektroniczny/sample/fxmlFiles/sample.fxml:30

	at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
	at javafx.fxml.FXMLLoader.access$2700(FXMLLoader.java:103)
	at javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:1143)
	at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:746)
	at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
	at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
	at sample.Main.start(Main.java:13)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$166(LauncherImpl.java:863)
	at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$179(PlatformImpl.java:326)
	at com.sun.javafx.application.PlatformImpl.lambda$null$177(PlatformImpl.java:295)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$178(PlatformImpl.java:294)
	at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at com.sun.glass.ui.win.WinApplication.lambda$null$152(WinApplication.java:177)
	... 1 more
Caused by: java.lang.NullPointerException
	at sample.Kontrolery.srodek.Glowna.initialize(Glowna.java:22)
	at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
	... 23 more
Exception running application sample.Main

Process finished with exit code 1

 

komentarz 5 maja 2019 przez mbabane Szeryf (79,280 p.)
Czy to ma być pod aplikację webową?
komentarz 5 maja 2019 przez poldeeek Mądrala (5,980 p.)

To jest aplikacja, która łączy się z bazą. Trochę źle sformułowałem tamto pytanie. Już je poprawiłem. A aby obiekt był widoczny wszędzie ustawiłem go po prostu jako statyczny :

public static Zalogowany uzytkownik;

I teraz chciałbym aby zadziałało coś takiego : 
 

@Override
public void initialize(URL location, ResourceBundle resources) {
    labelek.setText(SampleController.uzytkownik.getImie());
}

Gdzie póki co działą mi tylko to wyświetlenie tylko po kliknięciu przycisku : 

public void klik(){ labelek.setText(SampleController.uzytkownik.getImie()); }

 

komentarz 5 maja 2019 przez Zibi Obywatel (1,220 p.)

wrzuć kody zródłowe klas będzie łatwiej pomóc

komentarz 5 maja 2019 przez poldeeek Mądrala (5,980 p.)

SampleController.java
 

package sample.Kontrolery;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import sample.Kontrolery.srodek.Glowna;
import sample.Zalogowany;


import java.io.IOException;
import java.net.URL;
import java.sql.SQLException;
import java.util.ResourceBundle;

public class SampleController implements Initializable {
    @FXML
    private BorderPane borderPane;

    @FXML
    private LeftMenuButtons leftMenuButtonsController;

    @FXML
    private Label powitanie;

    public static Zalogowany uzytkownik;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        leftMenuButtonsController.setSampleController(this);

        try {
            uzytkownik = new Zalogowany();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        powitanie.setText("Witaj, jesteś zalogowany jako " + uzytkownik.getImie() + " " + uzytkownik.getNazwisko() +" (nauczyciel).");
    }

    public void setCenter(String fxmlPath){
        Parent root = null;
        try {
            root = FXMLLoader.load(getClass().getResource(fxmlPath));
        } catch (IOException e) {
            e.printStackTrace();
        }

        borderPane.setCenter(root);
    }
}

GlownaController.java

package sample.Kontrolery.srodek;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import sample.Kontrolery.SampleController;
import sample.Zalogowany;

import java.net.URL;
import java.util.ResourceBundle;


public class GlownaController implements Initializable {
    private SampleController sampleController;

    @FXML
    private Label labelek;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        labelek.setText(SampleController.uzytkownik.getImie());
    }

    public void klik(){
        labelek.setText(SampleController.uzytkownik.getImie());
    }


}

Sample.fxml
 

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.text.Font?>

<BorderPane fx:id="borderPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="450.0" prefWidth="700.0" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Kontrolery.SampleController">
   <left>
      <HBox prefHeight="100.0" prefWidth="150.0" BorderPane.alignment="CENTER">
          <fx:include fx:id="leftMenuButtons" source="LeftMenuButtons.fxml" />
      </HBox>
   </left>
   <top>
      <Label fx:id="powitanie" minHeight="30.0" BorderPane.alignment="TOP_LEFT">
         <font>
            <Font size="13.0" />
         </font>
         <BorderPane.margin>
            <Insets />
         </BorderPane.margin>
         <padding>
            <Insets left="25.0" top="10.0" />
         </padding>
      </Label>
   </top>
   <center>
      <HBox prefHeight="420.0" prefWidth="536.0" BorderPane.alignment="CENTER">
             <fx:include fx:id="centreBox" source="srodek/Glowna.fxml" />
      </HBox>
   </center>
</BorderPane>

Glowna.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>

<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="420.0" prefWidth="550.0"
      xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Kontrolery.srodek.GlownaController">
   <children>
      <Label fx:id="labelek" text="Label" />
      <Button fx:id="butt" onAction="#klik" mnemonicParsing="false" text="Button" />
   </children>
</VBox>

 

2 odpowiedzi

+1 głos
odpowiedź 5 maja 2019 przez Aisekai Nałogowiec (42,190 p.)

Np. klasa MainController tworzy mi takiego użytkownika i pobiera z bazy jego dane w metodzie initialize, a klasa GlownyController w metodzie initialize próbuje wyświetlić imię tego użytkownika ?

Skąd masz pewność, że wykona się to akurat w takiej kolejności, a nie na odwrót? Problem leży w tym, że zanim pobrany zostanie użytkownik z bazy danych i zapisany w zmiennej zalogowanyUzytkownik, klasa GlownaControler już się do niego chce odwołać. 

Zrezygnowałbym z pomysłu zmiennych globalnych w takim wydaniu. Zastanowiłbym się czy nie lepiej, żeby klasa SampleController powiadamiała klasę GłownaController o tym, że uzytkownik juz zostal pobrany z bazy danych. 

Kolejne pytanie: jakie przeznaczenie ma klasa SampleController i klasa GlownaController? Pytanie, czy nie byłoby logiczniej gdybyś zrobił z tych dwóch Kontrolerów jeden, jeżeli to możliwe. 

Działa mi to jeśli ustawię wyświetlenie tego imienia np po kliknięciu w jakiś przycisk, ale jeśli wywołam to wyświetlenie w initialize dostaje takie błędy : 

Działa, bo zdążyło już zaciągnąć dane z bazy danych i zainicjować zmienną uzytkownik. 

Rzeczy już takie bardziej odnośnie kodu:

1) Klasa Zalogowany nie powinna pobierać danych z bazy.

2) Postaraj się o angielskie nazewnictwo

3) Kontrolery nie powinny mieć logiki, ta powinna być wyodrębniona do osobnych klas. 

4) Zalogowany to niezbyt dobra nazwa, lepsza byłaby Uzytkownik.

komentarz 6 maja 2019 przez poldeeek Mądrala (5,980 p.)
Ja rozumiem czemu to nie działa, że te klasy na początku wykonują się od razu i obiekt może nie zdążyć się pobrać, tylko nie wiem jak rozwiązać ten problem właśnie.. Ale właśnie jeśli nie użyję zmiennych globalnych to nie za bardzo wiem jak się wtedy dostać do tego pobranego użytkownika. Czy pobrać go na nowo ? A jeśli tak to musiałbym przekazać chociaż id tego użytkownika, aby klasa GlownaController wiedziała kogo pobrać i tutaj znowu poza zmienną globalną nie mam innego pomysłu...
komentarz 6 maja 2019 przez Aisekai Nałogowiec (42,190 p.)
Rozwiązań może być sporo, tak jak mówiłem. Jednym z nich może być zrezygnowanie z dwóch kontrolerów na rzecz jednego (o ile coś takiego ma sens). SampleController może przekazać tego użytkownika do GlownaController. Może się w ogóle okazać, że problen jest natury architektonicznej (źle zaprojektowane kontrolery). Jak są powiązane ze sobą te dwa kontrolery? Mógłbyś stworzyć coś na zasadzie okna logowania i tam oddelegowac logikę odpowiedzialna za inicjowanie zmiennej z użytkownik.
komentarz 7 maja 2019 przez poldeeek Mądrala (5,980 p.)

Te dwa kontrolery muszą być osobno ponieważ SampleController kontroluje mi całego BorderPane. A GlownyController to plik odpowiedzialny za kontrole centralnej części BorderPane, która zmienia się w zaleznosci od przycisku (przyciski są w lewej części BorderPane). Właśnie chcę przekazywać w funkcji obiektu między kontrolerami ale nie wiem czemu przy każdej próbie mam wyrzucany wyjątek NullPointerException.

Załóżmy, że chciałbym aby kontroler SearchUczenController.java przekazywał do UserInfoController.java obiekt za pomocą metody more(). Ale nawet przy próbie przekazania zwykłego Stringa mam ten wyrzucany ten wyjątek.
 

public class UserInfoController implements Initializable {
    private Uczen seletced;
    private String nazwa;

    @FXML
    private SearchUczenController searchUczenController;

    @FXML
    Label label;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        searchUczenController.setUserInfoController(this);
    }

    public void setSearchUczenController(SearchUczenController searchUczenController) {
        this.searchUczenController = searchUczenController;
    }

    public void setNazwa(String nazwa) {
        this.nazwa = nazwa;
        System.out.println(nazwa);
    }
}
public class SearchUczenController implements Initializable {
    @FXML
    private TextField pole;

    @FXML
    private ListView mojaLista;

    private UserInfoController userInfoController;

    private List<Uczen> listaUczniow = new ArrayList<>();
    private Object selected;
    private Uczen uczenSelected;

    @Override
    public void initialize(URL location, ResourceBundle resources) {

    }

    public void more(){
        selected = mojaLista.getSelectionModel().getSelectedItem();
        uczenSelected = (Uczen) selected;
        userInfoController.setNazwa(" ");
        //userInfoController.ustaw();
    }

    public void setUserInfoController(UserInfoController userInfoController) {
        this.userInfoController = userInfoController;
    }
}

Przy podmienianiu plików fxml takie przekazywanie obiektów mi działało, a w tym przypadku nie działa i nie wiem za bardzo co jest źle. Niżej mam 2 pliki, w których ta komunikacja działa: 
 

package sample.Kontrolery;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import sample.Zalogowany;


import java.io.IOException;
import java.net.URL;
import java.sql.SQLException;
import java.util.ResourceBundle;

public class SampleController implements Initializable {
    @FXML
    private BorderPane borderPane;

    @FXML
    private LeftMenuButtons leftMenuButtonsController;

    @FXML
    private Label powitanie;

    public static Zalogowany uzytkownik;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        leftMenuButtonsController.setSampleController(this);

        try {
            uzytkownik = new Zalogowany();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        powitanie.setText("Witaj, jesteś zalogowany jako " + uzytkownik.getImie() + " " + uzytkownik.getNazwisko() +" (nauczyciel).");
    }

    public void setCenter(String fxmlPath){
        Parent root = null;
        try {
            root = FXMLLoader.load(getClass().getResource(fxmlPath));
        } catch (IOException e) {
            e.printStackTrace();
        }

        borderPane.setCenter(root);
    }
}
package sample.Kontrolery;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;

import java.net.URL;
import java.util.ResourceBundle;

public class LeftMenuButtons implements Initializable {

    private SampleController sampleController;

    private final static String GLOWNA_FXML = "/sample/fxmlFiles/srodek/Glowna.fxml";
    private final static String KLASY_FXML = "/sample/fxmlFiles/srodek/TwojeKlasy.fxml";
    private final static String SEARCH_FXML = "/sample/fxmlFiles/srodek/SearchUczen.fxml";
    private final static String ZAJ_DOD_FXML = "/sample/fxmlFiles/srodek/ZajDod.fxml";

    @Override
    public void initialize(URL location, ResourceBundle resources) {
    }

    public void setSampleController(SampleController sampleController) {
        this.sampleController = sampleController;
    }

    @FXML
    public void glownyButton(ActionEvent actionEvent) {
        sampleController.setCenter(GLOWNA_FXML);
    }

    @FXML
    public void klasyButton(ActionEvent actionEvent) {
        sampleController.setCenter(KLASY_FXML);
    }

    @FXML
    public void serachButton(ActionEvent actionEvent) { sampleController.setCenter(SEARCH_FXML); }

    @FXML
    public void dodButton(ActionEvent actionEvent) { sampleController.setCenter(ZAJ_DOD_FXML); }
}

I gdyby ktoś mógłby mi wytłumaczyć, ponieważ nie mogę zrozumieć skąd klasa SampleController wykonuje metodę w leftMenuButtonsController, mimo że oficjalnie nigdzie nie jest ten obiekt tak utworzony ?

0 głosów
odpowiedź 5 maja 2019 przez Zibi Obywatel (1,220 p.)
Czy to jest cały kod tych klas? Nie widzę miejsca gdzie jest ustawiane imie i nazwisko w klasie Zalogowany.
komentarz 5 maja 2019 przez poldeeek Mądrala (5,980 p.)

Zalogowany.java 

package sample;

import java.sql.*;

public class Zalogowany {
    private int id;
    private String imie;
    private String nazwisko;
    private int tel;
    // private DbConnection polaczenie;

    public Zalogowany() throws SQLException, ClassNotFoundException {

        String query = "SELECT * FROM NAUCZYCIEL";

        // polaczenie = new DbConnection();

        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection con;
        con = DriverManager.getConnection("jdbc:oracle:thin:@baza", "login", "haslo");

        PreparedStatement ps = con.prepareStatement(query);
        ResultSet rs = ps.executeQuery(query);
        rs.next();

        this.id = rs.getInt("id_nauczyciela");
        this.imie = rs.getString("imie");
        this.nazwisko = rs.getString("nazwisko");
        this.tel = rs.getInt("telefon");

        con.close();
    }

    public int getId() {
        return id;
    }

    public String getImie() {
        return imie;
    }

    public String getNazwisko() {
        return nazwisko;
    }

    public int getTel() {
        return tel;
    }
}

Ogólnie to połączenie i pobieranie danych z bazy działa
nie chce wrzucać wszystkiego bo mam naprawdę dużo tych klas i plików fxml :P

komentarz 5 maja 2019 przez Zibi Obywatel (1,220 p.)

Problem polega na inicjalizacji klasy Zalogowany w klasie SampleController. Obiekt Zalogowany nie jest zainicjalizowany, a jest wywoływany w GlownaController. Możesz zrobić blok statyczny w klasie SampleController i tam zainicjalizować obiekt Zalogowany.

static  {
    uzytkownik = new Zalogowany();
}
komentarz 5 maja 2019 przez poldeeek Mądrala (5,980 p.)

Nie za bardzo rozumiem.... przecież uzytkownik jest jako obiekt statyczny :
 

public static Zalogowany uzytkownik;

a tego bloku statycznego w metodzie initialize nie mogę dodać, ponieważ wymagany jest ode mnie typ lub jakis identyfikator.

komentarz 6 maja 2019 przez mbabane Szeryf (79,280 p.)
static  {
    uzytkownik = new Zalogowany();
}

Nie, nie, w tę stronę raczej nie idź.

Bo to by znaczyło de-facto, że użytkownik jest zawsze zalogowany.

Podobne pytania

0 głosów
0 odpowiedzi 490 wizyt
pytanie zadane 25 października 2016 w Java przez K0XM4N Gaduła (3,640 p.)
0 głosów
0 odpowiedzi 338 wizyt
pytanie zadane 8 maja 2021 w C i C++ przez krzysiu99 Nowicjusz (120 p.)
0 głosów
3 odpowiedzi 461 wizyt

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,941 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...